diff --git a/.codecov.yml b/.codecov.yml deleted file mode 100644 index f08462af..00000000 --- a/.codecov.yml +++ /dev/null @@ -1,35 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -coverage: - status: - project: - default: - target: auto - threshold: 0% - informational: true - patch: - default: - informational: true -ignore: - - "examples/.*" - - "docs/.*" - - "tests/.*" - - "checkstyle/.*" - - "format/.*" - - "threadpool/console-new/.*" - - "threadpool/console/.*" diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 6e54c6c7..00000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -# These are supported funding model platforms - -custom: ['https://hippo4j.cn/community/sponsor'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml deleted file mode 100644 index adcd03ef..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ /dev/null @@ -1,112 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -name: Bug report -title: "[Bug] Bug title " -description: If something isn't working as expected. -labels: [ "type: bug" ] -body: - - type: markdown - attributes: - value: | - For better global communication, Please write in English. - - - type: checkboxes - attributes: - label: Search before asking - description: > - Please make sure to search in the [issues](https://github.com/opengoofy/hippo4j/issues) - first to see whether the same issue was reported already. - options: - - label: > - I had searched in the [issues](https://github.com/opengoofy/hippo4j/issues) and found - no similar issues. - required: true - - - type: dropdown - attributes: - label: Environment - description: Describe the environment. - options: - - Mac - - Windows - - Linux - - Other - validations: - required: true - - - type: dropdown - attributes: - label: Hippo4j version - description: Describe the Hippo4j version. - options: - - develop - - 1.5.0 - - 1.4.3 - - Other - validations: - required: true - - - type: textarea - attributes: - label: What happened - description: Describe what happened. - placeholder: > - A clear and concise description of what the bug is. - validations: - required: true - - - type: textarea - attributes: - label: How to reproduce - description: > - Describe the steps to reproduce the bug here. - placeholder: > - Please make sure you provide a reproducible step-by-step case of how to reproduce the problem - as minimally and precisely as possible. - validations: - required: true - - - type: textarea - attributes: - label: Debug logs - description: Anything else we need to know? - placeholder: > - Add your debug logs here. - validations: - required: false - - - type: checkboxes - attributes: - label: Are you willing to submit PR? - description: > - This is absolutely not required, but we are happy to guide you in the contribution process - especially if you already have a good understanding of how to implement the fix. - options: - - label: Yes I am willing to submit a PR! - - - type: checkboxes - attributes: - label: Code of Conduct - description: > - The Code of Conduct helps create a safe space for everyone. We require that everyone agrees to it.. - options: - - label: I agree to follow this project's [Code of Conduct](https://www.apache.org/foundation/policies/conduct) * - - - type: markdown - attributes: - value: "Thanks for completing our form!" diff --git a/.github/ISSUE_TEMPLATE/documentation_related.yml b/.github/ISSUE_TEMPLATE/documentation_related.yml deleted file mode 100644 index 6a6cc0ef..00000000 --- a/.github/ISSUE_TEMPLATE/documentation_related.yml +++ /dev/null @@ -1,68 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -name: Documentation Related -title: "[Doc] Documentation Related " -description: I find some issues related to the documentation. -labels: [ "type: documentation" ] -body: - - type: markdown - attributes: - value: | - For better global communication, Please write in English. - - - type: checkboxes - attributes: - label: Search before asking - description: > - Please make sure to search in the [issues](https://github.com/opengoofy/hippo4j/issues) - first to see whether the same issue was reported already. - options: - - label: > - I had searched in the [issues](https://github.com/opengoofy/hippo4j/issues) and found - no similar issues. - required: true - - - type: textarea - attributes: - label: Documentation Related - description: Describe the suggestion about document. - placeholder: > - e.g There is a typo - validations: - required: true - - - type: checkboxes - attributes: - label: Are you willing to submit PR? - description: > - This is absolutely not required, but we are happy to guide you in the contribution process - especially if you already have a good understanding of how to implement the fix. - options: - - label: Yes I am willing to submit a PR! - - - type: checkboxes - attributes: - label: Code of Conduct - description: > - The Code of Conduct helps create a safe space for everyone. We require that everyone agrees to it.. - options: - - label: I agree to follow this project's [Code of Conduct](https://www.apache.org/foundation/policies/conduct) * - - - type: markdown - attributes: - value: "Thanks for completing our form!" diff --git a/.github/ISSUE_TEMPLATE/enhancement_request.yml b/.github/ISSUE_TEMPLATE/enhancement_request.yml deleted file mode 100644 index f0cb833d..00000000 --- a/.github/ISSUE_TEMPLATE/enhancement_request.yml +++ /dev/null @@ -1,77 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -name: Enhancement Request -title: "[Enhancement] Enhancement title" -description: I want to suggest an enhancement for this project -labels: [ "type: enhancement" ] -body: - - type: markdown - attributes: - value: | - For better global communication, Please write in English. - - - type: checkboxes - attributes: - label: Search before asking - description: > - Please make sure to search in the [issues](https://github.com/opengoofy/hippo4j/issues) - first to see whether the same issue was reported already. - options: - - label: > - I had searched in the [issues](https://github.com/opengoofy/hippo4j/issues) and found - no similar issues. - required: true - - - type: textarea - attributes: - label: Enhancement Request - description: Describe the suggestion. - placeholder: > - First of all: Have you checked the docs https://hippo4j.cn/community/dev_convention/code, - or GitHub issues whether someone else has already reported your issue? - validations: - required: true - - - type: textarea - attributes: - label: Describe the solution you'd like - description: Describe the suggestion. - placeholder: > - A clear and concise description of what you want to happen. Add any considered drawbacks. - validations: - required: true - - - type: checkboxes - attributes: - label: Are you willing to submit PR? - description: > - This is absolutely not required, but we are happy to guide you in the contribution process - especially if you already have a good understanding of how to implement the fix. - options: - - label: Yes I am willing to submit a PR! - - - type: checkboxes - attributes: - label: Code of Conduct - description: > - The Code of Conduct helps create a safe space for everyone. We require that everyone agrees to it.. - options: - - label: I agree to follow this project's [Code of Conduct](https://www.apache.org/foundation/policies/conduct) * - - type: markdown - attributes: - value: "Thanks for completing our form!" diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml deleted file mode 100644 index 9c2812f4..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ /dev/null @@ -1,70 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -name: Feature Request -title: "[Feature] Feature title " -description: I want to suggest a feature for this project. -labels: [ "type: feature" ] -body: - - type: markdown - attributes: - value: | - For better global communication, Please write in English. - - - type: checkboxes - attributes: - label: Search before asking - description: > - Please make sure to search in the [issues](https://github.com/opengoofy/hippo4j/issues) - first to see whether the same issue was reported already. - options: - - label: > - I had searched in the [issues](https://github.com/opengoofy/hippo4j/issues) and found - no similar issues. - required: true - - - type: textarea - attributes: - label: Feature Request - description: Describe the feature. - placeholder: > - First of all: Have you checked the docs https://hippo4j.cn/community/dev_convention/code, - or GitHub issues whether someone else has already reported your issue? - Maybe the feature already exists? - validations: - required: true - - - type: checkboxes - attributes: - label: Are you willing to submit PR? - description: > - This is absolutely not required, but we are happy to guide you in the contribution process - especially if you already have a good understanding of how to implement the fix. - options: - - label: Yes I am willing to submit a PR! - - - type: checkboxes - attributes: - label: Code of Conduct - description: > - The Code of Conduct helps create a safe space for everyone. We require that everyone agrees to it.. - options: - - label: I agree to follow this project's [Code of Conduct](https://www.apache.org/foundation/policies/conduct) * - - - type: markdown - attributes: - value: "Thanks for completing our form!" diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml deleted file mode 100644 index 638dbbd7..00000000 --- a/.github/ISSUE_TEMPLATE/question.yml +++ /dev/null @@ -1,51 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -name: Question -title: "[Question] Question title " -description: I have a question that isn't answered in docs or issue. -labels: [ "type: question" ] -body: - - type: markdown - attributes: - value: | - For better global communication, Please write in English. - - - type: checkboxes - attributes: - label: Search before asking - description: > - Please make sure to search in the [issues](https://github.com/opengoofy/hippo4j/issues) - first to see whether the same issue was reported already. - options: - - label: > - I had searched in the [issues](https://github.com/opengoofy/hippo4j/issues) and found - no similar issues. - required: true - - - type: textarea - attributes: - label: Question - description: Describe your question. - placeholder: > - Describe your question here :D - validations: - required: true - - - type: markdown - attributes: - value: "Thanks for completing our form!" diff --git a/.github/ISSUE_TEMPLATE/unit_test.yml b/.github/ISSUE_TEMPLATE/unit_test.yml deleted file mode 100644 index 3974c9db..00000000 --- a/.github/ISSUE_TEMPLATE/unit_test.yml +++ /dev/null @@ -1,86 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -name: Unit Test -title: "[Unit Test] Unit test title" -description: I want to do some unit tests for this project -labels: [ "type: testing" ] -body: - - type: markdown - attributes: - value: | - For better global communication, Please write in English. - - - type: checkboxes - attributes: - label: Search before asking - description: > - Please make sure to search in the [issues](https://github.com/opengoofy/hippo4j/issues) - first to see whether the same issue was reported already. - options: - - label: > - I had searched in the [issues](https://github.com/opengoofy/hippo4j/issues) and found - no similar issues. - required: true - - - type: checkboxes - attributes: - label: Read the unit testing guidelines - description: > - Read the [develop guidelines](https://hippo4j.cn/community/dev_convention/code) before writing unit test code. - options: - - label: > - I have read. - required: true - - - type: textarea - attributes: - label: Unit test request - description: Describe the unit test. - placeholder: > - First of all: Have you checked the docs https://hippo4j.cn/community/category/贡献规约, - or GitHub issues whether someone else has already reported your issue? - Maybe the unit tests you want to do have already been done? - validations: - required: true - - - type: textarea - attributes: - label: Describe the unit tests you want to do - description: Describe the unit test. - value: | - Module name: - Located at: - Task status: ×(unfinished) / √(finished) - | Task Status | Class | Type | - | :------: | :------ | :------ | - | × | xxxxxx | xxxxxx | - validations: - required: true - - - type: checkboxes - attributes: - label: Are you willing to submit PR? - description: > - This is absolutely not required, but we are happy to guide you in the contribution process - especially if you already have a good understanding of how to implement the fix. - options: - - label: Yes I am willing to submit a PR! - - - type: markdown - attributes: - value: "Thanks for completing our form!" diff --git a/.github/PULL_REQUEST_TEMPLATE b/.github/PULL_REQUEST_TEMPLATE deleted file mode 100644 index 907fdeba..00000000 --- a/.github/PULL_REQUEST_TEMPLATE +++ /dev/null @@ -1,6 +0,0 @@ -Fixes #ISSUSE_ID - -Changes proposed in this pull request: -- - -> Check mailbox configuration when submitting. [Contributor Guide](https://hippo4j.cn/community/contributor-guide) diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 5ace4600..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,6 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "weekly" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 39d46e4d..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,89 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# This workflow will build a Java project with Maven -# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven - -name: build - -on: - push: - branches: [ develop ] - paths: - - '.github/workflows/ci.yml' - - '**/pom.xml' - - '**/src/main/**' - - '**/src/test/**' - - '!*.md' - - '!docs/**' - pull_request: - branches: [ develop ] - paths: - - '.github/workflows/ci.yml' - - '**/pom.xml' - - '**/src/main/**' - - '**/src/test/**' - - '!*.md' - - '!docs/**' - repository_dispatch: - types: [rerun-ci] - -concurrency: - group: ${{ github.event_name }}-${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - unix: - name: JDK ${{ matrix.java.version }} - on ${{ matrix.os }} - runs-on: ${{ matrix.os }} - timeout-minutes: 60 - strategy: - matrix: - os: [ macos-latest ] - java: - - { - version: 11 - } - - { - version: 17 - } - steps: - - uses: actions/checkout@v4 - - name: Build with Maven - run: echo y | mvn clean install -Dskip.gpg=true -Dspotless.apply.skip=true -Dmaven.javadoc.skip=true - - test-coverage: - if: github.repository == 'opengoofy/hippo4j' - name: Test coverage report - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Cache Maven Repos - uses: actions/cache@v3 - with: - path: ~/.m2/repository - key: hippo4j-maven-third-party-${{ hashFiles('**/pom.xml') }} - restore-keys: | - hippo4j-maven-third-party- - - uses: actions/setup-java@v3 - with: - distribution: 'temurin' - java-version: 8 - - name: Test with Maven - run: echo y | mvn -T1C clean install -Dskip.gpg=true -Dspotless.apply.skip=true -Dskip.jacoco.plugin=false - - name: Upload to Codecov - run: bash <(curl -s https://codecov.io/bash) diff --git a/.github/workflows/reademe-contributors.yml b/.github/workflows/reademe-contributors.yml deleted file mode 100644 index 34583d53..00000000 --- a/.github/workflows/reademe-contributors.yml +++ /dev/null @@ -1,40 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# This workflow will build a Java project with Maven -# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven - -on: - push: - branches: - - main - -jobs: - contrib-readme-job: - runs-on: ubuntu-latest - name: A job to automate contrib in readme - steps: - - name: Contribute List - uses: akhilmhdh/contributors-readme-action@v2.3.6 - with: - image_size: 50 - columns_per_row: 9 - committer_email: wechat202110@163.com - committer_username: hippo4jbot[bot] - commit_message: 'Update the list of contributors' - env: - GITHUB_TOKEN: ${{ secrets.ACTION_TOKEN }} diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 0b2f4240..00000000 --- a/.gitignore +++ /dev/null @@ -1,56 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ -!**/node_modules/ -!**/dist/ - -### Agent ### -hippo4j-agent/ -**/dependency-reduced-pom.xml - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -# .vscode/ - -# maven plugin ignore -*.gpg -.flattened-pom.xml - -### Docs ### -docs/node_modules -docs/build -docs/.docusaurus - - -### Docker ### -docker/conf -docker/target - -### OS ### -.DS_Store \ No newline at end of file diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index e69de29b..00000000 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index c3150437..00000000 --- a/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1 +0,0 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.0/apache-maven-3.5.0-bin.zip diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 42bfc4e4..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "editor.codeActionsOnSave": { - "source.fixAll.eslint": true - }, - "[html]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnPaste": true, - "editor.formatOnSave": true - }, - "[javascriptreact]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true - }, - "[json]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true - }, - "[jsonc]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true - }, - "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnPaste": true, - "editor.formatOnSave": true - }, - "[typescriptreact]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnPaste": true, - "editor.formatOnSave": true - }, - "[less]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnPaste": true, - "editor.formatOnSave": true - }, - "typescript.tsdk": "./node_modules/typescript/lib" -} diff --git a/LICENSE b/LICENSE deleted file mode 100755 index c2441e86..00000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (properties) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README-EN.md b/README-EN.md index 106e5774..2e2d9e0e 100644 --- a/README-EN.md +++ b/README-EN.md @@ -1,3 +1,5 @@ + + # Dynamic and observable thread pool framework diff --git a/README.md b/README.md index 4e014578..84076ae4 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ + + ## 动态可观测线程池,提高系统运行保障能力 diff --git a/README.src.md b/README.src.md new file mode 100644 index 00000000..a060f57c --- /dev/null +++ b/README.src.md @@ -0,0 +1,217 @@ + + + + +## 动态可观测线程池,提高系统运行保障能力 + + +[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0) +[![Build Status](https://github.com/opengoofy/hippo4j/actions/workflows/ci.yml/badge.svg?event=push)](https://github.com/opengoofy/hippo4j) + +![](https://img.shields.io/github/stars/opengoofy/hippo4j?color=5470c6) +![](https://img.shields.io/github/forks/opengoofy/hippo4j?color=3ba272) +![](https://img.shields.io/github/contributors/opengoofy/hippo4j) +[![star](https://gitcode.com/opengoofy/hippo4j/star/badge.svg)](https://gitcode.com/opengoofy/hippo4j) +[![Docker Pulls](https://img.shields.io/docker/pulls/hippo4j/hippo4j-server.svg?label=docker%20pulls&color=fac858)](https://store.docker.com/community/images/hippo4j/hippo4j-server) +[![codecov](https://codecov.io/gh/opengoofy/hippo4j/branch/develop/graph/badge.svg?token=WBUVJN107I)](https://codecov.io/gh/opengoofy/hippo4j) +[![EN doc](https://img.shields.io/badge/readme-English-orange.svg)](https://github.com/opengoofy/hippo4j/blob/develop/README-EN.md) + +> 📢 新项目 +> +> [Ragent AI(点击跳转)](https://nageoffer.com/ragent) —— 企业级 Agentic RAG 项目,拿个 offer 社群在 AI 领域的首个开源作品。架构设计、代码实现保持一贯的高标准,适合写进校招/社招简历。毕竟现在哪家公司不关注 AI? + + +### 线程池痛点 + +--- + +线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。在高并发以及大批量的任务处理场景,线程池的使用是必不可少的。 + +如果有在项目中实际使用线程池,相信你可能会遇到以下痛点: + +- 线程池随便定义,线程资源过多,造成服务器高负载。 + +- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 +- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 +- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 +- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 +- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 +- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 +- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 + +### 什么是 Hippo4j + +--- + +提供以下功能支持: + +- 全局管控 - 管理应用线程池实例。 + +- 动态变更 - 应用运行时动态变更线程池参数,包括但不限于:核心、最大线程数、阻塞队列容量、拒绝策略等。 +- 通知报警 - 内置四种报警通知策略,线程池活跃度、容量水位、拒绝策略以及任务执行时间超长。 +- 数据采集 - 支持多种方式采集线程池数据,包括但不限于:日志、内置采集、Prometheus、InfluxDB、ElasticSearch 等。 +- 运行监控 - 实时查看线程池运行时数据,自定义时间内线程池运行数据图表展示。 +- 功能扩展 - 支持线程池任务传递上下文;项目关闭时,支持等待线程池在指定时间内完成任务。 +- 多种模式 - 内置两种使用模式:[依赖配置中心](https://hippo4j.cn/docs/user_docs/getting_started/config/hippo4j-config-start) 和 [无中间件依赖](https://hippo4j.cn/docs/user_docs/getting_started/server/hippo4j-server-start)。 +- 容器管理 - Tomcat、Jetty、Undertow 容器线程池运行时查看和线程数变更。 +- 框架适配 - Dubbo、Hystrix、RabbitMQ、RocketMQ 等消费线程池运行时数据查看和线程数变更。 +- 变更审核 - 提供多种用户角色,普通用户变更线程池参数需要 Admin 用户审核方可生效。 +- 动态化插件 - 内置多种线程池插件,支持用户自定义插件以及运行时扩展。 +- 多版本适配 - 经过实际测试,已支持客户端 SpringBoot 1.5.x => 2.7.5 版本(更高版本未测试)。 + +### 架构设计 + +--- +image + +### 快速开始 + +--- + +对于本地演示目的,请参阅 [Quick start](https://hippo4j.cn/docs/user_docs/user_guide/quick-start) + +演示环境: [http://console.hippo4j.cn/index.html](http://console.hippo4j.cn/index.html) + +### 接入登记 + +--- + +更多接入的公司,欢迎在 [登记地址](https://github.com/opengoofy/hippo4j/issues/13) 登记,登记仅仅为了产品推广。 + +### 联系我 + +--- + +开源不易,右上角点个 Star 鼓励一下吧! + +如果大家想要实时关注 Hippo4j 更新的文章以及分享的干货的话,可以关注我的公众号。 + +使用过程中有任何问题,或者对项目有什么建议,关注公众号回复:加群,和 `1000+` 志同道合的朋友交流讨论。 + +image + + +### 深入原理 + +--- + +如果您公司没有使用 Hippo4j 场景的话,我也建议去阅读下项目的底层原理,主要有以下几个原因: + +- 为了提高代码质量以及后续的扩展行为,运用多种设计模式实现高内聚、低耦合。 + +- 框架底层依赖 Spring 框架运行,并在源码中大量使用 Spring 相关功能。 +- 运用 JUC 并发包下多种工具保障多线程运行安全,通过实际场景理解并发编程。 +- 借鉴主流开源框架 Nacos、Eureka 实现轻量级配置中心和注册中心功能。 +- 自定义 RPC 框架实现,封装 Netty 完成客户端/服务端网络通信优化。 +- 通过 CheckStyle、Spotless 等插件规范代码编写,保障高质量代码行为和代码样式。 + +### 友情链接 + +--- + +- [[ Sa-Token ]](https://github.com/dromara/sa-token):一个轻量级 java 权限认证框架,让鉴权变得简单、优雅! + +- [[ HertzBeat ]](https://github.com/dromara/hertzbeat):易用友好的云监控系统, 无需 Agent, 强大自定义监控能力。 +- [[ JavaGuide ]](https://github.com/Snailclimb/JavaGuide):一份涵盖大部分 Java 程序员所需要掌握的核心知识。 +- [[ toBeBetterJavaer ]](https://github.com/itwanger/toBeBetterJavaer):一份通俗易懂、风趣幽默的 Java 学习指南。 +- [[ Jpom ]](https://gitee.com/dromara/Jpom):简而轻的低侵入式在线构建、自动部署、日常运维、项目监控软件。 +- [[ 12306 ]](https://gitee.com/nageoffer/12306):完成高仿 12306 用户+抢票+订单+支付服务,帮助学生主打就业的项目。 +- [[ CongoMall ]](https://gitee.com/nageoffer/congomall):企业级商城,基于 DDD 领域驱动模型开发,包含商城业务和基础架构。 + +### 贡献者 + +--- + +感谢所有为项目作出贡献的开发者。如果有意贡献,参考 [good first issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)。 + + + + + +### 鸣谢 + +--- + +Hippo4j 社区收到 Jetbrains 多份 Licenses,并已分配项目 [活跃开发者](https://hippo4j.cn/community/team/),非常感谢 Jetbrains 对开源社区的支持。 + +![JetBrains Logo (Main) logo](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg) +# Dynamic and observable thread pool framework + + +[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0) +[![Build Status](https://github.com/opengoofy/hippo4j/actions/workflows/ci.yml/badge.svg?event=push)](https://github.com/opengoofy.hippo4j) + +![](https://img.shields.io/github/stars/opengoofy/hippo4j?color=5470c6) +![](https://img.shields.io/github/forks/opengoofy/hippo4j?color=3ba272) +![](https://img.shields.io/github/contributors/opengoofy/hippo4j) +[![Docker Pulls](https://img.shields.io/docker/pulls/hippo4j/hippo4j-server.svg?label=docker%20pulls&color=fac858)](https://store.docker.com/community/images/hippo4j/hippo4j-server) +[![codecov](https://codecov.io/gh/opengoofy/hippo4j/branch/develop/graph/badge.svg?token=WBUVJN107I)](https://codecov.io/gh/opengoofy/hippo4j) +[![EN doc](https://img.shields.io/badge/readme-English-orange.svg)](https://github.com/opengoofy/hippo4j/blob/develop/README-EN.md) + +| **Stargazers Over Time** | **Contributors Over Time** | +|:---------------------------------------------------------------------------------------------------------------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| +| [![Stargazers over time](https://api.star-history.com/svg?repos=opengoofy/hippo4j&type=Date)](https://api.star-history.com/svg?repos=opengoofy/hippo4j&type=Date) | [![Contributor over time](https://contributor-graph-api.apiseven.com/contributors-svg?chart=contributorOverTime&repo=opengoofy/hippo4j)](https://www.apiseven.com/en/contributor-graph?chart=contributorOverTime&repo=opengoofy/hippo4j) | + +### Thread pool pain points + +--- + +A thread pool is a tool for managing threads based on the idea of pooling. + +Using a thread pool reduces the overhead of creating and destroying threads and avoids running out of system resources due to too many threads. + +The use of thread pools is essential in highly concurrent and high-volume task processing scenarios. + +If you have actually used thread pools in your projects, I believe you may have encountered the following pain points: + +- Thread pools are defined randomly, with too many thread resources, causing high server load. + +- The thread pool parameters are not easily evaluated and the business is at risk of failure. +- Thread pool task execution time exceeds the average execution cycle and developers are not informed. +- Thread pool tasks pile up and affect business operations. +- Wireless process pool monitoring when the service has timeouts, meltdowns, and other problems. +- Thread pools do not support the passing of runtime variables, such as MDC contexts. +- When a project is closed, a large number of running thread pool tasks are discarded. +- Thread pool running, task execution stopped, don't know the problem. + +### What is Hippo4j + +--- + +Hippo4j through the JDK thread pool enhancements, as well as extending the three-party framework underlying thread pools and other features for business systems to improve online operational security capabilities. + +The following functional support is provided: + +- Global Control - Managing Application Thread Pool Instances. + +- Dynamic changes - dynamically changing thread pool parameters at application runtime. +- Notify alarms - Four built-in alarm notification policies. +- Run Monitoring - Real-time view of thread pool runtime data. +- Feature extensions - support for thread pooling task passing contexts, etc. +- Multiple Modes - Two built-in usage modes: Configuration Center Mode and No Middleware Mode. +- Container Management - Tomcat, Jetty, Undertow container thread pool runtime view and thread count changes. +- Framework adaptation - Dubbo, Hystrix, Polaris, RabbitMQ, RocketMQ and other consumer thread pool runtime data view and thread count changes. + +### Quick Start + +--- + +For local presentation purposes, see [Quick start](https://hippo4j.cn/docs/user_docs/user_guide/quick-start). + +Demo Environment: [http://console.hippo4j.cn/index.html](http://console.hippo4j.cn/index.html). + +### Who is using + +--- + +More companies with access are welcome to register at [registration address](https://github.com/opengoofy/hippo4j/issues/13), registration is only for product promotion. + +### Contributors + +--- + +Thanks to all the developers who contributed to the project. If interested in contributing, refer to [good first issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). + + + + diff --git a/agent/config/agent.config b/agent/config/agent.config deleted file mode 100755 index c49ce54f..00000000 --- a/agent/config/agent.config +++ /dev/null @@ -1,76 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# The service name in UI -# ${service name} = [${group name}::]${logic name} -# The group name is optional only. -agent.service_name=${HIPPO4J_AGENT_NAME:Your_ApplicationName} - -# The agent namespace -agent.namespace=${HIPPO4J_AGENT_NAMESPACE:} - -# The agent cluster -agent.cluster=${HIPPO4J_AGENT_CLUSTER:} - -# If the operation name of the first span is included in this set, this segment should be ignored. Multiple values should be separated by `,`. -agent.ignore_suffix=${HIPPO4J_AGENT_IGNORE_SUFFIX:.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg} - -# If true, Hippo4j agent will save all instrumented classes files in `/debugging` folder. -# SkyWalking team may ask for these files in order to resolve compatible problem. -agent.is_open_debugging_class=${SW_AGENT_OPEN_DEBUG:false} - -# If true, Hippo4j agent will cache all instrumented classes files to memory or disk files (decided by class cache mode), -# allow other javaagent to enhance those classes that enhanced by SkyWalking agent. -agent.is_cache_enhanced_class=${SW_AGENT_CACHE_CLASS:false} - -# The instrumented classes cache mode: MEMORY or FILE -# MEMORY: cache class bytes to memory, if instrumented classes is too many or too large, it may take up more memory -# FILE: cache class bytes in `/class-cache` folder, automatically clean up cached class files when the application exits -agent.class_cache_mode=${SW_AGENT_CLASS_CACHE_MODE:MEMORY} - -# Logging level -logging.level=${HIPPO4J_LOGGING_LEVEL:INFO} -# Logging file_name -logging.file_name=${HIPPO4J_LOGGING_FILE_NAME:hippo4j-api.log} -# Log output. Default is FILE. Use CONSOLE means output to stdout. -logging.output=${SW_LOGGING_OUTPUT:FILE} -# Log files directory. Default is blank string, meaning use "{theHippo4jAgentJarDir}/logs " to output logs. -# {theHippo4jAgentJarDir} is the directory where the hippo4j agent jar file is located -logging.dir=${HIPPO4J_LOGGING_DIR:} -# Logger resolver: PATTERN or JSON. The default is PATTERN, which uses logging.pattern to print traditional text logs. -# JSON resolver prints logs in JSON format. -logging.resolver=${HIPPO4J_LOGGING_RESOLVER:PATTERN} -# Logging format. There are all conversion specifiers: -# * %level means log level. -# * %timestamp means now of time with format yyyy-MM-dd HH:mm:ss:SSS. -# * %thread means name of current thread. -# * %msg means some message which user logged. -# * %class means SimpleName of TargetClass. -# * %throwable means a throwable which user called. -# * %agent_name means agent.service_name. Only apply to the PatternLogger. -logging.pattern=${HIPPO4J_LOGGING_PATTERN:%level %timestamp %thread %class : %msg %throwable} -# Logging max_file_size, default: 300 * 1024 * 1024 = 314572800 -logging.max_file_size=${HIPPO4J_LOGGING_MAX_FILE_SIZE:314572800} -# The max history log files. When rollover happened, if log files exceed this number, -# then the oldest file will be delete. Negative or zero means off, by default. -logging.max_history_files=${HIPPO4J_LOGGING_MAX_HISTORY_FILES:-1} - -# Mount the specific folders of the plugins. Plugins in mounted folders would work. -plugin.mount=${SW_MOUNT_FOLDERS:plugins,activations} -# Peer maximum description limit. -plugin.peer_max_length=${SW_PLUGIN_PEER_MAX_LENGTH:200} -# Exclude some plugins define in plugins dir.Plugin names is defined in [Agent plugin list](Plugin-list.md) -plugin.exclude_plugins=${SW_EXCLUDE_PLUGINS:} \ No newline at end of file diff --git a/agent/dist-material/LICENSE b/agent/dist-material/LICENSE deleted file mode 100755 index f84d20b7..00000000 --- a/agent/dist-material/LICENSE +++ /dev/null @@ -1,232 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -======================================================================= -Apache SkyWalking Subcomponents: - -The Apache SkyWalking project contains subcomponents with separate copyright -notices and license terms. Your use of the source code for the these -subcomponents is subject to the terms and conditions of the following -licenses. - -======================================================================== -Apache 2.0 licenses -======================================================================== - -The following components are provided under the Apache License. See project link for details. -The text of each license is the standard Apache 2.0 license. - - raphw (byte-buddy) 1.12.13: http://bytebuddy.net/ , Apache 2.0 - Google: grpc-java 1.44.0: https://github.com/grpc/grpc-java, Apache 2.0 - Google: gson 2.8.9: https://github.com/google/gson , Apache 2.0 - Google: proto-google-common-protos 2.0.1: https://github.com/googleapis/googleapis , Apache 2.0 - Google: jsr305 3.0.2: http://central.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.0/jsr305-3.0.0.pom , Apache 2.0 - netty 4.1.79: https://github.com/netty/netty/blob/4.1/LICENSE.txt, Apache 2.0 - -======================================================================== -BSD licenses -======================================================================== - -The following components are provided under a BSD license. See project link for details. -The text of each license is also included at licenses/LICENSE-[project].txt. - - asm 9.2:https://gitlab.ow2.org , BSD-3-Clause diff --git a/agent/dist-material/NOTICE b/agent/dist-material/NOTICE deleted file mode 100755 index 5b238489..00000000 --- a/agent/dist-material/NOTICE +++ /dev/null @@ -1,299 +0,0 @@ -Opengoofy Hippo4j -Copyright 2017-2022 The Apache Software Foundation - -This product includes software developed at -The Apache Software Foundation (http://www.apache.org/). - -======================================================================== - -grpc-java NOTICE - -======================================================================== -Copyright 2014, gRPC Authors All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ------------------------------------------------------------------------ - -This product contains a modified portion of 'OkHttp', an open source -HTTP & SPDY client for Android and Java applications, which can be obtained -at: - - * LICENSE: - * okhttp/third_party/okhttp/LICENSE (Apache License 2.0) - * HOMEPAGE: - * https://github.com/square/okhttp - * LOCATION_IN_GRPC: - * okhttp/third_party/okhttp - -This product contains a modified portion of 'Netty', an open source -networking library, which can be obtained at: - - * LICENSE: - * netty/third_party/netty/LICENSE.txt (Apache License 2.0) - * HOMEPAGE: - * https://netty.io - * LOCATION_IN_GRPC: - * netty/third_party/netty - -======================================================================== - -grpc NOTICE - -======================================================================== - -Copyright 2014 gRPC authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - - -======================================================================== - -netty NOTICE - -======================================================================== - - - The Netty Project - ================= - -Please visit the Netty web site for more information: - - * http://netty.io/ - -Copyright 2014 The Netty Project - -The Netty Project licenses this file to you under the Apache License, -version 2.0 (the "License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at: - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. - -Also, please refer to each LICENSE..txt file, which is located in -the 'license' directory of the distribution file, for the license terms of the -components that this product depends on. - -------------------------------------------------------------------------------- -This product contains the extensions to Java Collections Framework which has -been derived from the works by JSR-166 EG, Doug Lea, and Jason T. Greene: - - * LICENSE: - * license/LICENSE.jsr166y.txt (Public Domain) - * HOMEPAGE: - * http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/ - * http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbosscache/experimental/jsr166/ - -This product contains a modified version of Robert Harder's Public Domain -Base64 Encoder and Decoder, which can be obtained at: - - * LICENSE: - * license/LICENSE.base64.txt (Public Domain) - * HOMEPAGE: - * http://iharder.sourceforge.net/current/java/base64/ - -This product contains a modified portion of 'Webbit', an event based -WebSocket and HTTP server, which can be obtained at: - - * LICENSE: - * license/LICENSE.webbit.txt (BSD License) - * HOMEPAGE: - * https://github.com/joewalnes/webbit - -This product contains a modified portion of 'SLF4J', a simple logging -facade for Java, which can be obtained at: - - * LICENSE: - * license/LICENSE.slf4j.txt (MIT License) - * HOMEPAGE: - * http://www.slf4j.org/ - -This product contains a modified portion of 'Apache Harmony', an open source -Java SE, which can be obtained at: - - * NOTICE: - * license/NOTICE.harmony.txt - * LICENSE: - * license/LICENSE.harmony.txt (Apache License 2.0) - * HOMEPAGE: - * http://archive.apache.org/dist/harmony/ - -This product contains a modified portion of 'jbzip2', a Java bzip2 compression -and decompression library written by Matthew J. Francis. It can be obtained at: - - * LICENSE: - * license/LICENSE.jbzip2.txt (MIT License) - * HOMEPAGE: - * https://code.google.com/p/jbzip2/ - -This product contains a modified portion of 'libdivsufsort', a C API library to construct -the suffix array and the Burrows-Wheeler transformed string for any input string of -a constant-size alphabet written by Yuta Mori. It can be obtained at: - - * LICENSE: - * license/LICENSE.libdivsufsort.txt (MIT License) - * HOMEPAGE: - * https://github.com/y-256/libdivsufsort - -This product contains a modified portion of Nitsan Wakart's 'JCTools', Java Concurrency Tools for the JVM, - which can be obtained at: - - * LICENSE: - * license/LICENSE.jctools.txt (ASL2 License) - * HOMEPAGE: - * https://github.com/JCTools/JCTools - -This product optionally depends on 'JZlib', a re-implementation of zlib in -pure Java, which can be obtained at: - - * LICENSE: - * license/LICENSE.jzlib.txt (BSD style License) - * HOMEPAGE: - * http://www.jcraft.com/jzlib/ - -This product optionally depends on 'Compress-LZF', a Java library for encoding and -decoding data in LZF format, written by Tatu Saloranta. It can be obtained at: - - * LICENSE: - * license/LICENSE.compress-lzf.txt (Apache License 2.0) - * HOMEPAGE: - * https://github.com/ning/compress - -This product optionally depends on 'lz4', a LZ4 Java compression -and decompression library written by Adrien Grand. It can be obtained at: - - * LICENSE: - * license/LICENSE.lz4.txt (Apache License 2.0) - * HOMEPAGE: - * https://github.com/jpountz/lz4-java - -This product optionally depends on 'lzma-java', a LZMA Java compression -and decompression library, which can be obtained at: - - * LICENSE: - * license/LICENSE.lzma-java.txt (Apache License 2.0) - * HOMEPAGE: - * https://github.com/jponge/lzma-java - -This product contains a modified portion of 'jfastlz', a Java port of FastLZ compression -and decompression library written by William Kinney. It can be obtained at: - - * LICENSE: - * license/LICENSE.jfastlz.txt (MIT License) - * HOMEPAGE: - * https://code.google.com/p/jfastlz/ - -This product contains a modified portion of and optionally depends on 'Protocol Buffers', Google's data -interchange format, which can be obtained at: - - * LICENSE: - * license/LICENSE.protobuf.txt (New BSD License) - * HOMEPAGE: - * https://github.com/google/protobuf - -This product optionally depends on 'Bouncy Castle Crypto APIs' to generate -a temporary self-signed X.509 certificate when the JVM does not provide the -equivalent functionality. It can be obtained at: - - * LICENSE: - * license/LICENSE.bouncycastle.txt (MIT License) - * HOMEPAGE: - * http://www.bouncycastle.org/ - -This product optionally depends on 'Snappy', a compression library produced -by Google Inc, which can be obtained at: - - * LICENSE: - * license/LICENSE.snappy.txt (New BSD License) - * HOMEPAGE: - * https://github.com/google/snappy - -This product optionally depends on 'JBoss Marshalling', an alternative Java -serialization API, which can be obtained at: - - * LICENSE: - * license/LICENSE.jboss-marshalling.txt (GNU LGPL 2.1) - * HOMEPAGE: - * http://www.jboss.org/jbossmarshalling - -This product optionally depends on 'Caliper', Google's micro- -benchmarking framework, which can be obtained at: - - * LICENSE: - * license/LICENSE.caliper.txt (Apache License 2.0) - * HOMEPAGE: - * https://github.com/google/caliper - -This product optionally depends on 'Apache Commons Logging', a logging -framework, which can be obtained at: - - * LICENSE: - * license/LICENSE.commons-logging.txt (Apache License 2.0) - * HOMEPAGE: - * http://commons.apache.org/logging/ - -This product optionally depends on 'Apache Log4J', a logging framework, which -can be obtained at: - - * LICENSE: - * license/LICENSE.log4j.txt (Apache License 2.0) - * HOMEPAGE: - * http://logging.apache.org/log4j/ - -This product optionally depends on 'Aalto XML', an ultra-high performance -non-blocking XML processor, which can be obtained at: - - * LICENSE: - * license/LICENSE.aalto-xml.txt (Apache License 2.0) - * HOMEPAGE: - * http://wiki.fasterxml.com/AaltoHome - -This product contains a modified version of 'HPACK', a Java implementation of -the HTTP/2 HPACK algorithm written by Twitter. It can be obtained at: - - * LICENSE: - * license/LICENSE.hpack.txt (Apache License 2.0) - * HOMEPAGE: - * https://github.com/twitter/hpack - -This product contains a modified portion of 'Apache Commons Lang', a Java library -provides utilities for the java.lang API, which can be obtained at: - - * LICENSE: - * license/LICENSE.commons-lang.txt (Apache License 2.0) - * HOMEPAGE: - * https://commons.apache.org/proper/commons-lang/ - - -This product contains the Maven wrapper scripts from 'Maven Wrapper', that provides an easy way to ensure a user has everything necessary to run the Maven build. - - * LICENSE: - * license/LICENSE.mvn-wrapper.txt (Apache License 2.0) - * HOMEPAGE: - * https://github.com/takari/maven-wrapper - diff --git a/agent/hippo4j-agent-bootstrap/pom.xml b/agent/hippo4j-agent-bootstrap/pom.xml deleted file mode 100644 index c356aab4..00000000 --- a/agent/hippo4j-agent-bootstrap/pom.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-agent - ${revision} - - - hippo4j-agent-bootstrap - jar - - - UTF-8 - cn.hippo4j.agent.bootstrap.Hippo4jAgent - true - true - net.bytebuddy - ${shade.package}.${shade.net.bytebuddy.source} - - - - - cn.hippo4j - hippo4j-agent-core - - - - - hippo4j-threadpool-agent - - - maven-shade-plugin - 3.4.1 - - - package - - shade - - - false - true - true - true - - - - ${premain.class} - ${can.redefine.classes} - ${can.retransform.classes} - - - - - - *:gson - io.grpc:* - io.netty:* - io.opencensus:* - com.google.*:* - com.google.guava:guava - org.checkerframework:checker-compat-qual - org.codehaus.mojo:animal-sniffer-annotations - io.perfmark:* - org.slf4j:* - - - - - ${shade.net.bytebuddy.source} - ${shade.net.bytebuddy.target} - - - - - net.bytebuddy:byte-buddy - - META-INF/versions/9/module-info.class - - - - - - - - - maven-antrun-plugin - - - clean - clean - - run - - - - - - - - - package - package - - run - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/agent/hippo4j-agent-bootstrap/src/main/java/cn/hippo4j/agent/bootstrap/Hippo4jAgent.java b/agent/hippo4j-agent-bootstrap/src/main/java/cn/hippo4j/agent/bootstrap/Hippo4jAgent.java deleted file mode 100644 index 4da18b4a..00000000 --- a/agent/hippo4j-agent-bootstrap/src/main/java/cn/hippo4j/agent/bootstrap/Hippo4jAgent.java +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.bootstrap; - -import cn.hippo4j.agent.core.boot.ServiceManager; -import cn.hippo4j.agent.core.conf.SnifferConfigInitializer; -import cn.hippo4j.agent.core.jvm.LoadedLibraryCollector; -import cn.hippo4j.agent.core.plugin.AbstractClassEnhancePluginDefine; -import cn.hippo4j.agent.core.plugin.EnhanceContext; -import cn.hippo4j.agent.core.plugin.InstrumentDebuggingClass; -import cn.hippo4j.agent.core.plugin.PluginBootstrap; -import cn.hippo4j.agent.core.plugin.PluginException; -import cn.hippo4j.agent.core.plugin.PluginFinder; -import cn.hippo4j.agent.core.plugin.bootstrap.BootstrapInstrumentBoost; -import cn.hippo4j.agent.core.plugin.bytebuddy.CacheableTransformerDecorator; -import cn.hippo4j.agent.core.plugin.jdk9module.JDK9ModuleExporter; -import cn.hippo4j.common.boot.AgentPackageNotFoundException; -import cn.hippo4j.common.conf.Config; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import net.bytebuddy.ByteBuddy; -import net.bytebuddy.agent.builder.AgentBuilder; -import net.bytebuddy.description.NamedElement; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.dynamic.DynamicType; -import net.bytebuddy.dynamic.scaffold.TypeValidation; -import net.bytebuddy.matcher.ElementMatcher; -import net.bytebuddy.matcher.ElementMatchers; -import net.bytebuddy.utility.JavaModule; - -import java.lang.instrument.Instrumentation; -import java.security.ProtectionDomain; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import static net.bytebuddy.matcher.ElementMatchers.nameContains; -import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; -import static net.bytebuddy.matcher.ElementMatchers.not; - -/** - * Hippo4j Agent - */ -public class Hippo4jAgent { - - private static ILog LOGGER = LogManager.getLogger(Hippo4jAgent.class); - - /** - * Main entrance. Use byte-buddy transform to enhance all classes, which define in plugins. - */ - public static void premain(String agentArgs, Instrumentation instrumentation) throws PluginException { - final PluginFinder pluginFinder; - try { - SnifferConfigInitializer.initializeCoreConfig(agentArgs); - } catch (Exception e) { - // try to resolve a new logger, and use the new logger to write the error log here - LogManager.getLogger(Hippo4jAgent.class) - .error(e, "Hippo4j agent initialized failure. Shutting down."); - return; - } finally { - // refresh logger again after initialization finishes - LOGGER = LogManager.getLogger(Hippo4jAgent.class); - } - - try { - pluginFinder = new PluginFinder(new PluginBootstrap().loadPlugins()); - } catch (AgentPackageNotFoundException ape) { - LOGGER.error(ape, "Locate agent.jar failure. Shutting down."); - return; - } catch (Exception e) { - LOGGER.error(e, "Hippo4j agent initialized failure. Shutting down."); - return; - } - - final ByteBuddy byteBuddy = new ByteBuddy().with(TypeValidation.of(Config.Agent.IS_OPEN_DEBUGGING_CLASS)); - - AgentBuilder agentBuilder = new AgentBuilder.Default(byteBuddy).ignore( - nameStartsWith("net.bytebuddy.") - .or(nameStartsWith("org.slf4j.")) - .or(nameStartsWith("org.groovy.")) - .or(nameContains("javassist")) - .or(nameContains(".asm.")) - .or(nameContains(".reflectasm.")) - .or(nameStartsWith("sun.reflect")) - .or(allHippo4jAgentExcludeToolkit()) - .or(ElementMatchers.isSynthetic())); - - JDK9ModuleExporter.EdgeClasses edgeClasses = new JDK9ModuleExporter.EdgeClasses(); - try { - agentBuilder = BootstrapInstrumentBoost.inject(pluginFinder, instrumentation, agentBuilder, edgeClasses); - } catch (Exception e) { - LOGGER.error(e, "Hippo4j agent inject bootstrap instrumentation failure. Shutting down."); - return; - } - - try { - agentBuilder = JDK9ModuleExporter.openReadEdge(instrumentation, agentBuilder, edgeClasses); - } catch (Exception e) { - LOGGER.error(e, "Hippo4j agent open read edge in JDK 9+ failure. Shutting down."); - return; - } - - if (Config.Agent.IS_CACHE_ENHANCED_CLASS) { - try { - agentBuilder = agentBuilder.with(new CacheableTransformerDecorator(Config.Agent.CLASS_CACHE_MODE)); - LOGGER.info("Hippo4j agent class cache [{}] activated.", Config.Agent.CLASS_CACHE_MODE); - } catch (Exception e) { - LOGGER.error(e, "Hippo4j agent can't active class cache."); - } - } - - agentBuilder.type(pluginFinder.buildMatch()) - .transform(new Transformer(pluginFinder)) - .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION) - .with(new RedefinitionListener()) - .with(new Listener()) - .installOn(instrumentation); - - PluginFinder.pluginInitCompleted(); - - try { - ServiceManager.INSTANCE.boot(); - } catch (Exception e) { - LOGGER.error(e, "Hippo4j agent boot failure."); - } - - try { - Class.forName("java.util.concurrent.ThreadPoolExecutor"); - } catch (ClassNotFoundException e) { - LOGGER.error(e, "Hippo4j agent boot failure."); - } - - Runtime.getRuntime() - .addShutdownHook(new Thread(ServiceManager.INSTANCE::shutdown, "hippo4j service shutdown thread")); - } - - /** - * transformer - */ - private static class Transformer implements AgentBuilder.Transformer { - - private PluginFinder pluginFinder; - - Transformer(PluginFinder pluginFinder) { - this.pluginFinder = pluginFinder; - } - - @Override - public DynamicType.Builder transform(final DynamicType.Builder builder, - final TypeDescription typeDescription, - final ClassLoader classLoader, - final JavaModule javaModule, - final ProtectionDomain protectionDomain) { - LoadedLibraryCollector.registerURLClassLoader(classLoader); - List pluginDefines = pluginFinder.find(typeDescription); - if (pluginDefines.size() > 0) { - DynamicType.Builder newBuilder = builder; - EnhanceContext context = new EnhanceContext(); - for (AbstractClassEnhancePluginDefine define : pluginDefines) { - DynamicType.Builder possibleNewBuilder = define.define( - typeDescription, newBuilder, classLoader, context); - if (possibleNewBuilder != null) { - newBuilder = possibleNewBuilder; - } - } - if (context.isEnhanced()) { - LOGGER.debug("Finish the prepare stage for {}.", typeDescription.getName()); - } - - return newBuilder; - } - - LOGGER.debug("Matched class {}, but ignore by finding mechanism.", typeDescription.getTypeName()); - return builder; - } - } - - private static ElementMatcher.Junction allHippo4jAgentExcludeToolkit() { - return nameStartsWith("cn.hippo4j").and(not(nameStartsWith("cn.hippo4j.agent.toolkit."))); - } - - /** - * listener - */ - private static class Listener implements AgentBuilder.Listener { - - @Override - public void onDiscovery(String typeName, ClassLoader classLoader, JavaModule module, boolean loaded) { - - } - - @Override - public void onTransformation(final TypeDescription typeDescription, - final ClassLoader classLoader, - final JavaModule module, - final boolean loaded, - final DynamicType dynamicType) { - if (LOGGER.isDebugEnable()) { - LOGGER.debug("On Transformation class {}.", typeDescription.getName()); - } - - InstrumentDebuggingClass.INSTANCE.log(dynamicType); - } - - @Override - public void onIgnored(final TypeDescription typeDescription, - final ClassLoader classLoader, - final JavaModule module, - final boolean loaded) { - - } - - @Override - public void onError(final String typeName, - final ClassLoader classLoader, - final JavaModule module, - final boolean loaded, - final Throwable throwable) { - LOGGER.error("Enhance class " + typeName + " error.", throwable); - } - - @Override - public void onComplete(String typeName, ClassLoader classLoader, JavaModule module, boolean loaded) { - } - } - - /** - * redefinition listener - */ - private static class RedefinitionListener implements AgentBuilder.RedefinitionStrategy.Listener { - - @Override - public void onBatch(int index, List> batch, List> types) { - /* do nothing */ - } - - @Override - public Iterable>> onError(int index, List> batch, Throwable throwable, List> types) { - LOGGER.error(throwable, "index={}, batch={}, types={}", index, batch, types); - return Collections.emptyList(); - } - - @Override - public void onComplete(int amount, List> types, Map>, Throwable> failures) { - /* do nothing */ - } - } -} diff --git a/agent/hippo4j-agent-core/pom.xml b/agent/hippo4j-agent-core/pom.xml deleted file mode 100644 index b21dc0df..00000000 --- a/agent/hippo4j-agent-core/pom.xml +++ /dev/null @@ -1,175 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-agent - ${revision} - - - hippo4j-agent-core - jar - - - UTF-8 - 2.0.7.Final - 1.4.1.Final - com.google - ${shade.package}.${shade.com.google.source} - io.grpc - ${shade.package}.${shade.io.grpc.source} - io.netty - ${shade.package}.${shade.io.netty.source} - io.opencensus - ${shade.package}.${shade.io.opencensus.source} - io.perfmark - ${shade.package}.${shade.io.perfmark.source} - org.slf4j - ${shade.package}.${shade.org.slf4j.source} - 1.18.0 - 2.3.1 - - - - - net.bytebuddy - byte-buddy - - - com.google.code.gson - gson - - - org.projectlombok - lombok - - - net.bytebuddy - byte-buddy-agent - test - - - com.github.tomakehurst - wiremock - test - - - jackson-annotations - com.fasterxml.jackson.core - - - jackson-core - com.fasterxml.jackson.core - - - jackson-databind - com.fasterxml.jackson.core - - - - - org.openjdk.jmh - jmh-generator-annprocess - test - - - cn.hippo4j - hippo4j-threadpool-infra-common - ${project.version} - - - - javax.xml.bind - jaxb-api - ${jaxb.version} - - - com.sun.xml.bind - jaxb-impl - ${jaxb.version} - - - - - - - kr.motd.maven - os-maven-plugin - ${os-maven-plugin.version} - - - initialize - - detect - - - - - - maven-shade-plugin - 3.4.1 - - - package - - shade - - - - - net.bytebuddy:byte-buddy:jar: - com.google.errorprone:error_prone_annotations:jar: - com.google.code.findbugs:jsr305:jar: - com.google.android:annotations:jar: - com.google.api.grpc:proto-google-common-protos:jar: - org.checkerframework:checker-compat-qual:jar: - org.codehaus.mojo:animal-sniffer-annotations:jar: - - - - - ${shade.com.google.source} - ${shade.com.google.target} - - - ${shade.io.grpc.source} - ${shade.io.grpc.target} - - - ${shade.io.netty.source} - ${shade.io.netty.target} - - - ${shade.io.opencensus.source} - ${shade.io.opencensus.target} - - - ${shade.io.perfmark.source} - ${shade.io.perfmark.target} - - - ${shade.org.slf4j.source} - ${shade.org.slf4j.target} - - - - - com.google.protobuf:protobuf-java - - google/protobuf/*.proto - google/protobuf/compiler/*.proto - - - - - - - - - - - - - \ No newline at end of file diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/base64/Base64.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/base64/Base64.java deleted file mode 100644 index 7e7c8337..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/base64/Base64.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.base64; - -import java.nio.charset.StandardCharsets; - -/** - * A wrapper of {@link java.util.Base64} with convenient conversion methods between {@code byte[]} and {@code String} - */ -public final class Base64 { - - private static final java.util.Base64.Decoder DECODER = java.util.Base64.getDecoder(); - private static final java.util.Base64.Encoder ENCODER = java.util.Base64.getEncoder(); - - private Base64() { - } - - public static String decode2UTFString(String in) { - return new String(DECODER.decode(in), StandardCharsets.UTF_8); - } - - public static String encode(String text) { - return ENCODER.encodeToString(text.getBytes(StandardCharsets.UTF_8)); - } - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/AgentPackagePath.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/AgentPackagePath.java deleted file mode 100644 index 02b3c665..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/AgentPackagePath.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.boot; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.common.boot.AgentPackageNotFoundException; - -import java.io.File; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; - -/** - * AgentPackagePath is a flag and finder to locate the Hippo4j agent.jar. It gets the absolute path of the agent jar. - * The path is the required metadata for agent core looking up the plugins and toolkit activations. If the lookup - * mechanism fails, the agent will exit directly. - */ -public class AgentPackagePath { - - private static final ILog LOGGER = LogManager.getLogger(AgentPackagePath.class); - - private static File AGENT_PACKAGE_PATH; - - public static File getPath() throws AgentPackageNotFoundException { - if (AGENT_PACKAGE_PATH == null) { - AGENT_PACKAGE_PATH = findPath(); - } - return AGENT_PACKAGE_PATH; - } - - public static boolean isPathFound() { - return AGENT_PACKAGE_PATH != null; - } - - private static File findPath() throws AgentPackageNotFoundException { - String classResourcePath = AgentPackagePath.class.getName().replaceAll("\\.", "/") + ".class"; - - URL resource = ClassLoader.getSystemClassLoader().getResource(classResourcePath); - if (resource != null) { - String urlString = resource.toString(); - - LOGGER.debug("The beacon class location is {}.", urlString); - - int insidePathIndex = urlString.indexOf('!'); - boolean isInJar = insidePathIndex > -1; - - if (isInJar) { - urlString = urlString.substring(urlString.indexOf("file:"), insidePathIndex); - File agentJarFile = null; - try { - agentJarFile = new File(new URL(urlString).toURI()); - } catch (MalformedURLException | URISyntaxException e) { - LOGGER.error(e, "Can not locate agent jar file by url:" + urlString); - } - if (agentJarFile.exists()) { - return agentJarFile.getParentFile(); - } - } else { - int prefixLength = "file:".length(); - String classLocation = urlString.substring( - prefixLength, urlString.length() - classResourcePath.length()); - return new File(classLocation); - } - } - - LOGGER.error("Can not locate agent jar file."); - throw new AgentPackageNotFoundException("Can not locate agent jar file."); - } - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/BootService.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/BootService.java deleted file mode 100644 index c854df5f..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/BootService.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.boot; - -/** - * The BootService is an interface to all remote, which need to boot when plugin mechanism begins to work. - * {@link #boot()} will be called when BootService start up. - */ -public interface BootService { - - void prepare() throws Throwable; - - void boot() throws Throwable; - - void onComplete() throws Throwable; - - void shutdown() throws Throwable; - - /** - * {@code BootService}s with higher priorities will be started earlier, and shut down later than those {@code BootService}s with lower priorities. - * - * @return the priority of this {@code BootService}. - */ - default int priority() { - return 0; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/DefaultImplementor.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/DefaultImplementor.java deleted file mode 100644 index b8f21af8..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/DefaultImplementor.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.boot; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface DefaultImplementor { -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/OverrideImplementor.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/OverrideImplementor.java deleted file mode 100644 index 59fff1e0..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/OverrideImplementor.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.boot; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface OverrideImplementor { - - Class value(); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/PluginConfig.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/PluginConfig.java deleted file mode 100644 index 8b175bc6..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/PluginConfig.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.boot; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * ConfigInitializationService provides the config class which should host all parameters originally from agent setup. - * {@link cn.hippo4j.agent.core.conf.Config} provides the core level config, all plugins could implement - * this interface to have the same capability about initializing config from agent.config, system properties and system - * environment variables. - */ -@Target({ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -public @interface PluginConfig { - - /** - * @return Class as the root to do config initialization. - */ - Class root(); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/ServiceConflictException.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/ServiceConflictException.java deleted file mode 100644 index f91f46a2..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/ServiceConflictException.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.boot; - -public class ServiceConflictException extends RuntimeException { - - public ServiceConflictException(String message) { - super(message); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/ServiceManager.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/ServiceManager.java deleted file mode 100644 index 7391f1c2..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/ServiceManager.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.boot; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.plugin.loader.AgentClassLoader; - -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.ServiceLoader; - -/** - * The ServiceManager bases on {@link ServiceLoader}, load all {@link BootService} implementations. - */ -public enum ServiceManager { - - INSTANCE; - - private static final ILog LOGGER = LogManager.getLogger(ServiceManager.class); - private Map bootedServices = Collections.emptyMap(); - - public void boot() { - bootedServices = loadAllServices(); - - prepare(); - startup(); - onComplete(); - } - - public void shutdown() { - bootedServices.values().stream().sorted(Comparator.comparingInt(BootService::priority).reversed()).forEach(service -> { - try { - service.shutdown(); - } catch (Throwable e) { - LOGGER.error(e, "ServiceManager try to shutdown [{}] fail.", service.getClass().getName()); - } - }); - } - - private Map loadAllServices() { - Map bootedServices = new LinkedHashMap<>(); - List allServices = new LinkedList<>(); - load(allServices); - for (final BootService bootService : allServices) { - Class bootServiceClass = bootService.getClass(); - boolean isDefaultImplementor = bootServiceClass.isAnnotationPresent(DefaultImplementor.class); - if (isDefaultImplementor) { - if (!bootedServices.containsKey(bootServiceClass)) { - bootedServices.put(bootServiceClass, bootService); - } else { - // ignore the default service - } - } else { - OverrideImplementor overrideImplementor = bootServiceClass.getAnnotation(OverrideImplementor.class); - if (overrideImplementor == null) { - if (!bootedServices.containsKey(bootServiceClass)) { - bootedServices.put(bootServiceClass, bootService); - } else { - throw new ServiceConflictException("Duplicate service define for :" + bootServiceClass); - } - } else { - Class targetService = overrideImplementor.value(); - if (bootedServices.containsKey(targetService)) { - boolean presentDefault = bootedServices.get(targetService) - .getClass() - .isAnnotationPresent(DefaultImplementor.class); - if (presentDefault) { - bootedServices.put(targetService, bootService); - } else { - throw new ServiceConflictException( - "Service " + bootServiceClass + " overrides conflict, " + "exist more than one service want to override :" + targetService); - } - } else { - bootedServices.put(targetService, bootService); - } - } - } - - } - return bootedServices; - } - - private void prepare() { - bootedServices.values().stream().sorted(Comparator.comparingInt(BootService::priority)).forEach(service -> { - try { - service.prepare(); - } catch (Throwable e) { - LOGGER.error(e, "ServiceManager try to pre-start [{}] fail.", service.getClass().getName()); - } - }); - } - - private void startup() { - bootedServices.values().stream().sorted(Comparator.comparingInt(BootService::priority)).forEach(service -> { - try { - service.boot(); - } catch (Throwable e) { - LOGGER.error(e, "ServiceManager try to start [{}] fail.", service.getClass().getName()); - } - }); - } - - private void onComplete() { - for (BootService service : bootedServices.values()) { - try { - service.onComplete(); - } catch (Throwable e) { - LOGGER.error(e, "Service [{}] AfterBoot process fails.", service.getClass().getName()); - } - } - } - - /** - * Find a {@link BootService} implementation, which is already started. - * - * @param serviceClass class name. - * @param {@link BootService} implementation class. - * @return {@link BootService} instance - */ - public T findService(Class serviceClass) { - return (T) bootedServices.get(serviceClass); - } - - void load(List allServices) { - for (final BootService bootService : ServiceLoader.load(BootService.class, AgentClassLoader.getDefault())) { - allServices.add(bootService); - } - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/SpringBootConfigInitializer.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/SpringBootConfigInitializer.java deleted file mode 100644 index 5d12c1e6..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/SpringBootConfigInitializer.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.boot; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.util.ConfigInitializer; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Properties; -import java.util.Set; - -public class SpringBootConfigInitializer { - - private static final ILog LOG = LogManager.getLogger(SpringBootConfigInitializer.class); - - private static final Set> SPRING_BOOT_CONFIG_LIST = Collections.synchronizedSet(new HashSet<>()); - - private static final long MAX_CACHE_TIME = 30L * 60L * 1000L; // half an hour. - - private static final int MAX_CACHE_SIZE = 1000; - - private static long PROPERTIES_LOAD_TIME; - - public static Properties SPRING_PROPERTIES = null; - - private SpringBootConfigInitializer() { - - } - - public static boolean isSpringPropertiesEmpty() { - return SPRING_PROPERTIES == null || SPRING_PROPERTIES.isEmpty(); - } - - public static synchronized void initializeConfig(SpringBootConfigNode springBootConfig) { - if (SPRING_PROPERTIES != null) { - try { - LOG.info("initialize Spring Config Class {}.", springBootConfig.root()); - ConfigInitializer.initialize(SPRING_PROPERTIES, springBootConfig.root(), true); - } catch (Throwable e) { - LOG.error(e, "Failed to set the agent settings {} to Config={} ", SPRING_PROPERTIES, springBootConfig.root()); - } - } - boolean isStarting = PROPERTIES_LOAD_TIME == 0L; - boolean overtime = System.currentTimeMillis() - PROPERTIES_LOAD_TIME > MAX_CACHE_TIME; - boolean oversize = SPRING_BOOT_CONFIG_LIST.size() > MAX_CACHE_SIZE; - // avoid memory leak. - if (isStarting || (!oversize && !overtime)) { - SPRING_BOOT_CONFIG_LIST.add(springBootConfig.root()); - } else { - LOG.warn("spirng Config Class is skipped {}.", springBootConfig.root()); - } - } - - public static synchronized void setSpringProperties(Properties properties) { - if (properties != null && (SPRING_PROPERTIES == null || properties.size() > SPRING_PROPERTIES.size())) { - LOG.info("set Spring Config Properties before : {}.", SPRING_PROPERTIES); - SPRING_PROPERTIES = properties; - LOG.info("set Spring Config Properties after : {}.", SPRING_PROPERTIES); - PROPERTIES_LOAD_TIME = System.currentTimeMillis(); - } - for (Class clazz : SPRING_BOOT_CONFIG_LIST) { - try { - LOG.info("initialize Spring Config Class in loop {}.", clazz); - ConfigInitializer.initialize(SPRING_PROPERTIES, clazz); - } catch (Throwable e) { - LOG.error(e, "Failed to set the agent Config={} from settings {}", clazz, properties); - } - } - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/SpringBootConfigNode.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/SpringBootConfigNode.java deleted file mode 100644 index 01350ca2..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/boot/SpringBootConfigNode.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.boot; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target({ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -public @interface SpringBootConfigNode { - - /** - * @return Class as the root to do config initialization. - */ - Class root(); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/conf/Constants.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/conf/Constants.java deleted file mode 100644 index 25f3d7bb..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/conf/Constants.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.conf; - -public class Constants { - - public static String PATH_SEPARATOR = System.getProperty("file.separator", "/"); - - public static String LINE_SEPARATOR = System.getProperty("line.separator", "\n"); - - public static String EMPTY_STRING = ""; - - public static char SERVICE_NAME_PART_CONNECTOR = '|'; - - // The name of the layer that represents agent-installed services, - // which is defined at - // https://github.com/apache/skywalking/blob/85ce1645be53e46286f36c0ea206c60db2d1a716/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/Layer.java#L30 - public static String EVENT_LAYER_NAME = "GENERAL"; - - public static int NULL_VALUE = 0; - - public static String SPRING_BOOT_CONFIG_PREFIX = "spring.dynamic.thread-pool"; - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/conf/SnifferConfigInitializer.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/conf/SnifferConfigInitializer.java deleted file mode 100644 index b8f8f4d0..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/conf/SnifferConfigInitializer.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.conf; - -import cn.hippo4j.agent.core.boot.AgentPackagePath; -import cn.hippo4j.agent.core.util.PropertyPlaceholderHelper; -import cn.hippo4j.agent.core.util.StringUtil; -import cn.hippo4j.common.boot.AgentPackageNotFoundException; -import cn.hippo4j.common.conf.Config; -import cn.hippo4j.common.conf.ConfigNotFoundException; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.common.logging.core.JsonLogResolver; -import cn.hippo4j.common.logging.core.PatternLogResolver; -import cn.hippo4j.common.toolkit.agent.ConfigInitializer; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import static cn.hippo4j.common.conf.Constants.SERVICE_NAME_PART_CONNECTOR; - -/** - * The SnifferConfigInitializer initializes all configs in several way. - */ -public class SnifferConfigInitializer { - - private static ILog LOGGER = LogManager.getLogger(SnifferConfigInitializer.class); - private static final String SPECIFIED_CONFIG_PATH = "hippo4j_config"; - private static final String DEFAULT_CONFIG_FILE_NAME = "/config/agent.config"; - private static final String ENV_KEY_PREFIX = "hippo4j."; - private static Properties AGENT_SETTINGS; - private static boolean IS_INIT_COMPLETED = false; - - /** - * If the specified agent config path is set, the agent will try to locate the specified agent config. If the - * specified agent config path is not set , the agent will try to locate `agent.config`, which should be in the - * /config directory of agent package. - *

- * Also try to override the config by system.properties. All the keys in this place should start with {@link - * #ENV_KEY_PREFIX}. e.g. in env `hippo4j.agent.service_name=yourAppName` to override `agent.service_name` in - * config file. - *

- * At the end, `agent.service_name` and `collector.servers` must not be blank. - */ - public static void initializeCoreConfig(String agentOptions) { - AGENT_SETTINGS = new Properties(); - try (final InputStreamReader configFileStream = loadConfig()) { - AGENT_SETTINGS.load(configFileStream); - for (String key : AGENT_SETTINGS.stringPropertyNames()) { - String value = (String) AGENT_SETTINGS.get(key); - AGENT_SETTINGS.put(key, PropertyPlaceholderHelper.INSTANCE.replacePlaceholders(value, AGENT_SETTINGS)); - } - - } catch (Exception e) { - LOGGER.error(e, "Failed to read the config file, hippo4j is going to run in default config."); - } - - try { - overrideConfigBySystemProp(); - } catch (Exception e) { - LOGGER.error(e, "Failed to read the system properties."); - } - - agentOptions = StringUtil.trim(agentOptions, ','); - if (!StringUtil.isEmpty(agentOptions)) { - try { - agentOptions = agentOptions.trim(); - LOGGER.info("Agent options is {}.", agentOptions); - - overrideConfigByAgentOptions(agentOptions); - } catch (Exception e) { - LOGGER.error(e, "Failed to parse the agent options, val is {}.", agentOptions); - } - } - - initializeConfig(Config.class); - // reconfigure logger after config initialization - configureLogger(); - LOGGER = LogManager.getLogger(SnifferConfigInitializer.class); - - if (StringUtil.isEmpty(Config.Agent.SERVICE_NAME)) { - throw new ExceptionInInitializerError("`agent.service_name` is missing."); - } else { - if (StringUtil.isNotEmpty(Config.Agent.NAMESPACE) || StringUtil.isNotEmpty(Config.Agent.CLUSTER)) { - Config.Agent.SERVICE_NAME = StringUtil.join( - SERVICE_NAME_PART_CONNECTOR, - Config.Agent.SERVICE_NAME, - Config.Agent.NAMESPACE, - Config.Agent.CLUSTER); - } - } - // if (StringUtil.isEmpty(Config.Collector.BACKEND_SERVICE)) { - // throw new ExceptionInInitializerError("`collector.backend_service` is missing."); - // } - if (Config.Plugin.PEER_MAX_LENGTH <= 3) { - LOGGER.warn( - "PEER_MAX_LENGTH configuration:{} error, the default value of 200 will be used.", - Config.Plugin.PEER_MAX_LENGTH); - Config.Plugin.PEER_MAX_LENGTH = 200; - } - - IS_INIT_COMPLETED = true; - } - - /** - * Initialize field values of any given config class. - * - * @param configClass to host the settings for code access. - */ - public static void initializeConfig(Class configClass) { - if (AGENT_SETTINGS == null) { - LOGGER.error("Plugin configs have to be initialized after core config initialization."); - return; - } - try { - ConfigInitializer.initialize(AGENT_SETTINGS, configClass); - } catch (IllegalAccessException e) { - LOGGER.error(e, - "Failed to set the agent settings {}" - + " to Config={} ", - AGENT_SETTINGS, configClass); - } - } - - private static void overrideConfigByAgentOptions(String agentOptions) throws IllegalArgumentException { - for (List terms : parseAgentOptions(agentOptions)) { - if (terms.size() != 2) { - throw new IllegalArgumentException("[" + terms + "] is not a key-value pair."); - } - AGENT_SETTINGS.put(terms.get(0), terms.get(1)); - } - } - - private static List> parseAgentOptions(String agentOptions) { - List> options = new ArrayList<>(); - List terms = new ArrayList<>(); - boolean isInQuotes = false; - StringBuilder currentTerm = new StringBuilder(); - for (char c : agentOptions.toCharArray()) { - if (c == '\'' || c == '"') { - isInQuotes = !isInQuotes; - } else if (c == '=' && !isInQuotes) { // key-value pair uses '=' as separator - terms.add(currentTerm.toString()); - currentTerm = new StringBuilder(); - } else if (c == ',' && !isInQuotes) { // multiple options use ',' as separator - terms.add(currentTerm.toString()); - currentTerm = new StringBuilder(); - - options.add(terms); - terms = new ArrayList<>(); - } else { - currentTerm.append(c); - } - } - // add the last term and option without separator - terms.add(currentTerm.toString()); - options.add(terms); - return options; - } - - public static boolean isInitCompleted() { - return IS_INIT_COMPLETED; - } - - /** - * Override the config by system properties. The property key must start with `hippo4j`, the result should be as - * same as in `agent.config` - *

- * such as: Property key of `agent.service_name` should be `hippo4j.agent.service_name` - */ - private static void overrideConfigBySystemProp() { - Properties systemProperties = System.getProperties(); - for (final Map.Entry prop : systemProperties.entrySet()) { - String key = prop.getKey().toString(); - if (key.startsWith(ENV_KEY_PREFIX)) { - String realKey = key.substring(ENV_KEY_PREFIX.length()); - AGENT_SETTINGS.put(realKey, prop.getValue()); - } - } - } - - /** - * Load the specified config file or default config file - * - * @return the config file {@link InputStream}, or null if not needEnhance. - */ - private static InputStreamReader loadConfig() throws AgentPackageNotFoundException, cn.hippo4j.common.conf.ConfigNotFoundException { - String specifiedConfigPath = System.getProperty(SPECIFIED_CONFIG_PATH); - File configFile = StringUtil.isEmpty(specifiedConfigPath) ? new File( - AgentPackagePath.getPath(), DEFAULT_CONFIG_FILE_NAME) : new File(specifiedConfigPath); - - if (configFile.exists() && configFile.isFile()) { - try { - LOGGER.info("Config file found in {}.", configFile); - - return new InputStreamReader(new FileInputStream(configFile), StandardCharsets.UTF_8); - } catch (FileNotFoundException e) { - throw new ConfigNotFoundException("Failed to load agent.config", e); - } - } - throw new ConfigNotFoundException("Failed to load agent.config."); - } - - static void configureLogger() { - switch (Config.Logging.RESOLVER) { - case JSON: - LogManager.setLogResolver(new JsonLogResolver()); - break; - case PATTERN: - default: - LogManager.setLogResolver(new PatternLogResolver()); - } - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/conf/dynamic/AgentConfigChangeWatcher.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/conf/dynamic/AgentConfigChangeWatcher.java deleted file mode 100644 index e896584d..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/conf/dynamic/AgentConfigChangeWatcher.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.conf.dynamic; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -public abstract class AgentConfigChangeWatcher { - - // Config key, should match KEY in the Table of Agent Configuration Properties. - private final String propertyKey; - - public AgentConfigChangeWatcher(String propertyKey) { - this.propertyKey = propertyKey; - } - - /** - * Notify the watcher, the new value received. - * - * @param value of new. - */ - public abstract void notify(ConfigChangeEvent value); - - /** - * @return current value of current config. - */ - public abstract String value(); - - @Override - public String toString() { - return "AgentConfigChangeWatcher{" - + "propertyKey='" + propertyKey + '\'' - + '}'; - } - - @Getter - @RequiredArgsConstructor - public static class ConfigChangeEvent { - - private final String newValue; - private final EventType eventType; - } - - public enum EventType { - ADD, MODIFY, DELETE - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/jvm/LoadedLibraryCollector.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/jvm/LoadedLibraryCollector.java deleted file mode 100644 index aebec1f0..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/jvm/LoadedLibraryCollector.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.jvm; - -import cn.hippo4j.agent.core.util.CollectionUtil; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -import java.io.File; -import java.lang.management.ManagementFactory; -import java.net.URL; -import java.net.URLClassLoader; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public class LoadedLibraryCollector { - - private static final ILog LOGGER = LogManager.getLogger(LoadedLibraryCollector.class); - private static final String JAR_SEPARATOR = "!"; - private static Set CURRENT_URL_CLASSLOADER_SET = new HashSet<>(); - private static final Gson GSON = new GsonBuilder().disableHtmlEscaping().create(); - /** - * Prevent OOM in special scenes - */ - private static int CURRENT_URL_CLASSLOADER_SET_MAX_SIZE = 50; - - public static void registerURLClassLoader(ClassLoader classLoader) { - if (CURRENT_URL_CLASSLOADER_SET.size() < CURRENT_URL_CLASSLOADER_SET_MAX_SIZE && classLoader instanceof URLClassLoader) { - CURRENT_URL_CLASSLOADER_SET.add(classLoader); - } - } - - private static String getVmStartTime() { - long startTime = ManagementFactory.getRuntimeMXBean().getStartTime(); - return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(startTime)); - } - - private static List getVmArgs() { - List vmArgs = ManagementFactory.getRuntimeMXBean().getInputArguments(); - List sortedVmArgs = new ArrayList<>(vmArgs); - Collections.sort(sortedVmArgs); - return sortedVmArgs; - } - - private static List getLibJarNames() { - List classLoaderUrls = loadClassLoaderUrls(); - return extractLibJarNamesFromURLs(classLoaderUrls); - } - - private static List loadClassLoaderUrls() { - List classLoaderUrls = new ArrayList<>(); - for (ClassLoader classLoader : CURRENT_URL_CLASSLOADER_SET) { - try { - URLClassLoader webappClassLoader = (URLClassLoader) classLoader; - URL[] urls = webappClassLoader.getURLs(); - classLoaderUrls.addAll(Arrays.asList(urls)); - } catch (Exception e) { - LOGGER.warn("Load classloader urls exception: {}", e.getMessage()); - } - } - return classLoaderUrls; - } - - private static List extractLibJarNamesFromURLs(List urls) { - Set libJarNames = new HashSet<>(); - for (URL url : urls) { - try { - String libJarName = extractLibJarName(url); - if (libJarName.endsWith(".jar")) { - libJarNames.add(libJarName); - } - } catch (Exception e) { - LOGGER.warn("Extracting library name exception: {}", e.getMessage()); - } - } - List sortedLibJarNames = new ArrayList<>(libJarNames.size()); - if (!CollectionUtil.isEmpty(libJarNames)) { - sortedLibJarNames.addAll(libJarNames); - Collections.sort(sortedLibJarNames); - } - return sortedLibJarNames; - } - - private static String extractLibJarName(URL url) { - String protocol = url.getProtocol(); - if (protocol.equals("file")) { - return extractNameFromFile(url.toString()); - } else if (protocol.equals("jar")) { - return extractNameFromJar(url.toString()); - } else { - return ""; - } - } - - private static String extractNameFromFile(String fileUri) { - int lastIndexOfSeparator = fileUri.lastIndexOf(File.separator); - if (lastIndexOfSeparator < 0) { - return fileUri; - } else { - return fileUri.substring(lastIndexOfSeparator + 1); - } - } - - private static String extractNameFromJar(String jarUri) { - String uri = jarUri.substring(0, jarUri.lastIndexOf(JAR_SEPARATOR)); - return extractNameFromFile(uri); - } - -} \ No newline at end of file diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/os/OSUtil.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/os/OSUtil.java deleted file mode 100644 index c3040fff..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/os/OSUtil.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.os; - -import java.lang.management.ManagementFactory; -import java.net.Inet4Address; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.util.Enumeration; -import java.util.LinkedList; -import java.util.List; - -public class OSUtil { - - private static volatile String OS_NAME; - private static volatile String HOST_NAME; - private static volatile List IPV4_LIST; - private static volatile int PROCESS_NO = 0; - - public static String getOsName() { - if (OS_NAME == null) { - OS_NAME = System.getProperty("os.name"); - } - return OS_NAME; - } - - public static String getHostName() { - if (HOST_NAME == null) { - try { - InetAddress host = InetAddress.getLocalHost(); - HOST_NAME = host.getHostName(); - } catch (UnknownHostException e) { - HOST_NAME = "unknown"; - } - } - return HOST_NAME; - } - - public static List getAllIPV4() { - if (IPV4_LIST == null) { - IPV4_LIST = new LinkedList<>(); - try { - Enumeration interfs = NetworkInterface.getNetworkInterfaces(); - while (interfs.hasMoreElements()) { - NetworkInterface networkInterface = interfs.nextElement(); - Enumeration inetAddresses = networkInterface.getInetAddresses(); - while (inetAddresses.hasMoreElements()) { - InetAddress address = inetAddresses.nextElement(); - if (address instanceof Inet4Address) { - String addressStr = address.getHostAddress(); - if ("127.0.0.1".equals(addressStr)) { - continue; - } else if ("localhost".equals(addressStr)) { - continue; - } - IPV4_LIST.add(addressStr); - } - } - } - } catch (SocketException e) { - - } - } - return IPV4_LIST; - } - - public static String getIPV4() { - final List allIPV4 = getAllIPV4(); - if (allIPV4.size() > 0) { - return allIPV4.get(0); - } else { - return "no-hostname"; - } - } - - public static int getProcessNo() { - if (PROCESS_NO == 0) { - try { - PROCESS_NO = Integer.parseInt(ManagementFactory.getRuntimeMXBean().getName().split("@")[0]); - } catch (Exception e) { - PROCESS_NO = -1; - } - } - return PROCESS_NO; - } - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/os/ProcessorUtil.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/os/ProcessorUtil.java deleted file mode 100644 index 30abb493..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/os/ProcessorUtil.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.os; - -import java.lang.management.ManagementFactory; - -public class ProcessorUtil { - - public static int getNumberOfProcessors() { - return ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors(); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/AbstractClassEnhancePluginDefine.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/AbstractClassEnhancePluginDefine.java deleted file mode 100644 index 82278a6a..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/AbstractClassEnhancePluginDefine.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.StaticMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.ClassEnhancePluginDefine; -import cn.hippo4j.agent.core.plugin.interceptor.v2.InstanceMethodsInterceptV2Point; -import cn.hippo4j.agent.core.plugin.interceptor.v2.StaticMethodsInterceptV2Point; -import cn.hippo4j.agent.core.plugin.match.ClassMatch; -import cn.hippo4j.agent.core.util.CollectionUtil; -import cn.hippo4j.agent.core.util.StringUtil; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.dynamic.DynamicType; - -import java.util.List; - -/** - * Basic abstract class of all sky-walking auto-instrumentation plugins. - *

- * It provides the outline of enhancing the target class. If you want to know more about enhancing, you should go to see - * {@link ClassEnhancePluginDefine} - */ -public abstract class AbstractClassEnhancePluginDefine { - - private static final ILog LOGGER = LogManager.getLogger(AbstractClassEnhancePluginDefine.class); - - /** - * New field name. - */ - public static final String CONTEXT_ATTR_NAME = "_$EnhancedClassField_ws"; - - /** - * Main entrance of enhancing the class. - * - * @param typeDescription target class description. - * @param builder byte-buddy's builder to manipulate target class's bytecode. - * @param classLoader load the given transformClass - * @return the new builder, or null if not be enhanced. - * @throws PluginException when set builder failure. - */ - public DynamicType.Builder define(TypeDescription typeDescription, DynamicType.Builder builder, - ClassLoader classLoader, EnhanceContext context) throws PluginException { - String interceptorDefineClassName = this.getClass().getName(); - String transformClassName = typeDescription.getTypeName(); - if (StringUtil.isEmpty(transformClassName)) { - LOGGER.warn("classname of being intercepted is not defined by {}.", interceptorDefineClassName); - return null; - } - - LOGGER.debug("prepare to enhance class {} by {}.", transformClassName, interceptorDefineClassName); - WitnessFinder finder = WitnessFinder.INSTANCE; - /** - * find witness classes for enhance class - */ - String[] witnessClasses = witnessClasses(); - if (witnessClasses != null) { - for (String witnessClass : witnessClasses) { - if (!finder.exist(witnessClass, classLoader)) { - LOGGER.warn("enhance class {} by plugin {} is not activated. Witness class {} does not exist.", transformClassName, interceptorDefineClassName, witnessClass); - return null; - } - } - } - List witnessMethods = witnessMethods(); - if (!CollectionUtil.isEmpty(witnessMethods)) { - for (WitnessMethod witnessMethod : witnessMethods) { - if (!finder.exist(witnessMethod, classLoader)) { - LOGGER.warn("enhance class {} by plugin {} is not activated. Witness method {} does not exist.", transformClassName, interceptorDefineClassName, witnessMethod); - return null; - } - } - } - - /** - * find origin class source code for interceptor - */ - DynamicType.Builder newClassBuilder = this.enhance(typeDescription, builder, classLoader, context); - - context.initializationStageCompleted(); - LOGGER.debug("enhance class {} by {} completely.", transformClassName, interceptorDefineClassName); - - return newClassBuilder; - } - - /** - * Begin to define how to enhance class. After invoke this method, only means definition is finished. - * - * @param typeDescription target class description - * @param newClassBuilder byte-buddy's builder to manipulate class bytecode. - * @return new byte-buddy's builder for further manipulation. - */ - protected DynamicType.Builder enhance(TypeDescription typeDescription, DynamicType.Builder newClassBuilder, - ClassLoader classLoader, EnhanceContext context) throws PluginException { - newClassBuilder = this.enhanceClass(typeDescription, newClassBuilder, classLoader); - - newClassBuilder = this.enhanceInstance(typeDescription, newClassBuilder, classLoader, context); - - return newClassBuilder; - } - - /** - * Enhance a class to intercept constructors and class instance methods. - * - * @param typeDescription target class description - * @param newClassBuilder byte-buddy's builder to manipulate class bytecode. - * @return new byte-buddy's builder for further manipulation. - */ - protected abstract DynamicType.Builder enhanceInstance(TypeDescription typeDescription, - DynamicType.Builder newClassBuilder, ClassLoader classLoader, - EnhanceContext context) throws PluginException; - - /** - * Enhance a class to intercept class static methods. - * - * @param typeDescription target class description - * @param newClassBuilder byte-buddy's builder to manipulate class bytecode. - * @return new byte-buddy's builder for further manipulation. - */ - protected abstract DynamicType.Builder enhanceClass(TypeDescription typeDescription, DynamicType.Builder newClassBuilder, - ClassLoader classLoader) throws PluginException; - - /** - * Define the {@link ClassMatch} for filtering class. - * - * @return {@link ClassMatch} - */ - protected abstract ClassMatch enhanceClass(); - - /** - * Witness classname list. Why need witness classname? Let's see like this: A library existed two released versions - * (like 1.0, 2.0), which include the same target classes, but because of version iterator, they may have the same - * name, but different methods, or different method arguments list. So, if I want to target the particular version - * (let's say 1.0 for example), version number is obvious not an option, this is the moment you need "Witness - * classes". You can add any classes only in this particular release version ( something like class - * com.company.1.x.A, only in 1.0 ), and you can achieve the goal. - */ - protected String[] witnessClasses() { - return new String[]{}; - } - - protected List witnessMethods() { - return null; - } - - public boolean isBootstrapInstrumentation() { - return false; - } - - /** - * Constructor methods intercept point. See {@link ConstructorInterceptPoint} - * - * @return collections of {@link ConstructorInterceptPoint} - */ - public abstract ConstructorInterceptPoint[] getConstructorsInterceptPoints(); - - /** - * Instance methods intercept point. See {@link InstanceMethodsInterceptPoint} - * - * @return collections of {@link InstanceMethodsInterceptPoint} - */ - public abstract InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints(); - - /** - * Instance methods intercept v2 point. See {@link InstanceMethodsInterceptV2Point} - * - * @return collections of {@link InstanceMethodsInterceptV2Point} - */ - public abstract InstanceMethodsInterceptV2Point[] getInstanceMethodsInterceptV2Points(); - - /** - * Static methods intercept point. See {@link StaticMethodsInterceptPoint} - * - * @return collections of {@link StaticMethodsInterceptPoint} - */ - public abstract StaticMethodsInterceptPoint[] getStaticMethodsInterceptPoints(); - - /** - * Instance methods intercept v2 point. See {@link InstanceMethodsInterceptV2Point} - * - * @return collections of {@link InstanceMethodsInterceptV2Point} - */ - public abstract StaticMethodsInterceptV2Point[] getStaticMethodsInterceptV2Points(); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/ByteBuddyCoreClasses.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/ByteBuddyCoreClasses.java deleted file mode 100644 index 95c5ef9f..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/ByteBuddyCoreClasses.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin; - -/** - * All ByteBuddy core classes required to expose, including open edge for JDK 9+ module, or Bootstrap instrumentation. - */ -public class ByteBuddyCoreClasses { - - private static final String SHADE_PACKAGE = "cn.hippo4j.agent.dependencies."; - - public static final String[] CLASSES = { - SHADE_PACKAGE + "net.bytebuddy.implementation.bind.annotation.RuntimeType", - SHADE_PACKAGE + "net.bytebuddy.implementation.bind.annotation.This", - SHADE_PACKAGE + "net.bytebuddy.implementation.bind.annotation.AllArguments", - SHADE_PACKAGE + "net.bytebuddy.implementation.bind.annotation.AllArguments$Assignment", - SHADE_PACKAGE + "net.bytebuddy.implementation.bind.annotation.SuperCall", - SHADE_PACKAGE + "net.bytebuddy.implementation.bind.annotation.Origin", - SHADE_PACKAGE + "net.bytebuddy.implementation.bind.annotation.Morph", - }; -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/DynamicPluginLoader.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/DynamicPluginLoader.java deleted file mode 100755 index 30ff5a94..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/DynamicPluginLoader.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin; - -import cn.hippo4j.agent.core.plugin.loader.AgentClassLoader; -import cn.hippo4j.agent.core.plugin.loader.InstrumentationLoader; - -import java.util.ArrayList; -import java.util.List; -import java.util.ServiceLoader; - -/** - * The plugin can be inserted into the kernel by implementing this spi return PluginDefine list. - */ - -public enum DynamicPluginLoader { - - INSTANCE; - - public List load(AgentClassLoader classLoader) { - List all = new ArrayList(); - for (InstrumentationLoader instrumentationLoader : ServiceLoader.load(InstrumentationLoader.class, classLoader)) { - List plugins = instrumentationLoader.load(classLoader); - if (plugins != null && !plugins.isEmpty()) { - all.addAll(plugins); - } - } - return all; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/EnhanceContext.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/EnhanceContext.java deleted file mode 100644 index c903ce86..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/EnhanceContext.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin; - -import cn.hippo4j.agent.core.plugin.interceptor.enhance.ClassEnhancePluginDefine; - -/** - * The EnhanceContext represents the context or status for processing a class. - *

- * Based on this context, the plugin core {@link ClassEnhancePluginDefine} knows how to process the specific steps for - * every particular plugin. - */ -public class EnhanceContext { - - private boolean isEnhanced = false; - /** - * The object has already been enhanced or extended. e.g. added the new field, or implemented the new interface - */ - private boolean objectExtended = false; - - public boolean isEnhanced() { - return isEnhanced; - } - - public void initializationStageCompleted() { - isEnhanced = true; - } - - public boolean isObjectExtended() { - return objectExtended; - } - - public void extendObjectCompleted() { - objectExtended = true; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/InstrumentDebuggingClass.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/InstrumentDebuggingClass.java deleted file mode 100644 index 02a900cc..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/InstrumentDebuggingClass.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin; - -import cn.hippo4j.agent.core.boot.AgentPackagePath; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.common.boot.AgentPackageNotFoundException; -import cn.hippo4j.common.conf.Config; -import net.bytebuddy.dynamic.DynamicType; - -import java.io.File; -import java.io.IOException; - -/** - * The manipulated class output. Write the dynamic classes to the `debugging` folder, when we need to do some debug and - * recheck. - */ -public enum InstrumentDebuggingClass { - - INSTANCE; - - private static final ILog LOGGER = LogManager.getLogger(InstrumentDebuggingClass.class); - private File debuggingClassesRootPath; - - public void log(DynamicType dynamicType) { - if (!Config.Agent.IS_OPEN_DEBUGGING_CLASS) { - return; - } - - /** - * try to do I/O things in synchronized way, to avoid unexpected situations. - */ - synchronized (INSTANCE) { - try { - if (debuggingClassesRootPath == null) { - try { - debuggingClassesRootPath = new File(AgentPackagePath.getPath(), "/debugging"); - if (!debuggingClassesRootPath.exists()) { - debuggingClassesRootPath.mkdir(); - } - } catch (AgentPackageNotFoundException e) { - LOGGER.error(e, "Can't find the root path for creating /debugging folder."); - } - } - - try { - dynamicType.saveIn(debuggingClassesRootPath); - } catch (IOException e) { - LOGGER.error(e, "Can't save class {} to file." + dynamicType.getTypeDescription().getActualName()); - } - } catch (Throwable t) { - LOGGER.error(t, "Save debugging classes fail."); - } - } - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginBootstrap.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginBootstrap.java deleted file mode 100644 index f76fe19d..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginBootstrap.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin; - -import cn.hippo4j.agent.core.plugin.loader.AgentClassLoader; -import cn.hippo4j.common.boot.AgentPackageNotFoundException; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; - -import java.net.URL; -import java.util.ArrayList; -import java.util.List; - -/** - * Plugins finder. Use {@link PluginResourcesResolver} to find all plugins, and ask {@link PluginCfg} to load all plugin - * definitions. - */ -public class PluginBootstrap { - - private static final ILog LOGGER = LogManager.getLogger(PluginBootstrap.class); - - /** - * load all plugins. - * - * @return plugin definition list. - */ - public List loadPlugins() throws AgentPackageNotFoundException { - AgentClassLoader.initDefaultLoader(); - - PluginResourcesResolver resolver = new PluginResourcesResolver(); - List resources = resolver.getResources(); - - if (resources == null || resources.size() == 0) { - LOGGER.info("no plugin files (hippo4j-plugin.def) found, continue to start application."); - return new ArrayList(); - } - - for (URL pluginUrl : resources) { - try { - PluginCfg.INSTANCE.load(pluginUrl.openStream()); - } catch (Throwable t) { - LOGGER.error(t, "plugin file [{}] init failure.", pluginUrl); - } - } - - List pluginClassList = PluginCfg.INSTANCE.getPluginClassList(); - - List plugins = new ArrayList(); - for (PluginDefine pluginDefine : pluginClassList) { - try { - LOGGER.debug("loading plugin class {}.", pluginDefine.getDefineClass()); - AbstractClassEnhancePluginDefine plugin = (AbstractClassEnhancePluginDefine) Class.forName(pluginDefine.getDefineClass(), true, AgentClassLoader - .getDefault()).newInstance(); - plugins.add(plugin); - } catch (Throwable t) { - LOGGER.error(t, "load plugin [{}] failure.", pluginDefine.getDefineClass()); - } - } - - plugins.addAll(DynamicPluginLoader.INSTANCE.load(AgentClassLoader.getDefault())); - - return plugins; - - } - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginCfg.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginCfg.java deleted file mode 100644 index fe707c9c..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginCfg.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.plugin.exception.IllegalPluginDefineException; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.List; - -public enum PluginCfg { - - INSTANCE; - - private static final ILog LOGGER = LogManager.getLogger(PluginCfg.class); - - private List pluginClassList = new ArrayList(); - private PluginSelector pluginSelector = new PluginSelector(); - - void load(InputStream input) throws IOException { - try { - BufferedReader reader = new BufferedReader(new InputStreamReader(input)); - String pluginDefine; - while ((pluginDefine = reader.readLine()) != null) { - try { - if (pluginDefine.trim().length() == 0 || pluginDefine.startsWith("#")) { - continue; - } - PluginDefine plugin = PluginDefine.build(pluginDefine); - pluginClassList.add(plugin); - } catch (IllegalPluginDefineException e) { - LOGGER.error(e, "Failed to format plugin({}) define.", pluginDefine); - } - } - pluginClassList = pluginSelector.select(pluginClassList); - } finally { - input.close(); - } - } - - public List getPluginClassList() { - return pluginClassList; - } - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginDefine.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginDefine.java deleted file mode 100644 index 79501e09..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginDefine.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin; - -import cn.hippo4j.agent.core.plugin.exception.IllegalPluginDefineException; -import cn.hippo4j.agent.core.util.StringUtil; - -public class PluginDefine { - - /** - * Plugin name. - */ - private String name; - - /** - * The class name of plugin defined. - */ - private String defineClass; - - private PluginDefine(String name, String defineClass) { - this.name = name; - this.defineClass = defineClass; - } - - public static PluginDefine build(String define) throws IllegalPluginDefineException { - if (StringUtil.isEmpty(define)) { - throw new IllegalPluginDefineException(define); - } - - String[] pluginDefine = define.split("="); - if (pluginDefine.length != 2) { - throw new IllegalPluginDefineException(define); - } - - String pluginName = pluginDefine[0]; - String defineClass = pluginDefine[1]; - return new PluginDefine(pluginName, defineClass); - } - - public String getDefineClass() { - return defineClass; - } - - public String getName() { - return name; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginException.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginException.java deleted file mode 100644 index 6b69a009..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginException.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin; - -public class PluginException extends RuntimeException { - - private static final long serialVersionUID = -6020188711867490724L; - - public PluginException(String message) { - super(message); - } - - public PluginException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginFinder.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginFinder.java deleted file mode 100644 index 588d4f5f..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginFinder.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin; - -import cn.hippo4j.agent.core.plugin.bytebuddy.AbstractJunction; -import cn.hippo4j.agent.core.plugin.match.ClassMatch; -import cn.hippo4j.agent.core.plugin.match.IndirectMatch; -import cn.hippo4j.agent.core.plugin.match.NameMatch; -import cn.hippo4j.agent.core.plugin.match.ProtectiveShieldMatcher; -import net.bytebuddy.description.NamedElement; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import static net.bytebuddy.matcher.ElementMatchers.isInterface; -import static net.bytebuddy.matcher.ElementMatchers.not; - -/** - * The PluginFinder represents a finder , which assist to find the one from the given {@link - * AbstractClassEnhancePluginDefine} list. - */ -public class PluginFinder { - - private final Map> nameMatchDefine = new HashMap>(); - private final List signatureMatchDefine = new ArrayList(); - private final List bootstrapClassMatchDefine = new ArrayList(); - private static boolean IS_PLUGIN_INIT_COMPLETED = false; - - public PluginFinder(List plugins) { - for (AbstractClassEnhancePluginDefine plugin : plugins) { - ClassMatch match = plugin.enhanceClass(); - - if (match == null) { - continue; - } - - if (match instanceof NameMatch) { - NameMatch nameMatch = (NameMatch) match; - LinkedList pluginDefines = nameMatchDefine.get(nameMatch.getClassName()); - if (pluginDefines == null) { - pluginDefines = new LinkedList(); - nameMatchDefine.put(nameMatch.getClassName(), pluginDefines); - } - pluginDefines.add(plugin); - } else { - signatureMatchDefine.add(plugin); - } - - if (plugin.isBootstrapInstrumentation()) { - bootstrapClassMatchDefine.add(plugin); - } - } - } - - public List find(TypeDescription typeDescription) { - List matchedPlugins = new LinkedList(); - String typeName = typeDescription.getTypeName(); - if (nameMatchDefine.containsKey(typeName)) { - matchedPlugins.addAll(nameMatchDefine.get(typeName)); - } - - for (AbstractClassEnhancePluginDefine pluginDefine : signatureMatchDefine) { - IndirectMatch match = (IndirectMatch) pluginDefine.enhanceClass(); - if (match.isMatch(typeDescription)) { - matchedPlugins.add(pluginDefine); - } - } - - return matchedPlugins; - } - - public ElementMatcher buildMatch() { - ElementMatcher.Junction judge = new AbstractJunction() { - - @Override - public boolean matches(NamedElement target) { - return nameMatchDefine.containsKey(target.getActualName()); - } - }; - judge = judge.and(not(isInterface())); - for (AbstractClassEnhancePluginDefine define : signatureMatchDefine) { - ClassMatch match = define.enhanceClass(); - if (match instanceof IndirectMatch) { - judge = judge.or(((IndirectMatch) match).buildJunction()); - } - } - return new ProtectiveShieldMatcher(judge); - } - - public List getBootstrapClassMatchDefine() { - return bootstrapClassMatchDefine; - } - - public static void pluginInitCompleted() { - IS_PLUGIN_INIT_COMPLETED = true; - } - - public static boolean isPluginInitCompleted() { - return IS_PLUGIN_INIT_COMPLETED; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginResourcesResolver.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginResourcesResolver.java deleted file mode 100644 index 861995ee..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginResourcesResolver.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.plugin.loader.AgentClassLoader; - -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.List; - -/** - * Use the current classloader to read all plugin define file. The file must be named 'hippo4j-plugin.def' - */ -public class PluginResourcesResolver { - - private static final ILog LOGGER = LogManager.getLogger(PluginResourcesResolver.class); - - public List getResources() { - List cfgUrlPaths = new ArrayList(); - Enumeration urls; - try { - urls = AgentClassLoader.getDefault().getResources("hippo4j-plugin.def"); - - while (urls.hasMoreElements()) { - URL pluginUrl = urls.nextElement(); - cfgUrlPaths.add(pluginUrl); - LOGGER.info("find hippo4j plugin define in {}", pluginUrl); - } - - return cfgUrlPaths; - } catch (IOException e) { - LOGGER.error("read resources failure.", e); - } - return null; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginSelector.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginSelector.java deleted file mode 100644 index 4859909e..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/PluginSelector.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static cn.hippo4j.common.conf.Config.Plugin.EXCLUDE_PLUGINS; - -/** - * Select some plugins in activated plugins - */ -public class PluginSelector { - - /** - * Exclude activated plugins - * - * @param pluginDefines the pluginDefines is loaded from activations directory or plugins directory - * @return real activate plugins - * @see Config.Plugin#EXCLUDE_PLUGINS - */ - public List select(List pluginDefines) { - if (!EXCLUDE_PLUGINS.isEmpty()) { - List excludes = Arrays.asList(EXCLUDE_PLUGINS.toLowerCase().split(",")); - return pluginDefines.stream() - .filter(item -> !excludes.contains(item.getName().toLowerCase())) - .collect(Collectors.toList()); - } - return pluginDefines; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/WitnessFinder.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/WitnessFinder.java deleted file mode 100644 index a7d30be2..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/WitnessFinder.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin; - -import net.bytebuddy.pool.TypePool; - -import java.util.HashMap; -import java.util.Map; - -/** - * The WitnessFinder represents a pool of {@link TypePool}s, each {@link TypePool} matches a {@link - * ClassLoader}, which helps to find the class declaration existed or not. - */ -public enum WitnessFinder { - - INSTANCE; - - private final Map poolMap = new HashMap(); - - /** - * @param classLoader for finding the witnessClass - * @return true, if the given witnessClass exists, through the given classLoader. - */ - public boolean exist(String witnessClass, ClassLoader classLoader) { - return getResolution(witnessClass, classLoader) - .isResolved(); - } - - /** - * get TypePool.Resolution of the witness class - * @param witnessClass class name - * @param classLoader classLoader for finding the witnessClass - * @return TypePool.Resolution - */ - private TypePool.Resolution getResolution(String witnessClass, ClassLoader classLoader) { - ClassLoader mappingKey = classLoader == null ? NullClassLoader.INSTANCE : classLoader; - if (!poolMap.containsKey(mappingKey)) { - synchronized (poolMap) { - if (!poolMap.containsKey(mappingKey)) { - TypePool classTypePool = classLoader == null ? TypePool.Default.ofBootLoader() : TypePool.Default.of(classLoader); - poolMap.put(mappingKey, classTypePool); - } - } - } - TypePool typePool = poolMap.get(mappingKey); - return typePool.describe(witnessClass); - } - - /** - * @param classLoader for finding the witness method - * @return true, if the given witness method exists, through the given classLoader. - */ - public boolean exist(WitnessMethod witnessMethod, ClassLoader classLoader) { - TypePool.Resolution resolution = getResolution(witnessMethod.getDeclaringClassName(), classLoader); - if (!resolution.isResolved()) { - return false; - } - return !resolution.resolve() - .getDeclaredMethods() - .filter(witnessMethod.getElementMatcher()) - .isEmpty(); - } - -} - -final class NullClassLoader extends ClassLoader { - - static NullClassLoader INSTANCE = new NullClassLoader(); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/WitnessMethod.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/WitnessMethod.java deleted file mode 100644 index 46c62d2b..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/WitnessMethod.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.ToString; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * Witness Method for plugin activation - */ -@ToString -@RequiredArgsConstructor -public class WitnessMethod { - - /** - * the class or interface name where the witness method is declared. - */ - @Getter - private final String declaringClassName; - /** - * matcher to match the witness method - */ - @Getter - private final ElementMatcher elementMatcher; - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/BootstrapInstrumentBoost.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/BootstrapInstrumentBoost.java deleted file mode 100644 index 7138ea85..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/BootstrapInstrumentBoost.java +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bootstrap; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.plugin.AbstractClassEnhancePluginDefine; -import cn.hippo4j.agent.core.plugin.ByteBuddyCoreClasses; -import cn.hippo4j.agent.core.plugin.InstrumentDebuggingClass; -import cn.hippo4j.agent.core.plugin.PluginException; -import cn.hippo4j.agent.core.plugin.PluginFinder; -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.StaticMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.v2.InstanceMethodsInterceptV2Point; -import cn.hippo4j.agent.core.plugin.interceptor.v2.StaticMethodsInterceptV2Point; -import cn.hippo4j.agent.core.plugin.jdk9module.JDK9ModuleExporter; -import cn.hippo4j.agent.core.plugin.loader.AgentClassLoader; -import net.bytebuddy.ByteBuddy; -import net.bytebuddy.agent.builder.AgentBuilder; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.dynamic.ClassFileLocator; -import net.bytebuddy.dynamic.DynamicType; -import net.bytebuddy.dynamic.loading.ClassInjector; -import net.bytebuddy.pool.TypePool; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.lang.instrument.Instrumentation; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import static net.bytebuddy.matcher.ElementMatchers.named; - -/** - * If there is Bootstrap instrumentation plugin declared in plugin list, BootstrapInstrumentBoost inject the necessary - * classes into bootstrap class loader, including generated dynamic delegate classes. - */ -public class BootstrapInstrumentBoost { - - private static final ILog LOGGER = LogManager.getLogger(BootstrapInstrumentBoost.class); - - private static final String[] HIGH_PRIORITY_CLASSES = { - "cn.hippo4j.agent.core.plugin.interceptor.enhance.BootstrapInterRuntimeAssist", - "cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor", - "cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor", - "cn.hippo4j.agent.core.plugin.interceptor.enhance.StaticMethodsAroundInterceptor", - "cn.hippo4j.agent.core.plugin.bootstrap.IBootstrapLog", - "cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance", - "cn.hippo4j.agent.core.plugin.interceptor.enhance.OverrideCallable", - "cn.hippo4j.agent.core.plugin.interceptor.enhance.MethodInterceptResult", - - // interceptor v2 - "cn.hippo4j.agent.core.plugin.interceptor.enhance.v2.InstanceMethodsAroundInterceptorV2", - "cn.hippo4j.agent.core.plugin.interceptor.enhance.v2.StaticMethodsAroundInterceptorV2", - "cn.hippo4j.agent.core.plugin.interceptor.enhance.v2.MethodInvocationContext", - }; - - private static String INSTANCE_METHOD_DELEGATE_TEMPLATE = "cn.hippo4j.agent.core.plugin.bootstrap.template.InstanceMethodInterTemplate"; - private static String INSTANCE_METHOD_WITH_OVERRIDE_ARGS_DELEGATE_TEMPLATE = "cn.hippo4j.agent.core.plugin.bootstrap.template.InstanceMethodInterWithOverrideArgsTemplate"; - private static String CONSTRUCTOR_DELEGATE_TEMPLATE = "cn.hippo4j.agent.core.plugin.bootstrap.template.ConstructorInterTemplate"; - private static String STATIC_METHOD_DELEGATE_TEMPLATE = "cn.hippo4j.agent.core.plugin.bootstrap.template.StaticMethodInterTemplate"; - private static String STATIC_METHOD_WITH_OVERRIDE_ARGS_DELEGATE_TEMPLATE = "cn.hippo4j.agent.core.plugin.bootstrap.template.StaticMethodInterWithOverrideArgsTemplate"; - - private static String INSTANCE_METHOD_V2_DELEGATE_TEMPLATE = "cn.hippo4j.agent.core.plugin.bootstrap.template.v2.InstanceMethodInterV2Template"; - private static String INSTANCE_METHOD_V2_WITH_OVERRIDE_ARGS_DELEGATE_TEMPLATE = "cn.hippo4j.agent.core.plugin.bootstrap.template.v2.InstanceMethodInterV2WithOverrideArgsTemplate"; - private static String STATIC_METHOD_V2_DELEGATE_TEMPLATE = "cn.hippo4j.agent.core.plugin.bootstrap.template.v2.StaticMethodInterV2Template"; - private static String STATIC_METHOD_V2_WITH_OVERRIDE_ARGS_DELEGATE_TEMPLATE = "cn.hippo4j.agent.core.plugin.bootstrap.template.v2.StaticMethodInterV2WithOverrideArgsTemplate"; - - public static AgentBuilder inject(PluginFinder pluginFinder, Instrumentation instrumentation, - AgentBuilder agentBuilder, JDK9ModuleExporter.EdgeClasses edgeClasses) throws PluginException { - Map classesTypeMap = new LinkedHashMap<>(); - - if (!prepareJREInstrumentation(pluginFinder, classesTypeMap)) { - return agentBuilder; - } - - if (!prepareJREInstrumentationV2(pluginFinder, classesTypeMap)) { - return agentBuilder; - } - - for (String highPriorityClass : HIGH_PRIORITY_CLASSES) { - loadHighPriorityClass(classesTypeMap, highPriorityClass); - } - for (String highPriorityClass : ByteBuddyCoreClasses.CLASSES) { - loadHighPriorityClass(classesTypeMap, highPriorityClass); - } - - /** - * Prepare to open edge of necessary classes. - */ - for (String generatedClass : classesTypeMap.keySet()) { - edgeClasses.add(generatedClass); - } - - /** - * Inject the classes into bootstrap class loader by using Unsafe Strategy. - * ByteBuddy adapts the sun.misc.Unsafe and jdk.internal.misc.Unsafe automatically. - */ - ClassInjector.UsingUnsafe.Factory factory = ClassInjector.UsingUnsafe.Factory.resolve(instrumentation); - factory.make(null, null).injectRaw(classesTypeMap); - agentBuilder = agentBuilder.with(new AgentBuilder.InjectionStrategy.UsingUnsafe.OfFactory(factory)); - - return agentBuilder; - } - - /** - * Get the delegate class name. - * - * @param methodsInterceptor of original interceptor in the plugin - * @return generated delegate class name - */ - public static String internalDelegate(String methodsInterceptor) { - return methodsInterceptor + "_internal"; - } - - /** - * Load the delegate class from current class loader, mostly should be AppClassLoader. - * - * @param methodsInterceptor of original interceptor in the plugin - * @return generated delegate class - */ - public static Class forInternalDelegateClass(String methodsInterceptor) { - try { - return Class.forName(internalDelegate(methodsInterceptor)); - } catch (ClassNotFoundException e) { - throw new PluginException(e.getMessage(), e); - } - } - - /** - * Generate dynamic delegate for ByteBuddy - * - * @param pluginFinder gets the whole plugin list. - * @param classesTypeMap hosts the class binary. - * @return true if have JRE instrumentation requirement. - * @throws PluginException when generate failure. - */ - private static boolean prepareJREInstrumentation(PluginFinder pluginFinder, - Map classesTypeMap) throws PluginException { - TypePool typePool = TypePool.Default.of(BootstrapInstrumentBoost.class.getClassLoader()); - List bootstrapClassMatchDefines = pluginFinder.getBootstrapClassMatchDefine(); - for (AbstractClassEnhancePluginDefine define : bootstrapClassMatchDefines) { - if (Objects.nonNull(define.getInstanceMethodsInterceptPoints())) { - for (InstanceMethodsInterceptPoint point : define.getInstanceMethodsInterceptPoints()) { - if (point.isOverrideArgs()) { - generateDelegator( - classesTypeMap, typePool, INSTANCE_METHOD_WITH_OVERRIDE_ARGS_DELEGATE_TEMPLATE, point - .getMethodsInterceptor()); - } else { - generateDelegator( - classesTypeMap, typePool, INSTANCE_METHOD_DELEGATE_TEMPLATE, point.getMethodsInterceptor()); - } - } - } - - if (Objects.nonNull(define.getConstructorsInterceptPoints())) { - for (ConstructorInterceptPoint point : define.getConstructorsInterceptPoints()) { - generateDelegator( - classesTypeMap, typePool, CONSTRUCTOR_DELEGATE_TEMPLATE, point.getConstructorInterceptor()); - } - } - - if (Objects.nonNull(define.getStaticMethodsInterceptPoints())) { - for (StaticMethodsInterceptPoint point : define.getStaticMethodsInterceptPoints()) { - if (point.isOverrideArgs()) { - generateDelegator( - classesTypeMap, typePool, STATIC_METHOD_WITH_OVERRIDE_ARGS_DELEGATE_TEMPLATE, point - .getMethodsInterceptor()); - } else { - generateDelegator( - classesTypeMap, typePool, STATIC_METHOD_DELEGATE_TEMPLATE, point.getMethodsInterceptor()); - } - } - } - } - return bootstrapClassMatchDefines.size() > 0; - } - - private static boolean prepareJREInstrumentationV2(PluginFinder pluginFinder, - Map classesTypeMap) throws PluginException { - TypePool typePool = TypePool.Default.of(BootstrapInstrumentBoost.class.getClassLoader()); - List bootstrapClassMatchDefines = pluginFinder.getBootstrapClassMatchDefine(); - for (AbstractClassEnhancePluginDefine define : bootstrapClassMatchDefines) { - if (Objects.nonNull(define.getInstanceMethodsInterceptV2Points())) { - for (InstanceMethodsInterceptV2Point point : define.getInstanceMethodsInterceptV2Points()) { - if (point.isOverrideArgs()) { - generateDelegator(classesTypeMap, typePool, - INSTANCE_METHOD_V2_WITH_OVERRIDE_ARGS_DELEGATE_TEMPLATE, - point.getMethodsInterceptorV2()); - } else { - generateDelegator( - classesTypeMap, typePool, INSTANCE_METHOD_V2_DELEGATE_TEMPLATE, - point.getMethodsInterceptorV2()); - } - } - } - - if (Objects.nonNull(define.getStaticMethodsInterceptV2Points())) { - for (StaticMethodsInterceptV2Point point : define.getStaticMethodsInterceptV2Points()) { - if (point.isOverrideArgs()) { - generateDelegator(classesTypeMap, typePool, - STATIC_METHOD_V2_WITH_OVERRIDE_ARGS_DELEGATE_TEMPLATE, - point.getMethodsInterceptorV2()); - } else { - generateDelegator( - classesTypeMap, typePool, STATIC_METHOD_V2_DELEGATE_TEMPLATE, - point.getMethodsInterceptorV2()); - } - } - } - } - return bootstrapClassMatchDefines.size() > 0; - } - - /** - * Generate the delegator class based on given template class. This is preparation stage level code generation. - *

- * One key step to avoid class confliction between AppClassLoader and BootstrapClassLoader - * - * @param classesTypeMap hosts injected binary of generated class - * @param typePool to generate new class - * @param templateClassName represents the class as template in this generation process. The templates are - * pre-defined in Hippo4j agent core. - */ - private static void generateDelegator(Map classesTypeMap, TypePool typePool, - String templateClassName, String methodsInterceptor) { - String internalInterceptorName = internalDelegate(methodsInterceptor); - try { - TypeDescription templateTypeDescription = typePool.describe(templateClassName).resolve(); - - DynamicType.Unloaded interceptorType = new ByteBuddy().redefine(templateTypeDescription, ClassFileLocator.ForClassLoader - .of(BootstrapInstrumentBoost.class.getClassLoader())) - .name(internalInterceptorName) - .field(named("TARGET_INTERCEPTOR")) - .value(methodsInterceptor) - .make(); - - classesTypeMap.put(internalInterceptorName, interceptorType.getBytes()); - - InstrumentDebuggingClass.INSTANCE.log(interceptorType); - } catch (Exception e) { - throw new PluginException("Generate Dynamic plugin failure", e); - } - } - - /** - * The class loaded by this method means it only should be loaded once in Bootstrap classloader, when bootstrap - * instrumentation active by any plugin - * - * @param loadedTypeMap hosts all injected class - * @param className to load - */ - private static void loadHighPriorityClass(Map loadedTypeMap, - String className) throws PluginException { - byte[] enhancedInstanceClassFile; - try { - String classResourceName = className.replaceAll("\\.", "/") + ".class"; - InputStream resourceAsStream = AgentClassLoader.getDefault().getResourceAsStream(classResourceName); - - if (resourceAsStream == null) { - throw new PluginException("High priority class " + className + " not found."); - } - - ByteArrayOutputStream os = new ByteArrayOutputStream(); - - byte[] buffer = new byte[1024]; - int len; - - // read bytes from the input stream and store them in buffer - while ((len = resourceAsStream.read(buffer)) != -1) { - // write bytes from the buffer into output stream - os.write(buffer, 0, len); - } - - enhancedInstanceClassFile = os.toByteArray(); - } catch (IOException e) { - throw new PluginException(e.getMessage(), e); - } - - loadedTypeMap.put(className, enhancedInstanceClassFile); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/BootstrapPluginLogBridge.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/BootstrapPluginLogBridge.java deleted file mode 100644 index bdcbcfdc..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/BootstrapPluginLogBridge.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bootstrap; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; - -/** - * The log bridge makes the ILog accessible inside bootstrap classloader, especially for internal interceptor. - */ -public class BootstrapPluginLogBridge implements IBootstrapLog { - - public static IBootstrapLog getLogger(String clazz) { - return new BootstrapPluginLogBridge(clazz); - } - - private final ILog logger; - - private BootstrapPluginLogBridge(String clazz) { - logger = LogManager.getLogger(clazz); - } - - @Override - public void info(String format) { - logger.info(format); - } - - @Override - public void info(String format, Object... arguments) { - logger.info(format, arguments); - } - - @Override - public void warn(String format, Object... arguments) { - logger.warn(format, arguments); - } - - @Override - public void warn(Throwable e, String format, Object... arguments) { - logger.warn(e, format, arguments); - } - - @Override - public void error(String format, Throwable e) { - logger.error(format, e); - } - - @Override - public void error(Throwable e, String format, Object... arguments) { - logger.error(e, format, arguments); - } - - @Override - public boolean isDebugEnable() { - return logger.isDebugEnable(); - } - - @Override - public boolean isInfoEnable() { - return logger.isInfoEnable(); - } - - @Override - public boolean isWarnEnable() { - return logger.isWarnEnable(); - } - - @Override - public boolean isErrorEnable() { - return logger.isErrorEnable(); - } - - @Override - public void debug(String format) { - logger.debug(format); - } - - @Override - public void debug(String format, Object... arguments) { - logger.debug(format, arguments); - } - - @Override - public void error(String format) { - logger.error(format); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/IBootstrapLog.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/IBootstrapLog.java deleted file mode 100644 index 52645b44..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/IBootstrapLog.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bootstrap; - -/** - * The log interface used in bootstrap internal interceptors. - *

- * Never used in any plugin or tracing core. - */ -public interface IBootstrapLog { - - void info(String format); - - void info(String format, Object... arguments); - - void warn(String format, Object... arguments); - - void warn(Throwable e, String format, Object... arguments); - - void error(String format, Throwable e); - - void error(Throwable e, String format, Object... arguments); - - boolean isDebugEnable(); - - boolean isInfoEnable(); - - boolean isWarnEnable(); - - boolean isErrorEnable(); - - void debug(String format); - - void debug(String format, Object... arguments); - - void error(String format); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/ConstructorInterTemplate.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/ConstructorInterTemplate.java deleted file mode 100644 index 3bca42a0..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/ConstructorInterTemplate.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bootstrap.template; - -import cn.hippo4j.agent.core.plugin.bootstrap.IBootstrapLog; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.BootstrapInterRuntimeAssist; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import net.bytebuddy.implementation.bind.annotation.This; - -public class ConstructorInterTemplate { - - /** - * This field is never set in the template, but has value in the runtime. - */ - private static String TARGET_INTERCEPTOR; - - private static InstanceConstructorInterceptor INTERCEPTOR; - private static IBootstrapLog LOGGER; - - /** - * Intercept the target constructor. - * - * @param obj target class instance. - * @param allArguments all constructor arguments - */ - @RuntimeType - public static void intercept(@This Object obj, @AllArguments Object[] allArguments) { - try { - prepare(); - - EnhancedInstance targetObject = (EnhancedInstance) obj; - - if (INTERCEPTOR == null) { - return; - } - INTERCEPTOR.onConstruct(targetObject, allArguments); - } catch (Throwable t) { - LOGGER.error("ConstructorInter failure.", t); - } - } - - /** - * Prepare the context. Link to the agent core in AppClassLoader. - */ - private static void prepare() { - if (INTERCEPTOR == null) { - ClassLoader loader = BootstrapInterRuntimeAssist.getAgentClassLoader(); - - if (loader != null) { - IBootstrapLog logger = BootstrapInterRuntimeAssist.getLogger(loader, TARGET_INTERCEPTOR); - if (logger != null) { - LOGGER = logger; - - INTERCEPTOR = BootstrapInterRuntimeAssist.createInterceptor(loader, TARGET_INTERCEPTOR, LOGGER); - } - } else { - LOGGER.error("Runtime ClassLoader not found when create {}." + TARGET_INTERCEPTOR); - } - } - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/InstanceMethodInterTemplate.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/InstanceMethodInterTemplate.java deleted file mode 100644 index aa9cb6f3..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/InstanceMethodInterTemplate.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bootstrap.template; - -import cn.hippo4j.agent.core.plugin.bootstrap.IBootstrapLog; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.BootstrapInterRuntimeAssist; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import net.bytebuddy.implementation.bind.annotation.SuperCall; -import net.bytebuddy.implementation.bind.annotation.This; - -import java.lang.reflect.Method; -import java.util.concurrent.Callable; - -public class InstanceMethodInterTemplate { - - /** - * This field is never set in the template, but has value in the runtime. - */ - private static String TARGET_INTERCEPTOR; - - private static InstanceMethodsAroundInterceptor INTERCEPTOR; - private static IBootstrapLog LOGGER; - - /** - * Intercept the target instance method. - * - * @param obj target class instance. - * @param allArguments all method arguments - * @param method method description. - * @param zuper the origin call ref. - * @return the return value of target instance method. - * @throws Exception only throw exception because of zuper.call() or unexpected exception in sky-walking ( This is a - * bug, if anything triggers this condition ). - */ - @RuntimeType - public static Object intercept(@This Object obj, @AllArguments Object[] allArguments, @SuperCall Callable zuper, - @Origin Method method) throws Throwable { - EnhancedInstance targetObject = (EnhancedInstance) obj; - - prepare(); - - MethodInterceptResult result = new MethodInterceptResult(); - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.beforeMethod(targetObject, method, allArguments, method.getParameterTypes(), result); - } - } catch (Throwable t) { - if (LOGGER != null) { - LOGGER.error(t, "class[{}] before method[{}] intercept failure", obj.getClass(), method.getName()); - } - } - - Object ret = null; - try { - if (!result.isContinue()) { - ret = result._ret(); - } else { - ret = zuper.call(); - } - } catch (Throwable t) { - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.handleMethodException(targetObject, method, allArguments, method.getParameterTypes(), t); - } - } catch (Throwable t2) { - if (LOGGER != null) { - LOGGER.error(t2, "class[{}] handle method[{}] exception failure", obj.getClass(), method.getName()); - } - } - throw t; - } finally { - try { - if (INTERCEPTOR != null) { - ret = INTERCEPTOR.afterMethod(targetObject, method, allArguments, method.getParameterTypes(), ret); - } - } catch (Throwable t) { - if (LOGGER != null) { - LOGGER.error(t, "class[{}] after method[{}] intercept failure", obj.getClass(), method.getName()); - } - } - } - - return ret; - } - - /** - * Prepare the context. Link to the agent core in AppClassLoader. - */ - private static void prepare() { - if (INTERCEPTOR == null) { - ClassLoader loader = BootstrapInterRuntimeAssist.getAgentClassLoader(); - - if (loader != null) { - IBootstrapLog logger = BootstrapInterRuntimeAssist.getLogger(loader, TARGET_INTERCEPTOR); - if (logger != null) { - LOGGER = logger; - - INTERCEPTOR = BootstrapInterRuntimeAssist.createInterceptor(loader, TARGET_INTERCEPTOR, LOGGER); - } - } else { - LOGGER.error("Runtime ClassLoader not found when create {}." + TARGET_INTERCEPTOR); - } - } - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/InstanceMethodInterWithOverrideArgsTemplate.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/InstanceMethodInterWithOverrideArgsTemplate.java deleted file mode 100644 index 78ef6751..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/InstanceMethodInterWithOverrideArgsTemplate.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bootstrap.template; - -import cn.hippo4j.agent.core.plugin.bootstrap.IBootstrapLog; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.BootstrapInterRuntimeAssist; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.OverrideCallable; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Morph; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import net.bytebuddy.implementation.bind.annotation.This; - -import java.lang.reflect.Method; - -public class InstanceMethodInterWithOverrideArgsTemplate { - - /** - * This field is never set in the template, but has value in the runtime. - */ - private static String TARGET_INTERCEPTOR; - - private static InstanceMethodsAroundInterceptor INTERCEPTOR; - private static IBootstrapLog LOGGER; - - /** - * Intercept the target instance method. - * - * @param obj target class instance. - * @param allArguments all method arguments - * @param method method description. - * @param zuper the origin call ref. - * @return the return value of target instance method. - * @throws Exception only throw exception because of zuper.call() or unexpected exception in sky-walking ( This is a - * bug, if anything triggers this condition ). - */ - @RuntimeType - public static Object intercept(@This Object obj, @AllArguments Object[] allArguments, @Morph OverrideCallable zuper, - @Origin Method method) throws Throwable { - EnhancedInstance targetObject = (EnhancedInstance) obj; - - prepare(); - - MethodInterceptResult result = new MethodInterceptResult(); - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.beforeMethod(targetObject, method, allArguments, method.getParameterTypes(), result); - } - } catch (Throwable t) { - if (LOGGER != null) { - LOGGER.error(t, "class[{}] before method[{}] intercept failure", obj.getClass(), method.getName()); - } - } - - Object ret = null; - try { - if (!result.isContinue()) { - ret = result._ret(); - } else { - ret = zuper.call(allArguments); - } - } catch (Throwable t) { - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.handleMethodException(targetObject, method, allArguments, method.getParameterTypes(), t); - } - } catch (Throwable t2) { - if (LOGGER != null) { - LOGGER.error(t2, "class[{}] handle method[{}] exception failure", obj.getClass(), method.getName()); - } - } - throw t; - } finally { - try { - if (INTERCEPTOR != null) { - ret = INTERCEPTOR.afterMethod(targetObject, method, allArguments, method.getParameterTypes(), ret); - } - } catch (Throwable t) { - if (LOGGER != null) { - LOGGER.error(t, "class[{}] after method[{}] intercept failure", obj.getClass(), method.getName()); - } - } - } - - return ret; - } - - /** - * Prepare the context. Link to the agent core in AppClassLoader. - */ - private static void prepare() { - if (INTERCEPTOR == null) { - ClassLoader loader = BootstrapInterRuntimeAssist.getAgentClassLoader(); - - if (loader != null) { - IBootstrapLog logger = BootstrapInterRuntimeAssist.getLogger(loader, TARGET_INTERCEPTOR); - if (logger != null) { - LOGGER = logger; - - INTERCEPTOR = BootstrapInterRuntimeAssist.createInterceptor(loader, TARGET_INTERCEPTOR, LOGGER); - } - } else { - LOGGER.error("Runtime ClassLoader not found when create {}." + TARGET_INTERCEPTOR); - } - } - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/StaticMethodInterTemplate.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/StaticMethodInterTemplate.java deleted file mode 100644 index df1abaf2..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/StaticMethodInterTemplate.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bootstrap.template; - -import cn.hippo4j.agent.core.plugin.bootstrap.IBootstrapLog; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.BootstrapInterRuntimeAssist; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.StaticMethodsAroundInterceptor; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import net.bytebuddy.implementation.bind.annotation.SuperCall; - -import java.lang.reflect.Method; -import java.util.concurrent.Callable; - -public class StaticMethodInterTemplate { - - /** - * This field is never set in the template, but has value in the runtime. - */ - private static String TARGET_INTERCEPTOR; - - private static StaticMethodsAroundInterceptor INTERCEPTOR; - private static IBootstrapLog LOGGER; - - /** - * Intercept the target static method. - * - * @param clazz target class - * @param allArguments all method arguments - * @param method method description. - * @param zuper the origin call ref. - * @return the return value of target static method. - * @throws Exception only throw exception because of zuper.call() or unexpected exception in sky-walking ( This is a - * bug, if anything triggers this condition ). - */ - @RuntimeType - public static Object intercept(@Origin Class clazz, @AllArguments Object[] allArguments, @Origin Method method, - @SuperCall Callable zuper) throws Throwable { - prepare(); - - MethodInterceptResult result = new MethodInterceptResult(); - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.beforeMethod(clazz, method, allArguments, method.getParameterTypes(), result); - } - } catch (Throwable t) { - LOGGER.error(t, "class[{}] before static method[{}] intercept failure", clazz, method.getName()); - } - - Object ret = null; - try { - if (!result.isContinue()) { - ret = result._ret(); - } else { - ret = zuper.call(); - } - } catch (Throwable t) { - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.handleMethodException(clazz, method, allArguments, method.getParameterTypes(), t); - } - } catch (Throwable t2) { - LOGGER.error(t2, "class[{}] handle static method[{}] exception failure", clazz, method.getName(), t2.getMessage()); - } - throw t; - } finally { - try { - if (INTERCEPTOR != null) { - ret = INTERCEPTOR.afterMethod(clazz, method, allArguments, method.getParameterTypes(), ret); - } - } catch (Throwable t) { - LOGGER.error(t, "class[{}] after static method[{}] intercept failure:{}", clazz, method.getName(), t.getMessage()); - } - } - return ret; - } - - /** - * Prepare the context. Link to the agent core in AppClassLoader. - */ - private static void prepare() { - if (INTERCEPTOR == null) { - ClassLoader loader = BootstrapInterRuntimeAssist.getAgentClassLoader(); - - if (loader != null) { - IBootstrapLog logger = BootstrapInterRuntimeAssist.getLogger(loader, TARGET_INTERCEPTOR); - if (logger != null) { - LOGGER = logger; - - INTERCEPTOR = BootstrapInterRuntimeAssist.createInterceptor(loader, TARGET_INTERCEPTOR, LOGGER); - } - } else { - LOGGER.error("Runtime ClassLoader not found when create {}." + TARGET_INTERCEPTOR); - } - } - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/StaticMethodInterWithOverrideArgsTemplate.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/StaticMethodInterWithOverrideArgsTemplate.java deleted file mode 100644 index a3b0b92f..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/StaticMethodInterWithOverrideArgsTemplate.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bootstrap.template; - -import cn.hippo4j.agent.core.plugin.bootstrap.IBootstrapLog; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.BootstrapInterRuntimeAssist; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.OverrideCallable; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.StaticMethodsAroundInterceptor; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Morph; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; - -import java.lang.reflect.Method; - -public class StaticMethodInterWithOverrideArgsTemplate { - - /** - * This field is never set in the template, but has value in the runtime. - */ - private static String TARGET_INTERCEPTOR; - - private static StaticMethodsAroundInterceptor INTERCEPTOR; - private static IBootstrapLog LOGGER; - - /** - * Intercept the target static method. - * - * @param clazz target class - * @param allArguments all method arguments - * @param method method description. - * @param zuper the origin call ref. - * @return the return value of target static method. - * @throws Exception only throw exception because of zuper.call() or unexpected exception in sky-walking ( This is a - * bug, if anything triggers this condition ). - */ - @RuntimeType - public static Object intercept(@Origin Class clazz, @AllArguments Object[] allArguments, @Origin Method method, - @Morph OverrideCallable zuper) throws Throwable { - prepare(); - - MethodInterceptResult result = new MethodInterceptResult(); - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.beforeMethod(clazz, method, allArguments, method.getParameterTypes(), result); - } - } catch (Throwable t) { - LOGGER.error(t, "class[{}] before static method[{}] intercept failure", clazz, method.getName()); - } - - Object ret = null; - try { - if (!result.isContinue()) { - ret = result._ret(); - } else { - ret = zuper.call(allArguments); - } - } catch (Throwable t) { - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.handleMethodException(clazz, method, allArguments, method.getParameterTypes(), t); - } - } catch (Throwable t2) { - LOGGER.error(t2, "class[{}] handle static method[{}] exception failure", clazz, method.getName(), t2.getMessage()); - } - throw t; - } finally { - try { - if (INTERCEPTOR != null) { - ret = INTERCEPTOR.afterMethod(clazz, method, allArguments, method.getParameterTypes(), ret); - } - } catch (Throwable t) { - LOGGER.error(t, "class[{}] after static method[{}] intercept failure:{}", clazz, method.getName(), t.getMessage()); - } - } - return ret; - } - - /** - * Prepare the context. Link to the agent core in AppClassLoader. - */ - private static void prepare() { - if (INTERCEPTOR == null) { - ClassLoader loader = BootstrapInterRuntimeAssist.getAgentClassLoader(); - - if (loader != null) { - IBootstrapLog logger = BootstrapInterRuntimeAssist.getLogger(loader, TARGET_INTERCEPTOR); - if (logger != null) { - LOGGER = logger; - - INTERCEPTOR = BootstrapInterRuntimeAssist.createInterceptor(loader, TARGET_INTERCEPTOR, LOGGER); - } - } else { - LOGGER.error("Runtime ClassLoader not found when create {}." + TARGET_INTERCEPTOR); - } - } - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/v2/InstanceMethodInterV2Template.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/v2/InstanceMethodInterV2Template.java deleted file mode 100644 index 0bc6205e..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/v2/InstanceMethodInterV2Template.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bootstrap.template.v2; - -import cn.hippo4j.agent.core.plugin.bootstrap.IBootstrapLog; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.BootstrapInterRuntimeAssist; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.v2.InstanceMethodsAroundInterceptorV2; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.v2.MethodInvocationContext; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import net.bytebuddy.implementation.bind.annotation.SuperCall; -import net.bytebuddy.implementation.bind.annotation.This; - -import java.lang.reflect.Method; -import java.util.concurrent.Callable; - -/** - * This class wouldn't be loaded in real env. This is a class template for dynamic class generation. - */ -public class InstanceMethodInterV2Template { - - /** - * This field is never set in the template, but has value in the runtime. - */ - private static String TARGET_INTERCEPTOR; - - private static InstanceMethodsAroundInterceptorV2 INTERCEPTOR; - private static IBootstrapLog LOGGER; - - /** - * Intercept the target instance method. - * - * @param obj target class instance. - * @param allArguments all method arguments - * @param method method description. - * @param zuper the origin call ref. - * @return the return value of target instance method. - * @throws Exception only throw exception because of zuper.call() or unexpected exception in sky-walking ( This is a - * bug, if anything triggers this condition ). - */ - @RuntimeType - public static Object intercept(@This Object obj, @AllArguments Object[] allArguments, @SuperCall Callable zuper, - @Origin Method method) throws Throwable { - EnhancedInstance targetObject = (EnhancedInstance) obj; - - prepare(); - - MethodInvocationContext context = new MethodInvocationContext(); - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.beforeMethod(targetObject, method, allArguments, method.getParameterTypes(), context); - } - } catch (Throwable t) { - if (LOGGER != null) { - LOGGER.error(t, "class[{}] before method[{}] intercept failure", obj.getClass(), method.getName()); - } - } - - Object ret = null; - try { - if (!context.isContinue()) { - ret = context._ret(); - } else { - ret = zuper.call(); - } - } catch (Throwable t) { - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.handleMethodException(targetObject, method, allArguments, method.getParameterTypes(), t, context); - } - } catch (Throwable t2) { - if (LOGGER != null) { - LOGGER.error(t2, "class[{}] handle method[{}] exception failure", obj.getClass(), method.getName()); - } - } - throw t; - } finally { - try { - if (INTERCEPTOR != null) { - ret = INTERCEPTOR.afterMethod(targetObject, method, allArguments, method.getParameterTypes(), ret, context); - } - } catch (Throwable t) { - if (LOGGER != null) { - LOGGER.error(t, "class[{}] after method[{}] intercept failure", obj.getClass(), method.getName()); - } - } - } - - return ret; - } - - /** - * Prepare the context. Link to the agent core in AppClassLoader. - */ - private static void prepare() { - if (INTERCEPTOR == null) { - ClassLoader loader = BootstrapInterRuntimeAssist.getAgentClassLoader(); - - if (loader != null) { - IBootstrapLog logger = BootstrapInterRuntimeAssist.getLogger(loader, TARGET_INTERCEPTOR); - if (logger != null) { - LOGGER = logger; - - INTERCEPTOR = BootstrapInterRuntimeAssist.createInterceptor(loader, TARGET_INTERCEPTOR, LOGGER); - } - } else { - LOGGER.error("Runtime ClassLoader not found when create {}." + TARGET_INTERCEPTOR); - } - } - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/v2/InstanceMethodInterV2WithOverrideArgsTemplate.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/v2/InstanceMethodInterV2WithOverrideArgsTemplate.java deleted file mode 100644 index 6e15b671..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/v2/InstanceMethodInterV2WithOverrideArgsTemplate.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bootstrap.template.v2; - -import cn.hippo4j.agent.core.plugin.bootstrap.IBootstrapLog; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.BootstrapInterRuntimeAssist; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.OverrideCallable; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.v2.InstanceMethodsAroundInterceptorV2; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.v2.MethodInvocationContext; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Morph; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import net.bytebuddy.implementation.bind.annotation.This; - -import java.lang.reflect.Method; - -/** - * This class wouldn't be loaded in real env. This is a class template for dynamic class generation. - */ -public class InstanceMethodInterV2WithOverrideArgsTemplate { - - /** - * This field is never set in the template, but has value in the runtime. - */ - private static String TARGET_INTERCEPTOR; - - private static InstanceMethodsAroundInterceptorV2 INTERCEPTOR; - private static IBootstrapLog LOGGER; - - /** - * Intercept the target instance method. - * - * @param obj target class instance. - * @param allArguments all method arguments - * @param method method description. - * @param zuper the origin call ref. - * @return the return value of target instance method. - * @throws Exception only throw exception because of zuper.call() or unexpected exception in sky-walking ( This is a - * bug, if anything triggers this condition ). - */ - @RuntimeType - public static Object intercept(@This Object obj, @AllArguments Object[] allArguments, @Morph OverrideCallable zuper, - @Origin Method method) throws Throwable { - EnhancedInstance targetObject = (EnhancedInstance) obj; - - prepare(); - - MethodInvocationContext context = new MethodInvocationContext(); - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.beforeMethod(targetObject, method, allArguments, method.getParameterTypes(), context); - } - } catch (Throwable t) { - if (LOGGER != null) { - LOGGER.error(t, "class[{}] before method[{}] intercept failure", obj.getClass(), method.getName()); - } - } - - Object ret = null; - try { - if (!context.isContinue()) { - ret = context._ret(); - } else { - ret = zuper.call(allArguments); - } - } catch (Throwable t) { - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.handleMethodException(targetObject, method, allArguments, method.getParameterTypes(), t, context); - } - } catch (Throwable t2) { - if (LOGGER != null) { - LOGGER.error(t2, "class[{}] handle method[{}] exception failure", obj.getClass(), method.getName()); - } - } - throw t; - } finally { - try { - if (INTERCEPTOR != null) { - ret = INTERCEPTOR.afterMethod(targetObject, method, allArguments, method.getParameterTypes(), ret, context); - } - } catch (Throwable t) { - if (LOGGER != null) { - LOGGER.error(t, "class[{}] after method[{}] intercept failure", obj.getClass(), method.getName()); - } - } - } - - return ret; - } - - /** - * Prepare the context. Link to the agent core in AppClassLoader. - */ - private static void prepare() { - if (INTERCEPTOR == null) { - ClassLoader loader = BootstrapInterRuntimeAssist.getAgentClassLoader(); - - if (loader != null) { - IBootstrapLog logger = BootstrapInterRuntimeAssist.getLogger(loader, TARGET_INTERCEPTOR); - if (logger != null) { - LOGGER = logger; - - INTERCEPTOR = BootstrapInterRuntimeAssist.createInterceptor(loader, TARGET_INTERCEPTOR, LOGGER); - } - } else { - LOGGER.error("Runtime ClassLoader not found when create {}." + TARGET_INTERCEPTOR); - } - } - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/v2/StaticMethodInterV2Template.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/v2/StaticMethodInterV2Template.java deleted file mode 100644 index 7693c597..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/v2/StaticMethodInterV2Template.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bootstrap.template.v2; - -import cn.hippo4j.agent.core.plugin.bootstrap.IBootstrapLog; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.BootstrapInterRuntimeAssist; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.v2.MethodInvocationContext; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.v2.StaticMethodsAroundInterceptorV2; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import net.bytebuddy.implementation.bind.annotation.SuperCall; - -import java.lang.reflect.Method; -import java.util.concurrent.Callable; - -/** - * This class wouldn't be loaded in real env. This is a class template for dynamic class generation. - */ -public class StaticMethodInterV2Template { - - /** - * This field is never set in the template, but has value in the runtime. - */ - private static String TARGET_INTERCEPTOR; - - private static StaticMethodsAroundInterceptorV2 INTERCEPTOR; - private static IBootstrapLog LOGGER; - - /** - * Intercept the target static method. - * - * @param clazz target class - * @param allArguments all method arguments - * @param method method description. - * @param zuper the origin call ref. - * @return the return value of target static method. - * @throws Exception only throw exception because of zuper.call() or unexpected exception in sky-walking ( This is a - * bug, if anything triggers this condition ). - */ - @RuntimeType - public static Object intercept(@Origin Class clazz, @AllArguments Object[] allArguments, @Origin Method method, - @SuperCall Callable zuper) throws Throwable { - prepare(); - - MethodInvocationContext context = new MethodInvocationContext(); - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.beforeMethod(clazz, method, allArguments, method.getParameterTypes(), context); - } - } catch (Throwable t) { - LOGGER.error(t, "class[{}] before static method[{}] intercept failure", clazz, method.getName()); - } - - Object ret = null; - try { - if (!context.isContinue()) { - ret = context._ret(); - } else { - ret = zuper.call(); - } - } catch (Throwable t) { - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.handleMethodException(clazz, method, allArguments, method.getParameterTypes(), t, context); - } - } catch (Throwable t2) { - LOGGER.error(t2, "class[{}] handle static method[{}] exception failure", clazz, method.getName(), t2.getMessage()); - } - throw t; - } finally { - try { - if (INTERCEPTOR != null) { - ret = INTERCEPTOR.afterMethod(clazz, method, allArguments, method.getParameterTypes(), ret, context); - } - } catch (Throwable t) { - LOGGER.error(t, "class[{}] after static method[{}] intercept failure:{}", clazz, method.getName(), t.getMessage()); - } - } - return ret; - } - - /** - * Prepare the context. Link to the agent core in AppClassLoader. - */ - private static void prepare() { - if (INTERCEPTOR == null) { - ClassLoader loader = BootstrapInterRuntimeAssist.getAgentClassLoader(); - - if (loader != null) { - IBootstrapLog logger = BootstrapInterRuntimeAssist.getLogger(loader, TARGET_INTERCEPTOR); - if (logger != null) { - LOGGER = logger; - - INTERCEPTOR = BootstrapInterRuntimeAssist.createInterceptor(loader, TARGET_INTERCEPTOR, LOGGER); - } - } else { - LOGGER.error("Runtime ClassLoader not found when create {}." + TARGET_INTERCEPTOR); - } - } - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/v2/StaticMethodInterV2WithOverrideArgsTemplate.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/v2/StaticMethodInterV2WithOverrideArgsTemplate.java deleted file mode 100644 index 22da45bb..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bootstrap/template/v2/StaticMethodInterV2WithOverrideArgsTemplate.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bootstrap.template.v2; - -import cn.hippo4j.agent.core.plugin.bootstrap.IBootstrapLog; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.BootstrapInterRuntimeAssist; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.OverrideCallable; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.v2.MethodInvocationContext; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.v2.StaticMethodsAroundInterceptorV2; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Morph; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; - -import java.lang.reflect.Method; - -/** - * This class wouldn't be loaded in real env. This is a class template for dynamic class generation. - */ -public class StaticMethodInterV2WithOverrideArgsTemplate { - - /** - * This field is never set in the template, but has value in the runtime. - */ - private static String TARGET_INTERCEPTOR; - - private static StaticMethodsAroundInterceptorV2 INTERCEPTOR; - private static IBootstrapLog LOGGER; - - /** - * Intercept the target static method. - * - * @param clazz target class - * @param allArguments all method arguments - * @param method method description. - * @param zuper the origin call ref. - * @return the return value of target static method. - * @throws Exception only throw exception because of zuper.call() or unexpected exception in sky-walking ( This is a - * bug, if anything triggers this condition ). - */ - @RuntimeType - public static Object intercept(@Origin Class clazz, @AllArguments Object[] allArguments, @Origin Method method, - @Morph OverrideCallable zuper) throws Throwable { - prepare(); - - MethodInvocationContext context = new MethodInvocationContext(); - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.beforeMethod(clazz, method, allArguments, method.getParameterTypes(), context); - } - } catch (Throwable t) { - LOGGER.error(t, "class[{}] before static method[{}] intercept failure", clazz, method.getName()); - } - - Object ret = null; - try { - if (!context.isContinue()) { - ret = context._ret(); - } else { - ret = zuper.call(allArguments); - } - } catch (Throwable t) { - try { - if (INTERCEPTOR != null) { - INTERCEPTOR.handleMethodException(clazz, method, allArguments, method.getParameterTypes(), t, context); - } - } catch (Throwable t2) { - LOGGER.error(t2, "class[{}] handle static method[{}] exception failure", clazz, method.getName(), t2.getMessage()); - } - throw t; - } finally { - try { - if (INTERCEPTOR != null) { - ret = INTERCEPTOR.afterMethod(clazz, method, allArguments, method.getParameterTypes(), ret, context); - } - } catch (Throwable t) { - LOGGER.error(t, "class[{}] after static method[{}] intercept failure:{}", clazz, method.getName(), t.getMessage()); - } - } - return ret; - } - - /** - * Prepare the context. Link to the agent core in AppClassLoader. - */ - private static void prepare() { - if (INTERCEPTOR == null) { - ClassLoader loader = BootstrapInterRuntimeAssist.getAgentClassLoader(); - - if (loader != null) { - IBootstrapLog logger = BootstrapInterRuntimeAssist.getLogger(loader, TARGET_INTERCEPTOR); - if (logger != null) { - LOGGER = logger; - - INTERCEPTOR = BootstrapInterRuntimeAssist.createInterceptor(loader, TARGET_INTERCEPTOR, LOGGER); - } - } else { - LOGGER.error("Runtime ClassLoader not found when create {}." + TARGET_INTERCEPTOR); - } - } - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/AbstractJunction.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/AbstractJunction.java deleted file mode 100644 index 4ae6ffcf..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/AbstractJunction.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bytebuddy; - -import net.bytebuddy.matcher.ElementMatcher; - -public abstract class AbstractJunction implements ElementMatcher.Junction { - - @Override - public Junction and(ElementMatcher other) { - return new Conjunction(this, other); - } - - @Override - public Junction or(ElementMatcher other) { - return new Disjunction(this, other); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/AnnotationTypeNameMatch.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/AnnotationTypeNameMatch.java deleted file mode 100644 index a1c1f69b..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/AnnotationTypeNameMatch.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bytebuddy; - -import net.bytebuddy.description.annotation.AnnotationDescription; -import net.bytebuddy.description.annotation.AnnotationSource; -import net.bytebuddy.matcher.CollectionItemMatcher; -import net.bytebuddy.matcher.DeclaringAnnotationMatcher; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * Annotation Type match. Similar with {@link net.bytebuddy.matcher.ElementMatchers#isAnnotatedWith}, the only different - * between them is this match use {@link String} to declare the type, instead of {@link Class}. This can avoid the - * classloader risk. - *

- * 2019-08-15 - */ -public class AnnotationTypeNameMatch implements ElementMatcher { - - /** - * the target annotation type - */ - private String annotationTypeName; - - /** - * declare the match target method with the certain type. - * - * @param annotationTypeName target annotation type - */ - private AnnotationTypeNameMatch(String annotationTypeName) { - this.annotationTypeName = annotationTypeName; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean matches(T target) { - return target.getAnnotationType().asErasure().getName().equals(annotationTypeName); - } - - /** - * The static method to create {@link AnnotationTypeNameMatch} This is a delegate method to follow byte-buddy {@link - * ElementMatcher}'s code style. - * - * @param annotationTypeName target annotation type - * @param The type of the object that is being matched. - * @return new {@link AnnotationTypeNameMatch} instance. - */ - public static Junction isAnnotatedWithType( - String annotationTypeName) { - final AnnotationTypeNameMatch matcher = new AnnotationTypeNameMatch(annotationTypeName); - return new DeclaringAnnotationMatcher(new CollectionItemMatcher(matcher)); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/ArgumentTypeNameMatch.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/ArgumentTypeNameMatch.java deleted file mode 100644 index 250370f3..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/ArgumentTypeNameMatch.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bytebuddy; - -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.method.ParameterList; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * Argument Type match. Similar with {@link net.bytebuddy.matcher.ElementMatchers#takesArgument}, the only different - * between them is this match use {@link String} to declare the type, instead of {@link Class}. This can avoid the - * classloader risk. - *

- */ -public class ArgumentTypeNameMatch implements ElementMatcher { - - /** - * the index of arguments list. - */ - private int index; - - /** - * the target argument type at {@link ArgumentTypeNameMatch#index} of the arguments list. - */ - private String argumentTypeName; - - /** - * declare the match target method with the certain index and type. - * - * @param index the index of arguments list. - * @param argumentTypeName target argument type - */ - private ArgumentTypeNameMatch(int index, String argumentTypeName) { - ArrayTypeNameChecker.check(argumentTypeName); - - this.index = index; - this.argumentTypeName = argumentTypeName; - } - - /** - * Match the target method. - * - * @param target target method description. - * @return true if matched. or false. - */ - @Override - public boolean matches(MethodDescription target) { - ParameterList parameters = target.getParameters(); - if (parameters.size() > index) { - return parameters.get(index).getType().asErasure().getName().equals(argumentTypeName); - } - - return false; - } - - /** - * The static method to create {@link ArgumentTypeNameMatch} This is a delegate method to follow byte-buddy {@link - * ElementMatcher}'s code style. - * - * @param index the index of arguments list. - * @param argumentTypeName target argument type - * @return new {@link ArgumentTypeNameMatch} instance. - */ - public static ElementMatcher takesArgumentWithType(int index, String argumentTypeName) { - return new ArgumentTypeNameMatch(index, argumentTypeName); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/ArrayTypeNameChecker.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/ArrayTypeNameChecker.java deleted file mode 100644 index 907b9687..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/ArrayTypeNameChecker.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bytebuddy; - -public class ArrayTypeNameChecker { - - public static void check(String typeName) { - if (typeName.endsWith("[]")) { - throw new IllegalArgumentException("Please use [Lxxx; to define an Array type, and ref to JVM Specification for details"); - } - } -} \ No newline at end of file diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/CacheableTransformerDecorator.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/CacheableTransformerDecorator.java deleted file mode 100644 index fd653f60..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/CacheableTransformerDecorator.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bytebuddy; - -import cn.hippo4j.agent.core.boot.AgentPackagePath; -import cn.hippo4j.agent.core.util.FileUtils; -import cn.hippo4j.agent.core.util.IOUtils; -import cn.hippo4j.common.boot.AgentPackageNotFoundException; -import cn.hippo4j.common.boot.ClassCacheMode; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import net.bytebuddy.agent.builder.AgentBuilder; -import net.bytebuddy.agent.builder.ResettableClassFileTransformer; -import net.bytebuddy.utility.RandomString; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.lang.instrument.IllegalClassFormatException; -import java.security.ProtectionDomain; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Wrapper classFileTransformer of ByteBuddy, save the enhanced bytecode to memory cache or file cache, - * and automatically load the previously generated bytecode during the second retransform, - * to solve the problem that ByteBuddy generates auxiliary classes with different random names every time. - * Allow other javaagent to enhance those classes that enhanced by Hippo4j agent. - */ -public class CacheableTransformerDecorator implements AgentBuilder.TransformerDecorator { - - private static final ILog LOGGER = LogManager.getLogger(CacheableTransformerDecorator.class); - - private final ClassCacheMode cacheMode; - private ClassCacheResolver cacheResolver; - - public CacheableTransformerDecorator(ClassCacheMode cacheMode) throws IOException { - this.cacheMode = cacheMode; - initClassCache(); - } - - private void initClassCache() throws IOException { - if (this.cacheMode.equals(ClassCacheMode.FILE)) { - String cacheDirBase = null; - try { - cacheDirBase = AgentPackagePath.getPath() + "/class-cache"; - } catch (AgentPackageNotFoundException e) { - throw new IOException("Can't find the root path for creating /class-cache folder."); - } - File cacheDir = new File(cacheDirBase + "/class-cache-" + RandomString.make()); - if (!cacheDir.exists()) { - cacheDir.mkdirs(); - } - if (!cacheDir.exists()) { - throw new IOException("Create class cache dir failure"); - } - - cacheResolver = new FileCacheResolver(cacheDir); - } else { - cacheResolver = new MemoryCacheResolver(); - } - } - - @Override - public ResettableClassFileTransformer decorate(ResettableClassFileTransformer classFileTransformer) { - return new ResettableClassFileTransformer.WithDelegation(classFileTransformer) { - - @Override - public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { - // load from cache - byte[] classCache = cacheResolver.getClassCache(loader, className); - if (classCache != null) { - return classCache; - } - - // transform class - classfileBuffer = classFileTransformer.transform(loader, className, classBeingRedefined, protectionDomain, classfileBuffer); - - // save to cache - if (classfileBuffer != null) { - cacheResolver.putClassCache(loader, className, classfileBuffer); - } - - return classfileBuffer; - } - }; - } - - private static String getClassLoaderHash(ClassLoader loader) { - String classloader; - if (loader != null) { - classloader = Integer.toHexString(loader.hashCode()); - } else { - // classloader is null for BootstrapClassLoader - classloader = "00000000"; - } - return classloader; - } - - interface ClassCacheResolver { - - byte[] getClassCache(ClassLoader loader, String className); - - void putClassCache(ClassLoader loader, String className, byte[] classfileBuffer); - } - - static class MemoryCacheResolver implements ClassCacheResolver { - - // classloaderHashcode@className -> class bytes - private Map classCacheMap = new ConcurrentHashMap(); - - @Override - public byte[] getClassCache(ClassLoader loader, String className) { - String cacheKey = getCacheKey(loader, className); - return classCacheMap.get(cacheKey); - } - - @Override - public void putClassCache(ClassLoader loader, String className, byte[] classfileBuffer) { - String cacheKey = getCacheKey(loader, className); - classCacheMap.put(cacheKey, classfileBuffer); - } - - private String getCacheKey(ClassLoader loader, String className) { - return getClassLoaderHash(loader) + "@" + className; - } - } - - static class FileCacheResolver implements ClassCacheResolver { - - private final File cacheDir; - - FileCacheResolver(File cacheDir) { - this.cacheDir = cacheDir; - - // clean cache dir on exit - FileUtils.deleteDirectoryOnExit(cacheDir); - } - - @Override - public byte[] getClassCache(ClassLoader loader, String className) { - // load from cache - File cacheFile = getCacheFile(loader, className); - if (cacheFile.exists()) { - FileInputStream fileInputStream = null; - try { - fileInputStream = new FileInputStream(cacheFile); - return IOUtils.toByteArray(fileInputStream); - } catch (IOException e) { - LOGGER.error("load class bytes from cache file failure", e); - } finally { - IOUtils.closeQuietly(fileInputStream); - } - } - return null; - } - - @Override - public void putClassCache(ClassLoader loader, String className, byte[] classfileBuffer) { - File cacheFile = getCacheFile(loader, className); - cacheFile.getParentFile().mkdirs(); - FileOutputStream output = null; - try { - output = new FileOutputStream(cacheFile); - IOUtils.copy(new ByteArrayInputStream(classfileBuffer), output); - } catch (IOException e) { - LOGGER.error("save class bytes to cache file failure", e); - } finally { - IOUtils.closeQuietly(output); - } - } - - private File getCacheFile(ClassLoader loader, String className) { - String filename = getClassLoaderHash(loader) + "/" + className.replace('.', '/') + ".class"; - return new File(cacheDir, filename); - } - - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/ReturnTypeNameMatch.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/ReturnTypeNameMatch.java deleted file mode 100644 index 38318020..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/bytebuddy/ReturnTypeNameMatch.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.bytebuddy; - -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * Return Type match. Similar with {@link net.bytebuddy.matcher.ElementMatchers#returns}, the only different between - * them is this match use {@link String} to declare the type, instead of {@link Class}. This can avoid the classloader - * risk. - *

- * 2019-08-15 - */ -public class ReturnTypeNameMatch implements ElementMatcher { - - /** - * the target return type - */ - private String returnTypeName; - - /** - * declare the match target method with the certain type. - * - * @param returnTypeName target return type - */ - private ReturnTypeNameMatch(String returnTypeName) { - ArrayTypeNameChecker.check(returnTypeName); - this.returnTypeName = returnTypeName; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean matches(MethodDescription target) { - return target.getReturnType().asErasure().getName().equals(returnTypeName); - } - - /** - * The static method to create {@link ReturnTypeNameMatch} This is a delegate method to follow byte-buddy {@link - * ElementMatcher}'s code style. - * - * @param returnTypeName target return type - * @return new {@link ReturnTypeNameMatch} instance. - */ - public static ElementMatcher returnsWithType(String returnTypeName) { - return new ReturnTypeNameMatch(returnTypeName); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/exception/IllegalPluginDefineException.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/exception/IllegalPluginDefineException.java deleted file mode 100644 index a23d7240..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/exception/IllegalPluginDefineException.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.exception; - -/** - * Thrown to indicate that a illegal format plugin definition has been defined in hippo4j-plugin.define. - */ -public class IllegalPluginDefineException extends Exception { - - public IllegalPluginDefineException(String define) { - super("Illegal plugin define : " + define); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/ConstructorInterceptPoint.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/ConstructorInterceptPoint.java deleted file mode 100644 index 330aa7d0..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/ConstructorInterceptPoint.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor; - -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * One of the three "Intercept Point". "Intercept Point" is a definition about where and how intercept happens. In this - * "Intercept Point", the definition targets class's constructors, and the interceptor. - *

- * ref to two others: {@link StaticMethodsInterceptPoint} and {@link InstanceMethodsInterceptPoint} - *

- */ -public interface ConstructorInterceptPoint { - - /** - * Constructor matcher - * - * @return matcher instance. - */ - ElementMatcher getConstructorMatcher(); - - /** - * @return represents a class name, the class instance must be a instance of {@link - * cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor} - */ - String getConstructorInterceptor(); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/DeclaredInstanceMethodsInterceptPoint.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/DeclaredInstanceMethodsInterceptPoint.java deleted file mode 100644 index 5ff4368a..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/DeclaredInstanceMethodsInterceptPoint.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor; - -/** - * this interface for those who only want to enhance declared method in case of some unexpected issue, such as spring - * controller - */ -public interface DeclaredInstanceMethodsInterceptPoint extends InstanceMethodsInterceptPoint { -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/EnhanceException.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/EnhanceException.java deleted file mode 100644 index 605bd8f5..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/EnhanceException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor; - -import cn.hippo4j.agent.core.plugin.PluginException; - -public class EnhanceException extends PluginException { - - private static final long serialVersionUID = -2234782755784217255L; - - public EnhanceException(String message) { - super(message); - } - - public EnhanceException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/InstanceMethodsInterceptPoint.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/InstanceMethodsInterceptPoint.java deleted file mode 100644 index 396f471c..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/InstanceMethodsInterceptPoint.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor; - -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * One of the three "Intercept Point". "Intercept Point" is a definition about where and how intercept happens. In this - * "Intercept Point", the definition targets class's instance methods, and the interceptor. - *

- * ref to two others: {@link ConstructorInterceptPoint} and {@link StaticMethodsInterceptPoint} - *

- */ -public interface InstanceMethodsInterceptPoint { - - /** - * class instance methods matcher. - * - * @return methods matcher - */ - ElementMatcher getMethodsMatcher(); - - /** - * @return represents a class name, the class instance must instanceof InstanceMethodsAroundInterceptor. - */ - String getMethodsInterceptor(); - - boolean isOverrideArgs(); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/StaticMethodsInterceptPoint.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/StaticMethodsInterceptPoint.java deleted file mode 100644 index 73babfa5..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/StaticMethodsInterceptPoint.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor; - -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * One of the three "Intercept Point". "Intercept Point" is a definition about where and how intercept happens. In this - * "Intercept Point", the definition targets class's static methods, and the interceptor. - *

- * ref to two others: {@link ConstructorInterceptPoint} and {@link InstanceMethodsInterceptPoint} - *

- */ -public interface StaticMethodsInterceptPoint { - - /** - * static methods matcher. - * - * @return matcher instance. - */ - ElementMatcher getMethodsMatcher(); - - /** - * @return represents a class name, the class instance must instanceof StaticMethodsAroundInterceptor. - */ - String getMethodsInterceptor(); - - boolean isOverrideArgs(); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/BootstrapInterRuntimeAssist.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/BootstrapInterRuntimeAssist.java deleted file mode 100644 index a1c5d38a..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/BootstrapInterRuntimeAssist.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance; - -import cn.hippo4j.agent.core.plugin.bootstrap.IBootstrapLog; - -import java.io.PrintStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; - -/** - * This assist help all bootstrap class core interceptor. - */ -public class BootstrapInterRuntimeAssist { - - private static final String AGENT_CLASSLOADER_DEFAULT = "cn.hippo4j.agent.core.plugin.loader.AgentClassLoader"; - private static final String DEFAULT_AGENT_CLASSLOADER_INSTANCE = "DEFAULT_LOADER"; - private static final String LOG_MANAGER_CLASS = "cn.hippo4j.agent.core.plugin.bootstrap.BootstrapPluginLogBridge"; - private static final String LOG_MANAGER_GET_LOGGER_METHOD = "getLogger"; - private static final PrintStream OUT = System.out; - - public static ClassLoader getAgentClassLoader() { - try { - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - if (loader == null) { - return null; - } - Class agentClassLoaderClass = Class.forName(AGENT_CLASSLOADER_DEFAULT, true, loader); - Field defaultLoaderField = agentClassLoaderClass.getDeclaredField(DEFAULT_AGENT_CLASSLOADER_INSTANCE); - defaultLoaderField.setAccessible(true); - ClassLoader defaultAgentClassLoader = (ClassLoader) defaultLoaderField.get(null); - - return defaultAgentClassLoader; - } catch (Exception e) { - e.printStackTrace(OUT); - return null; - } - } - - public static IBootstrapLog getLogger(ClassLoader defaultAgentClassLoader, String interceptor) { - try { - Class logManagerClass = Class.forName(LOG_MANAGER_CLASS, true, defaultAgentClassLoader); - Method getLogger = logManagerClass.getMethod(LOG_MANAGER_GET_LOGGER_METHOD, String.class); - return (IBootstrapLog) getLogger.invoke(null, interceptor + "_internal"); - } catch (Exception e) { - e.printStackTrace(OUT); - return null; - } - } - - public static T createInterceptor(ClassLoader defaultAgentClassLoader, String className, IBootstrapLog log) { - try { - Class interceptor = Class.forName(className, true, defaultAgentClassLoader); - return (T) interceptor.newInstance(); - } catch (Exception e) { - log.error(e, "Interceptor[{}] not found", className); - } - return null; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/ClassEnhancePluginDefine.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/ClassEnhancePluginDefine.java deleted file mode 100644 index 5790f80c..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/ClassEnhancePluginDefine.java +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance; - -import cn.hippo4j.agent.core.plugin.AbstractClassEnhancePluginDefine; -import cn.hippo4j.agent.core.plugin.EnhanceContext; -import cn.hippo4j.agent.core.plugin.PluginException; -import cn.hippo4j.agent.core.plugin.bootstrap.BootstrapInstrumentBoost; -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.DeclaredInstanceMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.EnhanceException; -import cn.hippo4j.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.StaticMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.v2.InstanceMethodsInterceptV2Point; -import cn.hippo4j.agent.core.plugin.interceptor.v2.StaticMethodsInterceptV2Point; -import cn.hippo4j.agent.core.util.StringUtil; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.dynamic.DynamicType; -import net.bytebuddy.implementation.FieldAccessor; -import net.bytebuddy.implementation.MethodDelegation; -import net.bytebuddy.implementation.SuperMethodCall; -import net.bytebuddy.implementation.bind.annotation.Morph; -import net.bytebuddy.matcher.ElementMatcher; -import net.bytebuddy.matcher.ElementMatchers; - -import static net.bytebuddy.jar.asm.Opcodes.ACC_PRIVATE; -import static net.bytebuddy.jar.asm.Opcodes.ACC_VOLATILE; -import static net.bytebuddy.matcher.ElementMatchers.isStatic; -import static net.bytebuddy.matcher.ElementMatchers.not; - -/** - * This class controls all enhance operations, including enhance constructors, instance methods and static methods. All - * the enhances base on three types interceptor point: {@link ConstructorInterceptPoint}, {@link - * InstanceMethodsInterceptPoint} and {@link StaticMethodsInterceptPoint} If plugin is going to enhance constructors, - * instance methods, or both, {@link ClassEnhancePluginDefine} will add a field of {@link Object} type. - */ -public abstract class ClassEnhancePluginDefine extends AbstractClassEnhancePluginDefine { - - private static final ILog LOGGER = LogManager.getLogger(ClassEnhancePluginDefine.class); - - /** - * Enhance a class to intercept constructors and class instance methods. - * - * @param typeDescription target class description - * @param newClassBuilder byte-buddy's builder to manipulate class bytecode. - * @return new byte-buddy's builder for further manipulation. - */ - @Override - protected DynamicType.Builder enhanceInstance(TypeDescription typeDescription, - DynamicType.Builder newClassBuilder, ClassLoader classLoader, - EnhanceContext context) throws PluginException { - ConstructorInterceptPoint[] constructorInterceptPoints = getConstructorsInterceptPoints(); - InstanceMethodsInterceptPoint[] instanceMethodsInterceptPoints = getInstanceMethodsInterceptPoints(); - String enhanceOriginClassName = typeDescription.getTypeName(); - boolean existedConstructorInterceptPoint = false; - if (constructorInterceptPoints != null && constructorInterceptPoints.length > 0) { - existedConstructorInterceptPoint = true; - } - boolean existedMethodsInterceptPoints = false; - if (instanceMethodsInterceptPoints != null && instanceMethodsInterceptPoints.length > 0) { - existedMethodsInterceptPoints = true; - } - - /** - * nothing need to be enhanced in class instance, maybe need enhance static methods. - */ - if (!existedConstructorInterceptPoint && !existedMethodsInterceptPoints) { - return newClassBuilder; - } - - /** - * Manipulate class source code.
- * - * new class need:
- * 1.Add field, name {@link #CONTEXT_ATTR_NAME}. - * 2.Add a field accessor for this field. - * - * And make sure the source codes manipulation only occurs once. - * - */ - if (!typeDescription.isAssignableTo(EnhancedInstance.class)) { - if (!context.isObjectExtended()) { - newClassBuilder = newClassBuilder.defineField( - CONTEXT_ATTR_NAME, Object.class, ACC_PRIVATE | ACC_VOLATILE) - .implement(EnhancedInstance.class) - .intercept(FieldAccessor.ofField(CONTEXT_ATTR_NAME)); - context.extendObjectCompleted(); - } - } - - /** - * 2. enhance constructors - */ - if (existedConstructorInterceptPoint) { - for (ConstructorInterceptPoint constructorInterceptPoint : constructorInterceptPoints) { - if (isBootstrapInstrumentation()) { - newClassBuilder = newClassBuilder.constructor(constructorInterceptPoint.getConstructorMatcher()) - .intercept(SuperMethodCall.INSTANCE.andThen(MethodDelegation.withDefaultConfiguration() - .to(BootstrapInstrumentBoost - .forInternalDelegateClass(constructorInterceptPoint - .getConstructorInterceptor())))); - } else { - newClassBuilder = newClassBuilder.constructor(constructorInterceptPoint.getConstructorMatcher()) - .intercept(SuperMethodCall.INSTANCE.andThen(MethodDelegation.withDefaultConfiguration() - .to(new ConstructorInter(constructorInterceptPoint - .getConstructorInterceptor(), classLoader)))); - } - } - } - - /** - * 3. enhance instance methods - */ - if (existedMethodsInterceptPoints) { - for (InstanceMethodsInterceptPoint instanceMethodsInterceptPoint : instanceMethodsInterceptPoints) { - String interceptor = instanceMethodsInterceptPoint.getMethodsInterceptor(); - if (StringUtil.isEmpty(interceptor)) { - throw new EnhanceException("no InstanceMethodsAroundInterceptor define to enhance class " + enhanceOriginClassName); - } - ElementMatcher.Junction junction = not(isStatic()).and(instanceMethodsInterceptPoint.getMethodsMatcher()); - if (instanceMethodsInterceptPoint instanceof DeclaredInstanceMethodsInterceptPoint) { - junction = junction.and(ElementMatchers.isDeclaredBy(typeDescription)); - } - if (instanceMethodsInterceptPoint.isOverrideArgs()) { - if (isBootstrapInstrumentation()) { - newClassBuilder = newClassBuilder.method(junction) - .intercept(MethodDelegation.withDefaultConfiguration() - .withBinders(Morph.Binder.install(OverrideCallable.class)) - .to(BootstrapInstrumentBoost.forInternalDelegateClass(interceptor))); - } else { - newClassBuilder = newClassBuilder.method(junction) - .intercept(MethodDelegation.withDefaultConfiguration() - .withBinders(Morph.Binder.install(OverrideCallable.class)) - .to(new InstMethodsInterWithOverrideArgs(interceptor, classLoader))); - } - } else { - if (isBootstrapInstrumentation()) { - newClassBuilder = newClassBuilder.method(junction) - .intercept(MethodDelegation.withDefaultConfiguration() - .to(BootstrapInstrumentBoost.forInternalDelegateClass(interceptor))); - } else { - newClassBuilder = newClassBuilder.method(junction) - .intercept(MethodDelegation.withDefaultConfiguration() - .to(new InstMethodsInter(interceptor, classLoader))); - } - } - } - } - - return newClassBuilder; - } - - /** - * Enhance a class to intercept class static methods. - * - * @param typeDescription target class description - * @param newClassBuilder byte-buddy's builder to manipulate class bytecode. - * @return new byte-buddy's builder for further manipulation. - */ - @Override - protected DynamicType.Builder enhanceClass(TypeDescription typeDescription, DynamicType.Builder newClassBuilder, - ClassLoader classLoader) throws PluginException { - StaticMethodsInterceptPoint[] staticMethodsInterceptPoints = getStaticMethodsInterceptPoints(); - String enhanceOriginClassName = typeDescription.getTypeName(); - if (staticMethodsInterceptPoints == null || staticMethodsInterceptPoints.length == 0) { - return newClassBuilder; - } - - for (StaticMethodsInterceptPoint staticMethodsInterceptPoint : staticMethodsInterceptPoints) { - String interceptor = staticMethodsInterceptPoint.getMethodsInterceptor(); - if (StringUtil.isEmpty(interceptor)) { - throw new EnhanceException("no StaticMethodsAroundInterceptor define to enhance class " + enhanceOriginClassName); - } - - if (staticMethodsInterceptPoint.isOverrideArgs()) { - if (isBootstrapInstrumentation()) { - newClassBuilder = newClassBuilder.method(isStatic().and(staticMethodsInterceptPoint.getMethodsMatcher())) - .intercept(MethodDelegation.withDefaultConfiguration() - .withBinders(Morph.Binder.install(OverrideCallable.class)) - .to(BootstrapInstrumentBoost.forInternalDelegateClass(interceptor))); - } else { - newClassBuilder = newClassBuilder.method(isStatic().and(staticMethodsInterceptPoint.getMethodsMatcher())) - .intercept(MethodDelegation.withDefaultConfiguration() - .withBinders(Morph.Binder.install(OverrideCallable.class)) - .to(new StaticMethodsInterWithOverrideArgs(interceptor))); - } - } else { - if (isBootstrapInstrumentation()) { - newClassBuilder = newClassBuilder.method(isStatic().and(staticMethodsInterceptPoint.getMethodsMatcher())) - .intercept(MethodDelegation.withDefaultConfiguration() - .to(BootstrapInstrumentBoost.forInternalDelegateClass(interceptor))); - } else { - newClassBuilder = newClassBuilder.method(isStatic().and(staticMethodsInterceptPoint.getMethodsMatcher())) - .intercept(MethodDelegation.withDefaultConfiguration() - .to(new StaticMethodsInter(interceptor))); - } - } - - } - - return newClassBuilder; - } - - /** - * @return null, means enhance no v2 instance methods. - */ - @Override - public InstanceMethodsInterceptV2Point[] getInstanceMethodsInterceptV2Points() { - return null; - } - - /** - * @return null, means enhance no v2 static methods. - */ - @Override - public StaticMethodsInterceptV2Point[] getStaticMethodsInterceptV2Points() { - return null; - } - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/ClassInstanceMethodsEnhancePluginDefine.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/ClassInstanceMethodsEnhancePluginDefine.java deleted file mode 100644 index f8b5c8c3..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/ClassInstanceMethodsEnhancePluginDefine.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance; - -import cn.hippo4j.agent.core.plugin.interceptor.StaticMethodsInterceptPoint; - -/** - * Plugins, which only need enhance class instance methods. Actually, inherit from {@link - * ClassInstanceMethodsEnhancePluginDefine} has no differences with inherit from {@link ClassEnhancePluginDefine}. Just - * override {@link ClassEnhancePluginDefine#getStaticMethodsInterceptPoints}, and return NULL, which means nothing to - * enhance. - */ -public abstract class ClassInstanceMethodsEnhancePluginDefine extends ClassEnhancePluginDefine { - - /** - * @return null, means enhance no static methods. - */ - @Override - public StaticMethodsInterceptPoint[] getStaticMethodsInterceptPoints() { - return null; - } - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/ClassStaticMethodsEnhancePluginDefine.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/ClassStaticMethodsEnhancePluginDefine.java deleted file mode 100644 index c5b04513..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/ClassStaticMethodsEnhancePluginDefine.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance; - -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; - -/** - * Plugins, which only need enhance class static methods. Actually, inherit from {@link - * ClassStaticMethodsEnhancePluginDefine} has no differences with inherit from {@link ClassEnhancePluginDefine}. Just - * override {@link ClassEnhancePluginDefine#getConstructorsInterceptPoints} and {@link - * ClassEnhancePluginDefine#getInstanceMethodsInterceptPoints}, and return NULL, which means nothing to enhance. - */ -public abstract class ClassStaticMethodsEnhancePluginDefine extends ClassEnhancePluginDefine { - - /** - * @return null, means enhance no constructors. - */ - @Override - public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return null; - } - - /** - * @return null, means enhance no instance methods. - */ - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return null; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/ConstructorInter.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/ConstructorInter.java deleted file mode 100644 index 7896eb22..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/ConstructorInter.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.plugin.PluginException; -import cn.hippo4j.agent.core.plugin.loader.InterceptorInstanceLoader; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import net.bytebuddy.implementation.bind.annotation.This; - -/** - * The actual byte-buddy's interceptor to intercept constructor methods. In this class, it provides a bridge between - * byte-buddy and sky-walking plugin. - */ -public class ConstructorInter { - - private static final ILog LOGGER = LogManager.getLogger(ConstructorInter.class); - - /** - * An {@link InstanceConstructorInterceptor} This name should only stay in {@link String}, the real {@link Class} - * type will trigger classloader failure. If you want to know more, please check on books about Classloader or - * Classloader appointment mechanism. - */ - private InstanceConstructorInterceptor interceptor; - - /** - * @param constructorInterceptorClassName class full name. - */ - public ConstructorInter(String constructorInterceptorClassName, ClassLoader classLoader) throws PluginException { - try { - interceptor = InterceptorInstanceLoader.load(constructorInterceptorClassName, classLoader); - } catch (Throwable t) { - throw new PluginException("Can't create InstanceConstructorInterceptorV2.", t); - } - } - - /** - * Intercept the target constructor. - * - * @param obj target class instance. - * @param allArguments all constructor arguments - */ - @RuntimeType - public void intercept(@This Object obj, @AllArguments Object[] allArguments) { - try { - EnhancedInstance targetObject = (EnhancedInstance) obj; - - interceptor.onConstruct(targetObject, allArguments); - } catch (Throwable t) { - LOGGER.error("ConstructorInter failure.", t); - } - - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/EnhancedInstance.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/EnhancedInstance.java deleted file mode 100644 index c6b7900b..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/EnhancedInstance.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance; - -public interface EnhancedInstance { - - Object getHippo4jDynamicField(); - - void setHippo4jDynamicField(Object value); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/InstMethodsInter.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/InstMethodsInter.java deleted file mode 100644 index 1d5dd6c1..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/InstMethodsInter.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.plugin.PluginException; -import cn.hippo4j.agent.core.plugin.loader.InterceptorInstanceLoader; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import net.bytebuddy.implementation.bind.annotation.SuperCall; -import net.bytebuddy.implementation.bind.annotation.This; - -import java.lang.reflect.Method; -import java.util.concurrent.Callable; - -/** - * The actual byte-buddy's interceptor to intercept class instance methods. In this class, it provides a bridge between - * byte-buddy and sky-walking plugin. - */ -public class InstMethodsInter { - - private static final ILog LOGGER = LogManager.getLogger(InstMethodsInter.class); - - /** - * An {@link InstanceMethodsAroundInterceptor} This name should only stay in {@link String}, the real {@link Class} - * type will trigger classloader failure. If you want to know more, please check on books about Classloader or - * Classloader appointment mechanism. - */ - private InstanceMethodsAroundInterceptor interceptor; - - /** - * @param instanceMethodsAroundInterceptorClassName class full name. - */ - public InstMethodsInter(String instanceMethodsAroundInterceptorClassName, ClassLoader classLoader) { - try { - interceptor = InterceptorInstanceLoader.load(instanceMethodsAroundInterceptorClassName, classLoader); - } catch (Throwable t) { - throw new PluginException("Can't create InstanceMethodsAroundInterceptor.", t); - } - } - - /** - * Intercept the target instance method. - * - * @param obj target class instance. - * @param allArguments all method arguments - * @param method method description. - * @param zuper the origin call ref. - * @return the return value of target instance method. - * @throws Exception only throw exception because of zuper.call() or unexpected exception in sky-walking ( This is a - * bug, if anything triggers this condition ). - */ - @RuntimeType - public Object intercept(@This Object obj, @AllArguments Object[] allArguments, @SuperCall Callable zuper, - @Origin Method method) throws Throwable { - EnhancedInstance targetObject = (EnhancedInstance) obj; - - MethodInterceptResult result = new MethodInterceptResult(); - try { - interceptor.beforeMethod(targetObject, method, allArguments, method.getParameterTypes(), result); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] before method[{}] intercept failure", obj.getClass(), method.getName()); - } - - Object ret = null; - try { - if (!result.isContinue()) { - ret = result._ret(); - } else { - ret = zuper.call(); - } - } catch (Throwable t) { - try { - interceptor.handleMethodException(targetObject, method, allArguments, method.getParameterTypes(), t); - } catch (Throwable t2) { - LOGGER.error(t2, "class[{}] handle method[{}] exception failure", obj.getClass(), method.getName()); - } - throw t; - } finally { - try { - ret = interceptor.afterMethod(targetObject, method, allArguments, method.getParameterTypes(), ret); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] after method[{}] intercept failure", obj.getClass(), method.getName()); - } - } - return ret; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/InstMethodsInterWithOverrideArgs.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/InstMethodsInterWithOverrideArgs.java deleted file mode 100644 index 57bc7444..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/InstMethodsInterWithOverrideArgs.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.plugin.PluginException; -import cn.hippo4j.agent.core.plugin.loader.InterceptorInstanceLoader; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Morph; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import net.bytebuddy.implementation.bind.annotation.This; - -import java.lang.reflect.Method; - -/** - * The actual byte-buddy's interceptor to intercept class instance methods. In this class, it provides a bridge between - * byte-buddy and sky-walking plugin. - */ -public class InstMethodsInterWithOverrideArgs { - - private static final ILog LOGGER = LogManager.getLogger(InstMethodsInterWithOverrideArgs.class); - - /** - * An {@link InstanceMethodsAroundInterceptor} This name should only stay in {@link String}, the real {@link Class} - * type will trigger classloader failure. If you want to know more, please check on books about Classloader or - * Classloader appointment mechanism. - */ - private InstanceMethodsAroundInterceptor interceptor; - - /** - * @param instanceMethodsAroundInterceptorClassName class full name. - */ - public InstMethodsInterWithOverrideArgs(String instanceMethodsAroundInterceptorClassName, ClassLoader classLoader) { - try { - interceptor = InterceptorInstanceLoader.load(instanceMethodsAroundInterceptorClassName, classLoader); - } catch (Throwable t) { - throw new PluginException("Can't create InstanceMethodsAroundInterceptor.", t); - } - } - - /** - * Intercept the target instance method. - * - * @param obj target class instance. - * @param allArguments all method arguments - * @param method method description. - * @param zuper the origin call ref. - * @return the return value of target instance method. - * @throws Exception only throw exception because of zuper.call() or unexpected exception in sky-walking ( This is a - * bug, if anything triggers this condition ). - */ - @RuntimeType - public Object intercept(@This Object obj, @AllArguments Object[] allArguments, @Origin Method method, - @Morph OverrideCallable zuper) throws Throwable { - EnhancedInstance targetObject = (EnhancedInstance) obj; - - MethodInterceptResult result = new MethodInterceptResult(); - try { - interceptor.beforeMethod(targetObject, method, allArguments, method.getParameterTypes(), result); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] before method[{}] intercept failure", obj.getClass(), method.getName()); - } - - Object ret = null; - try { - if (!result.isContinue()) { - ret = result._ret(); - } else { - ret = zuper.call(allArguments); - } - } catch (Throwable t) { - try { - interceptor.handleMethodException(targetObject, method, allArguments, method.getParameterTypes(), t); - } catch (Throwable t2) { - LOGGER.error(t2, "class[{}] handle method[{}] exception failure", obj.getClass(), method.getName()); - } - throw t; - } finally { - try { - ret = interceptor.afterMethod(targetObject, method, allArguments, method.getParameterTypes(), ret); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] after method[{}] intercept failure", obj.getClass(), method.getName()); - } - } - return ret; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/InstanceConstructorInterceptor.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/InstanceConstructorInterceptor.java deleted file mode 100644 index 7cc3472c..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/InstanceConstructorInterceptor.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance; - -/** - * The instance constructor's interceptor interface. Any plugin, which wants to intercept constructor, must implement - * this interface. - *

- */ -public interface InstanceConstructorInterceptor { - - /** - * Called after the origin constructor invocation. - */ - void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable; -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/InstanceMethodsAroundInterceptor.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/InstanceMethodsAroundInterceptor.java deleted file mode 100644 index 97e13ad8..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/InstanceMethodsAroundInterceptor.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance; - -import java.lang.reflect.Method; - -/** - * A interceptor, which intercept method's invocation. The target methods will be defined in {@link - * ClassEnhancePluginDefine}'s subclass, most likely in {@link ClassInstanceMethodsEnhancePluginDefine} - */ -public interface InstanceMethodsAroundInterceptor { - - /** - * called before target method invocation. - * - * @param result change this result, if you want to truncate the method. - */ - void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - MethodInterceptResult result) throws Throwable; - - /** - * called after target method invocation. Even method's invocation triggers an exception. - * - * @param ret the method's original return value. May be null if the method triggers an exception. - * @return the method's actual return value. - */ - Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - Object ret) throws Throwable; - - /** - * called when occur exception. - * - * @param t the exception occur. - */ - void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, - Class[] argumentsTypes, Throwable t); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/MethodInterceptResult.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/MethodInterceptResult.java deleted file mode 100644 index e647f2bc..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/MethodInterceptResult.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance; - -import java.lang.reflect.Method; - -/** - * This is a method return value manipulator. When a interceptor's method, such as {@link - * InstanceMethodsAroundInterceptor#beforeMethod(EnhancedInstance, Method, Object[], Class[], MethodInterceptResult)} - * (org.apache.skywalking.apm.agent.core.plugin.interceptor.EnhancedClassInstanceContext, has this as a method argument, - * the interceptor can manipulate the method's return value.

The new value set to this object, by {@link - * MethodInterceptResult#defineReturnValue(Object)}, will override the origin return value. - */ -public class MethodInterceptResult { - - private boolean isContinue = true; - - private Object ret = null; - - /** - * define the new return value. - * - * @param ret new return value. - */ - public void defineReturnValue(Object ret) { - this.isContinue = false; - this.ret = ret; - } - - /** - * @return true, will trigger method interceptor({@link InstMethodsInter} and {@link StaticMethodsInter}) to invoke - * the origin method. Otherwise, not. - */ - public boolean isContinue() { - return isContinue; - } - - /** - * @return the new return value. - */ - public Object _ret() { - return ret; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/OverrideCallable.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/OverrideCallable.java deleted file mode 100644 index 8a488dd4..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/OverrideCallable.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance; - -public interface OverrideCallable { - - Object call(Object[] args); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/StaticMethodsAroundInterceptor.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/StaticMethodsAroundInterceptor.java deleted file mode 100644 index d6398f19..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/StaticMethodsAroundInterceptor.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance; - -import java.lang.reflect.Method; - -/** - * The static method's interceptor interface. Any plugin, which wants to intercept static methods, must implement this - * interface. - */ -public interface StaticMethodsAroundInterceptor { - - /** - * called before target method invocation. - * - * @param result change this result, if you want to truncate the method. - */ - void beforeMethod(Class clazz, Method method, Object[] allArguments, Class[] parameterTypes, - MethodInterceptResult result); - - /** - * called after target method invocation. Even method's invocation triggers an exception. - * - * @param ret the method's original return value. - * @return the method's actual return value. - */ - Object afterMethod(Class clazz, Method method, Object[] allArguments, Class[] parameterTypes, Object ret); - - /** - * called when occur exception. - * - * @param t the exception occur. - */ - void handleMethodException(Class clazz, Method method, Object[] allArguments, Class[] parameterTypes, - Throwable t); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/StaticMethodsInter.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/StaticMethodsInter.java deleted file mode 100644 index 0a98c7de..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/StaticMethodsInter.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.plugin.loader.InterceptorInstanceLoader; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import net.bytebuddy.implementation.bind.annotation.SuperCall; - -import java.lang.reflect.Method; -import java.util.concurrent.Callable; - -/** - * The actual byte-buddy's interceptor to intercept class static methods. In this class, it provides a bridge between - * byte-buddy and sky-walking plugin. - */ -public class StaticMethodsInter { - - private static final ILog LOGGER = LogManager.getLogger(StaticMethodsInter.class); - - /** - * A class full name, and instanceof {@link StaticMethodsAroundInterceptor} This name should only stay in {@link - * String}, the real {@link Class} type will trigger classloader failure. If you want to know more, please check on - * books about Classloader or Classloader appointment mechanism. - */ - private String staticMethodsAroundInterceptorClassName; - - /** - * Set the name of {@link StaticMethodsInter#staticMethodsAroundInterceptorClassName} - * - * @param staticMethodsAroundInterceptorClassName class full name. - */ - public StaticMethodsInter(String staticMethodsAroundInterceptorClassName) { - this.staticMethodsAroundInterceptorClassName = staticMethodsAroundInterceptorClassName; - } - - /** - * Intercept the target static method. - * - * @param clazz target class - * @param allArguments all method arguments - * @param method method description. - * @param zuper the origin call ref. - * @return the return value of target static method. - * @throws Exception only throw exception because of zuper.call() or unexpected exception in sky-walking ( This is a - * bug, if anything triggers this condition ). - */ - @RuntimeType - public Object intercept(@Origin Class clazz, @AllArguments Object[] allArguments, @Origin Method method, - @SuperCall Callable zuper) throws Throwable { - StaticMethodsAroundInterceptor interceptor = InterceptorInstanceLoader.load(staticMethodsAroundInterceptorClassName, clazz - .getClassLoader()); - - MethodInterceptResult result = new MethodInterceptResult(); - try { - interceptor.beforeMethod(clazz, method, allArguments, method.getParameterTypes(), result); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] before static method[{}] intercept failure", clazz, method.getName()); - } - - Object ret = null; - try { - if (!result.isContinue()) { - ret = result._ret(); - } else { - ret = zuper.call(); - } - } catch (Throwable t) { - try { - interceptor.handleMethodException(clazz, method, allArguments, method.getParameterTypes(), t); - } catch (Throwable t2) { - LOGGER.error(t2, "class[{}] handle static method[{}] exception failure", clazz, method.getName(), t2.getMessage()); - } - throw t; - } finally { - try { - ret = interceptor.afterMethod(clazz, method, allArguments, method.getParameterTypes(), ret); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] after static method[{}] intercept failure:{}", clazz, method.getName(), t.getMessage()); - } - } - return ret; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/StaticMethodsInterWithOverrideArgs.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/StaticMethodsInterWithOverrideArgs.java deleted file mode 100644 index e7c11a7f..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/StaticMethodsInterWithOverrideArgs.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.plugin.loader.InterceptorInstanceLoader; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Morph; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; - -import java.lang.reflect.Method; - -/** - * The actual byte-buddy's interceptor to intercept class static methods. In this class, it provides a bridge between - * byte-buddy and sky-walking plugin. - */ -public class StaticMethodsInterWithOverrideArgs { - - private static final ILog LOGGER = LogManager.getLogger(StaticMethodsInterWithOverrideArgs.class); - - /** - * A class full name, and instanceof {@link StaticMethodsAroundInterceptor} This name should only stay in {@link - * String}, the real {@link Class} type will trigger classloader failure. If you want to know more, please check on - * books about Classloader or Classloader appointment mechanism. - */ - private String staticMethodsAroundInterceptorClassName; - - /** - * Set the name of {@link StaticMethodsInterWithOverrideArgs#staticMethodsAroundInterceptorClassName} - * - * @param staticMethodsAroundInterceptorClassName class full name. - */ - public StaticMethodsInterWithOverrideArgs(String staticMethodsAroundInterceptorClassName) { - this.staticMethodsAroundInterceptorClassName = staticMethodsAroundInterceptorClassName; - } - - /** - * Intercept the target static method. - * - * @param clazz target class - * @param allArguments all method arguments - * @param method method description. - * @param zuper the origin call ref. - * @return the return value of target static method. - * @throws Exception only throw exception because of zuper.call() or unexpected exception in sky-walking ( This is a - * bug, if anything triggers this condition ). - */ - @RuntimeType - public Object intercept(@Origin Class clazz, @AllArguments Object[] allArguments, @Origin Method method, - @Morph OverrideCallable zuper) throws Throwable { - StaticMethodsAroundInterceptor interceptor = InterceptorInstanceLoader.load(staticMethodsAroundInterceptorClassName, clazz - .getClassLoader()); - - MethodInterceptResult result = new MethodInterceptResult(); - try { - interceptor.beforeMethod(clazz, method, allArguments, method.getParameterTypes(), result); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] before static method[{}] intercept failure", clazz, method.getName()); - } - - Object ret = null; - try { - if (!result.isContinue()) { - ret = result._ret(); - } else { - ret = zuper.call(allArguments); - } - } catch (Throwable t) { - try { - interceptor.handleMethodException(clazz, method, allArguments, method.getParameterTypes(), t); - } catch (Throwable t2) { - LOGGER.error(t2, "class[{}] handle static method[{}] exception failure", clazz, method.getName(), t2.getMessage()); - } - throw t; - } finally { - try { - ret = interceptor.afterMethod(clazz, method, allArguments, method.getParameterTypes(), ret); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] after static method[{}] intercept failure:{}", clazz, method.getName(), t.getMessage()); - } - } - return ret; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/ClassEnhancePluginDefineV2.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/ClassEnhancePluginDefineV2.java deleted file mode 100644 index 75da0262..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/ClassEnhancePluginDefineV2.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance.v2; - -import cn.hippo4j.agent.core.plugin.AbstractClassEnhancePluginDefine; -import cn.hippo4j.agent.core.plugin.EnhanceContext; -import cn.hippo4j.agent.core.plugin.PluginException; -import cn.hippo4j.agent.core.plugin.bootstrap.BootstrapInstrumentBoost; -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.EnhanceException; -import cn.hippo4j.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.StaticMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.ConstructorInter; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.OverrideCallable; -import cn.hippo4j.agent.core.plugin.interceptor.v2.ConstructorInterceptV2Point; -import cn.hippo4j.agent.core.plugin.interceptor.v2.DeclaredInstanceMethodsInterceptV2Point; -import cn.hippo4j.agent.core.plugin.interceptor.v2.InstanceMethodsInterceptV2Point; -import cn.hippo4j.agent.core.plugin.interceptor.v2.StaticMethodsInterceptV2Point; -import cn.hippo4j.agent.core.util.StringUtil; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.dynamic.DynamicType; -import net.bytebuddy.implementation.FieldAccessor; -import net.bytebuddy.implementation.MethodDelegation; -import net.bytebuddy.implementation.SuperMethodCall; -import net.bytebuddy.implementation.bind.annotation.Morph; -import net.bytebuddy.matcher.ElementMatcher; -import net.bytebuddy.matcher.ElementMatchers; - -import static net.bytebuddy.jar.asm.Opcodes.ACC_PRIVATE; -import static net.bytebuddy.jar.asm.Opcodes.ACC_VOLATILE; -import static net.bytebuddy.matcher.ElementMatchers.isStatic; -import static net.bytebuddy.matcher.ElementMatchers.not; - -/** - * This class controls all enhance operations, including enhance constructors, instance methods and static methods. All - * the enhances base on three types interceptor point: {@link ConstructorInterceptV2Point}, {@link - * InstanceMethodsInterceptV2Point} and {@link StaticMethodsInterceptV2Point} If plugin is going to enhance constructors, - * instance methods, or both, {@link ClassEnhancePluginDefineV2} will add a field of {@link Object} type. - */ -public abstract class ClassEnhancePluginDefineV2 extends AbstractClassEnhancePluginDefine { - - @Override - protected DynamicType.Builder enhanceClass(TypeDescription typeDescription, - DynamicType.Builder newClassBuilder, - ClassLoader classLoader) throws PluginException { - StaticMethodsInterceptV2Point[] staticMethodsInterceptV2Points = getStaticMethodsInterceptV2Points(); - String enhanceOriginClassName = typeDescription.getTypeName(); - if (staticMethodsInterceptV2Points == null || staticMethodsInterceptV2Points.length == 0) { - return newClassBuilder; - } - - for (StaticMethodsInterceptV2Point staticMethodsInterceptV2Point : staticMethodsInterceptV2Points) { - String interceptor = staticMethodsInterceptV2Point.getMethodsInterceptorV2(); - if (StringUtil.isEmpty(interceptor)) { - throw new EnhanceException( - "no StaticMethodsAroundInterceptorV2 define to enhance class " + enhanceOriginClassName); - } - - if (staticMethodsInterceptV2Point.isOverrideArgs()) { - if (isBootstrapInstrumentation()) { - newClassBuilder = newClassBuilder.method( - isStatic().and(staticMethodsInterceptV2Point.getMethodsMatcher())) - .intercept(MethodDelegation.withDefaultConfiguration() - .withBinders(Morph.Binder.install(OverrideCallable.class)) - .to(BootstrapInstrumentBoost.forInternalDelegateClass(interceptor))); - } else { - newClassBuilder = newClassBuilder.method( - isStatic().and(staticMethodsInterceptV2Point.getMethodsMatcher())) - .intercept(MethodDelegation.withDefaultConfiguration() - .withBinders(Morph.Binder.install(OverrideCallable.class)) - .to(new StaticMethodsInterV2WithOverrideArgs(interceptor))); - } - } else { - if (isBootstrapInstrumentation()) { - newClassBuilder = newClassBuilder.method( - isStatic().and(staticMethodsInterceptV2Point.getMethodsMatcher())) - .intercept(MethodDelegation.withDefaultConfiguration() - .to(BootstrapInstrumentBoost.forInternalDelegateClass(interceptor))); - } else { - newClassBuilder = newClassBuilder.method( - isStatic().and(staticMethodsInterceptV2Point.getMethodsMatcher())) - .intercept(MethodDelegation.withDefaultConfiguration() - .to(new StaticMethodsInterV2(interceptor))); - } - } - - } - - return newClassBuilder; - } - - @Override - protected DynamicType.Builder enhanceInstance(TypeDescription typeDescription, - DynamicType.Builder newClassBuilder, ClassLoader classLoader, - EnhanceContext context) throws PluginException { - ConstructorInterceptPoint[] constructorInterceptPoints = getConstructorsInterceptPoints(); - InstanceMethodsInterceptV2Point[] instanceMethodsInterceptV2Points = getInstanceMethodsInterceptV2Points(); - String enhanceOriginClassName = typeDescription.getTypeName(); - - boolean existedConstructorInterceptPoint = false; - if (constructorInterceptPoints != null && constructorInterceptPoints.length > 0) { - existedConstructorInterceptPoint = true; - } - boolean existedMethodsInterceptV2Points = false; - if (instanceMethodsInterceptV2Points != null && instanceMethodsInterceptV2Points.length > 0) { - existedMethodsInterceptV2Points = true; - } - - if (!existedConstructorInterceptPoint && !existedMethodsInterceptV2Points) { - return newClassBuilder; - } - - if (!typeDescription.isAssignableTo(EnhancedInstance.class)) { - if (!context.isObjectExtended()) { - newClassBuilder = newClassBuilder.defineField( - CONTEXT_ATTR_NAME, Object.class, ACC_PRIVATE | ACC_VOLATILE) - .implement(EnhancedInstance.class) - .intercept(FieldAccessor.ofField(CONTEXT_ATTR_NAME)); - context.extendObjectCompleted(); - } - } - - if (existedConstructorInterceptPoint) { - for (ConstructorInterceptPoint constructorInterceptPoint : constructorInterceptPoints) { - if (isBootstrapInstrumentation()) { - newClassBuilder = newClassBuilder.constructor(constructorInterceptPoint.getConstructorMatcher()) - .intercept(SuperMethodCall.INSTANCE.andThen(MethodDelegation.withDefaultConfiguration() - .to(BootstrapInstrumentBoost - .forInternalDelegateClass(constructorInterceptPoint - .getConstructorInterceptor())))); - } else { - newClassBuilder = newClassBuilder.constructor(constructorInterceptPoint.getConstructorMatcher()) - .intercept(SuperMethodCall.INSTANCE.andThen(MethodDelegation.withDefaultConfiguration() - .to(new ConstructorInter(constructorInterceptPoint - .getConstructorInterceptor(), classLoader)))); - } - } - } - - if (existedMethodsInterceptV2Points) { - for (InstanceMethodsInterceptV2Point instanceMethodsInterceptV2Point : instanceMethodsInterceptV2Points) { - String interceptor = instanceMethodsInterceptV2Point.getMethodsInterceptorV2(); - if (StringUtil.isEmpty(interceptor)) { - throw new EnhanceException( - "no InstanceMethodsAroundInterceptorV2 define to enhance class " + enhanceOriginClassName); - } - ElementMatcher.Junction junction = not(isStatic()).and( - instanceMethodsInterceptV2Point.getMethodsMatcher()); - if (instanceMethodsInterceptV2Point instanceof DeclaredInstanceMethodsInterceptV2Point) { - junction = junction.and(ElementMatchers.isDeclaredBy(typeDescription)); - } - if (instanceMethodsInterceptV2Point.isOverrideArgs()) { - if (isBootstrapInstrumentation()) { - newClassBuilder = newClassBuilder.method(junction) - .intercept(MethodDelegation.withDefaultConfiguration() - .withBinders(Morph.Binder.install(OverrideCallable.class)) - .to(BootstrapInstrumentBoost.forInternalDelegateClass(interceptor))); - } else { - newClassBuilder = newClassBuilder.method(junction) - .intercept(MethodDelegation.withDefaultConfiguration() - .withBinders(Morph.Binder.install(OverrideCallable.class)) - .to(new InstMethodsInterV2WithOverrideArgs(interceptor, classLoader))); - } - } else { - if (isBootstrapInstrumentation()) { - newClassBuilder = newClassBuilder.method(junction) - .intercept(MethodDelegation.withDefaultConfiguration() - .to(BootstrapInstrumentBoost.forInternalDelegateClass(interceptor))); - } else { - newClassBuilder = newClassBuilder.method(junction) - .intercept(MethodDelegation.withDefaultConfiguration() - .to(new InstMethodsInterV2(interceptor, classLoader))); - } - } - } - } - - return newClassBuilder; - } - - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return null; - } - - @Override - public StaticMethodsInterceptPoint[] getStaticMethodsInterceptPoints() { - return null; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/ClassInstanceMethodsEnhancePluginDefineV2.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/ClassInstanceMethodsEnhancePluginDefineV2.java deleted file mode 100644 index 2f2c7300..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/ClassInstanceMethodsEnhancePluginDefineV2.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance.v2; - -import cn.hippo4j.agent.core.plugin.interceptor.v2.StaticMethodsInterceptV2Point; - -/** - * Plugins, which only need enhance class instance methods. Actually, inherit from {@link - * ClassInstanceMethodsEnhancePluginDefineV2} has no differences with inherit from {@link ClassEnhancePluginDefineV2}. - * Just override {@link ClassEnhancePluginDefineV2#getStaticMethodsInterceptPoints}, and return NULL, which means nothing - * to enhance. - */ -public abstract class ClassInstanceMethodsEnhancePluginDefineV2 extends ClassEnhancePluginDefineV2 { - - /** - * @return null, means enhance no v2 static methods. - */ - @Override - public StaticMethodsInterceptV2Point[] getStaticMethodsInterceptV2Points() { - return null; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/ClassStaticMethodsEnhancePluginDefineV2.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/ClassStaticMethodsEnhancePluginDefineV2.java deleted file mode 100644 index 294e70d8..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/ClassStaticMethodsEnhancePluginDefineV2.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance.v2; - -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.v2.InstanceMethodsInterceptV2Point; - -/** - * Plugins, which only need enhance class static methods. Actually, inherit from {@link - * ClassStaticMethodsEnhancePluginDefineV2} has no differences with inherit from {@link ClassEnhancePluginDefineV2}. Just - * override {@link ClassEnhancePluginDefineV2#getConstructorsInterceptPoints} and {@link - * ClassEnhancePluginDefineV2#getInstanceMethodsInterceptV2Points}, and return NULL, which means nothing to enhance. - */ -public abstract class ClassStaticMethodsEnhancePluginDefineV2 extends ClassEnhancePluginDefineV2 { - - /** - * @return null, means enhance no constructors. - */ - @Override - public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return null; - } - - /** - * @return null, means enhance no v2 instance methods. - */ - @Override - public InstanceMethodsInterceptV2Point[] getInstanceMethodsInterceptV2Points() { - return null; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/InstMethodsInterV2.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/InstMethodsInterV2.java deleted file mode 100644 index eea316d0..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/InstMethodsInterV2.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance.v2; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.plugin.PluginException; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.loader.InterceptorInstanceLoader; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import net.bytebuddy.implementation.bind.annotation.SuperCall; -import net.bytebuddy.implementation.bind.annotation.This; - -import java.lang.reflect.Method; -import java.util.concurrent.Callable; - -/** - * The actual byte-buddy's interceptor to intercept class instance methods. In this class, it provides a bridge between - * byte-buddy and sky-walking plugin. - */ -public class InstMethodsInterV2 { - - private static final ILog LOGGER = LogManager.getLogger(InstMethodsInterV2.class); - - private InstanceMethodsAroundInterceptorV2 interceptor; - - public InstMethodsInterV2(String instanceMethodsAroundInterceptorClassName, ClassLoader classLoader) { - try { - interceptor = InterceptorInstanceLoader.load(instanceMethodsAroundInterceptorClassName, classLoader); - } catch (Throwable t) { - throw new PluginException("Can't create InstanceMethodsAroundInterceptor.", t); - } - } - - @RuntimeType - public Object intercept(@This Object obj, @AllArguments Object[] allArguments, @SuperCall Callable zuper, - @Origin Method method) throws Throwable { - EnhancedInstance targetObject = (EnhancedInstance) obj; - - MethodInvocationContext context = new MethodInvocationContext(); - try { - interceptor.beforeMethod(targetObject, method, allArguments, method.getParameterTypes(), context); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] before method[{}] intercept failure", obj.getClass(), method.getName()); - } - - Object ret = null; - try { - if (!context.isContinue()) { - ret = context._ret(); - } else { - ret = zuper.call(); - } - } catch (Throwable t) { - try { - interceptor.handleMethodException(targetObject, method, allArguments, method.getParameterTypes(), t, context); - } catch (Throwable t2) { - LOGGER.error(t2, "class[{}] handle method[{}] exception failure", obj.getClass(), method.getName()); - } - throw t; - } finally { - try { - ret = interceptor.afterMethod(targetObject, method, allArguments, method.getParameterTypes(), ret, context); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] after method[{}] intercept failure", obj.getClass(), method.getName()); - } - } - return ret; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/InstMethodsInterV2WithOverrideArgs.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/InstMethodsInterV2WithOverrideArgs.java deleted file mode 100644 index 9aaa9888..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/InstMethodsInterV2WithOverrideArgs.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance.v2; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.plugin.PluginException; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.OverrideCallable; -import cn.hippo4j.agent.core.plugin.loader.InterceptorInstanceLoader; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Morph; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import net.bytebuddy.implementation.bind.annotation.This; - -import java.lang.reflect.Method; - -/** - * The actual byte-buddy's interceptor to intercept class instance methods. In this class, it provides a bridge between - * byte-buddy and sky-walking plugin. - */ -public class InstMethodsInterV2WithOverrideArgs { - - private static final ILog LOGGER = LogManager.getLogger(InstMethodsInterV2WithOverrideArgs.class); - - /** - * An {@link InstanceMethodsAroundInterceptorV2} This name should only stay in {@link String}, the real {@link Class} - * type will trigger classloader failure. If you want to know more, please check on books about Classloader or - * Classloader appointment mechanism. - */ - private InstanceMethodsAroundInterceptorV2 interceptor; - - /** - * @param instanceMethodsAroundInterceptorClassName class full name. - */ - public InstMethodsInterV2WithOverrideArgs(String instanceMethodsAroundInterceptorClassName, ClassLoader classLoader) { - try { - interceptor = InterceptorInstanceLoader.load(instanceMethodsAroundInterceptorClassName, classLoader); - } catch (Throwable t) { - throw new PluginException("Can't create InstanceMethodsAroundInterceptor.", t); - } - } - - /** - * Intercept the target instance method. - * - * @param obj target class instance. - * @param allArguments all method arguments - * @param method method description. - * @param zuper the origin call ref. - * @return the return value of target instance method. - * @throws Exception only throw exception because of zuper.call() or unexpected exception in sky-walking ( This is a - * bug, if anything triggers this condition ). - */ - @RuntimeType - public Object intercept(@This Object obj, @AllArguments Object[] allArguments, @Origin Method method, - @Morph OverrideCallable zuper) throws Throwable { - EnhancedInstance targetObject = (EnhancedInstance) obj; - - MethodInvocationContext context = new MethodInvocationContext(); - try { - interceptor.beforeMethod(targetObject, method, allArguments, method.getParameterTypes(), context); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] before method[{}] intercept failure", obj.getClass(), method.getName()); - } - - Object ret = null; - try { - if (!context.isContinue()) { - ret = context._ret(); - } else { - ret = zuper.call(allArguments); - } - } catch (Throwable t) { - try { - interceptor.handleMethodException(targetObject, method, allArguments, method.getParameterTypes(), t, context); - } catch (Throwable t2) { - LOGGER.error(t2, "class[{}] handle method[{}] exception failure", obj.getClass(), method.getName()); - } - throw t; - } finally { - try { - ret = interceptor.afterMethod(targetObject, method, allArguments, method.getParameterTypes(), ret, context); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] after method[{}] intercept failure", obj.getClass(), method.getName()); - } - } - return ret; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/InstanceMethodsAroundInterceptorV2.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/InstanceMethodsAroundInterceptorV2.java deleted file mode 100644 index b732300f..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/InstanceMethodsAroundInterceptorV2.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance.v2; - -import cn.hippo4j.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; - -import java.lang.reflect.Method; - -/** - * A v2 interceptor, which intercept method's invocation. The target methods will be defined in {@link - * ClassEnhancePluginDefineV2}'s subclass, most likely in {@link ClassInstanceMethodsEnhancePluginDefine} - */ -public interface InstanceMethodsAroundInterceptorV2 { - - /** - * called before target method invocation. - * - * @param context the method invocation context including result context. - */ - void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - MethodInvocationContext context) throws Throwable; - - /** - * called after target method invocation. Even method's invocation triggers an exception. - * - * @param ret the method's original return value. May be null if the method triggers an exception. - * @return the method's actual return value. - */ - Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - Object ret, MethodInvocationContext context) throws Throwable; - - /** - * called when occur exception. - * - * @param t the exception occur. - */ - void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, - Class[] argumentsTypes, Throwable t, MethodInvocationContext context); - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/MethodInvocationContext.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/MethodInvocationContext.java deleted file mode 100644 index a6647aa8..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/MethodInvocationContext.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance.v2; - -import cn.hippo4j.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import lombok.Getter; -import lombok.Setter; - -/** - * MethodInvocationContext holds the reference to propagate it between beforeMethod and afterMethod/handleMethodException - */ -@Setter -@Getter -public class MethodInvocationContext extends MethodInterceptResult { - - /** - * A pointer for the propagating context - */ - private Object context; -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/StaticMethodsAroundInterceptorV2.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/StaticMethodsAroundInterceptorV2.java deleted file mode 100644 index 55685f07..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/StaticMethodsAroundInterceptorV2.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance.v2; - -import java.lang.reflect.Method; - -/** - * The static method's interceptor v2 interface. Any plugin, which wants to intercept static methods, must implement this - * interface. - */ -public interface StaticMethodsAroundInterceptorV2 { - - /** - * called before target method invocation. - * - * @param context the method invocation context including result context. - */ - void beforeMethod(Class clazz, Method method, Object[] allArguments, Class[] parameterTypes, - MethodInvocationContext context); - - /** - * called after target method invocation. Even method's invocation triggers an exception. - * - * @param ret the method's original return value. - * @return the method's actual return value. - */ - Object afterMethod(Class clazz, Method method, Object[] allArguments, Class[] parameterTypes, Object ret, - MethodInvocationContext context); - - /** - * called when occur exception. - * - * @param t the exception occur. - */ - void handleMethodException(Class clazz, Method method, Object[] allArguments, Class[] parameterTypes, - Throwable t, MethodInvocationContext context); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/StaticMethodsInterV2.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/StaticMethodsInterV2.java deleted file mode 100644 index 7bd4c2f1..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/StaticMethodsInterV2.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance.v2; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.plugin.loader.InterceptorInstanceLoader; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import net.bytebuddy.implementation.bind.annotation.SuperCall; - -import java.lang.reflect.Method; -import java.util.concurrent.Callable; - -/** - * The actual byte-buddy's interceptor to intercept class instance methods. In this class, it provides a bridge between - * byte-buddy and sky-walking plugin. - */ -public class StaticMethodsInterV2 { - - private static final ILog LOGGER = LogManager.getLogger(StaticMethodsInterV2.class); - - /** - * A class full name, and instanceof {@link StaticMethodsAroundInterceptorV2} This name should only stay in {@link - * String}, the real {@link Class} type will trigger classloader failure. If you want to know more, please check on - * books about Classloader or Classloader appointment mechanism. - */ - private String staticMethodsAroundInterceptorClassName; - - /** - * Set the name of {@link StaticMethodsInterV2#staticMethodsAroundInterceptorClassName} - * - * @param staticMethodsAroundInterceptorClassName class full name. - */ - public StaticMethodsInterV2(String staticMethodsAroundInterceptorClassName) { - this.staticMethodsAroundInterceptorClassName = staticMethodsAroundInterceptorClassName; - } - - /** - * Intercept the target static method. - * - * @param clazz target class - * @param allArguments all method arguments - * @param method method description. - * @param zuper the origin call ref. - * @return the return value of target static method. - * @throws Exception only throw exception because of zuper.call() or unexpected exception in sky-walking ( This is a - * bug, if anything triggers this condition ). - */ - @RuntimeType - public Object intercept(@Origin Class clazz, @AllArguments Object[] allArguments, @Origin Method method, - @SuperCall Callable zuper) throws Throwable { - StaticMethodsAroundInterceptorV2 interceptor = InterceptorInstanceLoader.load(staticMethodsAroundInterceptorClassName, - clazz.getClassLoader()); - - MethodInvocationContext context = new MethodInvocationContext(); - try { - interceptor.beforeMethod(clazz, method, allArguments, method.getParameterTypes(), context); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] before static method[{}] intercept failure", clazz, method.getName()); - } - - Object ret = null; - try { - if (!context.isContinue()) { - ret = context._ret(); - } else { - ret = zuper.call(); - } - } catch (Throwable t) { - try { - interceptor.handleMethodException(clazz, method, allArguments, method.getParameterTypes(), t, context); - } catch (Throwable t2) { - LOGGER.error(t2, "class[{}] handle static method[{}] exception failure", clazz, method.getName(), t2.getMessage()); - } - throw t; - } finally { - try { - ret = interceptor.afterMethod(clazz, method, allArguments, method.getParameterTypes(), ret, context); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] after static method[{}] intercept failure:{}", clazz, method.getName(), t.getMessage()); - } - } - return ret; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/StaticMethodsInterV2WithOverrideArgs.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/StaticMethodsInterV2WithOverrideArgs.java deleted file mode 100644 index ca86bf2e..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/enhance/v2/StaticMethodsInterV2WithOverrideArgs.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.enhance.v2; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.OverrideCallable; -import cn.hippo4j.agent.core.plugin.loader.InterceptorInstanceLoader; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.Morph; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; - -import java.lang.reflect.Method; - -/** - * The actual byte-buddy's interceptor to intercept class instance methods. In this class, it provides a bridge between - * byte-buddy and sky-walking plugin. - */ -public class StaticMethodsInterV2WithOverrideArgs { - - private static final ILog LOGGER = LogManager.getLogger(StaticMethodsInterV2WithOverrideArgs.class); - - /** - * A class full name, and instanceof {@link StaticMethodsAroundInterceptorV2} This name should only stay in {@link - * String}, the real {@link Class} type will trigger classloader failure. If you want to know more, please check on - * books about Classloader or Classloader appointment mechanism. - */ - private String staticMethodsAroundInterceptorClassName; - - /** - * Set the name of {@link StaticMethodsInterV2WithOverrideArgs#staticMethodsAroundInterceptorClassName} - * - * @param staticMethodsAroundInterceptorClassName class full name. - */ - public StaticMethodsInterV2WithOverrideArgs(String staticMethodsAroundInterceptorClassName) { - this.staticMethodsAroundInterceptorClassName = staticMethodsAroundInterceptorClassName; - } - - /** - * Intercept the target static method. - * - * @param clazz target class - * @param allArguments all method arguments - * @param method method description. - * @param zuper the origin call ref. - * @return the return value of target static method. - * @throws Exception only throw exception because of zuper.call() or unexpected exception in sky-walking ( This is a - * bug, if anything triggers this condition ). - */ - @RuntimeType - public Object intercept(@Origin Class clazz, @AllArguments Object[] allArguments, @Origin Method method, - @Morph OverrideCallable zuper) throws Throwable { - StaticMethodsAroundInterceptorV2 interceptor = InterceptorInstanceLoader.load(staticMethodsAroundInterceptorClassName, - clazz.getClassLoader()); - - MethodInvocationContext context = new MethodInvocationContext(); - try { - interceptor.beforeMethod(clazz, method, allArguments, method.getParameterTypes(), context); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] before static method[{}] intercept failure", clazz, method.getName()); - } - - Object ret = null; - try { - if (!context.isContinue()) { - ret = context._ret(); - } else { - ret = zuper.call(allArguments); - } - } catch (Throwable t) { - try { - interceptor.handleMethodException(clazz, method, allArguments, method.getParameterTypes(), t, context); - } catch (Throwable t2) { - LOGGER.error(t2, "class[{}] handle static method[{}] exception failure", clazz, method.getName(), t2.getMessage()); - } - throw t; - } finally { - try { - ret = interceptor.afterMethod(clazz, method, allArguments, method.getParameterTypes(), ret, context); - } catch (Throwable t) { - LOGGER.error(t, "class[{}] after static method[{}] intercept failure:{}", clazz, method.getName(), t.getMessage()); - } - } - return ret; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/v2/ConstructorInterceptV2Point.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/v2/ConstructorInterceptV2Point.java deleted file mode 100644 index e073e7c1..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/v2/ConstructorInterceptV2Point.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.v2; - -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -public interface ConstructorInterceptV2Point { - - /** - * Constructor matcher - * - * @return matcher instance. - */ - ElementMatcher getConstructorMatcher(); - - /** - * @return represents a class name, the class instance must be a instance of {@link - * cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor} - */ - String getConstructorInterceptorV2(); - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/v2/DeclaredInstanceMethodsInterceptV2Point.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/v2/DeclaredInstanceMethodsInterceptV2Point.java deleted file mode 100644 index 02754d87..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/v2/DeclaredInstanceMethodsInterceptV2Point.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.v2; - -/** - * this interface for those who only want to enhance declared method in case of some unexpected issue, such as spring - * controller - */ -public interface DeclaredInstanceMethodsInterceptV2Point extends InstanceMethodsInterceptV2Point { -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/v2/InstanceMethodsInterceptV2Point.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/v2/InstanceMethodsInterceptV2Point.java deleted file mode 100644 index 6d4844cb..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/v2/InstanceMethodsInterceptV2Point.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.v2; - -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * One of the three "Intercept Point". "Intercept Point" is a definition about where and how intercept happens. In this - * "Intercept Point", the definition targets class's instance methods, and the interceptor. - *

- * ref to two others: {@link ConstructorInterceptPoint} and {@link StaticMethodsInterceptV2Point} - *

- */ -public interface InstanceMethodsInterceptV2Point { - - /** - * class instance methods matcher. - * - * @return methods matcher - */ - ElementMatcher getMethodsMatcher(); - - /** - * @return represents a class name, the class instance must instanceof InstanceMethodsAroundInterceptorV2. - */ - String getMethodsInterceptorV2(); - - boolean isOverrideArgs(); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/v2/StaticMethodsInterceptV2Point.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/v2/StaticMethodsInterceptV2Point.java deleted file mode 100644 index aa6e5d56..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/interceptor/v2/StaticMethodsInterceptV2Point.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.interceptor.v2; - -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * One of the three "Intercept Point". "Intercept Point" is a definition about where and how intercept happens. In this - * "Intercept Point", the definition targets class's static methods, and the interceptor. - *

- * ref to two others: {@link ConstructorInterceptPoint} and {@link InstanceMethodsInterceptV2Point} - *

- */ -public interface StaticMethodsInterceptV2Point { - - /** - * static methods matcher. - * - * @return matcher instance. - */ - ElementMatcher getMethodsMatcher(); - - /** - * @return represents a class name, the class instance must instanceof StaticMethodsAroundInterceptorV2. - */ - String getMethodsInterceptorV2(); - - boolean isOverrideArgs(); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/jdk9module/JDK9ModuleExporter.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/jdk9module/JDK9ModuleExporter.java deleted file mode 100644 index 07c69b54..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/jdk9module/JDK9ModuleExporter.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.jdk9module; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.agent.core.plugin.ByteBuddyCoreClasses; -import net.bytebuddy.agent.builder.AgentBuilder; - -import java.lang.instrument.Instrumentation; -import java.util.ArrayList; -import java.util.List; - -/** - * Since JDK 9, module concept has been introduced. By supporting that, agent core needs to open the read edge - */ -public class JDK9ModuleExporter { - - private static final ILog LOGGER = LogManager.getLogger(JDK9ModuleExporter.class); - - private static final String[] HIGH_PRIORITY_CLASSES = { - "cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance", - "cn.hippo4j.agent.core.plugin.interceptor.enhance.MethodInterceptResult", - "cn.hippo4j.agent.core.plugin.interceptor.enhance.OverrideCallable", - "cn.hippo4j.agent.core.plugin.interceptor.enhance.ConstructorInter", - "cn.hippo4j.agent.core.plugin.interceptor.enhance.InstMethodsInter", - "cn.hippo4j.agent.core.plugin.interceptor.enhance.InstMethodsInterWithOverrideArgs", - "cn.hippo4j.agent.core.plugin.interceptor.enhance.StaticMethodsInter", - "cn.hippo4j.agent.core.plugin.interceptor.enhance.StaticMethodsInterWithOverrideArgs", - }; - - /** - * Assures that all modules of the supplied types are read by the module of any instrumented type. JDK Module system - * was introduced since JDK9. - *

- * The following codes work only JDK Module system exist. - */ - public static AgentBuilder openReadEdge(Instrumentation instrumentation, AgentBuilder agentBuilder, - EdgeClasses classes) { - for (String className : classes.classes) { - try { - agentBuilder = agentBuilder.assureReadEdgeFromAndTo(instrumentation, Class.forName(className)); - } catch (ClassNotFoundException e) { - throw new UnsupportedOperationException("Fail to open read edge for class " + className + " to public access in JDK9+", e); - } - } - for (String className : HIGH_PRIORITY_CLASSES) { - try { - agentBuilder = agentBuilder.assureReadEdgeFromAndTo(instrumentation, Class.forName(className)); - } catch (ClassNotFoundException e) { - throw new UnsupportedOperationException("Fail to open read edge for class " + className + " to public access in JDK9+", e); - } - } - - return agentBuilder; - } - - public static class EdgeClasses { - - private List classes = new ArrayList(); - - public EdgeClasses() { - for (String className : ByteBuddyCoreClasses.CLASSES) { - add(className); - } - } - - public void add(String className) { - if (!classes.contains(className)) { - classes.add(className); - } - } - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/loader/AgentClassLoader.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/loader/AgentClassLoader.java deleted file mode 100644 index d227ec7e..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/loader/AgentClassLoader.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.loader; - -import cn.hippo4j.agent.core.boot.AgentPackagePath; -import cn.hippo4j.agent.core.boot.PluginConfig; -import cn.hippo4j.agent.core.boot.SpringBootConfigInitializer; -import cn.hippo4j.agent.core.boot.SpringBootConfigNode; -import cn.hippo4j.agent.core.conf.SnifferConfigInitializer; -import cn.hippo4j.agent.core.plugin.PluginBootstrap; -import cn.hippo4j.common.boot.AgentPackageNotFoundException; -import cn.hippo4j.common.conf.Config; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import lombok.RequiredArgsConstructor; - -import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.locks.ReentrantLock; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; - -/** - * The AgentClassLoader represents a classloader, which is in charge of finding plugins and interceptors. - */ -public class AgentClassLoader extends ClassLoader { - - static { - /* - * Try to solve the classloader dead lock. See https://github.com/apache/skywalking/pull/2016 - */ - registerAsParallelCapable(); - } - - private static final ILog LOGGER = LogManager.getLogger(AgentClassLoader.class); - /** - * The default class loader for the agent. - */ - private static AgentClassLoader DEFAULT_LOADER; - - private List classpath; - private static List allJars; - private ReentrantLock jarScanLock = new ReentrantLock(); - - public static AgentClassLoader getDefault() { - return DEFAULT_LOADER; - } - - /** - * Init the default class loader. - * - * @throws AgentPackageNotFoundException if agent package is not found. - */ - public static void initDefaultLoader() throws AgentPackageNotFoundException { - if (DEFAULT_LOADER == null) { - synchronized (AgentClassLoader.class) { - if (DEFAULT_LOADER == null) { - DEFAULT_LOADER = new AgentClassLoader(PluginBootstrap.class.getClassLoader()); - } - } - } - } - - public AgentClassLoader(ClassLoader parent) throws AgentPackageNotFoundException { - super(parent); - File agentDictionary = AgentPackagePath.getPath(); - classpath = new LinkedList<>(); - Config.Plugin.MOUNT.forEach(mountFolder -> classpath.add(new File(agentDictionary, mountFolder))); - } - - @Override - protected Class findClass(String name) throws ClassNotFoundException { - List allJars = getAllJars(); - String path = name.replace('.', '/').concat(".class"); - for (Jar jar : allJars) { - JarEntry entry = jar.jarFile.getJarEntry(path); - if (entry == null) { - continue; - } - try { - URL classFileUrl = new URL("jar:file:" + jar.sourceFile.getAbsolutePath() + "!/" + path); - byte[] data; - try ( - final BufferedInputStream is = new BufferedInputStream( - classFileUrl.openStream()); - final ByteArrayOutputStream baos = new ByteArrayOutputStream()) { - int ch; - while ((ch = is.read()) != -1) { - baos.write(ch); - } - data = baos.toByteArray(); - } - return processLoadedClass(defineClass(name, data, 0, data.length)); - } catch (IOException e) { - LOGGER.error(e, "find class fail."); - } - } - throw new ClassNotFoundException("Can't find " + name); - } - - @Override - protected URL findResource(String name) { - List allJars = getAllJars(); - for (Jar jar : allJars) { - JarEntry entry = jar.jarFile.getJarEntry(name); - if (entry != null) { - try { - return new URL("jar:file:" + jar.sourceFile.getAbsolutePath() + "!/" + name); - } catch (MalformedURLException ignored) { - } - } - } - return null; - } - - @Override - protected Enumeration findResources(String name) throws IOException { - List allResources = new LinkedList<>(); - List allJars = getAllJars(); - for (Jar jar : allJars) { - JarEntry entry = jar.jarFile.getJarEntry(name); - if (entry != null) { - allResources.add(new URL("jar:file:" + jar.sourceFile.getAbsolutePath() + "!/" + name)); - } - } - - final Iterator iterator = allResources.iterator(); - return new Enumeration() { - - @Override - public boolean hasMoreElements() { - return iterator.hasNext(); - } - - @Override - public URL nextElement() { - return iterator.next(); - } - }; - } - - private Class processLoadedClass(Class loadedClass) { - final PluginConfig pluginConfig = loadedClass.getAnnotation(PluginConfig.class); - if (pluginConfig != null) { - // Set up the plugin config when loaded by class loader at the first time. - // Agent class loader just loaded limited classes in the plugin jar(s), so the cost of this - // isAssignableFrom would be also very limited. - SnifferConfigInitializer.initializeConfig(pluginConfig.root()); - } - - final SpringBootConfigNode springBootConfig = loadedClass.getAnnotation(SpringBootConfigNode.class); - if (springBootConfig != null) { - // Set up the plugin config when loaded by spring environment is prepared, just scan in here. - // Agent class loader just loaded limited classes in the plugin jar(s), so the cost of this - // isAssignableFrom would be also very limited. - SpringBootConfigInitializer.initializeConfig(springBootConfig); - } - return loadedClass; - } - - private List getAllJars() { - if (allJars == null) { - jarScanLock.lock(); - try { - if (allJars == null) { - allJars = doGetJars(); - } - } finally { - jarScanLock.unlock(); - } - } - return allJars; - } - - private LinkedList doGetJars() { - LinkedList jars = new LinkedList<>(); - for (File path : classpath) { - if (path.exists() && path.isDirectory()) { - String[] jarFileNames = path.list((dir, name) -> name.endsWith(".jar")); - for (String fileName : jarFileNames) { - try { - File file = new File(path, fileName); - Jar jar = new Jar(new JarFile(file), file); - jars.add(jar); - LOGGER.info("{} loaded.", file.toString()); - } catch (IOException e) { - LOGGER.error(e, "{} jar file can't be resolved", fileName); - } - } - } - } - return jars; - } - - @RequiredArgsConstructor - private static class Jar { - - private final JarFile jarFile; - private final File sourceFile; - } -} \ No newline at end of file diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/loader/InstrumentationLoader.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/loader/InstrumentationLoader.java deleted file mode 100755 index 9fa470b4..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/loader/InstrumentationLoader.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.loader; - -import cn.hippo4j.agent.core.plugin.AbstractClassEnhancePluginDefine; - -import java.util.List; - -/** - * the spi of the InstrumentationLoader. - */ - -public interface InstrumentationLoader { - - List load(AgentClassLoader classLoader); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/loader/InterceptorInstanceLoader.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/loader/InterceptorInstanceLoader.java deleted file mode 100644 index e5c55ad4..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/loader/InterceptorInstanceLoader.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.loader; - -import cn.hippo4j.common.boot.AgentPackageNotFoundException; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.ReentrantLock; - -/** - * The InterceptorInstanceLoader is a classes finder and container. - *

- * This is a very important class in sky-walking's auto-instrumentation mechanism. If you want to fully understand why - * need this, and how it works, you need have knowledge about Classloader appointment mechanism. - *

- */ -public class InterceptorInstanceLoader { - - private static ConcurrentHashMap INSTANCE_CACHE = new ConcurrentHashMap(); - private static ReentrantLock INSTANCE_LOAD_LOCK = new ReentrantLock(); - private static Map EXTEND_PLUGIN_CLASSLOADERS = new HashMap(); - - /** - * Load an instance of interceptor, and keep it singleton. Create {@link AgentClassLoader} for each - * targetClassLoader, as an extend classloader. It can load interceptor classes from plugins, activations folders. - * - * @param className the interceptor class, which is expected to be found - * @param targetClassLoader the class loader for current application context - * @param expected type - * @return the type reference. - */ - public static T load(String className, - ClassLoader targetClassLoader) throws IllegalAccessException, InstantiationException, ClassNotFoundException, AgentPackageNotFoundException { - if (targetClassLoader == null) { - targetClassLoader = InterceptorInstanceLoader.class.getClassLoader(); - } - String instanceKey = className + "_OF_" + targetClassLoader.getClass() - .getName() + "@" - + Integer.toHexString(targetClassLoader - .hashCode()); - Object inst = INSTANCE_CACHE.get(instanceKey); - if (inst == null) { - INSTANCE_LOAD_LOCK.lock(); - ClassLoader pluginLoader; - try { - pluginLoader = EXTEND_PLUGIN_CLASSLOADERS.get(targetClassLoader); - if (pluginLoader == null) { - pluginLoader = new AgentClassLoader(targetClassLoader); - EXTEND_PLUGIN_CLASSLOADERS.put(targetClassLoader, pluginLoader); - } - } finally { - INSTANCE_LOAD_LOCK.unlock(); - } - inst = Class.forName(className, true, pluginLoader).newInstance(); - if (inst != null) { - INSTANCE_CACHE.put(instanceKey, inst); - } - } - - return (T) inst; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/ClassAnnotationMatch.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/ClassAnnotationMatch.java deleted file mode 100644 index ab181816..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/ClassAnnotationMatch.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.match; - -import net.bytebuddy.description.annotation.AnnotationDescription; -import net.bytebuddy.description.annotation.AnnotationList; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; -import static net.bytebuddy.matcher.ElementMatchers.isInterface; -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; - -/** - * Match the class by the given annotations in class. - */ -public class ClassAnnotationMatch implements IndirectMatch { - - private String[] annotations; - - private ClassAnnotationMatch(String[] annotations) { - if (annotations == null || annotations.length == 0) { - throw new IllegalArgumentException("annotations is null"); - } - this.annotations = annotations; - } - - @Override - public ElementMatcher.Junction buildJunction() { - ElementMatcher.Junction junction = null; - for (String annotation : annotations) { - if (junction == null) { - junction = buildEachAnnotation(annotation); - } else { - junction = junction.and(buildEachAnnotation(annotation)); - } - } - junction = junction.and(not(isInterface())); - return junction; - } - - @Override - public boolean isMatch(TypeDescription typeDescription) { - List annotationList = new ArrayList(Arrays.asList(annotations)); - AnnotationList declaredAnnotations = typeDescription.getDeclaredAnnotations(); - for (AnnotationDescription annotation : declaredAnnotations) { - annotationList.remove(annotation.getAnnotationType().getActualName()); - } - return annotationList.isEmpty(); - } - - private ElementMatcher.Junction buildEachAnnotation(String annotationName) { - return isAnnotatedWith(named(annotationName)); - } - - public static ClassAnnotationMatch byClassAnnotationMatch(String... annotations) { - return new ClassAnnotationMatch(annotations); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/ClassMatch.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/ClassMatch.java deleted file mode 100644 index 750bcf63..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/ClassMatch.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.match; - -public interface ClassMatch { -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/HierarchyMatch.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/HierarchyMatch.java deleted file mode 100644 index 759f38ba..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/HierarchyMatch.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.match; - -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.description.type.TypeList; -import net.bytebuddy.matcher.ElementMatcher; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static net.bytebuddy.matcher.ElementMatchers.hasSuperType; -import static net.bytebuddy.matcher.ElementMatchers.isInterface; -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; - -/** - * Match the class by the given super class or interfaces. - */ -public class HierarchyMatch implements IndirectMatch { - - private String[] parentTypes; - - private HierarchyMatch(String[] parentTypes) { - if (parentTypes == null || parentTypes.length == 0) { - throw new IllegalArgumentException("parentTypes is null"); - } - this.parentTypes = parentTypes; - } - - @Override - public ElementMatcher.Junction buildJunction() { - ElementMatcher.Junction junction = null; - for (String superTypeName : parentTypes) { - if (junction == null) { - junction = buildSuperClassMatcher(superTypeName); - } else { - junction = junction.and(buildSuperClassMatcher(superTypeName)); - } - } - junction = junction.and(not(isInterface())); - return junction; - } - - private ElementMatcher.Junction buildSuperClassMatcher(String superTypeName) { - return hasSuperType(named(superTypeName)); - } - - @Override - public boolean isMatch(TypeDescription typeDescription) { - List parentTypes = new ArrayList(Arrays.asList(this.parentTypes)); - - TypeList.Generic implInterfaces = typeDescription.getInterfaces(); - for (TypeDescription.Generic implInterface : implInterfaces) { - matchHierarchyClass(implInterface, parentTypes); - } - - if (typeDescription.getSuperClass() != null) { - matchHierarchyClass(typeDescription.getSuperClass(), parentTypes); - } - - return parentTypes.size() == 0; - - } - - private void matchHierarchyClass(TypeDescription.Generic clazz, List parentTypes) { - parentTypes.remove(clazz.asRawType().getTypeName()); - if (parentTypes.size() == 0) { - return; - } - - for (TypeDescription.Generic generic : clazz.getInterfaces()) { - matchHierarchyClass(generic, parentTypes); - } - - TypeDescription.Generic superClazz = clazz.getSuperClass(); - if (superClazz != null && !clazz.getTypeName().equals("java.lang.Object")) { - matchHierarchyClass(superClazz, parentTypes); - } - - } - - public static IndirectMatch byHierarchyMatch(String... parentTypes) { - return new HierarchyMatch(parentTypes); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/IndirectMatch.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/IndirectMatch.java deleted file mode 100644 index a400fdfc..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/IndirectMatch.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.match; - -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * All implementations can't direct match the class like {@link NameMatch} did. - */ -public interface IndirectMatch extends ClassMatch { - - ElementMatcher.Junction buildJunction(); - - boolean isMatch(TypeDescription typeDescription); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/MethodAnnotationMatch.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/MethodAnnotationMatch.java deleted file mode 100644 index 71c79747..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/MethodAnnotationMatch.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.match; - -import net.bytebuddy.description.annotation.AnnotationDescription; -import net.bytebuddy.description.annotation.AnnotationList; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; -import net.bytebuddy.matcher.ElementMatchers; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static net.bytebuddy.matcher.ElementMatchers.declaresMethod; -import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; -import static net.bytebuddy.matcher.ElementMatchers.isInterface; -import static net.bytebuddy.matcher.ElementMatchers.named; - -/** - * Match the class, which has methods with the certain annotations. This is a very complex match. - */ -public class MethodAnnotationMatch implements IndirectMatch { - - private String[] annotations; - - private MethodAnnotationMatch(String[] annotations) { - if (annotations == null || annotations.length == 0) { - throw new IllegalArgumentException("annotations is null"); - } - this.annotations = annotations; - } - - @Override - public ElementMatcher.Junction buildJunction() { - ElementMatcher.Junction junction = null; - for (String annotation : annotations) { - if (junction == null) { - junction = buildEachAnnotation(annotation); - } else { - junction = junction.and(buildEachAnnotation(annotation)); - } - } - junction = declaresMethod(junction).and(ElementMatchers.not(isInterface())); - return junction; - } - - @Override - public boolean isMatch(TypeDescription typeDescription) { - for (MethodDescription.InDefinedShape methodDescription : typeDescription.getDeclaredMethods()) { - List annotationList = new ArrayList(Arrays.asList(annotations)); - - AnnotationList declaredAnnotations = methodDescription.getDeclaredAnnotations(); - for (AnnotationDescription annotation : declaredAnnotations) { - annotationList.remove(annotation.getAnnotationType().getActualName()); - } - if (annotationList.isEmpty()) { - return true; - } - } - - return false; - } - - private ElementMatcher.Junction buildEachAnnotation(String annotationName) { - return isAnnotatedWith(named(annotationName)); - } - - public static IndirectMatch byMethodAnnotationMatch(String... annotations) { - return new MethodAnnotationMatch(annotations); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/MethodInheritanceAnnotationMatcher.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/MethodInheritanceAnnotationMatcher.java deleted file mode 100644 index 94fd02ae..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/MethodInheritanceAnnotationMatcher.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.match; - -import net.bytebuddy.build.HashCodeAndEqualsPlugin; -import net.bytebuddy.description.annotation.AnnotationList; -import net.bytebuddy.description.annotation.AnnotationSource; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.method.MethodList; -import net.bytebuddy.description.method.ParameterList; -import net.bytebuddy.description.type.TypeDefinition; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.description.type.TypeList; -import net.bytebuddy.matcher.CollectionItemMatcher; -import net.bytebuddy.matcher.ElementMatcher; - -import java.util.Objects; - -import static net.bytebuddy.matcher.ElementMatchers.annotationType; - -/** - * Matching used to match method annotations, Can match annotations on interface methods - */ -@HashCodeAndEqualsPlugin.Enhance -public class MethodInheritanceAnnotationMatcher extends ElementMatcher.Junction.AbstractBase { - - /** - * The matcher to be applied to the provided annotation list. - */ - private final ElementMatcher matcher; - - /** - * Creates a new matcher for the annotations of an annotated element. - * - * @param matcher The matcher to be applied to the provided annotation list. - */ - public MethodInheritanceAnnotationMatcher(ElementMatcher matcher) { - this.matcher = matcher; - } - - @Override - public boolean matches(T target) { - if (matcher.matches(target.getDeclaredAnnotations())) { - return true; - } - String name = target.getName(); - ParameterList parameters = target.getParameters(); - - TypeDefinition declaringType = target.getDeclaringType(); - return recursiveMatches(declaringType, name, parameters); - } - - private boolean recursiveMatches(TypeDefinition typeDefinition, String methodName, ParameterList parameters) { - TypeList.Generic interfaces = typeDefinition.getInterfaces(); - for (TypeDescription.Generic implInterface : interfaces) { - if (recursiveMatches(implInterface, methodName, parameters)) { - return true; - } - MethodList declaredMethods = implInterface.getDeclaredMethods(); - for (MethodDescription declaredMethod : declaredMethods) { - if (Objects.equals(declaredMethod.getName(), methodName) && parameterEquals(parameters, declaredMethod.getParameters())) { - return matcher.matches(declaredMethod.getDeclaredAnnotations()); - } - } - } - return false; - } - - private boolean parameterEquals(ParameterList source, ParameterList impl) { - if (source.size() != impl.size()) { - return false; - } - for (int i = 0; i < source.size(); i++) { - if (!Objects.equals(source.get(i).getType(), impl.get(i).getType())) { - return false; - } - } - return true; - } - - public static Junction byMethodInheritanceAnnotationMatcher( - ElementMatcher matcher) { - return new MethodInheritanceAnnotationMatcher(new CollectionItemMatcher<>(annotationType(matcher))); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/MultiClassNameMatch.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/MultiClassNameMatch.java deleted file mode 100644 index 8ebeba25..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/MultiClassNameMatch.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.match; - -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -import java.util.Arrays; -import java.util.List; - -import static net.bytebuddy.matcher.ElementMatchers.named; - -/** - * Match class with a given set of classes. - */ -public class MultiClassNameMatch implements IndirectMatch { - - private List matchClassNames; - - private MultiClassNameMatch(String[] classNames) { - if (classNames == null || classNames.length == 0) { - throw new IllegalArgumentException("match class names is null"); - } - this.matchClassNames = Arrays.asList(classNames); - } - - @Override - public ElementMatcher.Junction buildJunction() { - ElementMatcher.Junction junction = null; - for (String name : matchClassNames) { - if (junction == null) { - junction = named(name); - } else { - junction = junction.or(named(name)); - } - } - return junction; - } - - @Override - public boolean isMatch(TypeDescription typeDescription) { - return matchClassNames.contains(typeDescription.getTypeName()); - } - - public static IndirectMatch byMultiClassMatch(String... classNames) { - return new MultiClassNameMatch(classNames); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/NameMatch.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/NameMatch.java deleted file mode 100644 index 2dd9b11d..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/NameMatch.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.match; - -/** - * Match the class with an explicit class name. - */ -public class NameMatch implements ClassMatch { - - private String className; - - private NameMatch(String className) { - this.className = className; - } - - public String getClassName() { - return className; - } - - public static NameMatch byName(String className) { - return new NameMatch(className); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/PrefixMatch.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/PrefixMatch.java deleted file mode 100644 index d47d0409..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/PrefixMatch.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.match; - -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; -import net.bytebuddy.matcher.ElementMatchers; - -/** - * Match classes by any one of the given {@link #prefixes} - */ -@SuppressWarnings("rawtypes") -public class PrefixMatch implements IndirectMatch { - - private String[] prefixes; - - private PrefixMatch(String... prefixes) { - if (prefixes == null || prefixes.length == 0) { - throw new IllegalArgumentException("prefixes argument is null or empty"); - } - this.prefixes = prefixes; - } - - @Override - public ElementMatcher.Junction buildJunction() { - ElementMatcher.Junction junction = null; - - for (String prefix : prefixes) { - if (junction == null) { - junction = ElementMatchers.nameStartsWith(prefix); - } else { - junction = junction.or(ElementMatchers.nameStartsWith(prefix)); - } - } - - return junction; - } - - @Override - public boolean isMatch(TypeDescription typeDescription) { - for (final String prefix : prefixes) { - if (typeDescription.getName().startsWith(prefix)) { - return true; - } - } - return false; - } - - public static PrefixMatch nameStartsWith(final String... prefixes) { - return new PrefixMatch(prefixes); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/ProtectiveShieldMatcher.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/ProtectiveShieldMatcher.java deleted file mode 100644 index 7a02b300..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/ProtectiveShieldMatcher.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.match; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * In some cases, some frameworks and libraries use some binary codes tech too. From the community feedback, some of - * them have compatible issues with byte-buddy core, which trigger "Can't resolve type description" exception. - *

- * So I build this protective shield by a nested matcher. When the origin matcher(s) can't resolve the type, the - * Hippo4j agent ignores this types. - *

- * Notice: this ignore mechanism may miss some instrumentations, but at most cases, it's same. If missing happens, - * please pay attention to the WARNING logs. - */ -public class ProtectiveShieldMatcher extends ElementMatcher.Junction.AbstractBase { - - private static final ILog LOGGER = LogManager.getLogger(ProtectiveShieldMatcher.class); - - private final ElementMatcher matcher; - - public ProtectiveShieldMatcher(ElementMatcher matcher) { - this.matcher = matcher; - } - - @Override - public boolean matches(T target) { - try { - return this.matcher.matches(target); - } catch (Throwable t) { - if (LOGGER.isDebugEnable()) { - LOGGER.debug(t, "Byte-buddy occurs exception when match type."); - } - return false; - } - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/RegexMatch.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/RegexMatch.java deleted file mode 100644 index e3310b24..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/RegexMatch.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.match; - -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -import static net.bytebuddy.matcher.ElementMatchers.nameMatches; - -/** - * Match the class by given class name regex expression. - */ -public class RegexMatch implements IndirectMatch { - - private String[] regexExpressions; - - private RegexMatch(String... regexExpressions) { - if (regexExpressions == null || regexExpressions.length == 0) { - throw new IllegalArgumentException("annotations is null"); - } - this.regexExpressions = regexExpressions; - } - - @Override - public ElementMatcher.Junction buildJunction() { - ElementMatcher.Junction regexJunction = null; - for (String regexExpression : regexExpressions) { - if (regexJunction == null) { - regexJunction = nameMatches(regexExpression); - } else { - regexJunction = regexJunction.or(nameMatches(regexExpression)); - } - } - return regexJunction; - } - - @Override - public boolean isMatch(TypeDescription typeDescription) { - boolean isMatch = false; - for (String matchExpression : regexExpressions) { - isMatch = typeDescription.getTypeName().matches(matchExpression); - if (isMatch) { - break; - } - } - return isMatch; - } - - public static RegexMatch byRegexMatch(String... regexExpressions) { - return new RegexMatch(regexExpressions); - } -} \ No newline at end of file diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/logical/LogicalAndMatch.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/logical/LogicalAndMatch.java deleted file mode 100644 index 8f5f05f5..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/logical/LogicalAndMatch.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.match.logical; - -import cn.hippo4j.agent.core.plugin.match.IndirectMatch; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * Match classes by multiple criteria with AND conjunction - */ -public class LogicalAndMatch implements IndirectMatch { - - private final IndirectMatch[] indirectMatches; - - /** - * Don't instantiate this class directly, use {@link LogicalMatchOperation} instead - * - * @param indirectMatches the matching criteria to conjunct with AND - */ - LogicalAndMatch(final IndirectMatch... indirectMatches) { - this.indirectMatches = indirectMatches; - } - - @Override - public ElementMatcher.Junction buildJunction() { - ElementMatcher.Junction junction = null; - - for (final IndirectMatch indirectMatch : indirectMatches) { - if (junction == null) { - junction = indirectMatch.buildJunction(); - } else { - junction = junction.and(indirectMatch.buildJunction()); - } - } - - return junction; - } - - @Override - public boolean isMatch(final TypeDescription typeDescription) { - for (final IndirectMatch indirectMatch : indirectMatches) { - if (!indirectMatch.isMatch(typeDescription)) { - return false; - } - } - - return true; - } - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/logical/LogicalMatchOperation.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/logical/LogicalMatchOperation.java deleted file mode 100644 index 26637d8d..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/logical/LogicalMatchOperation.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.match.logical; - -import cn.hippo4j.agent.core.plugin.match.IndirectMatch; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; -import net.bytebuddy.matcher.NegatingMatcher; - -/** - * Util class to help to construct logical operations on {@link cn.hippo4j.agent.core.plugin.match.ClassMatch}s - */ -public class LogicalMatchOperation { - - public static IndirectMatch and(final IndirectMatch... matches) { - return new LogicalAndMatch(matches); - } - - public static IndirectMatch or(final IndirectMatch... matches) { - return new LogicalOrMatch(matches); - } - - public static IndirectMatch not(final IndirectMatch match) { - return new IndirectMatch() { - - @Override - public ElementMatcher.Junction buildJunction() { - return new NegatingMatcher(match.buildJunction()); - } - - @Override - public boolean isMatch(final TypeDescription typeDescription) { - return !match.isMatch(typeDescription); - } - }; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/logical/LogicalOrMatch.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/logical/LogicalOrMatch.java deleted file mode 100644 index 35549a3a..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/plugin/match/logical/LogicalOrMatch.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.plugin.match.logical; - -import cn.hippo4j.agent.core.plugin.match.IndirectMatch; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * Match classes by multiple criteria with OR conjunction - */ -public class LogicalOrMatch implements IndirectMatch { - - private final IndirectMatch[] indirectMatches; - - /** - * Don't instantiate this class directly, use {@link LogicalMatchOperation} instead - * - * @param indirectMatches the matching criteria to conjunct with OR - */ - LogicalOrMatch(final IndirectMatch... indirectMatches) { - this.indirectMatches = indirectMatches; - } - - @Override - public ElementMatcher.Junction buildJunction() { - ElementMatcher.Junction junction = null; - - for (final IndirectMatch indirectMatch : indirectMatches) { - if (junction == null) { - junction = indirectMatch.buildJunction(); - } else { - junction = junction.or(indirectMatch.buildJunction()); - } - } - - return junction; - } - - @Override - public boolean isMatch(final TypeDescription typeDescription) { - for (final IndirectMatch indirectMatch : indirectMatches) { - if (indirectMatch.isMatch(typeDescription)) { - return true; - } - } - - return false; - } - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/AgentThreadPoolConstants.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/AgentThreadPoolConstants.java deleted file mode 100644 index bdfbdaac..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/AgentThreadPoolConstants.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -public interface AgentThreadPoolConstants { - - String TOMCAT_NAME_PREFIX = "namePrefix"; - String DUBBO_NAME_PREFIX = "mPrefix"; - String DUBBO_THREAD_NAME = "DubboServerHandler"; - String THREAD_POOL_NAME_DUBBO = "dubbo"; - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/CollectionUtil.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/CollectionUtil.java deleted file mode 100644 index 587c84f8..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/CollectionUtil.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * Some utility methods for collections. Reinvent the wheels because importing third-party libs just for some methods is - * not worthwhile in agent side - * - * @since 7.0.0 - */ -public final class CollectionUtil { - - public static String toString(final Map map) { - return map.entrySet() - .stream() - .map(entry -> entry.getKey() + "=" + Arrays.toString(entry.getValue())) - .collect(Collectors.joining("\n")); - } - - @SuppressWarnings("rawtypes") - public static boolean isEmpty(Collection collection) { - return collection == null || collection.isEmpty(); - } - - /** - * Is empty. - * - * @param map - * @return - */ - public static boolean isEmpty(Map map) { - return map == null || map.isEmpty(); - } - - /** - * Is not empty. - * - * @param map - * @return - */ - public static boolean isNotEmpty(Map map) { - return !isEmpty(map); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/ConfigInitializer.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/ConfigInitializer.java deleted file mode 100644 index 5559db3c..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/ConfigInitializer.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Properties; - -/** - * Init a class's static fields by a {@link Properties}, including static fields and static inner classes. - *

- */ -public class ConfigInitializer { - - public static void initialize(Properties properties, Class rootConfigType) throws IllegalAccessException { - initNextLevel(properties, rootConfigType, new ConfigDesc(), false); - } - - public static void initialize(Properties properties, Class rootConfigType, boolean isSpringProperties) throws IllegalAccessException { - initNextLevel(properties, rootConfigType, new ConfigDesc(), isSpringProperties); - } - - private static void initNextLevel(Properties properties, Class recentConfigType, - ConfigDesc parentDesc, boolean isSpringProperties) throws IllegalArgumentException, IllegalAccessException { - for (Field field : recentConfigType.getFields()) { - if (Modifier.isPublic(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) { - String configKey = (parentDesc + "." + (isSpringProperties ? field.getName().replace("_", "-") : field.getName())).toLowerCase(); - Class type = field.getType(); - - if (type.equals(Map.class)) { - /* - * Map config format is, config_key[map_key]=map_value Such as plugin.opgroup.resttemplate.rule[abc]=/url/path - */ - // Deduct two generic types of the map - ParameterizedType genericType = (ParameterizedType) field.getGenericType(); - Type[] argumentTypes = genericType.getActualTypeArguments(); - - Type keyType = null; - Type valueType = null; - if (argumentTypes != null && argumentTypes.length == 2) { - // Get key type and value type of the map - keyType = argumentTypes[0]; - valueType = argumentTypes[1]; - } - Map map = (Map) field.get(null); - // Set the map from config key and properties - setForMapType(configKey, map, properties, keyType, valueType); - } else { - /* - * Others typical field type - */ - String value = properties.getProperty(configKey); - // Convert the value into real type - final Length lengthDefine = field.getAnnotation(Length.class); - if (lengthDefine != null) { - if (value != null && value.length() > lengthDefine.value()) { - value = value.substring(0, lengthDefine.value()); - } - } - Object convertedValue = convertToTypicalType(type, value); - if (convertedValue != null) { - field.set(null, convertedValue); - } - } - } - } - for (Class innerConfiguration : recentConfigType.getClasses()) { - String simpleName = innerConfiguration.getSimpleName(); - String description = isSpringProperties ? simpleName.replace("_", "-") : simpleName; - parentDesc.append(description); - initNextLevel(properties, innerConfiguration, parentDesc, isSpringProperties); - parentDesc.removeLastDesc(); - } - } - - /** - * Convert string value to typical type. - * - * @param type type to convert - * @param value string value to be converted - * @return converted value or null - */ - private static Object convertToTypicalType(Type type, String value) { - if (value == null || type == null) { - return null; - } - - Object result = null; - if (String.class.equals(type)) { - result = value; - } else if (int.class.equals(type) || Integer.class.equals(type)) { - result = Integer.valueOf(value); - } else if (long.class.equals(type) || Long.class.equals(type)) { - result = Long.valueOf(value); - } else if (boolean.class.equals(type) || Boolean.class.equals(type)) { - result = Boolean.valueOf(value); - } else if (float.class.equals(type) || Float.class.equals(type)) { - result = Float.valueOf(value); - } else if (double.class.equals(type) || Double.class.equals(type)) { - result = Double.valueOf(value); - } else if (List.class.equals(type)) { - result = convert2List(value); - } else if (type instanceof Class) { - Class clazz = (Class) type; - if (clazz.isEnum()) { - result = Enum.valueOf((Class) type, value.toUpperCase()); - } - } - return result; - } - - /** - * Set map items. - * - * @param configKey config key must not be null - * @param map map to set must not be null - * @param properties properties must not be null - * @param keyType key type of the map - * @param valueType value type of the map - */ - private static void setForMapType(String configKey, Map map, Properties properties, - final Type keyType, final Type valueType) { - - Objects.requireNonNull(configKey); - Objects.requireNonNull(map); - Objects.requireNonNull(properties); - - String prefix = configKey + "["; - String suffix = "]"; - - properties.forEach((propertyKey, propertyValue) -> { - String propertyStringKey = propertyKey.toString(); - if (propertyStringKey.startsWith(prefix) && propertyStringKey.endsWith(suffix)) { - String itemKey = propertyStringKey.substring( - prefix.length(), propertyStringKey.length() - suffix.length()); - Object keyObj; - Object valueObj; - - keyObj = convertToTypicalType(keyType, itemKey); - valueObj = convertToTypicalType(valueType, propertyValue.toString()); - - if (keyObj == null) { - keyObj = itemKey; - } - - if (valueObj == null) { - valueObj = propertyValue; - } - - map.put(keyObj, valueObj); - } - }); - } - - private static List convert2List(String value) { - if (StringUtil.isEmpty(value)) { - return Collections.emptyList(); - } - List result = new LinkedList<>(); - - String[] segments = value.split(","); - for (String segment : segments) { - String trimmedSegment = segment.trim(); - if (StringUtil.isNotEmpty(trimmedSegment)) { - result.add(trimmedSegment); - } - } - return result; - } - -} - -class ConfigDesc { - - private LinkedList descs = new LinkedList<>(); - - void append(String currentDesc) { - if (StringUtil.isNotEmpty(currentDesc)) { - descs.addLast(currentDesc); - } - } - - void removeLastDesc() { - descs.removeLast(); - } - - @Override - public String toString() { - return String.join(".", descs); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/CustomizeExpression.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/CustomizeExpression.java deleted file mode 100644 index f4aebf8a..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/CustomizeExpression.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; - -import java.lang.reflect.Array; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * a simple parsing expression - */ - -public class CustomizeExpression { - - private static final ILog LOGGER = LogManager.getLogger(CustomizeExpression.class); - - public static Map evaluationContext(Object[] allArguments) { - Map context = new HashMap<>(); - if (allArguments == null) { - return context; - } - for (int i = 0; i < allArguments.length; i++) { - context.put("arg[" + i + "]", allArguments[i]); - } - return context; - } - - public static Map evaluationReturnContext(Object ret) { - Map context = new HashMap<>(); - context.put("returnedObj", ret); - return context; - } - - public static String parseExpression(String expression, Map context) { - try { - String[] es = expression.split("\\."); - Object o = context.get(es[0]); - return o == null ? "null" : String.valueOf(parse(es, o, 0)); - } catch (Exception e) { - LOGGER.debug("parse expression error, expression is {}, exception is {}", expression, e.getMessage()); - } - return "null"; - } - - private static Object parse(String[] expressions, Object o, int i) { - int next = i + 1; - if (next == expressions.length) { - return o; - } else { - o = parse0(expressions[next], o); - return o == null ? "null" : parse(expressions, o, next); - } - } - - private static Object parse0(String expression, Object o) { - if (o instanceof Map) { - return matcherMap(expression, o); - } else if (o instanceof List) { - return matcherList(expression, o); - } else if (o.getClass().isArray()) { - return matcherArray(expression, o); - } else { - return matcherDefault(expression, o); - } - } - - private static Object matcherMap(String expression, Object o) { - String key = expression.replace("['", "").replace("']", ""); - return ((Map) o).get(key); - } - - private static Object matcherList(String expression, Object o) { - int index = Integer.parseInt(expression.replace("[", "").replace("]", "")); - List l = (List) o; - return l != null && l.size() > index ? l.get(index) : null; - } - - private static Object matcherArray(String expression, Object o) { - int index = Integer.parseInt(expression.replace("[", "").replace("]", "")); - return o != null && Array.getLength(o) > index ? Array.get(o, index) : null; - } - - private static Object matcherDefault(String expression, Object o) { - try { - if (expression.contains("()")) { - Method m = o.getClass().getMethod(expression.replace("()", "")); - m.setAccessible(true); - return m.invoke(o); - } else { - Field f = o.getClass().getDeclaredField(expression); - f.setAccessible(true); - return f.get(o); - } - } catch (Exception e) { - LOGGER.debug("matcher default error, expression is {}, object is {}, expression is {}", expression, o, e.getMessage()); - } - return null; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/ExecutorNameUtil.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/ExecutorNameUtil.java deleted file mode 100644 index e605e1ad..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/ExecutorNameUtil.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; - -import java.lang.reflect.Field; - -public class ExecutorNameUtil { - - private static final ILog LOGGER = LogManager.getLogger(ExecutorNameUtil.class); - - public static boolean isTomcatExecutor(Object threadFactory) { - try { - if ("org.apache.tomcat.util.threads.TaskThreadFactory".equals(threadFactory.getClass().getName())) { - Field namePrefixField = threadFactory.getClass().getDeclaredField(AgentThreadPoolConstants.TOMCAT_NAME_PREFIX); - namePrefixField.setAccessible(true); - String namePrefix = (String) namePrefixField.get(threadFactory); - if (RegexUtil.isTomcatNameMatch(namePrefix)) { - return true; - } - } - } catch (Throwable t) { - LOGGER.error("Fail to put tomcat executor", t); - } - return false; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/FileUtils.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/FileUtils.java deleted file mode 100644 index 2d954dda..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/FileUtils.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -import java.io.File; -import java.nio.file.Files; - -public class FileUtils { - - /** - * delete directories and files recursively - * - * @param dir directory to delete - */ - public static void deleteDirectory(File dir) { - File[] files = dir.listFiles(); - if (files != null) { - for (File file : files) { - if (!Files.isSymbolicLink(file.toPath())) { - if (file.isDirectory()) { - deleteDirectory(file); - } else { - file.delete(); - } - } else { - file.delete(); - } - } - } - dir.delete(); - } - - public static void deleteDirectoryOnExit(File dir) { - Runtime.getRuntime().addShutdownHook(new Thread() { - - @Override - public void run() { - FileUtils.deleteDirectory(dir); - } - }); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/IOUtils.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/IOUtils.java deleted file mode 100644 index 7c89756b..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/IOUtils.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -import java.io.ByteArrayOutputStream; -import java.io.Closeable; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * Copied from commons-io-2.2 (org.apache.commons.io.IOUtils) - * Origin license: http://www.apache.org/licenses/LICENSE-2.0 - * @version $Id: IOUtils.java 1304177 2012-03-23 03:36:44Z ggregory $ - */ -public class IOUtils { - - private static final int EOF = -1; - - /** - * The default buffer size ({@value}) to use for - * {@link #copyLarge(InputStream, OutputStream)} - */ - private static final int DEFAULT_BUFFER_SIZE = 1024 * 4; - - /** - * Get the contents of an InputStream as a byte[]. - *

- * This method buffers the input internally, so there is no need to use a - * BufferedInputStream. - * - * @param input the InputStream to read from - * @return the requested byte array - * @throws NullPointerException if the input is null - * @throws IOException if an I/O error occurs - */ - public static byte[] toByteArray(InputStream input) throws IOException { - ByteArrayOutputStream output = new ByteArrayOutputStream(); - copy(input, output); - return output.toByteArray(); - } - - /** - * Copy bytes from an InputStream to an - * OutputStream. - *

- * This method buffers the input internally, so there is no need to use a - * BufferedInputStream. - *

- * Large streams (over 2GB) will return a bytes copied value of - * -1 after the copy has completed since the correct - * number of bytes cannot be returned as an int. For large streams - * use the copyLarge(InputStream, OutputStream) method. - * - * @param input the InputStream to read from - * @param output the OutputStream to write to - * @return the number of bytes copied, or -1 if > Integer.MAX_VALUE - * @throws NullPointerException if the input or output is null - * @throws IOException if an I/O error occurs - * @since 1.1 - */ - public static int copy(InputStream input, OutputStream output) throws IOException { - long count = copyLarge(input, output); - if (count > Integer.MAX_VALUE) { - return -1; - } - return (int) count; - } - - /** - * Copy bytes from a large (over 2GB) InputStream to an - * OutputStream. - *

- * This method buffers the input internally, so there is no need to use a - * BufferedInputStream. - *

- * The buffer size is given by {@link #DEFAULT_BUFFER_SIZE}. - * - * @param input the InputStream to read from - * @param output the OutputStream to write to - * @return the number of bytes copied - * @throws NullPointerException if the input or output is null - * @throws IOException if an I/O error occurs - * @since 1.3 - */ - public static long copyLarge(InputStream input, OutputStream output) throws IOException { - return copyLarge(input, output, new byte[DEFAULT_BUFFER_SIZE]); - } - - /** - * Copy bytes from a large (over 2GB) InputStream to an - * OutputStream. - *

- * This method uses the provided buffer, so there is no need to use a - * BufferedInputStream. - *

- * - * @param input the InputStream to read from - * @param output the OutputStream to write to - * @param buffer the buffer to use for the copy - * @return the number of bytes copied - * @throws NullPointerException if the input or output is null - * @throws IOException if an I/O error occurs - * @since 2.2 - */ - public static long copyLarge(InputStream input, OutputStream output, byte[] buffer) throws IOException { - long count = 0; - int n = 0; - while (EOF != (n = input.read(buffer))) { - output.write(buffer, 0, n); - count += n; - } - return count; - } - - /** - * close streams - * @param closeable the closeable handler - */ - public static void closeQuietly(Closeable closeable) { - try { - if (closeable != null) { - closeable.close(); - } - } catch (IOException ex) { - // ignore ex - } - } - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/Length.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/Length.java deleted file mode 100644 index 4226d4d7..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/Length.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * The length rule of the target field. - */ -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface Length { - - int value(); -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/MethodUtil.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/MethodUtil.java deleted file mode 100644 index bd7e13f6..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/MethodUtil.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -import java.lang.reflect.Method; - -/** - * According to the input parameter, return the OperationName for the span record, It can determine the unique method - */ - -public class MethodUtil { - - public static String generateOperationName(Method method) { - StringBuilder operationName = new StringBuilder(method.getDeclaringClass() - .getName() + "." + method.getName() + "("); - Class[] parameterTypes = method.getParameterTypes(); - for (int i = 0; i < parameterTypes.length; i++) { - operationName.append(parameterTypes[i].getName()); - if (i < (parameterTypes.length - 1)) { - operationName.append(","); - } - } - operationName.append(")"); - return operationName.toString(); - } - - /** - * This is a low-performance method, recommend to use this when have to, make sure it is only executed once and the - * result is being cached. - */ - public static boolean isMethodExist(ClassLoader classLoader, String className, String methodName, - String... parameterTypes) { - try { - Class clazz = Class.forName(className, true, classLoader); - if (parameterTypes == null || parameterTypes.length == 0) { - clazz.getDeclaredMethod(methodName); - return true; - } else { - Method[] declaredMethods = clazz.getDeclaredMethods(); - for (Method declaredMethod : declaredMethods) { - if (declaredMethod.getName().equals(methodName) - && isParameterTypesEquals(declaredMethod.getParameterTypes(), parameterTypes)) { - return true; - } - } - } - } catch (Exception e) { - // ignore - } - return false; - } - - private static boolean isParameterTypesEquals(Class[] parameterTypeClazz, String[] parameterTypeString) { - if (parameterTypeClazz == null) { - return false; - } - if (parameterTypeClazz.length != parameterTypeString.length) { - return false; - } - for (int i = 0; i < parameterTypeClazz.length; i++) { - if (!parameterTypeClazz[i].getName().equals(parameterTypeString[i])) { - return false; - } - } - return true; - - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/PlaceholderConfigurerSupport.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/PlaceholderConfigurerSupport.java deleted file mode 100644 index 3b2f6ffd..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/PlaceholderConfigurerSupport.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -public class PlaceholderConfigurerSupport { - - /** - * Default placeholder prefix: {@value} - */ - public static final String DEFAULT_PLACEHOLDER_PREFIX = "${"; - - /** - * Default placeholder suffix: {@value} - */ - public static final String DEFAULT_PLACEHOLDER_SUFFIX = "}"; - - /** - * Default value separator: {@value} - */ - public static final String DEFAULT_VALUE_SEPARATOR = ":"; - -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/PrivateKeyUtil.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/PrivateKeyUtil.java deleted file mode 100644 index 48df0f19..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/PrivateKeyUtil.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.Base64; - -/** - * Util intends to parse PKCS#1 and PKCS#8 at same time. - */ -public class PrivateKeyUtil { - - private static final String PKCS_1_PEM_HEADER = "-----BEGIN RSA PRIVATE KEY-----"; - private static final String PKCS_1_PEM_FOOTER = "-----END RSA PRIVATE KEY-----"; - private static final String PKCS_8_PEM_HEADER = "-----BEGIN PRIVATE KEY-----"; - private static final String PKCS_8_PEM_FOOTER = "-----END PRIVATE KEY-----"; - - /** - * Load a RSA decryption key from a file (PEM or DER). - */ - public static InputStream loadDecryptionKey(String keyFilePath) throws IOException { - byte[] keyDataBytes = Files.readAllBytes(Paths.get(keyFilePath)); - String keyDataString = new String(keyDataBytes, StandardCharsets.UTF_8); - - if (keyDataString.contains(PKCS_1_PEM_HEADER)) { - // OpenSSL / PKCS#1 Base64 PEM encoded file - keyDataString = keyDataString.replace(PKCS_1_PEM_HEADER, ""); - keyDataString = keyDataString.replace(PKCS_1_PEM_FOOTER, ""); - keyDataString = keyDataString.replace("\n", ""); - return readPkcs1PrivateKey(Base64.getDecoder().decode(keyDataString)); - } - - return new ByteArrayInputStream(keyDataString.getBytes()); - } - - /** - * Create a InputStream instance from raw PKCS#1 bytes. Raw Java API can't recognize ASN.1 format, so we should - * convert it into a pkcs#8 format Java can understand. - */ - private static InputStream readPkcs1PrivateKey(byte[] pkcs1Bytes) { - int pkcs1Length = pkcs1Bytes.length; - int totalLength = pkcs1Length + 22; - byte[] pkcs8Header = new byte[]{ - 0x30, (byte) 0x82, (byte) ((totalLength >> 8) & 0xff), (byte) (totalLength & 0xff), // Sequence + total length - 0x2, 0x1, 0x0, // Integer (0) - 0x30, 0xD, 0x6, 0x9, 0x2A, (byte) 0x86, 0x48, (byte) 0x86, (byte) 0xF7, 0xD, 0x1, 0x1, 0x1, 0x5, 0x0, // Sequence: 1.2.840.113549.1.1.1, NULL - 0x4, (byte) 0x82, (byte) ((pkcs1Length >> 8) & 0xff), (byte) (pkcs1Length & 0xff) // Octet string + length - }; - StringBuilder pkcs8 = new StringBuilder(PKCS_8_PEM_HEADER); - pkcs8.append("\n").append(new String(Base64.getEncoder().encode(join(pkcs8Header, pkcs1Bytes)))); - pkcs8.append("\n").append(PKCS_8_PEM_FOOTER); - return new ByteArrayInputStream(pkcs8.toString().getBytes()); - } - - private static byte[] join(byte[] byteArray1, byte[] byteArray2) { - byte[] bytes = new byte[byteArray1.length + byteArray2.length]; - System.arraycopy(byteArray1, 0, bytes, 0, byteArray1.length); - System.arraycopy(byteArray2, 0, bytes, byteArray1.length, byteArray2.length); - return bytes; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/PropertyPlaceholderHelper.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/PropertyPlaceholderHelper.java deleted file mode 100644 index 39e09629..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/PropertyPlaceholderHelper.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - -/** - * Utility class for working with Strings that have placeholder values in them. A placeholder takes the form {@code - * ${name}}. Using {@code PropertyPlaceholderHelper} these placeholders can be substituted for user-supplied values.

- * Values for substitution can be supplied using a {@link Properties} instance or using a {@link PlaceholderResolver}. - */ -public enum PropertyPlaceholderHelper { - - INSTANCE( - PlaceholderConfigurerSupport.DEFAULT_PLACEHOLDER_PREFIX, - PlaceholderConfigurerSupport.DEFAULT_PLACEHOLDER_SUFFIX, PlaceholderConfigurerSupport.DEFAULT_VALUE_SEPARATOR, - true); - - private final String placeholderPrefix; - - private final String placeholderSuffix; - - private final String simplePrefix; - - private final String valueSeparator; - - private final boolean ignoreUnresolvablePlaceholders; - - /** - * Creates a new {@code PropertyPlaceholderHelper} that uses the supplied prefix and suffix. - * - * @param placeholderPrefix the prefix that denotes the start of a placeholder - * @param placeholderSuffix the suffix that denotes the end of a placeholder - * @param valueSeparator the separating character between the placeholder variable and the - * associated default value, if any - * @param ignoreUnresolvablePlaceholders indicates whether unresolvable placeholders should be ignored ({@code - * true}) or cause an exception ({@code false}) - */ - PropertyPlaceholderHelper(String placeholderPrefix, String placeholderSuffix, String valueSeparator, - boolean ignoreUnresolvablePlaceholders) { - if (StringUtil.isEmpty(placeholderPrefix) || StringUtil.isEmpty(placeholderSuffix)) { - throw new UnsupportedOperationException("'placeholderPrefix or placeholderSuffix' must not be null"); - } - - final Map wellKnownSimplePrefixes = new HashMap(4); - - wellKnownSimplePrefixes.put("}", "{"); - wellKnownSimplePrefixes.put("]", "["); - wellKnownSimplePrefixes.put(")", "("); - - this.placeholderPrefix = placeholderPrefix; - this.placeholderSuffix = placeholderSuffix; - String simplePrefixForSuffix = wellKnownSimplePrefixes.get(this.placeholderSuffix); - if (simplePrefixForSuffix != null && this.placeholderPrefix.endsWith(simplePrefixForSuffix)) { - this.simplePrefix = simplePrefixForSuffix; - } else { - this.simplePrefix = this.placeholderPrefix; - } - this.valueSeparator = valueSeparator; - this.ignoreUnresolvablePlaceholders = ignoreUnresolvablePlaceholders; - } - - /** - * Replaces all placeholders of format {@code ${name}} with the corresponding property from the supplied {@link - * Properties}. - * - * @param value the value containing the placeholders to be replaced - * @param properties the {@code Properties} to use for replacement - * @return the supplied value with placeholders replaced inline - */ - public String replacePlaceholders(String value, final Properties properties) { - return replacePlaceholders(value, new PlaceholderResolver() { - - @Override - public String resolvePlaceholder(String placeholderName) { - return getConfigValue(placeholderName, properties); - } - }); - } - - private String getConfigValue(String key, final Properties properties) { - String value = System.getProperty(key); - if (value == null) { - value = System.getenv(key); - } - if (value == null) { - value = properties.getProperty(key); - } - return value; - } - - /** - * Replaces all placeholders of format {@code ${name}} with the value returned from the supplied {@link - * PlaceholderResolver}. - * - * @param value the value containing the placeholders to be replaced - * @param placeholderResolver the {@code PlaceholderResolver} to use for replacement - * @return the supplied value with placeholders replaced inline - */ - public String replacePlaceholders(String value, PlaceholderResolver placeholderResolver) { - return parseStringValue(value, placeholderResolver, new HashSet()); - } - - protected String parseStringValue(String value, PlaceholderResolver placeholderResolver, - Set visitedPlaceholders) { - - StringBuilder result = new StringBuilder(value); - - int startIndex = value.indexOf(this.placeholderPrefix); - while (startIndex != -1) { - int endIndex = findPlaceholderEndIndex(result, startIndex); - if (endIndex != -1) { - String placeholder = result.substring(startIndex + this.placeholderPrefix.length(), endIndex); - String originalPlaceholder = placeholder; - if (!visitedPlaceholders.add(originalPlaceholder)) { - throw new IllegalArgumentException( - "Circular placeholder reference '" + originalPlaceholder + "' in property definitions"); - } - // Recursive invocation, parsing placeholders contained in the placeholder key. - placeholder = parseStringValue(placeholder, placeholderResolver, visitedPlaceholders); - // Now obtain the value for the fully resolved key... - String propVal = placeholderResolver.resolvePlaceholder(placeholder); - if (propVal == null && this.valueSeparator != null) { - int separatorIndex = placeholder.indexOf(this.valueSeparator); - if (separatorIndex != -1) { - String actualPlaceholder = placeholder.substring(0, separatorIndex); - String defaultValue = placeholder.substring(separatorIndex + this.valueSeparator.length()); - propVal = placeholderResolver.resolvePlaceholder(actualPlaceholder); - if (propVal == null) { - propVal = defaultValue; - } - } - } - if (propVal != null) { - // Recursive invocation, parsing placeholders contained in the - // previously resolved placeholder value. - propVal = parseStringValue(propVal, placeholderResolver, visitedPlaceholders); - result.replace(startIndex, endIndex + this.placeholderSuffix.length(), propVal); - startIndex = result.indexOf(this.placeholderPrefix, startIndex + propVal.length()); - } else if (this.ignoreUnresolvablePlaceholders) { - // Proceed with unprocessed value. - startIndex = result.indexOf(this.placeholderPrefix, endIndex + this.placeholderSuffix.length()); - } else { - throw new IllegalArgumentException( - "Could not resolve placeholder '" + placeholder + "'" + " in value \"" + value + "\""); - } - visitedPlaceholders.remove(originalPlaceholder); - } else { - startIndex = -1; - } - } - return result.toString(); - } - - private int findPlaceholderEndIndex(CharSequence buf, int startIndex) { - int index = startIndex + this.placeholderPrefix.length(); - int withinNestedPlaceholder = 0; - while (index < buf.length()) { - if (StringUtil.substringMatch(buf, index, this.placeholderSuffix)) { - if (withinNestedPlaceholder > 0) { - withinNestedPlaceholder--; - index = index + this.placeholderSuffix.length(); - } else { - return index; - } - } else if (StringUtil.substringMatch(buf, index, this.simplePrefix)) { - withinNestedPlaceholder++; - index = index + this.simplePrefix.length(); - } else { - index++; - } - } - return -1; - } - - /** - * Strategy interface used to resolve replacement values for placeholders contained in Strings. - */ - public interface PlaceholderResolver { - - /** - * Resolve the supplied placeholder name to the replacement value. - * - * @param placeholderName the name of the placeholder to resolve - * @return the replacement value, or {@code null} if no replacement is to be made - */ - String resolvePlaceholder(String placeholderName); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/ReflectUtil.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/ReflectUtil.java deleted file mode 100644 index 105a5274..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/ReflectUtil.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.List; - -public class ReflectUtil { - - private static final ILog LOGGER = LogManager.getLogger(ReflectUtil.class); - - public static List getStaticFieldsFromType(Class clazz, Class declaredType) { - Field[] fields = clazz.getDeclaredFields(); - List result = new ArrayList<>(); - for (Field field : fields) { - if (field.getType().isAssignableFrom(declaredType) - && Modifier.isStatic(field.getModifiers())) { - field.setAccessible(true); - result.add(field); - } - } - return result; - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/RegexUtil.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/RegexUtil.java deleted file mode 100644 index a3576643..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/RegexUtil.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -import java.util.regex.Pattern; - -public class RegexUtil { - - private static final String TOMCAT_NAME_PATTERN_STRING = "http\\S+nio\\S+-exec-"; - private static final Pattern TOMCAT_NAME_PATTERN = Pattern.compile(TOMCAT_NAME_PATTERN_STRING); - - public static boolean isTomcatNameMatch(String executorName) { - return TOMCAT_NAME_PATTERN.matcher(executorName).find(); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/RunnableWithExceptionProtection.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/RunnableWithExceptionProtection.java deleted file mode 100644 index 5a3d392b..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/RunnableWithExceptionProtection.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -public class RunnableWithExceptionProtection implements Runnable { - - private Runnable run; - private CallbackWhenException callback; - - public RunnableWithExceptionProtection(Runnable run, CallbackWhenException callback) { - this.run = run; - this.callback = callback; - } - - @Override - public void run() { - try { - run.run(); - } catch (Throwable t) { - callback.handle(t); - } - } - - public interface CallbackWhenException { - - void handle(Throwable t); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/StringUtil.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/StringUtil.java deleted file mode 100644 index 040f915c..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/StringUtil.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -import java.util.function.Consumer; - -public final class StringUtil { - - public static boolean isEmpty(String str) { - return str == null || str.length() == 0; - } - - public static boolean isNotEmpty(String str) { - return !isEmpty(str); - } - - public static boolean isBlank(String str) { - return str == null || isEmpty(str.trim()); - } - - public static boolean isNotBlank(String str) { - return !isBlank(str); - } - - public static void setIfPresent(String value, Consumer setter) { - if (isNotEmpty(value)) { - setter.accept(value); - } - } - - public static String join(final char delimiter, final String... strings) { - if (strings.length == 0) { - return null; - } - if (strings.length == 1) { - return strings[0]; - } - int length = strings.length - 1; - for (final String s : strings) { - if (s == null) { - continue; - } - length += s.length(); - } - final StringBuilder sb = new StringBuilder(length); - if (strings[0] != null) { - sb.append(strings[0]); - } - for (int i = 1; i < strings.length; ++i) { - if (!isEmpty(strings[i])) { - sb.append(delimiter).append(strings[i]); - } else { - sb.append(delimiter); - } - } - return sb.toString(); - } - - public static boolean substringMatch(CharSequence str, int index, CharSequence substring) { - if (index + substring.length() > str.length()) { - return false; - } - for (int i = 0; i < substring.length(); i++) { - if (str.charAt(index + i) != substring.charAt(i)) { - return false; - } - } - return true; - } - - public static String cut(String str, int threshold) { - if (isEmpty(str) || str.length() <= threshold) { - return str; - } - return str.substring(0, threshold); - } - - public static String trim(final String str, final char ch) { - if (isEmpty(str)) { - return null; - } - - final char[] chars = str.toCharArray(); - - int i = 0, j = chars.length - 1; - // noinspection StatementWithEmptyBody - for (; i < chars.length && chars[i] == ch; i++) { - } - // noinspection StatementWithEmptyBody - for (; j > 0 && chars[j] == ch; j--) { - } - - return new String(chars, i, j - i + 1); - } -} diff --git a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/ThreadPoolPropertyKey.java b/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/ThreadPoolPropertyKey.java deleted file mode 100644 index aa493f9e..00000000 --- a/agent/hippo4j-agent-core/src/main/java/cn/hippo4j/agent/core/util/ThreadPoolPropertyKey.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.core.util; - -public interface ThreadPoolPropertyKey { - - String THREAD_POOL_ID = "threadPoolId"; - - String CORE_POOL_SIZE = "corePoolSize"; - - String MAXIMUM_POOL_SIZE = "maximumPoolSize"; - - String ALLOW_CORE_THREAD_TIME_OUT = "allowCoreThreadTimeOut"; - - String KEEP_ALIVE_TIME = "keepAliveTime"; - - String BLOCKING_QUEUE = "blockingQueue"; - - String QUEUE_CAPACITY = "queueCapacity"; - - String REJECTED_HANDLER = "rejectedHandler"; - - String EXECUTE_TIME_OUT = "executeTimeOut"; -} diff --git a/agent/hippo4j-agent-plugin/adapter-plugins/dubbo-plugin/pom.xml b/agent/hippo4j-agent-plugin/adapter-plugins/dubbo-plugin/pom.xml deleted file mode 100644 index 5304c6eb..00000000 --- a/agent/hippo4j-agent-plugin/adapter-plugins/dubbo-plugin/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - hippo4j-agent-adapter-plugins - cn.hippo4j - ${revision} - - 4.0.0 - - dubbo-plugin - - - - org.apache.dubbo - dubbo - provided - - - - cn.hippo4j - hippo4j-threadpool-infra-common - ${project.version} - - - - - \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/adapter-plugins/dubbo-plugin/src/main/java/cn/hippo4j/agent/adapter/dubbo/DubboThreadPoolAdapter.java b/agent/hippo4j-agent-plugin/adapter-plugins/dubbo-plugin/src/main/java/cn/hippo4j/agent/adapter/dubbo/DubboThreadPoolAdapter.java deleted file mode 100644 index 6ba5045e..00000000 --- a/agent/hippo4j-agent-plugin/adapter-plugins/dubbo-plugin/src/main/java/cn/hippo4j/agent/adapter/dubbo/DubboThreadPoolAdapter.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.adapter.dubbo; - -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum; -import cn.hippo4j.common.executor.support.RejectedPolicyTypeEnum; -import cn.hippo4j.common.model.executor.ExecutorProperties; -import cn.hippo4j.common.toolkit.BooleanUtil; -import cn.hippo4j.common.toolkit.ReflectUtil; -import java.util.Map; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ThreadPoolExecutor; -import org.apache.dubbo.common.Version; -import org.apache.dubbo.common.extension.ExtensionLoader; -import org.apache.dubbo.common.store.DataStore; -import org.apache.dubbo.common.threadpool.manager.ExecutorRepository; - -/** - * Dubbo thread-pool adapter. - */ -public class DubboThreadPoolAdapter { - - public static void registerExecutors() { - boolean isLegacyVersion = true; - String poolKey = ExecutorService.class.getName(); - // Since 2.7.5, Dubbo has changed the way thread pools are used - // fixed https://github.com/opengoofy/hippo4j/issues/708 - try { - if (Version.getIntVersion(Version.getVersion()) < 2070500) { - isLegacyVersion = false; - } - } catch (Exception ex) { - } - - try { - if (isLegacyVersion) { - DataStore dataStore = ExtensionLoader.getExtensionLoader(DataStore.class).getDefaultExtension(); - Map executors = dataStore.get(poolKey); - executors.forEach((key, value) -> putHolder(mark() + key, (ThreadPoolExecutor) value)); - return; - } - ExecutorRepository executorRepository = ExtensionLoader.getExtensionLoader(ExecutorRepository.class).getDefaultExtension(); - ConcurrentMap> data = - (ConcurrentMap>) ReflectUtil.getFieldValue(executorRepository, "data"); - ConcurrentMap executorServiceMap = data.get(poolKey); - executorServiceMap.forEach((key, value) -> putHolder(mark() + key, (ThreadPoolExecutor) value)); - } catch (Exception ex) { - } - } - - private static void putHolder(String executorName, ThreadPoolExecutor executor) { - if (executor == null) { - return; - } - ExecutorProperties executorProperties = ExecutorProperties.builder() - .threadPoolId(executorName) - .corePoolSize(executor.getCorePoolSize()) - .maximumPoolSize(executor.getMaximumPoolSize()) - .allowCoreThreadTimeOut(BooleanUtil.toBoolean(String.valueOf(executor.allowsCoreThreadTimeOut()))) - .blockingQueue(BlockingQueueTypeEnum.getBlockingQueueTypeEnumByName(executor.getQueue().getClass().getSimpleName()).getName()) - .queueCapacity(executor.getQueue().remainingCapacity()) - .rejectedHandler(RejectedPolicyTypeEnum.getRejectedPolicyTypeEnumByName(executor.getRejectedExecutionHandler().getClass().getSimpleName()).getName()) - .build(); - ThreadPoolExecutorRegistry.putHolder(executorName, executor, executorProperties); - } - - public static String mark() { - return "Dubbo"; - } -} diff --git a/agent/hippo4j-agent-plugin/adapter-plugins/pom.xml b/agent/hippo4j-agent-plugin/adapter-plugins/pom.xml deleted file mode 100644 index 1c52b2e9..00000000 --- a/agent/hippo4j-agent-plugin/adapter-plugins/pom.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-agent-plugin - ${revision} - - - hippo4j-agent-adapter-plugins - pom - - - 8 - 8 - UTF-8 - - - - dubbo-plugin - - - \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/apollo-plugin/pom.xml b/agent/hippo4j-agent-plugin/apollo-plugin/pom.xml deleted file mode 100644 index 67ddd9c6..00000000 --- a/agent/hippo4j-agent-plugin/apollo-plugin/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-agent-plugin - ${revision} - - - hippo4j-agent-apollo-plugin - - - 1.9.1 - - - - - cn.hippo4j - hippo4j-agent-spring-plugin-common - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-dynamic-mode-config - ${project.version} - - - com.ctrip.framework.apollo - apollo-client - ${apollo.version} - provided - - - - \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/apollo-plugin/src/main/java/cn/hippo4j/agent/plugin/apollo/ApolloDynamicThreadPoolChangeHandler.java b/agent/hippo4j-agent-plugin/apollo-plugin/src/main/java/cn/hippo4j/agent/plugin/apollo/ApolloDynamicThreadPoolChangeHandler.java deleted file mode 100644 index 77784263..00000000 --- a/agent/hippo4j-agent-plugin/apollo-plugin/src/main/java/cn/hippo4j/agent/plugin/apollo/ApolloDynamicThreadPoolChangeHandler.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.apollo; - -import cn.hippo4j.agent.plugin.spring.common.conf.SpringBootConfig; -import cn.hippo4j.agent.plugin.spring.common.toolkit.SpringPropertyBinder; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.dynamic.mode.config.refresher.AbstractConfigThreadPoolDynamicRefresh; -import com.ctrip.framework.apollo.Config; -import com.ctrip.framework.apollo.ConfigChangeListener; -import com.ctrip.framework.apollo.ConfigFile; -import com.ctrip.framework.apollo.ConfigService; -import com.ctrip.framework.apollo.core.enums.ConfigFileFormat; -import com.ctrip.framework.apollo.model.ConfigChange; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static cn.hippo4j.agent.core.conf.Constants.SPRING_BOOT_CONFIG_PREFIX; - -/** - * Dynamic thread pool change handler - */ -public class ApolloDynamicThreadPoolChangeHandler extends AbstractConfigThreadPoolDynamicRefresh { - - private static final ILog LOGGER = LogManager.getLogger(ApolloDynamicThreadPoolChangeHandler.class); - - /** - * Registers a listener with Apollo to monitor for changes in the thread pool configuration. - */ - @Override - public void registerListener() { - List apolloNamespaces = SpringBootConfig.Spring.Dynamic.Thread_Pool.Apollo.NAMESPACE; - String namespace = apolloNamespaces.get(0); - String configFileType = SpringBootConfig.Spring.Dynamic.Thread_Pool.CONFIG_FILE_TYPE; - Config config = ConfigService.getConfig(String.format("%s.%s", namespace, configFileType)); - ConfigChangeListener configChangeListener = configChangeEvent -> { - String replacedNamespace = namespace.replaceAll("." + configFileType, ""); - ConfigFileFormat configFileFormat = ConfigFileFormat.fromString(configFileType); - ConfigFile configFile = ConfigService.getConfigFile(replacedNamespace, configFileFormat); - Map newChangeValueMap = new HashMap<>(); - configChangeEvent.changedKeys().stream().filter(each -> each.contains(SPRING_BOOT_CONFIG_PREFIX)).forEach(each -> { - ConfigChange change = configChangeEvent.getChange(each); - String newValue = change.getNewValue(); - newChangeValueMap.put(each, newValue); - }); - dynamicRefresh(configFileType, configFile.getContent(), newChangeValueMap); - }; - config.addChangeListener(configChangeListener); - LOGGER.info("[Hippo4j-Agent] Dynamic thread pool refresher, add apollo listener success. namespace: {}", namespace); - } - - /** - * Builds and binds the {@link BootstrapConfigProperties} from the given configuration map. - *

- * This method uses SpringPropertyBinder to bind the configuration values to an instance - * of {@link BootstrapConfigProperties}, which can then be used to configure the thread pool - * dynamically. - * - * @param configInfo the configuration map containing properties to bind. - * @return the bound {@link BootstrapConfigProperties} instance. - */ - @Override - public BootstrapConfigProperties buildBootstrapProperties(Map configInfo) { - BootstrapConfigProperties bindableBootstrapConfigProperties = SpringPropertyBinder.bindProperties(configInfo, BootstrapConfigProperties.PREFIX, BootstrapConfigProperties.class); - return bindableBootstrapConfigProperties; - } -} diff --git a/agent/hippo4j-agent-plugin/apollo-plugin/src/main/java/cn/hippo4j/agent/plugin/apollo/boot/ApolloPluginBootService.java b/agent/hippo4j-agent-plugin/apollo-plugin/src/main/java/cn/hippo4j/agent/plugin/apollo/boot/ApolloPluginBootService.java deleted file mode 100644 index 20d7551f..00000000 --- a/agent/hippo4j-agent-plugin/apollo-plugin/src/main/java/cn/hippo4j/agent/plugin/apollo/boot/ApolloPluginBootService.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.apollo.boot; - -import cn.hippo4j.agent.core.boot.BootService; -import cn.hippo4j.agent.core.boot.DefaultImplementor; - -/** - * Apollo plugin boot service - */ -@DefaultImplementor -public class ApolloPluginBootService implements BootService { - - @Override - public void prepare() throws Throwable { - - } - - @Override - public void boot() throws Throwable { - - } - - @Override - public void onComplete() throws Throwable { - - } - - @Override - public void shutdown() throws Throwable { - - } -} diff --git a/agent/hippo4j-agent-plugin/apollo-plugin/src/main/java/cn/hippo4j/agent/plugin/apollo/define/ApolloInstrumentation.java b/agent/hippo4j-agent-plugin/apollo-plugin/src/main/java/cn/hippo4j/agent/plugin/apollo/define/ApolloInstrumentation.java deleted file mode 100644 index 76579b47..00000000 --- a/agent/hippo4j-agent-plugin/apollo-plugin/src/main/java/cn/hippo4j/agent/plugin/apollo/define/ApolloInstrumentation.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.apollo.define; - -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import cn.hippo4j.agent.core.plugin.match.ClassMatch; -import cn.hippo4j.agent.core.plugin.match.NameMatch; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -import static net.bytebuddy.matcher.ElementMatchers.any; - -/** - * Apollo instrumentation - */ -public class ApolloInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - - private static final String ENHANCE_CLASS = "com.ctrip.framework.apollo.internals.DefaultConfig"; - - private static final String CONSTRUCTOR_INTERCEPT_CLASS = "cn.hippo4j.agent.plugin.apollo.interceptor.ApolloConfigConstructorInterceptor"; - - @Override - protected ClassMatch enhanceClass() { - return NameMatch.byName(ENHANCE_CLASS); - } - - @Override - public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[]{ - new ConstructorInterceptPoint() { - - @Override - public ElementMatcher getConstructorMatcher() { - return any(); - } - - @Override - public String getConstructorInterceptor() { - return CONSTRUCTOR_INTERCEPT_CLASS; - } - } - }; - } - - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[0]; - } -} diff --git a/agent/hippo4j-agent-plugin/apollo-plugin/src/main/java/cn/hippo4j/agent/plugin/apollo/interceptor/ApolloConfigConstructorInterceptor.java b/agent/hippo4j-agent-plugin/apollo-plugin/src/main/java/cn/hippo4j/agent/plugin/apollo/interceptor/ApolloConfigConstructorInterceptor.java deleted file mode 100644 index 16c3dced..00000000 --- a/agent/hippo4j-agent-plugin/apollo-plugin/src/main/java/cn/hippo4j/agent/plugin/apollo/interceptor/ApolloConfigConstructorInterceptor.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.apollo.interceptor; - -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; -import cn.hippo4j.agent.plugin.apollo.listeners.ApolloConfigPropertiesLoaderCompletedListener; -import cn.hippo4j.common.extension.design.AbstractSubjectCenter; - -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * Default config constructor interceptor - */ -public class ApolloConfigConstructorInterceptor implements InstanceConstructorInterceptor { - - private static final AtomicBoolean isExecuted = new AtomicBoolean(false); - - @Override - public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { - - // This logic will only be executed once - if (isExecuted.compareAndSet(false, true)) { - // The Apollo plugin triggers before the Spring configuration plug-in. - // This means that when the Apollo plug-in executes, Spring's Environment is not yet ready, - // so the configuration cannot be read - // After listening to the AGENT_SPRING_PROPERTIES_LOADER_COMPLETED event, register the listener for Apollo - AbstractSubjectCenter.register(AbstractSubjectCenter.SubjectType.AGENT_SPRING_PROPERTIES_LOADER_COMPLETED, - new ApolloConfigPropertiesLoaderCompletedListener()); - } - } -} diff --git a/agent/hippo4j-agent-plugin/apollo-plugin/src/main/java/cn/hippo4j/agent/plugin/apollo/listeners/ApolloConfigPropertiesLoaderCompletedListener.java b/agent/hippo4j-agent-plugin/apollo-plugin/src/main/java/cn/hippo4j/agent/plugin/apollo/listeners/ApolloConfigPropertiesLoaderCompletedListener.java deleted file mode 100644 index 8bef9193..00000000 --- a/agent/hippo4j-agent-plugin/apollo-plugin/src/main/java/cn/hippo4j/agent/plugin/apollo/listeners/ApolloConfigPropertiesLoaderCompletedListener.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.apollo.listeners; - -import cn.hippo4j.agent.plugin.apollo.ApolloDynamicThreadPoolChangeHandler; -import cn.hippo4j.common.extension.design.Observer; -import cn.hippo4j.common.extension.design.ObserverMessage; -import cn.hippo4j.threadpool.dynamic.api.ThreadPoolDynamicRefresh; - -/** - * Apollo Config Properties Loader Completed Listener - */ -public class ApolloConfigPropertiesLoaderCompletedListener implements Observer { - - @Override - public void accept(ObserverMessage observerMessage) { - ThreadPoolDynamicRefresh dynamicRefresh = new ApolloDynamicThreadPoolChangeHandler(); - dynamicRefresh.registerListener(); - } -} \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/apollo-plugin/src/main/resources/META-INF/services/cn.hippo4j.agent.core.boot.BootService b/agent/hippo4j-agent-plugin/apollo-plugin/src/main/resources/META-INF/services/cn.hippo4j.agent.core.boot.BootService deleted file mode 100644 index 8832c467..00000000 --- a/agent/hippo4j-agent-plugin/apollo-plugin/src/main/resources/META-INF/services/cn.hippo4j.agent.core.boot.BootService +++ /dev/null @@ -1,17 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -cn.hippo4j.agent.plugin.apollo.boot.ApolloPluginBootService \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/apollo-plugin/src/main/resources/hippo4j-plugin.def b/agent/hippo4j-agent-plugin/apollo-plugin/src/main/resources/hippo4j-plugin.def deleted file mode 100644 index ede6239b..00000000 --- a/agent/hippo4j-agent-plugin/apollo-plugin/src/main/resources/hippo4j-plugin.def +++ /dev/null @@ -1,17 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apollo-plugin=cn.hippo4j.agent.plugin.apollo.define.ApolloInstrumentation \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/nacos-plugin/pom.xml b/agent/hippo4j-agent-plugin/nacos-plugin/pom.xml deleted file mode 100644 index 986f041e..00000000 --- a/agent/hippo4j-agent-plugin/nacos-plugin/pom.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-agent-plugin - ${revision} - - - hippo4j-agent-nacos-plugin - - - 2.2.1 - - - - - cn.hippo4j - hippo4j-agent-spring-plugin-common - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-dynamic-mode-config - ${project.version} - - - org.springframework - spring-context - provided - - - com.alibaba.nacos - nacos-client - ${nacos.version} - provided - - - - \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/NacosDynamicThreadPoolChangeHandler.java b/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/NacosDynamicThreadPoolChangeHandler.java deleted file mode 100644 index 691719ec..00000000 --- a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/NacosDynamicThreadPoolChangeHandler.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.nacos; - -import cn.hippo4j.agent.plugin.spring.common.conf.NacosCloudConfig; -import cn.hippo4j.agent.plugin.spring.common.conf.NacosConfig; -import cn.hippo4j.agent.plugin.spring.common.conf.SpringBootConfig; -import cn.hippo4j.agent.plugin.spring.common.toolkit.SpringPropertyBinder; -import cn.hippo4j.common.executor.ThreadFactoryBuilder; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.threadpool.dynamic.mode.config.parser.ConfigParserHandler; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.dynamic.mode.config.refresher.AbstractConfigThreadPoolDynamicRefresh; -import com.alibaba.nacos.api.NacosFactory; -import com.alibaba.nacos.api.PropertyKeyConst; -import com.alibaba.nacos.api.config.ConfigService; -import com.alibaba.nacos.api.config.listener.Listener; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.Properties; -import java.util.concurrent.Executor; -import java.util.concurrent.ScheduledThreadPoolExecutor; - -import static cn.hippo4j.common.constant.Constants.DEFAULT_NAMESPACE_ID; - -/** - * NacosDynamicThreadPoolChangeHandler is responsible for handling dynamic thread pool - * configuration changes in a Spring environment by listening to configuration updates from Nacos. - *

- * This class extends {@link AbstractConfigThreadPoolDynamicRefresh} and implements the logic - * to register a Nacos listener, handle configuration changes, and dynamically refresh the thread pool - * properties based on the new configuration. - *

- */ -public class NacosDynamicThreadPoolChangeHandler extends AbstractConfigThreadPoolDynamicRefresh { - - private static final ILog LOGGER = LogManager.getLogger(NacosDynamicThreadPoolChangeHandler.class); - - /** - * Registers a listener with Nacos to monitor for changes in the thread pool configuration. - *

- * This method sets up the Nacos {@link ConfigService} with the server address and namespace - * from the Spring Boot configuration. It then adds a listener that will receive and process - * configuration updates, triggering a dynamic refresh of thread pool settings. - */ - @Override - public void registerListener() { - // Retrieve necessary configuration properties - String configFileType = SpringBootConfig.Spring.Dynamic.Thread_Pool.CONFIG_FILE_TYPE; - String serverAddr = Optional.ofNullable(NacosCloudConfig.Spring.Cloud.Nacos.Config.SERVER_ADDR).filter(s -> !StringUtil.isEmpty(s)) - .orElse(Optional.ofNullable(NacosConfig.Nacos.Config.SERVER_ADDR).filter(s -> !StringUtil.isEmpty(s)) - .orElse("")); - if (StringUtil.isEmpty(serverAddr)) { - LOGGER.error("[Hippo4j-Agent] add Nacos listener failure. Nacos Registry address not configured"); - return; - } - String dataId = SpringBootConfig.Spring.Dynamic.Thread_Pool.Nacos.DATA_ID; - String group = SpringBootConfig.Spring.Dynamic.Thread_Pool.Nacos.GROUP; - String namespace = SpringBootConfig.Spring.Dynamic.Thread_Pool.Nacos.NAMESPACE.get(0); - namespace = namespace.equals(DEFAULT_NAMESPACE_ID) ? "" : namespace; - try { - // Initialize Nacos ConfigService with the provided properties - Properties properties = new Properties(); - properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr); - properties.put(PropertyKeyConst.NAMESPACE, namespace); - ConfigService configService = NacosFactory.createConfigService(properties); - - // Define the listener to handle configuration changes - Listener configChangeListener = new Listener() { - - @Override - public void receiveConfigInfo(String configInfo) { - LOGGER.debug("Received configuration: " + configInfo); - Map changeValueMap = new HashMap<>(); - try { - // Parse the configuration and map the values to the appropriate keys - Map configInfoMap = ConfigParserHandler.getInstance().parseConfig(configInfo, configFileType); - configInfoMap.forEach((key, value) -> { - if (key instanceof String) { - changeValueMap.put((String) key, value); - } - }); - } catch (IOException e) { - LOGGER.error(e, "[Hippo4j-Agent] Dynamic thread pool refresher, Failed to resolve configuration. configFileType: {} configInfo: {} ", configFileType, configInfo); - } - // Trigger the dynamic refresh with the parsed configuration - dynamicRefresh(configFileType, configInfo, changeValueMap); - } - - @Override - public Executor getExecutor() { - return new ScheduledThreadPoolExecutor(1, ThreadFactoryBuilder.builder().daemon(true).prefix("client.dynamic.refresh.agent").build()); - } - }; - // Add the listener to the Nacos ConfigService - configService.addListener(dataId, group, configChangeListener); - LOGGER.info("[Hippo4j-Agent] Dynamic thread pool refresher, add Nacos listener successfully. serverAddr: {} namespace: {} data-id: {} group: {}", serverAddr, namespace, dataId, group); - } catch (Exception e) { - LOGGER.error(e, "[Hippo4j-Agent] Dynamic thread pool refresher, add Nacos listener failure. serverAddr: {} namespace: {} data-id: {} group: {}", serverAddr, namespace, dataId, group); - } - } - - /** - * Builds and binds the {@link BootstrapConfigProperties} from the given configuration map. - *

- * This method uses SpringPropertyBinder to bind the configuration values to an instance - * of {@link BootstrapConfigProperties}, which can then be used to configure the thread pool - * dynamically. - * - * @param configInfo the configuration map containing properties to bind. - * @return the bound {@link BootstrapConfigProperties} instance. - */ - @Override - public BootstrapConfigProperties buildBootstrapProperties(Map configInfo) { - BootstrapConfigProperties bindableBootstrapConfigProperties = SpringPropertyBinder.bindProperties(configInfo, BootstrapConfigProperties.PREFIX, BootstrapConfigProperties.class); - return bindableBootstrapConfigProperties; - } -} diff --git a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/boot/NacosPluginBootService.java b/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/boot/NacosPluginBootService.java deleted file mode 100644 index 65fe2a47..00000000 --- a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/boot/NacosPluginBootService.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.nacos.boot; - -import cn.hippo4j.agent.core.boot.BootService; -import cn.hippo4j.agent.core.boot.DefaultImplementor; - -/** - * Nacos plugin boot service - */ -@DefaultImplementor -public class NacosPluginBootService implements BootService { - - @Override - public void prepare() throws Throwable { - - } - - @Override - public void boot() throws Throwable { - - } - - @Override - public void onComplete() throws Throwable { - - } - - @Override - public void shutdown() throws Throwable { - - } -} diff --git a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/define/NacosCloudAdapterInstrumentation.java b/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/define/NacosCloudAdapterInstrumentation.java deleted file mode 100644 index 6fe99477..00000000 --- a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/define/NacosCloudAdapterInstrumentation.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.nacos.define; - -import cn.hippo4j.agent.core.plugin.WitnessMethod; -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import cn.hippo4j.agent.core.plugin.match.ClassMatch; -import cn.hippo4j.agent.core.plugin.match.NameMatch; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -import java.util.Collections; -import java.util.List; - -import static net.bytebuddy.matcher.ElementMatchers.named; - -public class NacosCloudAdapterInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - - private static final String ENHANCE_CLASS = "org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration"; - - private static final String INSTANCE_METHODS_INTERCEPT_CLASS = "cn.hippo4j.agent.plugin.nacos.interceptor.NacosCloudAdapterConfigInstanceMethodInterceptor"; - - @Override - protected ClassMatch enhanceClass() { - return NameMatch.byName(ENHANCE_CLASS); - } - - @Override - public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[0]; - } - - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[]{new InstanceMethodsInterceptPoint() { - - @Override - public ElementMatcher getMethodsMatcher() { - return named("initialize"); - } - - @Override - public String getMethodsInterceptor() { - return INSTANCE_METHODS_INTERCEPT_CLASS; - } - - @Override - public boolean isOverrideArgs() { - return false; - } - }}; - } - - @Override - protected List witnessMethods() { - return Collections.singletonList(new WitnessMethod("com.alibaba.cloud.nacos.client.NacosPropertySourceLocator", named("locate"))); - } -} diff --git a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/define/NacosInstrumentation.java b/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/define/NacosInstrumentation.java deleted file mode 100644 index d33c6031..00000000 --- a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/define/NacosInstrumentation.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.nacos.define; - -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import cn.hippo4j.agent.core.plugin.match.ClassMatch; -import cn.hippo4j.agent.core.plugin.match.NameMatch; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -import static net.bytebuddy.matcher.ElementMatchers.any; - -/** - * Nacos instrumentation - */ -public class NacosInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - - private static final String ENHANCE_CLASS = "com.alibaba.nacos.client.config.NacosConfigService"; - - private static final String CONSTRUCTOR_INTERCEPT_CLASS = "cn.hippo4j.agent.plugin.nacos.interceptor.NacosConfigConstructorInterceptor"; - - @Override - protected ClassMatch enhanceClass() { - return NameMatch.byName(ENHANCE_CLASS); - } - - @Override - public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[]{ - new ConstructorInterceptPoint() { - - @Override - public ElementMatcher getConstructorMatcher() { - return any(); - } - - @Override - public String getConstructorInterceptor() { - return CONSTRUCTOR_INTERCEPT_CLASS; - } - } - }; - } - - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[0]; - } -} diff --git a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/interceptor/NacosCloudAdapterConfigInstanceMethodInterceptor.java b/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/interceptor/NacosCloudAdapterConfigInstanceMethodInterceptor.java deleted file mode 100644 index 9a227edf..00000000 --- a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/interceptor/NacosCloudAdapterConfigInstanceMethodInterceptor.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.nacos.interceptor; - -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import cn.hippo4j.agent.plugin.spring.common.support.SpringPropertiesLoader; -import cn.hippo4j.agent.plugin.spring.common.support.SpringThreadPoolRegisterSupport; -import cn.hippo4j.core.config.ApplicationContextHolder; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.env.ConfigurableEnvironment; - -import java.lang.reflect.Method; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * Nacos Cloud config constructor interceptor - */ -public class NacosCloudAdapterConfigInstanceMethodInterceptor implements InstanceMethodsAroundInterceptor { - - private static final AtomicBoolean isExecuted = new AtomicBoolean(false); - - @Override - public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - - } - - @Override - public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { - // This logic will only be executed once - if (isExecuted.compareAndSet(false, true)) { - // Get the configurable Application Context - ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) allArguments[0]; - ConfigurableEnvironment environment = configurableApplicationContext.getEnvironment(); - - // Remote Nacos configuration swiped into SpringPropertiesLoader - SpringPropertiesLoader.loadSpringProperties(environment); - // Refresh thread pool instances through configuration - SpringThreadPoolRegisterSupport.registerThreadPoolInstances(ApplicationContextHolder.getInstance()); - - } - return ret; - } - - @Override - public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { - - } -} diff --git a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/interceptor/NacosConfigConstructorInterceptor.java b/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/interceptor/NacosConfigConstructorInterceptor.java deleted file mode 100644 index e4379ce8..00000000 --- a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/interceptor/NacosConfigConstructorInterceptor.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.nacos.interceptor; - -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; -import cn.hippo4j.agent.plugin.nacos.NacosDynamicThreadPoolChangeHandler; -import cn.hippo4j.agent.plugin.nacos.listeners.NacosConfigPropertiesLoaderCompletedListener; -import cn.hippo4j.agent.plugin.spring.common.support.SpringPropertiesLoader; -import cn.hippo4j.common.extension.design.AbstractSubjectCenter; - -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * Nacos config constructor interceptor - */ -public class NacosConfigConstructorInterceptor implements InstanceConstructorInterceptor { - - private static final AtomicBoolean isExecuted = new AtomicBoolean(false); - - @Override - public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { - // This logic will only be executed once - if (isExecuted.compareAndSet(false, true)) { - - // Determine whether SpringPropertiesLoader is initialized - AtomicBoolean active = SpringPropertiesLoader.getActive(); - - // For Nacos-Cloud, the SpringPropertiesLoader environment initialization is triggered first, and then the logic to register listeners is triggered - // For Nacos-Boot, the listener is registered first, and the SpringPropertiesLoader environment is initialized - if (Boolean.TRUE.equals(active.get())) { - new NacosDynamicThreadPoolChangeHandler().registerListener(); - return; - } - - // The Nacos plugin triggers before the Spring configuration plug-in. - // This means that when the Nacos plugin executes, Spring's Environment is not yet ready, - // so the configuration cannot be read - // After listening to the AGENT_SPRING_PROPERTIES_LOADER_COMPLETED event, register the listener for Nacos - AbstractSubjectCenter.register(AbstractSubjectCenter.SubjectType.AGENT_SPRING_PROPERTIES_LOADER_COMPLETED, new NacosConfigPropertiesLoaderCompletedListener()); - } - } -} diff --git a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/listeners/NacosConfigPropertiesLoaderCompletedListener.java b/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/listeners/NacosConfigPropertiesLoaderCompletedListener.java deleted file mode 100644 index fa7a795b..00000000 --- a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/java/cn/hippo4j/agent/plugin/nacos/listeners/NacosConfigPropertiesLoaderCompletedListener.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.nacos.listeners; - -import cn.hippo4j.agent.plugin.nacos.NacosDynamicThreadPoolChangeHandler; -import cn.hippo4j.common.extension.design.Observer; -import cn.hippo4j.common.extension.design.ObserverMessage; -import cn.hippo4j.threadpool.dynamic.api.ThreadPoolDynamicRefresh; - -/** - * Nacos Config Properties Loader Completed Listener - */ -public class NacosConfigPropertiesLoaderCompletedListener implements Observer { - - @Override - public void accept(ObserverMessage observerMessage) { - ThreadPoolDynamicRefresh dynamicRefresh = new NacosDynamicThreadPoolChangeHandler(); - dynamicRefresh.registerListener(); - } -} diff --git a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/resources/META-INF/services/cn.hippo4j.agent.core.boot.BootService b/agent/hippo4j-agent-plugin/nacos-plugin/src/main/resources/META-INF/services/cn.hippo4j.agent.core.boot.BootService deleted file mode 100644 index 5337b3b0..00000000 --- a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/resources/META-INF/services/cn.hippo4j.agent.core.boot.BootService +++ /dev/null @@ -1,17 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -cn.hippo4j.agent.plugin.nacos.boot.NacosPluginBootService \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/resources/hippo4j-plugin.def b/agent/hippo4j-agent-plugin/nacos-plugin/src/main/resources/hippo4j-plugin.def deleted file mode 100644 index fb175826..00000000 --- a/agent/hippo4j-agent-plugin/nacos-plugin/src/main/resources/hippo4j-plugin.def +++ /dev/null @@ -1,18 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -nacos-plugin=cn.hippo4j.agent.plugin.nacos.define.NacosInstrumentation -nacos-cloud-adapter-plugin=cn.hippo4j.agent.plugin.nacos.define.NacosCloudAdapterInstrumentation \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/pom.xml b/agent/hippo4j-agent-plugin/pom.xml deleted file mode 100644 index b2bae3f4..00000000 --- a/agent/hippo4j-agent-plugin/pom.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-agent - ${revision} - - - hippo4j-agent-plugin - pom - - spring-plugins - threadpool-plugin - adapter-plugins - apollo-plugin - nacos-plugin - - - - UTF-8 - - net.bytebuddy - ${shade.package}.${shade.net.bytebuddy.source} - - ${project.build.directory}${sdk.plugin.related.dir}/../../../hippo4j-agent - - ${agent.package.dest.dir}/plugins - - 1.0b3 - 1.8.1 - - - - - cn.hippo4j - hippo4j-agent-core - ${project.version} - - - org.springframework - spring-core - - - provided - - - net.bytebuddy - byte-buddy - provided - - - - - - - maven-shade-plugin - - - package - - shade - - - false - true - true - true - - - ${shade.net.bytebuddy.source} - ${shade.net.bytebuddy.target} - - - - - - - - maven-antrun-plugin - - - package - - run - - - - - - - - - - - - - - - - - - - ant-contrib - ant-contrib - ${ant-contrib.version} - - - ant - ant - - - - - org.apache.ant - ant-nodeps - ${ant-nodeps.version} - - - - - - \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/spring-plugins/pom.xml b/agent/hippo4j-agent-plugin/spring-plugins/pom.xml deleted file mode 100644 index f9ff2a2a..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-agent-plugin - ${revision} - - - hippo4j-agent-spring-plugins - pom - - - spring-boot-1x-plugin - spring-boot-2x-plugin - spring-boot-3x-plugin - spring-plugin-common - - - - UTF-8 - /.. - - \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/pom.xml b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/pom.xml deleted file mode 100644 index 1a020f30..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-agent-spring-plugins - ${revision} - - - hippo4j-agent-spring-boot-1x-plugin - - - 1.5.22.RELEASE - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring.boot.version} - pom - import - - - - - - - org.springframework.boot - spring-boot-starter - ${spring.boot.version} - provided - - - - cn.hippo4j - hippo4j-agent-spring-plugin-common - ${project.version} - - - - cn.hippo4j - dubbo-plugin - - - - - \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v1/boot/SpringBootV1PluginBootService.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v1/boot/SpringBootV1PluginBootService.java deleted file mode 100644 index 2ab4a1c3..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v1/boot/SpringBootV1PluginBootService.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.boot.v1.boot; - -import cn.hippo4j.agent.core.boot.BootService; -import cn.hippo4j.agent.core.boot.DefaultImplementor; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; - -/** - * SpringBoot v1 plugin boot service - */ -@DefaultImplementor -public class SpringBootV1PluginBootService implements BootService { - - private static final ILog LOGGER = LogManager.getLogger(SpringBootV1PluginBootService.class); - - @Override - public void prepare() throws Throwable { - - } - - @Override - public void boot() throws Throwable { - LOGGER.info("Loader SpringBootV1PluginBootService..."); - } - - @Override - public void onComplete() throws Throwable { - - } - - @Override - public void shutdown() throws Throwable { - - } -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v1/define/EventPublishingRunListenerInstrumentationV1.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v1/define/EventPublishingRunListenerInstrumentationV1.java deleted file mode 100644 index a87dd732..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v1/define/EventPublishingRunListenerInstrumentationV1.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.boot.v1.define; - -import cn.hippo4j.agent.core.plugin.WitnessMethod; -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import cn.hippo4j.agent.core.plugin.match.ClassMatch; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -import java.util.Collections; -import java.util.List; - -import static cn.hippo4j.agent.core.plugin.match.NameMatch.byName; -import static net.bytebuddy.matcher.ElementMatchers.named; - -/** - * SpringBoot v1 EventPublishingRunListener Finished instrumentation - */ -public class EventPublishingRunListenerInstrumentationV1 extends ClassInstanceMethodsEnhancePluginDefine { - - private static final String ENHANCE_CLASS = "org.springframework.boot.context.event.EventPublishingRunListener"; - - private static final String EVENT_PUBLISHING_FINISHED_INTERCEPTOR_V1 = "cn.hippo4j.agent.plugin.spring.boot.v1.interceptor.EventPublishingRunListenerFinishedInterceptorV1"; - - @Override - protected ClassMatch enhanceClass() { - return byName(ENHANCE_CLASS); - } - - @Override - public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[0]; - } - - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[]{new InstanceMethodsInterceptPoint() { - - @Override - public ElementMatcher getMethodsMatcher() { - return named("finished"); - } - - @Override - public String getMethodsInterceptor() { - return EVENT_PUBLISHING_FINISHED_INTERCEPTOR_V1; - } - - @Override - public boolean isOverrideArgs() { - return false; - } - }}; - } - - @Override - protected List witnessMethods() { - return Collections.singletonList(new WitnessMethod("org.springframework.boot.context.event.EventPublishingRunListener", named("finished"))); - } -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v1/interceptor/EventPublishingRunListenerFinishedInterceptorV1.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v1/interceptor/EventPublishingRunListenerFinishedInterceptorV1.java deleted file mode 100644 index 9d268d34..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v1/interceptor/EventPublishingRunListenerFinishedInterceptorV1.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.boot.v1.interceptor; - -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import cn.hippo4j.agent.plugin.spring.common.event.DynamicThreadPoolRefreshListener; -import cn.hippo4j.agent.plugin.spring.common.support.SpringPropertiesLoader; -import cn.hippo4j.agent.plugin.spring.common.support.SpringThreadPoolRegisterSupport; -import cn.hippo4j.common.extension.design.AbstractSubjectCenter; -import cn.hippo4j.core.config.ApplicationContextHolder; -import org.springframework.context.ApplicationListener; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.context.event.ContextRefreshedEvent; - -import java.lang.reflect.Method; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * EventPublishingRunListener Finished interceptor - */ -public class EventPublishingRunListenerFinishedInterceptorV1 implements InstanceMethodsAroundInterceptor { - - private static final AtomicBoolean isExecuted = new AtomicBoolean(false); - - @Override - public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - - } - - @Override - public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { - // Since the finished() method is a method of the EventPublishingRunListener class, - // the EventPublishingRunListener the first parameter is ConfigurableApplicationContext - ConfigurableApplicationContext context = (ConfigurableApplicationContext) allArguments[0]; - if (context.getParent() != null) { - // After the child container is started, the thread pool registration will be carried out - // IDEA's runtime environment or debugging mechanisms make context refresh speeds different. - // Ensure that thread pool registration logic is executed only after the context is fully started - if (context.isActive()) { - SpringThreadPoolRegisterSupport.registerThreadPoolInstances(context); - return ret; - } - // However, the packaged JAR runtime may refresh the context faster - // resulting in the context not being refreshed yet when registerThreadPoolInstances is called - // Register listener to handle the registration after the context has been fully refreshed - context.addApplicationListener((ApplicationListener) event -> { - SpringThreadPoolRegisterSupport.registerThreadPoolInstances(event.getApplicationContext()); - }); - return ret; - } - // This logic will only be executed once - if (isExecuted.compareAndSet(false, true)) { - ApplicationContextHolder contextHolder = new ApplicationContextHolder(); - contextHolder.setApplicationContext(context); - // Load Spring Properties - SpringPropertiesLoader.loadSpringProperties(context.getEnvironment()); - // register Dynamic ThreadPool Refresh Listener - if (AbstractSubjectCenter.get(AbstractSubjectCenter.SubjectType.THREAD_POOL_DYNAMIC_REFRESH) == null) { - AbstractSubjectCenter.register(AbstractSubjectCenter.SubjectType.THREAD_POOL_DYNAMIC_REFRESH, new DynamicThreadPoolRefreshListener()); - } - } - return ret; - } - - @Override - public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { - - } -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/src/main/resources/META-INF/services/cn.hippo4j.agent.core.boot.BootService b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/src/main/resources/META-INF/services/cn.hippo4j.agent.core.boot.BootService deleted file mode 100644 index 589da575..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/src/main/resources/META-INF/services/cn.hippo4j.agent.core.boot.BootService +++ /dev/null @@ -1,17 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -cn.hippo4j.agent.plugin.spring.boot.v1.boot.SpringBootV1PluginBootService \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/src/main/resources/hippo4j-plugin.def b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/src/main/resources/hippo4j-plugin.def deleted file mode 100644 index eb4a0376..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-1x-plugin/src/main/resources/hippo4j-plugin.def +++ /dev/null @@ -1,17 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -spring-boot-1.x=cn.hippo4j.agent.plugin.spring.boot.v1.define.EventPublishingRunListenerInstrumentationV1 diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/pom.xml b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/pom.xml deleted file mode 100644 index 6fac2cc4..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/pom.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-agent-spring-plugins - ${revision} - - - hippo4j-agent-spring-boot-2x-plugin - jar - - - 2.3.2.RELEASE - - - - - org.springframework.boot - spring-boot-starter - ${spring.boot.version} - provided - - - - cn.hippo4j - hippo4j-agent-spring-plugin-common - ${project.version} - - - - cn.hippo4j - hippo4j-threadpool-dynamic-mode-config - ${project.version} - - - - \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v2/boot/SpringBootV2PluginBootService.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v2/boot/SpringBootV2PluginBootService.java deleted file mode 100644 index 8a97116b..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v2/boot/SpringBootV2PluginBootService.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.boot.v2.boot; - -import cn.hippo4j.agent.core.boot.BootService; -import cn.hippo4j.agent.core.boot.DefaultImplementor; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; - -/** - * SpringBoot v2 plugin boot service - */ -@DefaultImplementor -public class SpringBootV2PluginBootService implements BootService { - - private static final ILog LOGGER = LogManager.getLogger(SpringBootV2PluginBootService.class); - - @Override - public void prepare() throws Throwable { - - } - - @Override - public void boot() throws Throwable { - LOGGER.info("Loader SpringBootV2PluginBootService..."); - } - - @Override - public void onComplete() throws Throwable { - - } - - @Override - public void shutdown() throws Throwable { - - } -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v2/define/EventPublishingRunListenerInstrumentationV2.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v2/define/EventPublishingRunListenerInstrumentationV2.java deleted file mode 100644 index f305b2d2..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v2/define/EventPublishingRunListenerInstrumentationV2.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.boot.v2.define; - -import cn.hippo4j.agent.core.plugin.WitnessMethod; -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import cn.hippo4j.agent.core.plugin.match.ClassMatch; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -import java.util.Arrays; -import java.util.List; - -import static net.bytebuddy.matcher.ElementMatchers.named; -import static cn.hippo4j.agent.core.plugin.match.NameMatch.byName; -import static net.bytebuddy.matcher.ElementMatchers.not; - -/** - * SpringBoot v2 Event publishing run listener instrumentation - */ -public class EventPublishingRunListenerInstrumentationV2 extends ClassInstanceMethodsEnhancePluginDefine { - - private static final String ENHANCE_CLASS = "org.springframework.boot.context.event.EventPublishingRunListener"; - - private static final String EVENT_PUBLISHING_STARTED_INTERCEPTOR_V2 = "cn.hippo4j.agent.plugin.spring.boot.v2.interceptor.EventPublishingStartedInterceptorV2"; - private static final String EVENT_PUBLISHING_ENVIRONMENT_PREPARED_INTERCEPTOR = "cn.hippo4j.agent.plugin.spring.common.interceptor.EventPublishingRunListenerEnvironmentPreparedInterceptor"; - - @Override - protected ClassMatch enhanceClass() { - return byName(ENHANCE_CLASS); - } - - @Override - public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[0]; - } - - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[]{ - new InstanceMethodsInterceptPoint() { - - @Override - public ElementMatcher getMethodsMatcher() { - return named("started"); - } - - @Override - public String getMethodsInterceptor() { - return EVENT_PUBLISHING_STARTED_INTERCEPTOR_V2; - } - - @Override - public boolean isOverrideArgs() { - return false; - } - }, - new InstanceMethodsInterceptPoint() { - - @Override - public ElementMatcher getMethodsMatcher() { - return named("environmentPrepared"); - } - - @Override - public String getMethodsInterceptor() { - return EVENT_PUBLISHING_ENVIRONMENT_PREPARED_INTERCEPTOR; - } - - @Override - public boolean isOverrideArgs() { - return false; - } - } - }; - } - - @Override - protected List witnessMethods() { - return Arrays.asList( - new WitnessMethod("org.springframework.boot.context.event.EventPublishingRunListener", named("started")), - new WitnessMethod("org.springframework.boot.context.event.EventPublishingRunListener", named("running")), - new WitnessMethod("org.springframework.boot.context.event.EventPublishingRunListener", not(named("ready"))) - // new WitnessMethod("org.springframework.boot.context.properties.ConstructorBinding", not(isAnnotatedWith(Deprecated.class))) - ); - } - - @Override - protected String[] witnessClasses() { - return new String[]{"org.springframework.boot.context.properties.ConstructorBinding"}; - } - -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v2/interceptor/EventPublishingStartedInterceptorV2.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v2/interceptor/EventPublishingStartedInterceptorV2.java deleted file mode 100644 index cf8cab9d..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v2/interceptor/EventPublishingStartedInterceptorV2.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.boot.v2.interceptor; - -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import cn.hippo4j.agent.plugin.spring.common.event.DynamicThreadPoolRefreshListener; -import cn.hippo4j.agent.plugin.spring.common.support.SpringPropertiesLoader; -import cn.hippo4j.agent.plugin.spring.common.support.SpringThreadPoolRegisterSupport; -import cn.hippo4j.common.extension.design.AbstractSubjectCenter; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.core.config.ApplicationContextHolder; -import org.springframework.context.ConfigurableApplicationContext; - -import java.lang.reflect.Method; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * Event publishing started interceptor - */ -public class EventPublishingStartedInterceptorV2 implements InstanceMethodsAroundInterceptor { - - private static final AtomicBoolean isExecuted = new AtomicBoolean(false); - - private static final ILog LOGGER = LogManager.getLogger(EventPublishingStartedInterceptorV2.class); - - @Override - public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - - } - - @Override - public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { - ConfigurableApplicationContext context = (ConfigurableApplicationContext) allArguments[0]; - if (context.getParent() != null) { - // After the child container is started, the thread pool registration will be carried out - SpringThreadPoolRegisterSupport.registerThreadPoolInstances(context); - return ret; - } - // This logic will only be executed once - if (isExecuted.compareAndSet(false, true)) { - ApplicationContextHolder contextHolder = new ApplicationContextHolder(); - contextHolder.setApplicationContext(context); - // Load Spring Properties - SpringPropertiesLoader.loadSpringProperties(context.getEnvironment()); - // register Dynamic ThreadPool Refresh Listener - if (AbstractSubjectCenter.get(AbstractSubjectCenter.SubjectType.THREAD_POOL_DYNAMIC_REFRESH) == null) { - AbstractSubjectCenter.register(AbstractSubjectCenter.SubjectType.THREAD_POOL_DYNAMIC_REFRESH, new DynamicThreadPoolRefreshListener()); - } - } - - return ret; - } - - @Override - public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { - - } -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/src/main/resources/META-INF/services/cn.hippo4j.agent.core.boot.BootService b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/src/main/resources/META-INF/services/cn.hippo4j.agent.core.boot.BootService deleted file mode 100644 index 687ec9f8..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/src/main/resources/META-INF/services/cn.hippo4j.agent.core.boot.BootService +++ /dev/null @@ -1,17 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -cn.hippo4j.agent.plugin.spring.boot.v2.boot.SpringBootV2PluginBootService \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/src/main/resources/hippo4j-plugin.def b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/src/main/resources/hippo4j-plugin.def deleted file mode 100644 index 029e7955..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-2x-plugin/src/main/resources/hippo4j-plugin.def +++ /dev/null @@ -1,17 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -spring-boot-2.x=cn.hippo4j.agent.plugin.spring.boot.v2.define.EventPublishingRunListenerInstrumentationV2 \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/pom.xml b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/pom.xml deleted file mode 100644 index c3a32e47..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-agent-spring-plugins - ${revision} - - - hippo4j-agent-spring-boot-3x-plugin - - - 3.0.2 - - - - - - org.springframework.boot - spring-boot-starter - ${spring-boot.version} - provided - - - - cn.hippo4j - hippo4j-agent-spring-plugin-common - ${project.version} - - - - - \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v3/boot/SpringBootV3PluginBootService.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v3/boot/SpringBootV3PluginBootService.java deleted file mode 100644 index 29cb0c2a..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v3/boot/SpringBootV3PluginBootService.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.boot.v3.boot; - -import cn.hippo4j.agent.core.boot.BootService; -import cn.hippo4j.agent.core.boot.DefaultImplementor; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; - -/** - * SpringBoot v3 plugin boot service - */ -@DefaultImplementor -public class SpringBootV3PluginBootService implements BootService { - - private static final ILog LOGGER = LogManager.getLogger(SpringBootV3PluginBootService.class); - - @Override - public void prepare() throws Throwable { - - } - - @Override - public void boot() throws Throwable { - LOGGER.info("Loader SpringBootV3PluginBootService..."); - } - - @Override - public void onComplete() throws Throwable { - - } - - @Override - public void shutdown() throws Throwable { - - } -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v3/define/EventPublishingRunListenerInstrumentationV3.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v3/define/EventPublishingRunListenerInstrumentationV3.java deleted file mode 100644 index f5ee63cc..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v3/define/EventPublishingRunListenerInstrumentationV3.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.boot.v3.define; - -import cn.hippo4j.agent.core.plugin.WitnessMethod; -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import cn.hippo4j.agent.core.plugin.match.ClassMatch; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -import java.util.Collections; -import java.util.List; - -import static cn.hippo4j.agent.core.plugin.match.NameMatch.byName; -import static net.bytebuddy.matcher.ElementMatchers.named; - -/** - * SpringBoot v3 Event publishing run listener instrumentation - */ -public class EventPublishingRunListenerInstrumentationV3 extends ClassInstanceMethodsEnhancePluginDefine { - - private static final String ENHANCE_CLASS = "org.springframework.boot.context.event.EventPublishingRunListener"; - - private static final String EVENT_PUBLISHING_STARTED_INTERCEPTOR_V3 = "cn.hippo4j.agent.plugin.spring.boot.v3.interceptor.EventPublishingStartedInterceptorV3"; - - @Override - protected ClassMatch enhanceClass() { - return byName(ENHANCE_CLASS); - } - - @Override - public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[0]; - } - - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[]{ - new InstanceMethodsInterceptPoint() { - - @Override - public ElementMatcher getMethodsMatcher() { - return named("ready"); - } - - @Override - public String getMethodsInterceptor() { - return EVENT_PUBLISHING_STARTED_INTERCEPTOR_V3; - } - - @Override - public boolean isOverrideArgs() { - return false; - } - } - }; - } - - @Override - protected List witnessMethods() { - return Collections.singletonList(new WitnessMethod("org.springframework.boot.context.event.EventPublishingRunListener", - named("ready"))); - } - - @Override - protected String[] witnessClasses() { - return new String[]{"org.springframework.boot.context.properties.bind.ConstructorBinding"}; - } - -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v3/interceptor/EventPublishingStartedInterceptorV3.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v3/interceptor/EventPublishingStartedInterceptorV3.java deleted file mode 100644 index c4c02a0d..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/src/main/java/cn/hippo4j/agent/plugin/spring/boot/v3/interceptor/EventPublishingStartedInterceptorV3.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.boot.v3.interceptor; - -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import cn.hippo4j.agent.plugin.spring.common.event.DynamicThreadPoolRefreshListener; -import cn.hippo4j.agent.plugin.spring.common.support.SpringPropertiesLoader; -import cn.hippo4j.agent.plugin.spring.common.support.SpringThreadPoolRegisterSupport; -import cn.hippo4j.common.extension.design.AbstractSubjectCenter; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.core.config.ApplicationContextHolder; -import org.springframework.context.ConfigurableApplicationContext; - -import java.lang.reflect.Method; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * Event publishing started interceptor - */ -public class EventPublishingStartedInterceptorV3 implements InstanceMethodsAroundInterceptor { - - private static final AtomicBoolean isExecuted = new AtomicBoolean(false); - - private static final ILog LOGGER = LogManager.getLogger(EventPublishingStartedInterceptorV3.class); - - @Override - public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - - } - - @Override - public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { - ConfigurableApplicationContext context = (ConfigurableApplicationContext) allArguments[0]; - // This logic will only be executed once - if (isExecuted.compareAndSet(false, true)) { - ApplicationContextHolder contextHolder = new ApplicationContextHolder(); - contextHolder.setApplicationContext(context); - // Load Spring Properties - SpringPropertiesLoader.loadSpringProperties(context.getEnvironment()); - // the thread pool registration will be carried out - SpringThreadPoolRegisterSupport.registerThreadPoolInstances(context); - // register Dynamic ThreadPool Refresh Listener - if (AbstractSubjectCenter.get(AbstractSubjectCenter.SubjectType.THREAD_POOL_DYNAMIC_REFRESH) == null) { - AbstractSubjectCenter.register(AbstractSubjectCenter.SubjectType.THREAD_POOL_DYNAMIC_REFRESH, new DynamicThreadPoolRefreshListener()); - } - } - - return ret; - } - - @Override - public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { - - } -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/src/main/resources/META-INF/services/cn.hippo4j.agent.core.boot.BootService b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/src/main/resources/META-INF/services/cn.hippo4j.agent.core.boot.BootService deleted file mode 100644 index 5685fd16..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/src/main/resources/META-INF/services/cn.hippo4j.agent.core.boot.BootService +++ /dev/null @@ -1,17 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -cn.hippo4j.agent.plugin.spring.boot.v3.boot.SpringBootV3PluginBootService \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/src/main/resources/hippo4j-plugin.def b/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/src/main/resources/hippo4j-plugin.def deleted file mode 100644 index 7d27b358..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-boot-3x-plugin/src/main/resources/hippo4j-plugin.def +++ /dev/null @@ -1,17 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -spring-boot-3.x=cn.hippo4j.agent.plugin.spring.boot.v3.define.EventPublishingRunListenerInstrumentationV3 diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/pom.xml b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/pom.xml deleted file mode 100644 index 5552d5e1..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/pom.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-agent-spring-plugins - ${revision} - - - hippo4j-agent-spring-plugin-common - - - - org.springframework - spring-core - provided - - - org.springframework - spring-context - provided - - - org.projectlombok - lombok - provided - - - org.slf4j - slf4j-api - - - cn.hippo4j - hippo4j-threadpool-dynamic-api - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-dynamic-core - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-kernel-alarm - ${project.version} - - - org.springframework - spring-core - - - - - cn.hippo4j - hippo4j-threadpool-core - ${project.version} - - - org.springframework.boot - spring-boot-starter - - - - - cn.hippo4j - hippo4j-threadpool-dynamic-mode-config - ${project.version} - - - org.springframework - spring-core - - - - - cn.hippo4j - hippo4j-threadpool-adapter-web - ${project.version} - - - org.springframework.boot - spring-boot-starter - - - - - cn.hippo4j - hippo4j-threadpool-infra-common - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-monitor-elasticsearch - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-monitor-local-log - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-monitor-micrometer - ${project.version} - - - io.micrometer - micrometer-registry-prometheus - - - \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/alarm/AgentModeNotifyConfigBuilder.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/alarm/AgentModeNotifyConfigBuilder.java deleted file mode 100644 index 8a77f7d0..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/alarm/AgentModeNotifyConfigBuilder.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.common.alarm; - -import cn.hippo4j.adapter.web.WebThreadPoolService; -import cn.hippo4j.agent.plugin.spring.common.support.ThreadPoolCheckAlarmSupport; -import cn.hippo4j.common.api.IExecutorProperties; -import cn.hippo4j.common.model.executor.ExecutorNotifyProperties; -import cn.hippo4j.common.model.executor.ExecutorProperties; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.NotifyPlatformProperties; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.WebExecutorProperties; -import cn.hippo4j.threadpool.message.api.NotifyConfigBuilder; -import cn.hippo4j.threadpool.message.api.NotifyConfigDTO; -import cn.hippo4j.threadpool.message.core.service.AlarmControlHandler; -import lombok.AllArgsConstructor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - -import static cn.hippo4j.agent.plugin.spring.common.support.SpringPropertiesLoader.BOOTSTRAP_CONFIG_PROPERTIES; -import static cn.hippo4j.common.constant.Constants.DEFAULT_INTERVAL; - -/** - * This class is responsible for building the notification configurations for thread pools in an agent mode. - * It implements the {@link NotifyConfigBuilder} interface and provides methods to build and initialize - * notification configurations for various platforms and types (e.g., ALARM, CONFIG). - * - *

The configuration is based on the properties loaded from the bootstrap configuration and includes - * handling for alarm control and notification intervals.

- * - * TODO: This is copied from {@link cn.hippo4j.config.springboot.starter.notify.ConfigModeNotifyConfigBuilder} and can be refactored later - */ -@AllArgsConstructor -public class AgentModeNotifyConfigBuilder implements NotifyConfigBuilder { - - private static final Logger LOGGER = LoggerFactory.getLogger(ThreadPoolCheckAlarmSupport.class); - - private final AlarmControlHandler alarmControlHandler; - - private final WebThreadPoolService webThreadPoolService; - - /** - * Builds the notification configurations for all executors defined in the bootstrap configuration. - * - *

This method filters the executors based on their alarm settings and constructs the notification - * configurations accordingly. If global alarm settings are disabled and there are no specific alarms - * configured for any executor, the method returns an empty map.

- * - * @return A map containing the notification configurations, keyed by the notification type (e.g., ALARM, CONFIG). - */ - public Map> buildNotify() { - Map> resultMap = new HashMap<>(); - boolean globalAlarm = Optional.ofNullable(BOOTSTRAP_CONFIG_PROPERTIES.getDefaultExecutor()) - .map(ExecutorProperties::getAlarm) - .orElse(true); - List executors = BOOTSTRAP_CONFIG_PROPERTIES.getExecutors(); - if (CollectionUtil.isEmpty(executors)) { - LOGGER.warn("Failed to build notify, executors configuration is empty."); - return resultMap; - } - List actual = executors.stream() - .filter(each -> Optional.ofNullable(each.getAlarm()) - .orElse(false)) - .collect(Collectors.toList()); - if (!globalAlarm && CollectionUtil.isEmpty(actual)) { - return resultMap; - } - for (ExecutorProperties executorProperties : executors) { - Map> buildSingleNotifyConfig = buildSingleNotifyConfig(executorProperties); - initCacheAndLock(buildSingleNotifyConfig); - resultMap.putAll(buildSingleNotifyConfig); - } - // register notify config for web - WebExecutorProperties webProperties = BOOTSTRAP_CONFIG_PROPERTIES.getWeb(); - if (webProperties == null) { - return resultMap; - } - if (StringUtil.isBlank(webProperties.getThreadPoolId())) { - webProperties.setThreadPoolId(webThreadPoolService.getWebContainerType().getName()); - } - Map> webSingleNotifyConfigMap = buildSingleNotifyConfig(webProperties); - initCacheAndLock(webSingleNotifyConfigMap); - resultMap.putAll(webSingleNotifyConfigMap); - - return resultMap; - } - - /** - * Builds the notification configurations for a single executor. - * - *

This method generates two types of notifications: ALARM and CONFIG. For each type, it creates - * notification configurations based on the platforms defined in the bootstrap configuration.

- * - * @param executorProperties The properties of the executor for which to build the notification configurations. - * @return A map containing the notification configurations for the given executor, keyed by the notification type. - */ - public Map> buildSingleNotifyConfig(IExecutorProperties executorProperties) { - String threadPoolId = executorProperties.getThreadPoolId(); - Map> resultMap = new HashMap<>(); - String alarmBuildKey = threadPoolId + "+ALARM"; - List alarmNotifyConfigs = new ArrayList<>(); - List notifyPlatforms = BOOTSTRAP_CONFIG_PROPERTIES.getNotifyPlatforms(); - for (NotifyPlatformProperties platformProperties : notifyPlatforms) { - NotifyConfigDTO notifyConfig = new NotifyConfigDTO(); - notifyConfig.setPlatform(platformProperties.getPlatform()); - notifyConfig.setTpId(threadPoolId); - notifyConfig.setType("ALARM"); - notifyConfig.setSecret(platformProperties.getSecret()); - notifyConfig.setSecretKey(getToken(platformProperties)); - notifyConfig.setInterval(buildInterval(executorProperties)); - notifyConfig.setReceives(buildReceive(executorProperties)); - alarmNotifyConfigs.add(notifyConfig); - } - resultMap.put(alarmBuildKey, alarmNotifyConfigs); - String changeBuildKey = threadPoolId + "+CONFIG"; - List changeNotifyConfigs = new ArrayList<>(); - for (NotifyPlatformProperties platformProperties : notifyPlatforms) { - NotifyConfigDTO notifyConfig = new NotifyConfigDTO(); - notifyConfig.setPlatform(platformProperties.getPlatform()); - notifyConfig.setTpId(threadPoolId); - notifyConfig.setType("CONFIG"); - notifyConfig.setSecretKey(getToken(platformProperties)); - notifyConfig.setSecret(platformProperties.getSecret()); - notifyConfig.setReceives(buildReceive(executorProperties)); - changeNotifyConfigs.add(notifyConfig); - } - resultMap.put(changeBuildKey, changeNotifyConfigs); - return resultMap; - } - - /** - * Retrieves the token for the given notification platform properties. - * - *

If the token is not explicitly set, the method returns the secret key as the fallback.

- * - * @param platformProperties The platform properties from which to retrieve the token. - * @return The token or secret key associated with the given platform properties. - */ - private String getToken(NotifyPlatformProperties platformProperties) { - return StringUtil.isNotBlank(platformProperties.getToken()) ? platformProperties.getToken() : platformProperties.getSecretKey(); - } - - /** - * Builds the notification interval for the given executor properties. - * - *

This method first checks the executor's specific notify configuration. If not set, it falls back - * to the default executor configuration in the bootstrap properties.

- * - * @param executorProperties The properties of the executor for which to build the notification interval. - * @return The notification interval in seconds. - */ - private int buildInterval(IExecutorProperties executorProperties) { - return Optional.ofNullable(executorProperties.getNotify()) - .map(ExecutorNotifyProperties::getInterval) - .orElse(Optional.ofNullable(BOOTSTRAP_CONFIG_PROPERTIES.getDefaultExecutor()) - .map(ExecutorProperties::getNotify) - .map(ExecutorNotifyProperties::getInterval) - .orElse(DEFAULT_INTERVAL)); - } - - /** - * Builds the notification recipients for the given executor properties. - * - *

This method first checks the executor's specific notify configuration. If not set, it falls back - * to the default executor configuration in the bootstrap properties.

- * - * @param executorProperties The properties of the executor for which to build the notification recipients. - * @return A string containing the recipients of the notifications. - */ - private String buildReceive(IExecutorProperties executorProperties) { - return Optional.ofNullable(executorProperties.getNotify()) - .map(ExecutorNotifyProperties::getReceives) - .orElse(Optional.ofNullable(BOOTSTRAP_CONFIG_PROPERTIES.getDefaultExecutor()) - .map(ExecutorProperties::getNotify) - .map(ExecutorNotifyProperties::getReceives).orElse("")); - } - - /** - * Initializes the cache and lock mechanisms for the given notification configurations. - * - *

This method is primarily responsible for setting up alarm controls based on the notification - * configurations, ensuring that the appropriate cache and lock mechanisms are initialized for - * each thread pool and platform combination.

- * - * @param buildSingleNotifyConfig A map containing the notification configurations that need cache and lock initialization. - */ - public void initCacheAndLock(Map> buildSingleNotifyConfig) { - buildSingleNotifyConfig.forEach( - (key, val) -> val.stream() - .filter(each -> Objects.equals("ALARM", each.getType())) - .forEach(each -> alarmControlHandler.initCacheAndLock(each.getTpId(), each.getPlatform(), each.getInterval()))); - } -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/conf/NacosCloudConfig.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/conf/NacosCloudConfig.java deleted file mode 100644 index 62019812..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/conf/NacosCloudConfig.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.common.conf; - -import cn.hippo4j.agent.core.boot.SpringBootConfigNode; - -/** - * Nacos Cloud config - */ -public class NacosCloudConfig { - - public static class Spring { - - /** - * Cloud - */ - public static class Cloud { - - /** - * Nacos - */ - public static class Nacos { - - /** - * Config - */ - @SpringBootConfigNode(root = NacosConfig.class) - public static class Config { - - public static String SERVER_ADDR = ""; - - } - } - } - } -} \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/conf/NacosConfig.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/conf/NacosConfig.java deleted file mode 100644 index 07227530..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/conf/NacosConfig.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.common.conf; - -import cn.hippo4j.agent.core.boot.SpringBootConfigNode; - -/** - * nacos config - */ -public class NacosConfig { - - /** - * Nacos - */ - public static class Nacos { - - /** - * Config - */ - @SpringBootConfigNode(root = NacosCloudConfig.class) - public static class Config { - - public static String SERVER_ADDR = ""; - - } - } -} \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/conf/SpringBootConfig.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/conf/SpringBootConfig.java deleted file mode 100644 index 48e05894..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/conf/SpringBootConfig.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.common.conf; - -import cn.hippo4j.agent.core.boot.SpringBootConfigNode; - -import java.util.Arrays; -import java.util.List; - -/** - * Spring boot config - */ -public class SpringBootConfig { - - /** - * Spring - */ - @SpringBootConfigNode(root = SpringBootConfig.class) - public static class Spring { - - /** - * Dynamic - */ - @SpringBootConfigNode(root = SpringBootConfig.class) - public static class Dynamic { - - /** - * ThreadPool - */ - @SpringBootConfigNode(root = SpringBootConfig.class) - public static class Thread_Pool { - - /** - * Apollo - */ - @SpringBootConfigNode(root = SpringBootConfig.class) - public static class Apollo { - - public static List NAMESPACE = Arrays.asList("application"); - } - - @SpringBootConfigNode(root = SpringBootConfig.class) - public static class Nacos { - - public static String SERVER_ADDR = "localhost"; - - public static List NAMESPACE = Arrays.asList(""); - - public static String DATA_ID = ""; - - public static String GROUP = "DEFAULT_GROUP"; - } - - /** - * Monitor - */ - @SpringBootConfigNode(root = SpringBootConfig.class) - public static class Monitor { - - public static Boolean enable = Boolean.TRUE; - - public static String collectTypes = "micrometer"; - - public static String threadPoolTypes = "dynamic"; - - public static Long initialDelay = 10000L; - - public static Long collectInterval = 5000L; - - public static Integer AGENT_MICROMETER_PORT; - - } - - public static String CONFIG_FILE_TYPE; - } - } - - @SpringBootConfigNode(root = SpringBootConfig.class) - public static class Application { - - public static String name = ""; - - } - - @SpringBootConfigNode(root = SpringBootConfig.class) - public static class Profiles { - - public static String active = ""; - - } - } -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/define/SpringApplicationInstrumentation.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/define/SpringApplicationInstrumentation.java deleted file mode 100644 index bcd7f5c3..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/define/SpringApplicationInstrumentation.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.common.define; - -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import cn.hippo4j.agent.core.plugin.match.ClassMatch; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -import static cn.hippo4j.agent.core.plugin.match.NameMatch.byName; -import static net.bytebuddy.matcher.ElementMatchers.named; - -public class SpringApplicationInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - - private static final String ENHANCE_CLASS = "org.springframework.boot.SpringApplication"; - - private static final String RUN_INTERCEPTOR = "cn.hippo4j.agent.plugin.spring.common.interceptor.SpringApplicationRunInterceptor"; - - @Override - protected ClassMatch enhanceClass() { - return byName(ENHANCE_CLASS); - } - - @Override - public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[0]; - } - - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[]{ - new InstanceMethodsInterceptPoint() { - - @Override - public ElementMatcher getMethodsMatcher() { - return named("run"); - } - - @Override - public String getMethodsInterceptor() { - return RUN_INTERCEPTOR; - } - - @Override - public boolean isOverrideArgs() { - return false; - } - } - }; - } - - @Override - protected String[] witnessClasses() { - return new String[]{"org.springframework.boot.SpringApplication"}; - } -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/event/DynamicThreadPoolRefreshListener.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/event/DynamicThreadPoolRefreshListener.java deleted file mode 100644 index 836ab712..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/event/DynamicThreadPoolRefreshListener.java +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.common.event; - -import cn.hippo4j.agent.core.util.CollectionUtil; -import cn.hippo4j.agent.plugin.spring.common.alarm.AgentModeNotifyConfigBuilder; -import cn.hippo4j.agent.plugin.spring.common.support.ThreadPoolCheckAlarmSupport; -import cn.hippo4j.common.executor.ThreadPoolExecutorHolder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum; -import cn.hippo4j.common.executor.support.RejectedPolicyTypeEnum; -import cn.hippo4j.common.executor.support.ResizableCapacityLinkedBlockingQueue; -import cn.hippo4j.common.extension.design.Observer; -import cn.hippo4j.common.extension.design.ObserverMessage; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.common.model.executor.ExecutorProperties; -import cn.hippo4j.common.toolkit.ThreadPoolExecutorUtil; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.message.api.NotifyConfigDTO; -import cn.hippo4j.threadpool.message.core.request.ChangeParameterNotifyRequest; -import cn.hippo4j.threadpool.message.core.service.GlobalNotifyAlarmManage; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolBaseSendMessageService; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolNotifyAlarm; -import lombok.RequiredArgsConstructor; - -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_DELIMITER; -import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_THREAD_POOL_TEXT; - -/** - * Dynamic thread-pool refresh listener. - */ -@RequiredArgsConstructor -public class DynamicThreadPoolRefreshListener implements Observer { - - private static final ILog LOG = LogManager.getLogger(DynamicThreadPoolRefreshListener.class); - - @Override - public void accept(ObserverMessage observerMessage) { - BootstrapConfigProperties bindableConfigProperties = observerMessage.message(); - List executors = bindableConfigProperties.getExecutors(); - for (ExecutorProperties properties : executors) { - String threadPoolId = properties.getThreadPoolId(); - // Check whether the thread pool configuration is empty and whether the parameters have changed - ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(threadPoolId); - /* - * Check whether the notification configuration is consistent, this operation will not trigger the notification. - */ - checkNotifyConsistencyAndReplace(properties); - if (executorHolder.isEmpty() || !checkPropertiesConsistency(executorHolder, properties)) { - continue; - } - dynamicRefreshThreadPool(executorHolder, properties); - sendChangeNotificationMessage(executorHolder, properties); - executorHolder.setExecutorProperties(properties); - } - } - - /** - * Check notify consistency and replace. - * - * @param executorProperties - */ - private void checkNotifyConsistencyAndReplace(ExecutorProperties executorProperties) { - boolean checkNotifyConfig = false; - boolean checkNotifyAlarm = false; - ThreadPoolBaseSendMessageService threadPoolBaseSendMessageService = ThreadPoolCheckAlarmSupport.getThreadPoolBaseSendMessageService(); - AgentModeNotifyConfigBuilder agentNotifyConfigBuilder = ThreadPoolCheckAlarmSupport.getAgentNotifyConfigBuilder(); - // Build a new notification configuration for the Agent - Map> newDynamicThreadPoolNotifyMap = agentNotifyConfigBuilder.buildSingleNotifyConfig(executorProperties); - Map> notifyConfigs = threadPoolBaseSendMessageService.getNotifyConfigs(); - if (CollectionUtil.isNotEmpty(notifyConfigs)) { - for (Map.Entry> each : newDynamicThreadPoolNotifyMap.entrySet()) { - if (checkNotifyConfig) { - break; - } - List notifyConfigDTOS = notifyConfigs.get(each.getKey()); - for (NotifyConfigDTO notifyConfig : each.getValue()) { - if (!notifyConfigDTOS.contains(notifyConfig)) { - checkNotifyConfig = true; - break; - } - } - } - } - if (checkNotifyConfig) { - agentNotifyConfigBuilder.initCacheAndLock(newDynamicThreadPoolNotifyMap); - threadPoolBaseSendMessageService.putPlatform(newDynamicThreadPoolNotifyMap); - } - ThreadPoolNotifyAlarm threadPoolNotifyAlarm = GlobalNotifyAlarmManage.get(executorProperties.getThreadPoolId()); - if (threadPoolNotifyAlarm != null) { - Boolean isAlarm = executorProperties.getAlarm(); - Integer activeAlarm = executorProperties.getActiveAlarm(); - Integer capacityAlarm = - executorProperties.getCapacityAlarm(); - if ((isAlarm != null && !Objects.equals(isAlarm, threadPoolNotifyAlarm.getAlarm())) || (activeAlarm != null && !Objects.equals(activeAlarm, - threadPoolNotifyAlarm.getActiveAlarm())) || (capacityAlarm != null && !Objects.equals(capacityAlarm, threadPoolNotifyAlarm.getCapacityAlarm()))) { - checkNotifyAlarm = true; - threadPoolNotifyAlarm.setAlarm(Optional.ofNullable(isAlarm).orElse(threadPoolNotifyAlarm.getAlarm())); - threadPoolNotifyAlarm.setActiveAlarm(Optional.ofNullable(activeAlarm).orElse(threadPoolNotifyAlarm.getActiveAlarm())); - threadPoolNotifyAlarm.setCapacityAlarm(Optional.ofNullable(capacityAlarm).orElse(threadPoolNotifyAlarm.getCapacityAlarm())); - } - } - if (checkNotifyConfig || checkNotifyAlarm) { - LOG.info("[{}] Dynamic thread pool notification property changes.", executorProperties.getThreadPoolId()); - } - } - - /** - * Check consistency. - * - * @param executorHolder executor holder - * @param properties properties after dynamic thread pool change - */ - private boolean checkPropertiesConsistency(ThreadPoolExecutorHolder executorHolder, ExecutorProperties properties) { - ExecutorProperties beforeProperties = executorHolder.getExecutorProperties(); - ThreadPoolExecutor executor = executorHolder.getExecutor(); - boolean result = (properties.getCorePoolSize() != null && !Objects.equals(beforeProperties.getCorePoolSize(), properties.getCorePoolSize())) - || (properties.getMaximumPoolSize() != null && !Objects.equals(beforeProperties.getMaximumPoolSize(), properties.getMaximumPoolSize())) - || (properties.getAllowCoreThreadTimeOut() != null && !Objects.equals(beforeProperties.getAllowCoreThreadTimeOut(), properties.getAllowCoreThreadTimeOut())) - || (properties.getExecuteTimeOut() != null && !Objects.equals(beforeProperties.getExecuteTimeOut(), properties.getExecuteTimeOut())) - || (properties.getKeepAliveTime() != null && !Objects.equals(beforeProperties.getKeepAliveTime(), properties.getKeepAliveTime())) - || (properties.getRejectedHandler() != null && !Objects.equals(beforeProperties.getRejectedHandler(), properties.getRejectedHandler())) - || - ((properties.getQueueCapacity() != null && !Objects.equals(beforeProperties.getQueueCapacity(), properties.getQueueCapacity()) - && Objects.equals(BlockingQueueTypeEnum.RESIZABLE_LINKED_BLOCKING_QUEUE.getName(), executor.getQueue().getClass().getSimpleName()))); - return result; - } - - /** - * Dynamic refresh thread-pool. - * - * @param executorHolder executor holder - * @param properties properties after dynamic thread pool change - */ - private void dynamicRefreshThreadPool(ThreadPoolExecutorHolder executorHolder, ExecutorProperties properties) { - ExecutorProperties beforeProperties = executorHolder.getExecutorProperties(); - ThreadPoolExecutor executor = executorHolder.getExecutor(); - if (properties.getMaximumPoolSize() != null && properties.getCorePoolSize() != null) { - ThreadPoolExecutorUtil.safeSetPoolSize(executor, properties.getCorePoolSize(), properties.getMaximumPoolSize()); - } else { - if (properties.getMaximumPoolSize() != null) { - executor.setMaximumPoolSize(properties.getMaximumPoolSize()); - } - if (properties.getCorePoolSize() != null) { - executor.setCorePoolSize(properties.getCorePoolSize()); - } - } - if (properties.getAllowCoreThreadTimeOut() != null && !Objects.equals(beforeProperties.getAllowCoreThreadTimeOut(), properties.getAllowCoreThreadTimeOut())) { - executor.allowCoreThreadTimeOut(properties.getAllowCoreThreadTimeOut()); - } - // TODO - if (properties.getExecuteTimeOut() != null && !Objects.equals(beforeProperties.getExecuteTimeOut(), properties.getExecuteTimeOut())) { - // if (executor instanceof DynamicThreadPoolExecutor) { - // ((DynamicThreadPoolExecutor) executor).setExecuteTimeOut(properties.getExecuteTimeOut()); - // } - } - if (properties.getRejectedHandler() != null && !Objects.equals(beforeProperties.getRejectedHandler(), properties.getRejectedHandler())) { - RejectedExecutionHandler rejectedExecutionHandler = RejectedPolicyTypeEnum.createPolicy(properties.getRejectedHandler()); - executor.setRejectedExecutionHandler(rejectedExecutionHandler); - } - if (properties.getKeepAliveTime() != null && !Objects.equals(beforeProperties.getKeepAliveTime(), properties.getKeepAliveTime())) { - executor.setKeepAliveTime(properties.getKeepAliveTime(), TimeUnit.SECONDS); - } - if (properties.getQueueCapacity() != null && !Objects.equals(beforeProperties.getQueueCapacity(), properties.getQueueCapacity()) - && Objects.equals(BlockingQueueTypeEnum.RESIZABLE_LINKED_BLOCKING_QUEUE.getName(), executor.getQueue().getClass().getSimpleName())) { - if (executor.getQueue() instanceof ResizableCapacityLinkedBlockingQueue) { - ResizableCapacityLinkedBlockingQueue queue = (ResizableCapacityLinkedBlockingQueue) executor.getQueue(); - queue.setCapacity(properties.getQueueCapacity()); - } else { - LOG.warn("The queue length cannot be modified. Queue type mismatch. Current queue type: {}", executor.getQueue().getClass().getSimpleName()); - } - } - } - - /** - * Sends a change notification message for a thread pool when its properties are updated. - * This method logs the changes in thread pool properties and sends a notification to the platform - * with the updated configuration details. - * - * @param executorHolder The holder object for the thread pool executor, containing its current state and properties. - * @param properties The new properties for the thread pool that are being applied. - */ - private void sendChangeNotificationMessage(ThreadPoolExecutorHolder executorHolder, ExecutorProperties properties) { - ExecutorProperties beforeProperties = executorHolder.getExecutorProperties(); - LOG.info(CHANGE_THREAD_POOL_TEXT, - executorHolder.getThreadPoolId(), - String.format(CHANGE_DELIMITER, beforeProperties.getCorePoolSize(), properties.getCorePoolSize()), - String.format(CHANGE_DELIMITER, beforeProperties.getMaximumPoolSize(), properties.getMaximumPoolSize()), - String.format(CHANGE_DELIMITER, beforeProperties.getQueueCapacity(), properties.getQueueCapacity()), - String.format(CHANGE_DELIMITER, beforeProperties.getKeepAliveTime(), properties.getKeepAliveTime()), - String.format(CHANGE_DELIMITER, beforeProperties.getExecuteTimeOut(), properties.getExecuteTimeOut()), - String.format(CHANGE_DELIMITER, beforeProperties.getRejectedHandler(), properties.getRejectedHandler()), - String.format(CHANGE_DELIMITER, beforeProperties.getAllowCoreThreadTimeOut(), properties.getAllowCoreThreadTimeOut())); - - // Send platform configuration notification - ChangeParameterNotifyRequest changeRequest = buildChangeRequest(beforeProperties, properties); - ThreadPoolCheckAlarmSupport.getThreadPoolConfigChangeHandler().sendPoolConfigChange(changeRequest); - } - - /** - * Construct change parameter notify request instance. - * - * @param beforeProperties old properties - * @param properties new properties - * @return instance - */ - private ChangeParameterNotifyRequest buildChangeRequest(ExecutorProperties beforeProperties, ExecutorProperties properties) { - ChangeParameterNotifyRequest changeParameterNotifyRequest = ChangeParameterNotifyRequest.builder() - .beforeCorePoolSize(beforeProperties.getCorePoolSize()) - .beforeMaximumPoolSize(beforeProperties.getMaximumPoolSize()) - .beforeAllowsCoreThreadTimeOut(beforeProperties.getAllowCoreThreadTimeOut()) - .beforeKeepAliveTime(beforeProperties.getKeepAliveTime()) - .beforeQueueCapacity(beforeProperties.getQueueCapacity()) - .beforeRejectedName(beforeProperties.getRejectedHandler()) - .beforeExecuteTimeOut(beforeProperties.getExecuteTimeOut()) - .blockingQueueName(properties.getBlockingQueue()) - .nowCorePoolSize(Optional.ofNullable(properties.getCorePoolSize()).orElse(beforeProperties.getCorePoolSize())) - .nowMaximumPoolSize(Optional.ofNullable(properties.getMaximumPoolSize()).orElse(beforeProperties.getMaximumPoolSize())) - .nowAllowsCoreThreadTimeOut(Optional.ofNullable(properties.getAllowCoreThreadTimeOut()).orElse(beforeProperties.getAllowCoreThreadTimeOut())) - .nowKeepAliveTime(Optional.ofNullable(properties.getKeepAliveTime()).orElse(beforeProperties.getKeepAliveTime())) - .nowQueueCapacity(Optional.ofNullable(properties.getQueueCapacity()).orElse(beforeProperties.getQueueCapacity())) - .nowRejectedName(Optional.ofNullable(properties.getRejectedHandler()).orElse(beforeProperties.getRejectedHandler())) - .nowExecuteTimeOut(Optional.ofNullable(properties.getExecuteTimeOut()).orElse(beforeProperties.getExecuteTimeOut())) - .build(); - changeParameterNotifyRequest.setThreadPoolId(beforeProperties.getThreadPoolId()); - return changeParameterNotifyRequest; - } -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/interceptor/EventPublishingRunListenerEnvironmentPreparedInterceptor.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/interceptor/EventPublishingRunListenerEnvironmentPreparedInterceptor.java deleted file mode 100644 index e148c96b..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/interceptor/EventPublishingRunListenerEnvironmentPreparedInterceptor.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.common.interceptor; - -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import cn.hippo4j.agent.plugin.spring.common.support.SpringEnvironmentSupport; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.env.ConfigurableEnvironment; - -import java.lang.reflect.Method; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * Event publishing run listener environment prepared interceptor - */ -public class EventPublishingRunListenerEnvironmentPreparedInterceptor implements InstanceMethodsAroundInterceptor { - - private static final AtomicBoolean isExecuted = new AtomicBoolean(false); - - private static final Logger LOGGER = LoggerFactory.getLogger(EventPublishingRunListenerEnvironmentPreparedInterceptor.class); - - @Override - public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - - } - - @Override - public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { - if (isExecuted.compareAndSet(false, true)) { - ConfigurableEnvironment environment = null; - try { - environment = (ConfigurableEnvironment) allArguments[0]; - } catch (Exception e) { - environment = (ConfigurableEnvironment) allArguments[1]; - } - SpringEnvironmentSupport.disableNonAgentSwitch(environment); - LOGGER.info("[Hippo4j-Agent] Switch off in non-Agent mode."); - } - return ret; - } - - @Override - public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { - - } -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/monitor/MonitorHandlersConfigurator.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/monitor/MonitorHandlersConfigurator.java deleted file mode 100644 index 76509cdd..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/monitor/MonitorHandlersConfigurator.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.common.monitor; - -import cn.hippo4j.agent.plugin.spring.common.support.SpringPropertiesLoader; -import cn.hippo4j.common.extension.spi.ServiceLoaderRegistry; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.common.monitor.MonitorCollectTypeEnum; -import cn.hippo4j.common.monitor.MonitorHandlerTypeEnum; -import cn.hippo4j.core.executor.state.ThreadPoolRunStateHandler; -import cn.hippo4j.monitor.elasticsearch.AdapterThreadPoolElasticSearchMonitorHandler; -import cn.hippo4j.monitor.elasticsearch.DynamicThreadPoolElasticSearchMonitorHandler; -import cn.hippo4j.monitor.elasticsearch.WebThreadPoolElasticSearchMonitorHandler; -import cn.hippo4j.monitor.local.log.AdapterThreadPoolLocalLogMonitorHandler; -import cn.hippo4j.monitor.local.log.DynamicThreadPoolLocalLogMonitorHandler; -import cn.hippo4j.monitor.local.log.WebThreadPoolLocalLogMonitorHandler; -import cn.hippo4j.monitor.micrometer.AdapterThreadPoolMicrometerMonitorHandler; -import cn.hippo4j.monitor.micrometer.DynamicThreadPoolMicrometerMonitorHandler; -import cn.hippo4j.monitor.micrometer.WebThreadPoolMicrometerMonitorHandler; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.MonitorProperties; -import cn.hippo4j.threadpool.monitor.api.ThreadPoolMonitor; -import org.springframework.core.env.ConfigurableEnvironment; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.BiConsumer; - -/** - * This class is responsible for configuring and initializing monitoring handlers - * for various types of thread pools. It maps specific monitoring types (e.g., Micrometer, - * Log, Elasticsearch) to their corresponding handler initializers and manages the - * setup process based on the provided configuration. - */ -public class MonitorHandlersConfigurator { - - private static final ILog LOGGER = LogManager.getLogger(MonitorHandlersConfigurator.class); - - // Maps thread pool types to their corresponding handler constructors - private static final Map> handlerMap = new HashMap<>(); - - static { - // Initialize the handler map with specific monitoring types - handlerMap.put(MonitorCollectTypeEnum.MICROMETER.getValue(), MonitorHandlersConfigurator::handleMicrometer); - handlerMap.put(MonitorCollectTypeEnum.LOG.getValue(), MonitorHandlersConfigurator::handleLog); - handlerMap.put(MonitorCollectTypeEnum.ELASTICSEARCH.getValue(), MonitorHandlersConfigurator::handleElasticSearch); - } - - /** - * Initializes the monitoring handlers based on the provided monitoring configuration. - *

- * This method performs the following tasks: - *

    - *
  • Parses the configured monitoring types and thread pool types.
  • - *
  • Initializes a monitoring context with the necessary thread pool monitors and state handler.
  • - *
  • For each configured monitoring type, invokes the corresponding handler initializer - * for each relevant thread pool type.
  • - *
  • Logs a warning if an unrecognized monitoring type is encountered.
  • - *
  • Registers and adds thread pool monitors that match the configured monitoring types.
  • - *
- * - * @param monitor The monitoring properties configuration. - * @param environment The application environment from which additional configuration can be loaded. - * @param threadPoolMonitors A list to hold the initialized thread pool monitors. - */ - public static void initializeMonitorHandlers(MonitorProperties monitor, ConfigurableEnvironment environment, List threadPoolMonitors) { - List collectTypes = Arrays.asList(monitor.getCollectTypes().split(",")); - List threadPoolTypes = Arrays.asList(monitor.getThreadPoolTypes().split(",")); - ThreadPoolRunStateHandler threadPoolRunStateHandler = new ThreadPoolRunStateHandler( - SpringPropertiesLoader.inetUtils, environment); - - MonitorHandlerContext context = new MonitorHandlerContext(threadPoolMonitors, threadPoolRunStateHandler); - - // Initialize handlers for each configured monitoring type and thread pool type - for (String collectType : collectTypes) { - if (handlerMap.containsKey(collectType)) { - for (MonitorHandlerTypeEnum type : MonitorHandlerTypeEnum.values()) { - if (threadPoolTypes.contains(type.name().toLowerCase())) { - handlerMap.get(collectType).accept(type, context); - } - } - } else { - LOGGER.warn("[Hippo4j-Agent] MonitorConfigurator initialize Unrecognized collect type: [{}]", collectType); - } - } - - // Register and add dynamic thread pool monitors matching the configured types - Collection dynamicThreadPoolMonitors = ServiceLoaderRegistry.getSingletonServiceInstances(ThreadPoolMonitor.class); - dynamicThreadPoolMonitors.stream().filter(each -> collectTypes.contains(each.getType())).forEach(threadPoolMonitors::add); - } - - /** - * Initializes Micrometer-based monitoring handlers for the specified thread pool type. - * - * @param type The type of thread pool to be monitored. - * @param context The context containing the monitors and state handler. - */ - private static void handleMicrometer(MonitorHandlerTypeEnum type, MonitorHandlerContext context) { - switch (type) { - case DYNAMIC: - context.monitors.add(new DynamicThreadPoolMicrometerMonitorHandler(context.threadPoolRunStateHandler)); - break; - case WEB: - context.monitors.add(new WebThreadPoolMicrometerMonitorHandler()); - break; - case ADAPTER: - context.monitors.add(new AdapterThreadPoolMicrometerMonitorHandler()); - break; - } - } - - /** - * Initializes Log-based monitoring handlers for the specified thread pool type. - * - * @param type The type of thread pool to be monitored. - * @param context The context containing the monitors and state handler. - */ - private static void handleLog(MonitorHandlerTypeEnum type, MonitorHandlerContext context) { - switch (type) { - case DYNAMIC: - context.monitors.add(new DynamicThreadPoolLocalLogMonitorHandler(context.threadPoolRunStateHandler)); - break; - case WEB: - context.monitors.add(new WebThreadPoolLocalLogMonitorHandler()); - break; - case ADAPTER: - context.monitors.add(new AdapterThreadPoolLocalLogMonitorHandler()); - break; - } - } - - /** - * Initializes Elasticsearch-based monitoring handlers for the specified thread pool type. - * - * @param type The type of thread pool to be monitored. - * @param context The context containing the monitors and state handler. - */ - private static void handleElasticSearch(MonitorHandlerTypeEnum type, MonitorHandlerContext context) { - switch (type) { - case DYNAMIC: - context.monitors.add(new DynamicThreadPoolElasticSearchMonitorHandler(context.threadPoolRunStateHandler)); - break; - case WEB: - context.monitors.add(new WebThreadPoolElasticSearchMonitorHandler()); - break; - case ADAPTER: - context.monitors.add(new AdapterThreadPoolElasticSearchMonitorHandler()); - break; - } - } - - /** - * A helper class to manage the context in which monitoring handlers are initialized. - */ - private static class MonitorHandlerContext { - - List monitors; - ThreadPoolRunStateHandler threadPoolRunStateHandler; - - MonitorHandlerContext(List monitors, ThreadPoolRunStateHandler handler) { - this.monitors = monitors; - this.threadPoolRunStateHandler = handler; - } - } -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/monitor/MonitorMetricEndpoint.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/monitor/MonitorMetricEndpoint.java deleted file mode 100644 index e5276104..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/monitor/MonitorMetricEndpoint.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.common.monitor; - -import cn.hippo4j.agent.plugin.spring.common.conf.SpringBootConfig; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import com.sun.net.httpserver.HttpExchange; -import com.sun.net.httpserver.HttpHandler; -import com.sun.net.httpserver.HttpServer; -import io.micrometer.core.instrument.Metrics; -import io.micrometer.core.instrument.composite.CompositeMeterRegistry; -import io.micrometer.prometheus.PrometheusConfig; -import io.micrometer.prometheus.PrometheusMeterRegistry; - -import java.io.IOException; -import java.io.OutputStream; -import java.net.InetSocketAddress; - -/** - * This class is responsible for exposing Prometheus metrics via an HTTP endpoint. - * It initializes the Prometheus registry, binds it to the global metrics registry, - * and starts an HTTP server to serve the metrics data. - */ -public class MonitorMetricEndpoint { - - private static final ILog LOGGER = LogManager.getLogger(MonitorHandlersConfigurator.class); - - /** - * Starts the Prometheus metrics HTTP server. - *

- * This method performs the following steps: - *

    - *
  • Initializes the PrometheusMeterRegistry with the default configuration.
  • - *
  • Binds the Prometheus registry to the global CompositeMeterRegistry.
  • - *
  • Attempts to start an HTTP server on the configured port to expose the Prometheus metrics.
  • - *
- * If the port is not configured, or if there is an error starting the server, appropriate error messages - * are logged, and the method returns without starting the server. - *

- */ - public static void startPrometheusEndpoint() { - - // Initialize the Prometheus registry - PrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); - - // Bind the Prometheus registry to the global Metrics registry - CompositeMeterRegistry globalRegistry = Metrics.globalRegistry; - globalRegistry.add(prometheusRegistry); - - // Get the configured port for the Prometheus metrics HTTP server - Integer port = SpringBootConfig.Spring.Dynamic.Thread_Pool.Monitor.AGENT_MICROMETER_PORT; - if (port == null) { - LOGGER.error( - "[Hippo4j-Agent] Failed to start Prometheus metrics endpoint server. Please configure the exposed endpoint by adding: spring.dynamic.thread-pool.monitor.agent-micrometer-port=xxx to the configuration file"); - return; - } - - // Create the HTTP server - HttpServer server = null; - try { - server = HttpServer.create(new InetSocketAddress(port), 0); - } catch (IOException e) { - LOGGER.error("[Hippo4j-Agent] Failed to start Prometheus metrics endpoint server", e); - return; - } - - // Register the /actuator/prometheus context to handle metrics requests - server.createContext("/actuator/prometheus", exchange -> { - String response = prometheusRegistry.scrape(); // Get metrics data in Prometheus format - exchange.sendResponseHeaders(200, response.getBytes().length); - try (OutputStream os = exchange.getResponseBody()) { - os.write(response.getBytes()); - } - }); - - // Start the server - server.start(); - LOGGER.info("[Hippo4j-Agent] Prometheus metrics server started on port {}", port); - } - -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/support/SpringEnvironmentSupport.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/support/SpringEnvironmentSupport.java deleted file mode 100644 index d4b7e619..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/support/SpringEnvironmentSupport.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.common.support; - -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; - -import java.util.HashMap; -import java.util.Map; - -/** - * Spring environment support - */ -public class SpringEnvironmentSupport { - - public static void disableNonAgentSwitch(ConfigurableEnvironment environment) { - Map map = new HashMap<>(); - map.put("spring.dynamic.thread-pool.enable", false); // Switch off in non-Agent mode - MapPropertySource propertySource = new MapPropertySource("Hippo4j-Agent-Properties", map); - environment.getPropertySources().addLast(propertySource); - } -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/support/SpringPropertiesLoader.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/support/SpringPropertiesLoader.java deleted file mode 100644 index 907b2074..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/support/SpringPropertiesLoader.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.common.support; - -import cn.hippo4j.agent.core.boot.SpringBootConfigInitializer; -import cn.hippo4j.agent.plugin.spring.common.toolkit.SpringPropertyBinder; -import cn.hippo4j.common.extension.design.AbstractSubjectCenter; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; -import cn.hippo4j.core.toolkit.inet.InetUtils; -import cn.hippo4j.core.toolkit.inet.InetUtilsProperties; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import lombok.Getter; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.EnumerablePropertySource; -import org.springframework.core.env.PropertiesPropertySource; -import org.springframework.core.env.PropertySource; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import java.util.Properties; -import java.util.concurrent.atomic.AtomicBoolean; - -import static cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties.PREFIX; - -/** - * Spring properties loader - */ -public class SpringPropertiesLoader { - - private static final ILog LOGGER = LogManager.getLogger(SpringPropertiesLoader.class); - - /** - * A flag used to indicate whether loadSpringProperties() method has been called, - * Used to determine whether the SpringPropertiesLoader has been initialized - */ - @Getter - private static final AtomicBoolean active = new AtomicBoolean(Boolean.FALSE); - - public static BootstrapConfigProperties BOOTSTRAP_CONFIG_PROPERTIES = new BootstrapConfigProperties(); - - public static InetUtilsProperties INET_UTILS_PROPERTIES = new InetUtilsProperties(); - - public static InetUtils inetUtils; - - public static void loadSpringProperties(ConfigurableEnvironment environment) { - Iterator> iterator = environment.getPropertySources().iterator(); - Properties properties = new Properties(); - List> propertySourceList = new ArrayList<>(); - while (iterator.hasNext()) { - propertySourceList.add(iterator.next()); - } - // Sort to ensure that the configuration in the configuration center is after the array - // To get the latest configuration information - propertySourceList.sort(Comparator.comparing( - // Make sure that Nacos boot's propertySource is placed first in the propertySourceList - item -> !item.getClass().getName().equals("com.alibaba.nacos.spring.core.env.NacosPropertySource"))); - - for (int i = propertySourceList.size() - 1; i >= 0; i--) { - PropertySource propertySource = propertySourceList.get(i); - if (!(propertySource instanceof EnumerablePropertySource)) { - LOGGER.warn("Skip propertySource[{}] because {} not enumerable.", propertySource.getName(), propertySource.getClass()); - continue; - } - LOGGER.info("Load propertySource[{}] into SpringProperties.", propertySource.getName()); - EnumerablePropertySource enumerablePropertySource = (EnumerablePropertySource) propertySource; - String[] keys = enumerablePropertySource.getPropertyNames(); - for (String key : keys) { - Object value = null; - try { - value = enumerablePropertySource.getProperty(key); - if (value != null) { - properties.put(key.toLowerCase(), value.toString()); - } - } catch (Throwable e) { - LOGGER.warn("Put property to spring properties failed, key=[{}], value=[{}]", key, value); - } - } - } - SpringBootConfigInitializer.setSpringProperties(properties); - PropertiesPropertySource propertySource = new PropertiesPropertySource("customPropertySource", properties); - environment.getPropertySources().addFirst(propertySource); - // initialize BootstrapConfigProperties - BOOTSTRAP_CONFIG_PROPERTIES = SpringPropertyBinder.bindProperties(environment, PREFIX, BootstrapConfigProperties.class); - INET_UTILS_PROPERTIES = SpringPropertyBinder.bindProperties(environment, InetUtilsProperties.PREFIX, InetUtilsProperties.class); - // Send AGENT_SPRING_PROPERTIES_LOADER_COMPLETED notification event Before active is false - if (AbstractSubjectCenter.get(AbstractSubjectCenter.SubjectType.AGENT_SPRING_PROPERTIES_LOADER_COMPLETED) != null && Boolean.FALSE.equals(active.get())) { - AbstractSubjectCenter.notify(AbstractSubjectCenter.SubjectType.AGENT_SPRING_PROPERTIES_LOADER_COMPLETED, () -> ""); - } - active.set(Boolean.TRUE); - // Enable the thread pool check alert handler - ThreadPoolCheckAlarmSupport.enableThreadPoolCheckAlarmHandler(); - // Enable thread pool monitor handler - ThreadPoolMonitorSupport.enableThreadPoolMonitorHandler(environment); - } - -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/support/SpringThreadPoolRegisterSupport.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/support/SpringThreadPoolRegisterSupport.java deleted file mode 100644 index 4aba9498..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/support/SpringThreadPoolRegisterSupport.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.common.support; - -import cn.hippo4j.agent.core.util.ReflectUtil; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum; -import cn.hippo4j.common.executor.support.RejectedPolicyTypeEnum; -import cn.hippo4j.common.handler.DynamicThreadPoolAdapterChoose; -import cn.hippo4j.common.model.executor.ExecutorNotifyProperties; -import cn.hippo4j.common.model.executor.ExecutorProperties; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.common.toolkit.ThreadPoolExecutorUtil; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.message.core.service.GlobalNotifyAlarmManage; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolNotifyAlarm; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import static cn.hippo4j.common.constant.Constants.DYNAMIC_THREAD_POOL_EXECUTOR; - -/** - * Spring thread pool register support - */ -public class SpringThreadPoolRegisterSupport { - - private static final Logger LOGGER = LoggerFactory.getLogger(SpringThreadPoolRegisterSupport.class); - - private static final int DEFAULT_ACTIVE_ALARM = 80; - - private static final int DEFAULT_CAPACITY_ALARM = 80; - - private static final int DEFAULT_INTERVAL = 5; - - private static final String DEFAULT_RECEIVES = ""; - - public static void registerThreadPoolInstances(ApplicationContext context) { - Map> referencedClassMap = ThreadPoolExecutorRegistry.REFERENCED_CLASS_MAP; - for (Map.Entry> entry : referencedClassMap.entrySet()) { - ThreadPoolExecutor enhancedInstance = entry.getKey(); - Class declaredClass = entry.getValue(); - List declaredFields = ReflectUtil.getStaticFieldsFromType(declaredClass, ThreadPoolExecutor.class); - for (Field field : declaredFields) { - try { - Object value = field.get(null); - if (value == enhancedInstance) { - String threadPoolId = declaredClass.getName() + "#" + field.getName(); - register(threadPoolId, enhancedInstance, Boolean.TRUE); - break; - } - } catch (IllegalAccessException e) { - LOGGER.error("Get static field error.", e); - } - } - } - - Map beansWithAnnotation = context.getBeansOfType(Executor.class); - beansWithAnnotation.forEach((beanName, bean) -> { - ThreadPoolExecutor executor = null; - // Get ThreadPoolExecutor Instance - if (DynamicThreadPoolAdapterChoose.match(bean)) { - executor = DynamicThreadPoolAdapterChoose.unwrap(bean); - } else if (bean instanceof ThreadPoolTaskExecutor) { - ThreadPoolTaskExecutor taskExecutor = (ThreadPoolTaskExecutor) bean; - // Get a real instance of ThreadPoolExecutor - executor = taskExecutor.getThreadPoolExecutor(); - } else if (bean instanceof ThreadPoolExecutor) { - executor = (ThreadPoolExecutor) bean; - } else { - LOGGER.warn("[Hippo4j-Agent] Thread pool ignore registered beanName={}, Now Unsupported thread pool executor type:{} ", beanName, bean.getClass().getName()); - } - if (executor == null) { - LOGGER.warn("[Hippo4j-Agent] Thread pool is null, ignore bean registration. beanName={}, beanClass={}", beanName, bean.getClass().getName()); - } else { - register(beanName, executor, Boolean.FALSE); - } - }); - - LOGGER.info("[Hippo4j-Agent] Registered thread pool instances successfully."); - } - - public static void register(String threadPoolId, ThreadPoolExecutor executor, Boolean isAgentScanEnhancePool) { - if (executor == null) { - return; - } - ExecutorProperties executorProperties = - SpringPropertiesLoader.BOOTSTRAP_CONFIG_PROPERTIES.getExecutors().stream().filter(each -> Objects.equals(threadPoolId, each.getThreadPoolId())).findFirst().orElse(null); - - // Determines the thread pool that is currently obtained by bean scanning - if (Objects.isNull(executorProperties)) { - if (isAgentScanEnhancePool) { - throw new RuntimeException(String.format("The thread pool id [%s] does not exist in the configuration.", threadPoolId)); - } else { - // Thread pool that do not require enhancement are skipped by the agent - return; - } - } - - try { - executorProperties = buildActualExecutorProperties(executorProperties); - // Replace the original configuration and refresh the thread pool - threadPoolParamReplace(executor, executorProperties); - } catch (Exception ex) { - LOGGER.error("[Hippo4j-Agent] Failed to initialize thread pool configuration.", ex); - } - // Build notification information entity - ThreadPoolNotifyAlarm threadPoolNotifyAlarm = buildThreadPoolNotifyAlarm(executorProperties); - GlobalNotifyAlarmManage.put(threadPoolId, threadPoolNotifyAlarm); - - ThreadPoolExecutorRegistry.putHolder(threadPoolId, executor, executorProperties); - } - - /** - * Thread-pool param replace. - * - * @param executor dynamic thread-pool executor - * @param executorProperties executor properties - */ - private static void threadPoolParamReplace(ThreadPoolExecutor executor, ExecutorProperties executorProperties) { - BlockingQueue workQueue = BlockingQueueTypeEnum.createBlockingQueue(executorProperties.getBlockingQueue(), executorProperties.getQueueCapacity()); - cn.hippo4j.common.toolkit.ReflectUtil.setFieldValue(executor, "workQueue", workQueue); - ThreadPoolExecutorUtil.safeSetPoolSize(executor, executorProperties.getCorePoolSize(), executorProperties.getMaximumPoolSize()); - executor.setKeepAliveTime(executorProperties.getKeepAliveTime(), TimeUnit.SECONDS); - executor.allowCoreThreadTimeOut(executorProperties.getAllowCoreThreadTimeOut()); - executor.setRejectedExecutionHandler(RejectedPolicyTypeEnum.createPolicy(executorProperties.getRejectedHandler())); - // Reflection sets the thread pool setExecuteTimeOut - if (DYNAMIC_THREAD_POOL_EXECUTOR.equals(executor.getClass().getName())) { - try { - Method setExecuteTimeOutMethod = executor.getClass().getMethod("setExecuteTimeOut", Long.class); - Long executeTimeOut = executorProperties.getExecuteTimeOut(); - if (executeTimeOut != null) { - setExecuteTimeOutMethod.invoke(executor, executeTimeOut); - } - } catch (Exception e) { - LOGGER.error("[Hippo4j-Agent] Failed to set executeTimeOut.", e); - } - } - } - - /** - * Build actual executor properties. - * - * @param executorProperties executor properties - * @return executor properties - */ - private static ExecutorProperties buildActualExecutorProperties(ExecutorProperties executorProperties) { - return Optional.ofNullable(SpringPropertiesLoader.BOOTSTRAP_CONFIG_PROPERTIES.getDefaultExecutor()).map(each -> buildExecutorProperties(executorProperties)).orElse(executorProperties); - } - - /** - * Build executor properties. - * - * @param executorProperties executor properties - * @return executor properties - */ - private static ExecutorProperties buildExecutorProperties(ExecutorProperties executorProperties) { - BootstrapConfigProperties configProperties = SpringPropertiesLoader.BOOTSTRAP_CONFIG_PROPERTIES; - return ExecutorProperties.builder() - .corePoolSize(Optional.ofNullable(executorProperties.getCorePoolSize()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getCorePoolSize).get())) - .maximumPoolSize(Optional.ofNullable(executorProperties.getMaximumPoolSize()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getMaximumPoolSize).get())) - .allowCoreThreadTimeOut(Optional.ofNullable(executorProperties.getAllowCoreThreadTimeOut()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getAllowCoreThreadTimeOut).get())) - .keepAliveTime(Optional.ofNullable(executorProperties.getKeepAliveTime()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getKeepAliveTime).get())) - .blockingQueue(Optional.ofNullable(executorProperties.getBlockingQueue()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getBlockingQueue).get())) - .executeTimeOut(Optional.ofNullable(executorProperties.getExecuteTimeOut()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getExecuteTimeOut).orElse(0L))) - .queueCapacity(Optional.ofNullable(executorProperties.getQueueCapacity()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getQueueCapacity).get())) - .rejectedHandler(Optional.ofNullable(executorProperties.getRejectedHandler()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getRejectedHandler).get())) - .threadNamePrefix(StringUtil.isBlank(executorProperties.getThreadNamePrefix()) ? executorProperties.getThreadPoolId() : executorProperties.getThreadNamePrefix()) - .threadPoolId(executorProperties.getThreadPoolId()) - .alarm(Optional.ofNullable(executorProperties.getAlarm()).orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getAlarm).orElse(null))) - .activeAlarm(Optional.ofNullable(executorProperties.getActiveAlarm()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getActiveAlarm).orElse(null))) - .capacityAlarm(Optional.ofNullable(executorProperties.getCapacityAlarm()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getCapacityAlarm).orElse(null))) - .notify(Optional.ofNullable(executorProperties.getNotify()).orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getNotify).orElse(null))) - .nodes(Optional.ofNullable(executorProperties.getNodes()).orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getNodes).orElse(null))) - .build(); - } - - /** - * Build thread-pool notify alarm - * - * @param executorProperties executor properties - * @return thread-pool notify alarm - */ - private static ThreadPoolNotifyAlarm buildThreadPoolNotifyAlarm(ExecutorProperties executorProperties) { - BootstrapConfigProperties configProperties = SpringPropertiesLoader.BOOTSTRAP_CONFIG_PROPERTIES; - ExecutorNotifyProperties notify = Optional.ofNullable(executorProperties).map(ExecutorProperties::getNotify).orElse(null); - boolean isAlarm = Optional.ofNullable(executorProperties.getAlarm()).orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getAlarm).orElse(true)); - int activeAlarm = Optional.ofNullable(executorProperties.getActiveAlarm()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getActiveAlarm).orElse(DEFAULT_ACTIVE_ALARM)); - int capacityAlarm = Optional.ofNullable(executorProperties.getCapacityAlarm()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getCapacityAlarm).orElse(DEFAULT_CAPACITY_ALARM)); - int interval = Optional.ofNullable(notify).map(ExecutorNotifyProperties::getInterval) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getNotify).map(ExecutorNotifyProperties::getInterval).orElse(DEFAULT_INTERVAL)); - String receive = Optional.ofNullable(notify).map(ExecutorNotifyProperties::getReceives) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getNotify).map(ExecutorNotifyProperties::getReceives).orElse(DEFAULT_RECEIVES)); - ThreadPoolNotifyAlarm threadPoolNotifyAlarm = new ThreadPoolNotifyAlarm(isAlarm, activeAlarm, capacityAlarm); - threadPoolNotifyAlarm.setInterval(interval); - threadPoolNotifyAlarm.setReceives(receive); - return threadPoolNotifyAlarm; - } - -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/support/ThreadPoolCheckAlarmSupport.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/support/ThreadPoolCheckAlarmSupport.java deleted file mode 100644 index 58cd2131..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/support/ThreadPoolCheckAlarmSupport.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.common.support; - -import cn.hippo4j.agent.plugin.spring.common.alarm.AgentModeNotifyConfigBuilder; -import cn.hippo4j.agent.plugin.spring.common.conf.SpringBootConfig; -import cn.hippo4j.agent.plugin.spring.common.toolkit.SpringPropertyBinder; -import cn.hippo4j.common.propertie.EnvironmentProperties; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.core.toolkit.IdentifyUtil; -import cn.hippo4j.core.toolkit.inet.InetUtils; -import cn.hippo4j.core.toolkit.inet.InetUtilsProperties; -import cn.hippo4j.threadpool.alarm.handler.DefaultThreadPoolCheckAlarmHandler; -import cn.hippo4j.threadpool.message.api.NotifyConfigDTO; -import cn.hippo4j.threadpool.message.core.platform.DingSendMessageHandler; -import cn.hippo4j.threadpool.message.core.platform.LarkSendMessageHandler; -import cn.hippo4j.threadpool.message.core.platform.WeChatSendMessageHandler; -import cn.hippo4j.threadpool.message.core.service.AlarmControlHandler; -import cn.hippo4j.threadpool.message.core.service.DefaultThreadPoolConfigChangeHandler; -import cn.hippo4j.threadpool.message.core.service.SendMessageHandler; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolBaseSendMessageService; -import lombok.Getter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.env.ConfigurableEnvironment; - -import java.util.List; -import java.util.Map; - -import static cn.hippo4j.agent.plugin.spring.common.support.SpringPropertiesLoader.BOOTSTRAP_CONFIG_PROPERTIES; - -/** - * The {@code ThreadPoolCheckAlarmSupport} class provides functionality to enable and configure - * a thread pool check alarm handler. This is typically used to monitor thread pools for potential - * issues and send notifications based on the configured alert mechanisms. - */ -public class ThreadPoolCheckAlarmSupport { - - private static final Logger LOGGER = LoggerFactory.getLogger(ThreadPoolCheckAlarmSupport.class); - - @Getter - private static ThreadPoolBaseSendMessageService threadPoolBaseSendMessageService; - - @Getter - private static DefaultThreadPoolConfigChangeHandler threadPoolConfigChangeHandler; - - @Getter - private static AgentModeNotifyConfigBuilder agentNotifyConfigBuilder; - - private static DefaultThreadPoolCheckAlarmHandler checkAlarmHandler; - - /** - * Enables the thread pool check alarm handler if the corresponding configuration property is set to {@code true}. - *

- * This method performs the following actions: - *

    - *
  • Checks the value of the {@code enable} property in the bootstrap configuration. If it is {@code true}, it proceeds.
  • - *
  • Initializes environment properties needed for the monitoring process.
  • - *
  • Creates an instance of {@link AlarmControlHandler} and {@link ThreadPoolBaseSendMessageService} with necessary dependencies.
  • - *
  • Initializes and registers message handlers and notification configurations.
  • - *
  • Creates an instance of {@link DefaultThreadPoolCheckAlarmHandler} and schedules it to start monitoring the thread pool.
  • - *
- */ - public static void enableThreadPoolCheckAlarmHandler() { - // Check if the thread pool checker is enabled in the bootstrap configuration properties - if (Boolean.TRUE.equals(BOOTSTRAP_CONFIG_PROPERTIES.getEnable())) { - - // Initialize EnvironmentProperties - initializeEnvironmentProperties(); - - // Initialize the AlarmControlHandler and ThreadPoolBaseSendMessageService - AlarmControlHandler alarmControlHandler = new AlarmControlHandler(); - threadPoolBaseSendMessageService = createThreadPoolBaseSendMessageService(alarmControlHandler); - threadPoolConfigChangeHandler = new DefaultThreadPoolConfigChangeHandler(threadPoolBaseSendMessageService); - - // Initialize the alarm platform information - initializeSendMessageHandlers(threadPoolBaseSendMessageService, alarmControlHandler); - - // Execute scheduled task to check an alarm - scheduleExecute(threadPoolBaseSendMessageService); - - LOGGER.info("[Hippo4j-Agent] Start Check AlarmHandler the running status of dynamic thread pools."); - - } - } - - /** - * Initializes environment properties used for thread pool monitoring. - *

- * This method sets the state check interval, item ID, application name, and active profile from the bootstrap configuration. - */ - private static void initializeEnvironmentProperties() { - EnvironmentProperties.checkStateInterval = Long.valueOf(BOOTSTRAP_CONFIG_PROPERTIES.getCheckStateInterval()); - EnvironmentProperties.itemId = BOOTSTRAP_CONFIG_PROPERTIES.getItemId(); - EnvironmentProperties.applicationName = SpringBootConfig.Spring.Application.name; - EnvironmentProperties.active = SpringBootConfig.Spring.Profiles.active; - ConfigurableEnvironment environment = ApplicationContextHolder.getBean(ConfigurableEnvironment.class); - InetUtilsProperties inetUtilsProperties = SpringPropertyBinder.bindProperties(environment, InetUtilsProperties.PREFIX, InetUtilsProperties.class); - SpringPropertiesLoader.inetUtils = new InetUtils(inetUtilsProperties); - IdentifyUtil.generate(environment, SpringPropertiesLoader.inetUtils); - } - - /** - * Creates and returns a new instance of {@link ThreadPoolBaseSendMessageService} with the specified {@link AlarmControlHandler}. - * - * @param alarmControlHandler The {@link AlarmControlHandler} used to control and handle alarms. - * @return A new instance of {@link ThreadPoolBaseSendMessageService}. - */ - private static ThreadPoolBaseSendMessageService createThreadPoolBaseSendMessageService(AlarmControlHandler alarmControlHandler) { - return new ThreadPoolBaseSendMessageService(alarmControlHandler); - } - - /** - * Initializes and registers the message handlers and notification configurations in the specified - * {@link ThreadPoolBaseSendMessageService}. - *

- * This method creates instances of various {@link SendMessageHandler} implementations and registers them. - * It also constructs and registers notification configurations using the {@link AgentModeNotifyConfigBuilder}. - * - * @param threadPoolBaseSendMessageService The {@link ThreadPoolBaseSendMessageService} in which message handlers and notification configurations will be registered. - * @param alarmControlHandler The {@link AlarmControlHandler} used to handle alarms and notifications. - */ - private static void initializeSendMessageHandlers(ThreadPoolBaseSendMessageService threadPoolBaseSendMessageService, AlarmControlHandler alarmControlHandler) { - // Initialize message handlers - DingSendMessageHandler dingSendMessageHandler = new DingSendMessageHandler(); - WeChatSendMessageHandler weChatSendMessageHandler = new WeChatSendMessageHandler(); - LarkSendMessageHandler larkSendMessageHandler = new LarkSendMessageHandler(); - - // Register message handlers - threadPoolBaseSendMessageService.getSendMessageHandlers().put(dingSendMessageHandler.getType(), dingSendMessageHandler); - threadPoolBaseSendMessageService.getSendMessageHandlers().put(weChatSendMessageHandler.getType(), weChatSendMessageHandler); - threadPoolBaseSendMessageService.getSendMessageHandlers().put(larkSendMessageHandler.getType(), larkSendMessageHandler); - - // Construct and register notification configurations - // TODO : register notify config for web , null Can be replaced with tomcat, jetty, undertow, etc. implementation classes - agentNotifyConfigBuilder = new AgentModeNotifyConfigBuilder(alarmControlHandler, null); - Map> notifyConfigs = agentNotifyConfigBuilder.buildNotify(); - threadPoolBaseSendMessageService.getNotifyConfigs().putAll(notifyConfigs); - } - - // 启动或重新启动检查任务 - public static void scheduleExecute(ThreadPoolBaseSendMessageService threadPoolBaseSendMessageService) { - // If a task is already running, cancel it first - if (checkAlarmHandler != null) { - // Shut down the thread pool and prepare to regenerate the listener thread pool - checkAlarmHandler.destroyScheduleExecute(); - } - // Initialize the thread pool check alarm handler with necessary services - checkAlarmHandler = new DefaultThreadPoolCheckAlarmHandler(threadPoolBaseSendMessageService); - // Run the check alarm handler to start monitoring the thread pool - checkAlarmHandler.scheduleExecute(); - } -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/support/ThreadPoolMonitorSupport.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/support/ThreadPoolMonitorSupport.java deleted file mode 100644 index a45c4fa9..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/support/ThreadPoolMonitorSupport.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.common.support; - -import cn.hippo4j.agent.plugin.spring.common.monitor.MonitorHandlersConfigurator; -import cn.hippo4j.agent.plugin.spring.common.monitor.MonitorMetricEndpoint; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.extension.spi.ServiceLoaderRegistry; -import cn.hippo4j.common.monitor.MonitorCollectTypeEnum; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.MonitorProperties; -import cn.hippo4j.threadpool.monitor.api.ThreadPoolMonitor; -import lombok.Getter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.Environment; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; - -import static cn.hippo4j.agent.plugin.spring.common.support.SpringPropertiesLoader.BOOTSTRAP_CONFIG_PROPERTIES; - -/** - * This class provides support for monitoring dynamic thread pools in an application. - * It includes methods to initialize and enable monitoring components, and schedules - * periodic data collection from the thread pools. - */ -public class ThreadPoolMonitorSupport { - - private static final Logger LOGGER = LoggerFactory.getLogger(ThreadPoolMonitorSupport.class); - - /** - * A flag used to indicate whether enableThreadPoolMonitorHandler() method has been called, - * Used to determine whether the ThreadPoolMonitorHandler has been enable - */ - @Getter - private static final AtomicBoolean active = new AtomicBoolean(Boolean.FALSE); - - private static final ScheduledExecutorService collectScheduledExecutor = new ScheduledThreadPoolExecutor(1, r -> new Thread(r, "client.agent.scheduled.collect.data")); - - private static final List threadPoolMonitors = new ArrayList<>(); - - static { - // Register the ThreadPoolMonitor service with the ServiceLoaderRegistry - ServiceLoaderRegistry.register(ThreadPoolMonitor.class); - } - - /** - * Enables the dynamic thread pool monitoring handler. - *

- * This method performs the following steps: - *

    - *
  • Validates the monitoring configuration from the environment properties.
  • - *
  • Initializes monitoring components for the dynamic thread pools.
  • - *
  • Exposes metric endpoints, such as Prometheus, if configured.
  • - *
  • Schedules periodic collection of metrics from the thread pools.
  • - *
- * If the monitoring configuration is invalid or disabled, the method returns without - * enabling the monitoring handler. - *

- * - * @param environment The environment from which the monitoring configuration is loaded. - */ - public static void enableThreadPoolMonitorHandler(Environment environment) { - BootstrapConfigProperties properties = BOOTSTRAP_CONFIG_PROPERTIES; - MonitorProperties monitor = properties.getMonitor(); - if (Objects.isNull(monitor) || !monitor.getEnable() || StringUtil.isBlank(monitor.getThreadPoolTypes()) || StringUtil.isBlank(monitor.getCollectTypes())) { - return; - } - - LOGGER.info("[Hippo4j-Agent] Start monitoring the running status of dynamic thread pools."); - - // Initialize monitoring components for the dynamic thread pools - MonitorHandlersConfigurator.initializeMonitorHandlers(monitor, (ConfigurableEnvironment) environment, threadPoolMonitors); - - // Determine whether the task is successfully enabled - // return directly if it has been enabled, and do not start the thread pool repeatedly - if (Boolean.TRUE.equals(active.get())) - return; - - // Expose metric endpoints based on the configured collect types - List collectTypes = Arrays.asList(monitor.getCollectTypes().split(",")); - if (collectTypes.contains(MonitorCollectTypeEnum.MICROMETER.getValue())) { - MonitorMetricEndpoint.startPrometheusEndpoint(); - } - - // Schedule periodic collection of metrics from the thread pools - Runnable scheduledTask = scheduleRunnable(); - collectScheduledExecutor.scheduleWithFixedDelay(scheduledTask, monitor.getInitialDelay(), monitor.getCollectInterval(), TimeUnit.MILLISECONDS); - - active.set(true); - if (ThreadPoolExecutorRegistry.getThreadPoolExecutorSize() > 0) { - LOGGER.info("[Hippo4j-Agent] Dynamic thread pool: [{}]. The dynamic thread pool starts data collection and reporting.", ThreadPoolExecutorRegistry.getThreadPoolExecutorSize()); - } - } - - /** - * Returns a Runnable task that collects metrics from the dynamic thread pools. - *

- * This method is used to create a task that periodically iterates over the - * registered thread pool monitors and collects their metrics. If an exception - * occurs during the collection, it is logged. - *

- * - * @return A Runnable task that performs the metrics collection. - */ - private static Runnable scheduleRunnable() { - return () -> { - for (ThreadPoolMonitor each : threadPoolMonitors) { - try { - each.collect(); - } catch (Throwable ex) { - LOGGER.error("[Hippo4j-Agent] Error monitoring the running status of dynamic thread pool. Type: {}", each.getType(), ex); - } - } - }; - } - -} diff --git a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/toolkit/SpringPropertyBinder.java b/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/toolkit/SpringPropertyBinder.java deleted file mode 100644 index 22a6bc62..00000000 --- a/agent/hippo4j-agent-plugin/spring-plugins/spring-plugin-common/src/main/java/cn/hippo4j/agent/plugin/spring/common/toolkit/SpringPropertyBinder.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.spring.common.toolkit; - -import cn.hippo4j.threadpool.dynamic.mode.config.parser.ConfigFileTypeEnum; -import org.springframework.beans.BeanWrapper; -import org.springframework.beans.BeanWrapperImpl; -import org.springframework.core.env.Environment; -import org.springframework.core.env.PropertySource; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; - -import java.beans.PropertyEditorSupport; -import java.util.*; - -/** - * CustomPropertyBinder is a utility class for binding properties from Spring's Environment - * to Java objects based on a given prefix. This is useful for dynamically binding configurations - * in Spring applications where configuration properties are organized hierarchically and need to be - * mapped to corresponding Java objects. - * - *

This class handles complex property structures, including nested properties and collections, - * ensuring that all properties prefixed with the specified string are correctly bound to the target - * Java object.

- */ -public class SpringPropertyBinder { - - /** - * Binds properties from the Spring Environment to an instance of the specified configuration class. - * - * @param environment the Spring Environment containing property sources. - * @param prefix the prefix to filter properties for binding (e.g., "spring.dynamic.thread-pool"). - * @param clazz the class type of the configuration object to bind properties to. - * @param the type of the configuration class. - * @return an instance of the configuration class with properties bound from the environment. - * @throws RuntimeException if there is an error instantiating the configuration class or binding properties. - */ - public static T bindProperties(Environment environment, String prefix, Class clazz) { - try { - // Create an instance of the target class - T instance = clazz.getDeclaredConstructor().newInstance(); - BeanWrapper beanWrapper = new BeanWrapperImpl(instance); - - // Register custom editor for ConfigFileTypeEnum to handle specific type conversions - beanWrapper.registerCustomEditor(ConfigFileTypeEnum.class, new ConfigFileTypeEnumEditor()); - - // Iterate over all property keys that match the given prefix - for (String key : getAllPropertyKeys(environment, prefix)) { - String propertyName = key.substring(prefix.length() + 1); // Remove prefix from the property key - String[] tokens = propertyName.split("\\."); // Split the property name by dot for nested properties - setPropertyValue(tokens, beanWrapper, environment.getProperty(key)); // Set the property value recursively - } - - return instance; - } catch (Exception e) { - throw new RuntimeException("Unable to bind properties to " + clazz.getName(), e); - } - } - - /** - * Binds properties from a map to an instance of the specified configuration class. - * - * @param configInfo a map containing property paths and their values. - * @param prefix the prefix to filter properties for binding (e.g., "spring.dynamic.thread-pool"). - * @param clazz the class type of the configuration object to bind properties to. - * @param the type of the configuration class. - * @return an instance of the configuration class with properties bound from the configInfo map. - */ - public static T bindProperties(Map configInfo, String prefix, Class clazz) { - try { - // Create an instance of the target class - T instance = clazz.getDeclaredConstructor().newInstance(); - BeanWrapper beanWrapper = new BeanWrapperImpl(instance); - - // Register custom editor for specific type conversions (if needed) - beanWrapper.registerCustomEditor(ConfigFileTypeEnum.class, new ConfigFileTypeEnumEditor()); - - // Iterate over all property keys that match the given prefix in the configInfo map - for (Map.Entry entry : configInfo.entrySet()) { - String key = entry.getKey().toString(); - if (key.startsWith(prefix)) { - String propertyName = key.substring(prefix.length() + 1); // Remove prefix from the property key - String[] tokens = propertyName.split("\\."); // Split the property name by dot for nested properties - setPropertyValue(tokens, beanWrapper, entry.getValue().toString()); // Set the property value recursively - } - } - return instance; - } catch (Exception e) { - throw new RuntimeException("Unable to bind properties to " + clazz.getName(), e); - } - } - - /** - * Recursively sets property values on the target object, handling nested properties and collections. - * - * @param tokens an array of property path tokens (e.g., ["nested", "property", "name"]). - * @param beanWrapper the BeanWrapper instance used to manipulate the target object. - * @param value the value to set on the target property. - */ - private static void setPropertyValue(String[] tokens, BeanWrapper beanWrapper, String value) { - for (int i = 0; i < tokens.length - 1; i++) { - String token = tokens[i]; - - if (token.matches(".*\\[\\d+\\]$")) { // Handle array/list property - token = token.substring(0, token.indexOf('[')); - int index = Integer.parseInt(tokens[i].substring(token.length() + 1, tokens[i].length() - 1)); - - token = convertToCamelCase(token); // Convert token to camelCase if necessary - List list = (List) beanWrapper.getPropertyValue(token); - if (list == null) { - list = new ArrayList<>(); - beanWrapper.setPropertyValue(convertToCamelCase(token), list); // Initialize the list if it's null - } - - // Ensure the list has enough size to accommodate the index - if (list.size() <= index) { - try { - // Instantiate the list element if it does not exist - list.add(index, beanWrapper.getPropertyTypeDescriptor(token) - .getElementTypeDescriptor().getType().newInstance()); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - // Move the beanWrapper context to the current list element - beanWrapper = new BeanWrapperImpl(list.get(index)); - } else { // Handle simple or nested property - Object nestedObject = beanWrapper.getPropertyValue(token); - if (nestedObject == null) { - Class nestedClass = beanWrapper.getPropertyType(token); - if (Map.class.isAssignableFrom(nestedClass)) { - nestedObject = new HashMap<>(); // Initialize nested Map if necessary - } else { - try { - nestedObject = nestedClass.getDeclaredConstructor().newInstance(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - beanWrapper.setPropertyValue(convertToCamelCase(token), nestedObject); - } - // Move the beanWrapper context to the nested object - beanWrapper = new BeanWrapperImpl(nestedObject); - } - } - - // Finally, set the actual property value on the resolved object - String finalPropertyName = tokens[tokens.length - 1]; - Object currentObject = beanWrapper.getWrappedInstance(); - if (currentObject instanceof Map) { - // If the current object is a Map, set the value as a key-value pair - ((Map) currentObject).put(finalPropertyName, value); - } else { - // Otherwise, set it as a simple property - beanWrapper.setPropertyValue(convertToCamelCase(finalPropertyName), value); - } - } - - /** - * Retrieves all property keys from the environment that start with the given prefix. - * - * @param environment the Spring Environment containing property sources. - * @param prefix the prefix to filter property keys. - * @return a set of property keys that match the prefix. - */ - private static Set getAllPropertyKeys(Environment environment, String prefix) { - Set keys = new HashSet<>(); - // Iterate through all property sources in the environment - for (PropertySource propertySource : ((ConfigurableEnvironment) environment).getPropertySources()) { - if (propertySource instanceof MapPropertySource) { - Map source = ((MapPropertySource) propertySource).getSource(); - // Collect keys that start with the specified prefix - for (String key : source.keySet()) { - if (key.startsWith(prefix)) { - keys.add(key); - } - } - } - } - return keys; - } - - /** - * Converts a dashed-separated string to camelCase. - *

- * For example, "my-property-name" -> "myPropertyName". - * - * @param dashed the dashed-separated string to be converted. - * @return the camelCase representation of the input string. - */ - private static String convertToCamelCase(String dashed) { - String[] parts = dashed.split("-"); - return Arrays.stream(parts) - .map(part -> part.substring(0, 1).toUpperCase() + part.substring(1)) // Capitalize each part - .reduce((first, second) -> first + second) // Concatenate all parts together - .map(result -> result.substring(0, 1).toLowerCase() + result.substring(1)) // Lowercase the first letter - .orElse(dashed); - } - - /** - * ConfigFileTypeEnumEditor is a custom property editor for converting string representations - * of {@link ConfigFileTypeEnum} into the corresponding enum instances. - *

- * This editor is useful in scenarios where properties are read as strings but need to be - * converted to enum types for further processing. - */ - public static class ConfigFileTypeEnumEditor extends PropertyEditorSupport { - - /** - * Converts the given text value to the corresponding {@link ConfigFileTypeEnum} instance. - *

- * This method overrides the default implementation to parse the input string and convert - * it into a {@link ConfigFileTypeEnum}. If the input string does not match any known enum - * value, an {@link IllegalArgumentException} will be thrown. - * - * @param text the string representation of the enum to be converted. - * @throws IllegalArgumentException if the text does not match any known enum value. - */ - @Override - public void setAsText(String text) throws IllegalArgumentException { - setValue(ConfigFileTypeEnum.of(text)); - } - } - -} diff --git a/agent/hippo4j-agent-plugin/threadpool-plugin/pom.xml b/agent/hippo4j-agent-plugin/threadpool-plugin/pom.xml deleted file mode 100644 index 16517f4c..00000000 --- a/agent/hippo4j-agent-plugin/threadpool-plugin/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-agent-plugin - ${revision} - - - hippo4j-agent-threadpool-plugin - - - - cn.hippo4j - hippo4j-threadpool-core - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-infra-common - ${project.version} - - - \ No newline at end of file diff --git a/agent/hippo4j-agent-plugin/threadpool-plugin/src/main/java/cn/hippo4j/agent/plugin/thread/pool/define/ThreadPoolExecutorInstrumentation.java b/agent/hippo4j-agent-plugin/threadpool-plugin/src/main/java/cn/hippo4j/agent/plugin/thread/pool/define/ThreadPoolExecutorInstrumentation.java deleted file mode 100644 index 0480cdc7..00000000 --- a/agent/hippo4j-agent-plugin/threadpool-plugin/src/main/java/cn/hippo4j/agent/plugin/thread/pool/define/ThreadPoolExecutorInstrumentation.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.thread.pool.define; - -import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import cn.hippo4j.agent.core.plugin.match.ClassMatch; -import cn.hippo4j.agent.core.plugin.match.NameMatch; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -import static net.bytebuddy.matcher.ElementMatchers.takesArguments; - -/** - * Thread pool executor instrumentation - */ -public class ThreadPoolExecutorInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - - private static final String ENHANCE_CLASS = "java.util.concurrent.ThreadPoolExecutor"; - - private static final String CONSTRUCTOR_INTERCEPT_CLASS = "cn.hippo4j.agent.plugin.thread.pool.interceptor.ThreadPoolExecutorConstructorMethodInterceptor"; - - private static final int CONSTRUCTOR_INTERCEPT_PARAMETER_LENGTH = 7; - - @Override - protected ClassMatch enhanceClass() { - return NameMatch.byName(ENHANCE_CLASS); - } - - @Override - public boolean isBootstrapInstrumentation() { - return true; - } - - /** - * The constructor method that only intercepts all parameters prevents repeated interception. - */ - @Override - public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[]{ - new ConstructorInterceptPoint() { - - @Override - public ElementMatcher getConstructorMatcher() { - return takesArguments(CONSTRUCTOR_INTERCEPT_PARAMETER_LENGTH); - } - - @Override - public String getConstructorInterceptor() { - return CONSTRUCTOR_INTERCEPT_CLASS; - } - } - }; - } - - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[0]; - } -} diff --git a/agent/hippo4j-agent-plugin/threadpool-plugin/src/main/java/cn/hippo4j/agent/plugin/thread/pool/interceptor/ThreadPoolExecutorConstructorMethodInterceptor.java b/agent/hippo4j-agent-plugin/threadpool-plugin/src/main/java/cn/hippo4j/agent/plugin/thread/pool/interceptor/ThreadPoolExecutorConstructorMethodInterceptor.java deleted file mode 100644 index db1019d4..00000000 --- a/agent/hippo4j-agent-plugin/threadpool-plugin/src/main/java/cn/hippo4j/agent/plugin/thread/pool/interceptor/ThreadPoolExecutorConstructorMethodInterceptor.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.agent.plugin.thread.pool.interceptor; - -import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; -import cn.hippo4j.agent.core.util.CollectionUtil; -import cn.hippo4j.agent.core.util.StringUtil; -import cn.hippo4j.common.conf.Config; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.ThreadPoolExecutor; - -/** - * Thread pool executor constructor method interceptor - */ -public class ThreadPoolExecutorConstructorMethodInterceptor implements InstanceConstructorInterceptor { - - private static final ILog LOGGER = LogManager.getLogger(ThreadPoolExecutorConstructorMethodInterceptor.class); - - private static final List EXCLUDE_STACK_TRACE_ELEMENT_CLASS_PREFIX = Arrays.asList("java", "cn.hippo4j.agent"); - - private static final int INITIAL_CAPACITY = 3; - - @Override - public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { - - List stackTraceElements = getStackTraceElements(); - if (CollectionUtil.isEmpty(stackTraceElements)) { - return; - } - StackTraceElement declaredClassStackTraceElement = stackTraceElements.get(0); - String declaredClassName = declaredClassStackTraceElement.getClassName(); - Class declaredClass = null; - try { - declaredClass = Thread.currentThread().getContextClassLoader().loadClass(declaredClassName); - } catch (ClassNotFoundException e) { - // The thread pool in the Agent plug-in is loaded by AgentclassLodaer. - // Due to the delegation model, it can only be searched upwards, so searching here will result in ClassNotFount. - // Because the parent of AgentClassLoader is AppclassLoder, it is ignored here ,skip the enhancement logic - LOGGER.debug("searching {} result in ClassNotFount , so skip the enhancement logic", declaredClassName); - return; - } - ThreadPoolExecutorRegistry.REFERENCED_CLASS_MAP.put((ThreadPoolExecutor) objInst, declaredClass); - } - - private List getStackTraceElements() { - StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); - int i; - for (i = 0; i < stackTraceElements.length; i++) { - String fullClassName = stackTraceElements[i].getClassName(); - if (isBusinessStackTraceClassName(fullClassName)) { - if (isExcludeThreadPoolClass(fullClassName)) { - return Collections.emptyList(); - } else { - break; - } - } - } - - List result = new ArrayList<>(INITIAL_CAPACITY); // Find up to three layers - for (int j = 0; i < stackTraceElements.length && j < INITIAL_CAPACITY; i++, j++) { - String fullClassName = stackTraceElements[i].getClassName(); - if (isExcludeThreadPoolClass(fullClassName)) { - break; - } else { - result.add(stackTraceElements[i]); - } - } - - return result; - } - - private boolean isBusinessStackTraceClassName(String className) { - for (String prefix : EXCLUDE_STACK_TRACE_ELEMENT_CLASS_PREFIX) { - if (className.startsWith(prefix)) { - return false; - } - } - return true; - } - private boolean isExcludeThreadPoolClass(String className) { - if (StringUtil.isBlank(className)) { - return true; - } - List excludePackagePrefix = Config.Plugin.ThreadPool.EXCLUDE_PACKAGE_PREFIX; - for (String excludePrefix : excludePackagePrefix) { - if (className.startsWith(excludePrefix)) { - return true; - } - } - return false; - } -} diff --git a/agent/hippo4j-agent-plugin/threadpool-plugin/src/main/resources/hippo4j-plugin.def b/agent/hippo4j-agent-plugin/threadpool-plugin/src/main/resources/hippo4j-plugin.def deleted file mode 100644 index d84d9489..00000000 --- a/agent/hippo4j-agent-plugin/threadpool-plugin/src/main/resources/hippo4j-plugin.def +++ /dev/null @@ -1,17 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -thread-pool-plugin=cn.hippo4j.agent.plugin.thread.pool.define.ThreadPoolExecutorInstrumentation \ No newline at end of file diff --git a/agent/pom.xml b/agent/pom.xml deleted file mode 100644 index 4f7c0abb..00000000 --- a/agent/pom.xml +++ /dev/null @@ -1,270 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-all - ${revision} - - hippo4j-agent - pom - - - hippo4j-agent-core - hippo4j-agent-plugin - hippo4j-agent-bootstrap - - - - cn.hippo4j.agent.dependencies - 1.8 - 4.13.1 - 2.0.7 - 3.5.13 - 1.18.34 - - - 1.12.13 - 1.44.0 - 4.1.79.Final - 2.8.9 - 1.6.2 - 1.3.2 - 3.1 - - 6.0.53 - - - 0.6.1 - 1.6.0 - 1.8 - 2.10 - 2.8.2 - 3.1.0 - 2.22.0 - 3.2.0 - 3.1.0 - 3.1.1 - 3.0.0-M2 - 3.8.0 - 3.1.0 - 3.0.1 - 2.5 - 4.3.0 - 3.1.0 - 1.33 - 1.5 - true - 1.7.25 - 32.0.0-jre - 2.16.0 - - - - - - cn.hippo4j - hippo4j-agent-core - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-common - ${project.version} - provided - - - com.google.code.gson - gson - ${gson.version} - - - com.google.guava - guava - ${guava.version} - - - net.bytebuddy - byte-buddy - ${bytebuddy.version} - - - org.slf4j - slf4j-api - ${slf4j.version} - - - org.openjdk.jmh - jmh-core - ${jmh.version} - test - - - org.projectlombok - lombok - ${lombok.version} - provided - - - javax.annotation - javax.annotation-api - ${javax.annotation-api.version} - provided - - - junit - junit - ${junit.version} - test - - - org.powermock - powermock-module-junit4 - ${powermock.version} - test - - - org.powermock - powermock-api-mockito2 - ${powermock.version} - test - - - net.bytebuddy - byte-buddy-agent - ${bytebuddy.version} - - - org.objenesis - objenesis - ${objenesis.version} - - - com.github.tomakehurst - wiremock - ${wiremock.version} - test - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - test - - - cn.hippo4j - dubbo-plugin - ${project.version} - - - - - - ${project.artifactId}-${project.version} - - - - - - io.takari - maven - ${takari-maven-plugin.version} - - - maven-antrun-plugin - ${maven-antrun-plugin.version} - - - maven-deploy-plugin - ${maven-deploy-plugin.version} - - - maven-assembly-plugin - ${maven-assembly-plugin.version} - - - maven-failsafe-plugin - ${maven-failsafe-plugin.version} - - - maven-jar-plugin - ${maven-jar-plugin.version} - - true - - - - maven-shade-plugin - ${maven-shade-plugin.version} - - - - - - kr.motd.maven - os-maven-plugin - ${os-maven-plugin.version} - - - initialize - - detect - - - - - - maven-enforcer-plugin - ${maven-enforcer-plugin.version} - - - enforce-java - - enforce - - validate - - - - - 1.8 - - - - - - - - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${compiler.version} - ${compiler.version} - ${project.build.sourceEncoding} - - - - maven-resources-plugin - ${maven-resource-plugin.version} - - ${project.build.sourceEncoding} - - - - maven-source-plugin - ${maven-source-plugin.version} - - - attach-sources - none - - jar - - - - - - - \ No newline at end of file diff --git a/checkstyle/hippo4j_checkstyle.xml b/checkstyle/hippo4j_checkstyle.xml deleted file mode 100644 index c45a921f..00000000 --- a/checkstyle/hippo4j_checkstyle.xml +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/checkstyle/hippo4j_checkstyle_suppression.xml b/checkstyle/hippo4j_checkstyle_suppression.xml deleted file mode 100644 index 59487b95..00000000 --- a/checkstyle/hippo4j_checkstyle_suppression.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dependencies/pom.xml b/dependencies/pom.xml deleted file mode 100644 index af91cef3..00000000 --- a/dependencies/pom.xml +++ /dev/null @@ -1,221 +0,0 @@ - - - 4.0.0 - cn.hippo4j - hippo4j-dependencies - ${revision} - pom - Hippo4j Dependencies - - - 2.0.0-SNAPSHOT - 6.5.0 - 2.9.3 - 6.1.5.Final - 0.9.0 - 2.11.1 - 2.1.214 - 3.12.4 - 3.0.5 - 2.6.12 - 1.7.7 - 1.8.4 - 2.0.4 - 3.4.2 - 2.3.2.RELEASE - 1.9.1 - 2.2.4.RELEASE - 0.7.3 - 1.7.2 - 2.2.2 - 4.1.56.Final - 6.8.17 - 9.0.55 - 5.1.0 - 2.2.6.RELEASE - 3.1.0 - 2.2.9.RELEASE - 2.2.5.RELEASE - - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - com.baomidou - mybatis-plus-boot-starter - ${mybatis-plus.version} - - - com.github.dozermapper - dozer-core - ${dozer.version} - - - org.slf4j - slf4j-api - ${slf4j-api.version} - - - org.apache.dubbo - dubbo - ${dubbo.version} - true - - - com.alibaba.nacos - nacos-client - ${nacos-client.version} - - - com.alibaba - dubbo - ${alibaba-dubbo.version} - - - io.micrometer - micrometer-core - ${micrometer-core.version} - - - com.ctrip.framework.apollo - apollo-client - ${apollo.version} - - - com.github.ben-manes.caffeine - caffeine - ${caffeine.version} - - - org.hibernate.validator - hibernate-validator - ${hibernate-validator.version} - - - io.jsonwebtoken - jjwt - ${jjwt.version} - - - com.h2database - h2 - ${h2.version} - runtime - - - org.springframework.cloud - spring-cloud-starter-consul-config - ${consul.version} - - - io.etcd - jetcd-core - ${jetcd.version} - - - com.tencent.polaris - polaris-configuration-factory - ${polaris.version} - - - com.tencent.polaris - router-rule - - - com.tencent.polaris - router-nearby - - - com.tencent.polaris - router-metadata - - - com.tencent.polaris - router-canary - - - com.tencent.polaris - router-set - - - com.tencent.polaris - router-isolated - - - com.tencent.polaris - router-healthy - - - io.grpc - grpc-all - - - - - org.apache.rocketmq - rocketmq-spring-boot-starter - ${rocketmq.version} - - - io.netty - netty-all - ${netty.version} - - - org.elasticsearch - elasticsearch - ${elasticsearch.version} - - - org.elasticsearch.client - transport - ${elasticsearch.version} - - - org.elasticsearch.client - elasticsearch-rest-high-level-client - ${elasticsearch.version} - - - org.apache.tomcat.embed - tomcat-embed-core - ${tomcat-embed-core.version} - - - org.apache.curator - curator-framework - ${curator-framework.version} - - - com.alibaba.cloud - spring-cloud-starter-stream-rocketmq - ${spring-cloud-starter-stream-rocketmq.version} - - - org.springframework.cloud - spring-cloud-starter-stream-rabbit - ${spring-cloud-starter-stream-rabbitmq.version} - - - org.springframework.cloud - spring-cloud-starter-netflix-hystrix - ${spring-cloud-starter-netflix-hystrix.version} - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - ${spring-cloud-starter-alibaba-nacos-config.version} - - - - \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index bb14f76c..00000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -FROM openjdk:8-jre-slim -MAINTAINER lijianxin - -ENV DATASOURCE_MODE="h2" \ - DATASOURCE_HOST="127.0.0.1" \ - DATASOURCE_PORT="3306" \ - DATASOURCE_DB="hippo4j_manager" \ - DATASOURCE_USERNAME="root" \ - DATASOURCE_PASSWORD="root" \ - BASE_DIR="/opt/hippo4j" - -ENV TZ=PRC -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone - -ADD conf/hippo4j-logback.xml ${BASE_DIR}/conf/hippo4j-logback.xml -ADD conf/application.properties ${BASE_DIR}/conf/application.properties -ADD conf/application-h2.properties ${BASE_DIR}/conf/application-h2.properties -ADD target/hippo4j-server.jar ${BASE_DIR}/hippo4j-server.jar -ADD docker-startup.sh ${BASE_DIR}/docker-startup.sh - -WORKDIR ${BASE_DIR} -RUN chmod +x docker-startup.sh - -ENTRYPOINT ["./docker-startup.sh"] - \ No newline at end of file diff --git a/docker/docker-startup.sh b/docker/docker-startup.sh deleted file mode 100644 index ccbda789..00000000 --- a/docker/docker-startup.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -export JAVA_HOME -export JAVA="$JAVA_HOME/bin/java" - -export SERVER="hippo4j-server" - -JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext" -JAVA_OPT="${JAVA_OPT} -Xloggc:${BASE_DIR}/logs/hippo4j_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M" - -JAVA_OPT="${JAVA_OPT} -Xms1024m -Xmx1024m -Xmn512m" -JAVA_OPT="${JAVA_OPT} -Dhippo4j.standalone=true" -JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof" -JAVA_OPT="${JAVA_OPT} -Dhippo4j.home=${BASE_DIR}" - -JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}" -JAVA_OPT="${JAVA_OPT} --logging.config=${BASE_DIR}/conf/hippo4j-logback.xml" -JAVA_OPT="${JAVA_OPT} --server.max-http-header-size=524288" -JAVA_OPT="${JAVA_OPT} --server.tomcat.basedir=${BASE_DIR}/bin" - -if [[ "${DATASOURCE_MODE}" == "mysql" ]]; then - JAVA_OPT="${JAVA_OPT} --spring.profiles.active=mysql --hippo4j.database.init_enable=false " - JAVA_OPT="${JAVA_OPT} --spring.datasource.url=jdbc:mysql://${DATASOURCE_HOST}:${DATASOURCE_PORT}/${DATASOURCE_DB}?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8 " - JAVA_OPT="${JAVA_OPT} --spring.datasource.username=${DATASOURCE_USERNAME} --spring.datasource.password=${DATASOURCE_PASSWORD} " -elif [[ "${DATASOURCE_MODE}" == "h2" ]]; then - JAVA_OPT="${JAVA_OPT} --spring.profiles.active=h2 --spring.datasource.url=jdbc:h2:file:${BASE_DIR}/h2_hippo4j;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL" -else - echo "hippo4j DATASOURCE_MODE is error, value ${DATASOURCE_MODE}, use default h2" -fi - -if [ ! -d "${BASE_DIR}/logs" ]; then - mkdir ${BASE_DIR}/logs -fi - -echo "$JAVA ${JAVA_OPT}" - -echo "hippo4j is starting with standalone" - -if [ ! -f "${BASE_DIR}/logs/start.out" ]; then - touch "${BASE_DIR}/logs/start.out" -fi - -echo "$JAVA ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 & -java -jar hippo4j-server.jar ${JAVA_OPT} -echo "hippo4j is starting,you can check the ${BASE_DIR}/logs/" diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 03c9d56e..00000000 --- a/docs/README.md +++ /dev/null @@ -1,15 +0,0 @@ - -## 启动 - -> 依赖 node 版本 16+ - -```shell script -npm i -npm run start -``` - -## 部署 - -```shell script -GIT_SSH_COMMAND="ssh -i ~/.ssh/hippo4j" USE_SSH=true docusaurus deploy -``` diff --git a/docs/babel.config.js b/docs/babel.config.js deleted file mode 100644 index e00595da..00000000 --- a/docs/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: [require.resolve('@docusaurus/core/lib/babel/preset')], -}; diff --git a/docs/blog/2022-06-06-hippo4j/index.md b/docs/blog/2022-06-06-hippo4j/index.md deleted file mode 100644 index e5aaba49..00000000 --- a/docs/blog/2022-06-06-hippo4j/index.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -slug: Hippo-4J发布1.3.0版本 -title: Hippo-4J发布1.3.0版本 -authors: [xiaomage] -tags: [hippo4j, release, 1.3.0] ---- - -大家好,我是 **小马哥**。 - -Hippo4j 距离上一个版本 1.2.1 已经过去一个月的时间。在此期间,由 **8 位贡献者** 提交了 **170+ commits**,正式发布 **1.3.0** 版本。 - -注:这是一个 **兼容历史版本** 的重大升级。 - -## HIPPO-4J 1.3.0 - -### Feature - -1. 添加 RabbitMQ 线程池监控及动态变更 -2. 添加 RocketMQ 线程池监控及动态变更 -3. 添加 Dubbo 线程池监控及动态变更 -4. 添加 SpringCloud Stream RocketMQ 消费线程池监控及动态变更 - -### Refactor - -1. 重构容器线程池查询及修改功能 -2. 优化配置中心触发监听后,所执行的数据变更逻辑 - -### Optimize - -1. 前端控制台删除无用组件 -2. 服务端页面字段未显示中文 -3. 控制台 UI 优化 -4. 修改线程池实例后实时刷新列表参数 -5. 容器线程池编辑仅限 Admin 权限 -6. SpringBoot Starter 变更包路径 - -### BUG - -1. 修复 SpringBoot Nacos 动态刷新不生效 -2. 报警配置 alarm=false 不配置通知报警平台和接收人报错 - -## 三方框架线程池适配 - -Hippo4j 1.3.0 最大的功能发布就是开发出了 **适配三方框架的基础框架**。 - -目前已完成 **Dubbo、RabbitMQ、RocketMQ、RocketMQSpringCloudStream** 的线程池适配,后续还会接入 **Kafka、Hystrix** 等框架或中间件的线程池适配。 - -### 引入适配三方框架 Jar 包 - -引入 Hippo4j server 或 core 的 maven jar 坐标后,还需要引入对应的框架适配 jar: - -```xml - - cn.hippo4j - - hippo4j-spring-boot-starter-adapter-dubbo - - hippo4j-spring-boot-starter-adapter-rabbitmq - - hippo4j-spring-boot-starter-adapter-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq - 1.3.0 - -``` - -如果想觉得引入多个 jar 包繁琐,可以仅需引入一个全量包,Hippo4j 框架底层会根据各中间件的条件,判断加载具体线程池适配器。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-adapter-all - 1.3.0 - -``` - -### HIPPO-4J Server - -Hippo4j server 引入上述适配 jar 包后,即可在 Hippo4j server 的控制台进行查看及修改三方框架线程池。 - -![图1 线程池适配列表](https://oss.open8gu.com/image-20220531194810047.png) - - - -点击编辑即可修改该 Java 应用对应的框架底层线程池。 - -![图2 修改三方线程池](https://oss.open8gu.com/image-20220605152549732.png) - - - -点击 **全部修改** 按钮可以修改当前组下所有应用实例的线程池配置。 - -修改成功后,应用控制台打印以下日志,即为修改成功。 - -```java -[input] RocketMQ consumption thread pool parameter change. coreSize :: 1 => 10, maximumSize :: 1 => 10 -``` - -### HIPPO-4J Core - -Hippo4j core 除了依赖上述适配 Jar 包外,还需要在配置中心添加以下配置项。 - -```yaml -spring: - dynamic: - thread-pool: - # 省略其它配置 - adapter-executors: - # threadPoolKey 代表线程池标识 - - threadPoolKey: 'input' - # mark 为三方线程池框架类型,参见文初已支持框架集合 - mark: 'RocketMQSpringCloudStream' - corePoolSize: 10 - maximumPoolSize: 10 -``` - -## Gitee GVP - -Hippo4j 获得了一些宝贵的荣誉,这属于每一位对 Hippo4j 做出过贡献的成员。 - -![图3 GVP 证书](https://oss.open8gu.com/170607238-7308c9be-1d63-46a6-852c-eef2e4cf7405.jpeg) - - - -感谢所有为 Hippo4j 做出贡献的开发者! - -https://github.com/opengoofy/hippo4j/graphs/contributors - -![图4 Hippo4j 开发者](https://oss.open8gu.com/image-20220605151136276.png) - - - -## 最后总结 - -开源不易,如果各位小伙伴看了 Hippo4j 框架后有所收获,希望能帮忙在 Github、Gitee 点个 star,谢谢。 - -**Github**:https://github.com/opengoofy/hippo4j - -**Gitee**:https://gitee.com/mabaiwancn/hippo4j - -目前已有 **10+** 公司在生产环境使用 Hippo4j,如果贵公司使用了 Hippo4j,请在下方 Issue 登记,谢谢。 - -**Issue**:https://github.com/opengoofy/hippo4j/issues/13 - -登记使用不会对公司有任何影响,仅为了扩大 Hippo4j 影响力,帮助它能走得更远。 diff --git a/docs/blog/authors.yml b/docs/blog/authors.yml deleted file mode 100644 index ffffe8d4..00000000 --- a/docs/blog/authors.yml +++ /dev/null @@ -1,5 +0,0 @@ -xiaomage: - name: 小马哥 - title: hippo4j 作者 - url: https://github.com/magegoofy - image_url: https://avatars.githubusercontent.com/u/77398366?v=4 diff --git a/docs/community/_category_.json b/docs/community/_category_.json deleted file mode 100644 index bcd256c9..00000000 --- a/docs/community/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "社区", - "position": 1, - "link": { - "type": "generated-index" - } -} diff --git a/docs/community/contributor.md b/docs/community/contributor.md deleted file mode 100644 index f40d60b1..00000000 --- a/docs/community/contributor.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -id: contributor-guide -sidebar_position: 1 -title: 贡献指南 ---- - -Git Commit Log 尽量使用英文。 - -Pull Request 尽量保持单一,不同语义的代码贡献应拆分多个 Pull Request。 - -为了让您的 GitHub ID 显示在 Contributor 列表中,别忘了以下设置: - -```shell -git config --global user.name "username" -git config --global user.email "GitHub 账号邮箱" -``` diff --git a/docs/community/dev_convention/_category_.json b/docs/community/dev_convention/_category_.json deleted file mode 100644 index cb875453..00000000 --- a/docs/community/dev_convention/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "贡献规约", - "position": 2, - "link": { - "type": "generated-index" - } -} diff --git a/docs/community/dev_convention/code.md b/docs/community/dev_convention/code.md deleted file mode 100644 index ce3d6018..00000000 --- a/docs/community/dev_convention/code.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -sidebar_position: 2 -title: 代码规约 ---- - -1. 代码提交前,执行 `mvn spotless:apply` 保证代码格式符合规范。 -2. 代码中不要出现无意义的空行。 diff --git a/docs/community/dev_convention/document.md b/docs/community/dev_convention/document.md deleted file mode 100644 index 7f0d65a2..00000000 --- a/docs/community/dev_convention/document.md +++ /dev/null @@ -1,226 +0,0 @@ ---- -sidebar_position: 1 -title: 文档规约 ---- - -文档引用自:[中文文案排版指北](https://github.com/sparanoid/chinese-copywriting-guidelines) - -## 空格 - -> 「有研究顯示,打字的時候不喜歡在中文和英文之間加空格的人,感情路都走得很辛苦,有七成的比例會在 34 歲的時候跟自己不愛的人結婚,而其餘三成的人最後只能把遺產留給自己的貓。畢竟愛情跟書寫都需要適時地留白。 -> -> 與大家共勉之。」——[vinta/paranoid-auto-spacing](https://github.com/vinta/pangu.js) - -### 中英文之間需要增加空格 - -正確: - -> 在 LeanCloud 上,數據儲存是圍繞 `AVObject` 進行的。 - -錯誤: - -> 在LeanCloud上,數據儲存是圍繞`AVObject`進行的。 - -> 在 LeanCloud上,數據儲存是圍繞`AVObject` 進行的。 - -完整的正確用法: - -> 在 LeanCloud 上,數據儲存是圍繞 `AVObject` 進行的。每個 `AVObject` 都包含了與 JSON 兼容的 key-value 對應的數據。數據是 schema-free 的,你不需要在每個 `AVObject` 上提前指定存在哪些键,只要直接設定對應的 key-value 即可。 - -例外:「豆瓣FM」等產品名詞,按照官方所定義的格式書寫。 - -### 中文與數字之間需要增加空格 - -正確: - -> 今天出去買菜花了 5000 元。 - -錯誤: - -> 今天出去買菜花了 5000元。 - -> 今天出去買菜花了5000元。 - -### 數字與單位之間需要增加空格 - -正確: - -> 我家的光纖入屋寬頻有 10 Gbps,SSD 一共有 20 TB。 - -錯誤: - -> 我家的光纖入屋寬頻有 10Gbps,SSD 一共有 20TB。 - -例外:度數/百分比與數字之間不需要增加空格: - -正確: - -> 角度為 90° 的角,就是直角。 - -> 新 MacBook Pro 有 15% 的 CPU 性能提升。 - -錯誤: - -> 角度為 90 ° 的角,就是直角。 - -> 新 MacBook Pro 有 15 % 的 CPU 性能提升。 - -### 全形標點與其他字符之間不加空格 - -正確: - -> 剛剛買了一部 iPhone,好開心! - -錯誤: - -> 剛剛買了一部 iPhone ,好開心! - -> 剛剛買了一部 iPhone, 好開心! - -### `text-spacing` to the rescue? - -CSS Text Module Level 4 的 [`text-spacing`](https://www.w3.org/TR/css-text-4/#text-spacing-property) 和 Microsoft 的 [`-ms-text-autospace`](https://msdn.microsoft.com/library/ms531164(v=vs.85).aspx) 可以實現自動為中英文之間增加空白。不過目前並未普及,另外在其他應用場景,例如 macOS、iOS、Windows 等用戶介面目前並不存在這個特性,所以請繼續保持隨手加空格的習慣。 - -## 標點符號 - -### 不重複使用標點符號 - -即使中國大陸的標點符號用法允許重複使用標點符號,但是這麼做會破壞句子的美觀性。 - -正確: - -> 德國隊竟然戰勝了巴西隊! - -> 她竟然對你說「喵」?! - -錯誤: - -> 德國隊竟然戰勝了巴西隊!! - -> 德國隊竟然戰勝了巴西隊!!!!!!!! - -> 她竟然對你說「喵」??!! - -> 她竟然對你說「喵」?!?!??!! - -## 全形和半形 - -不明白什麼是全形(全角)與半形(半角)符號?請查看維基百科條目『[全形和半形](https://zh.wikipedia.org/wiki/%E5%85%A8%E5%BD%A2%E5%92%8C%E5%8D%8A%E5%BD%A2)』。 - -### 使用全形中文標點 - -正確: - -> 嗨!你知道嘛?今天前台的小妹跟我說「喵」了哎! - -> 核磁共振成像(NMRI)是什麼原理都不知道?JFGI! - -錯誤: - -> 嗨! 你知道嘛? 今天前台的小妹跟我說 "喵" 了哎! - -> 嗨!你知道嘛?今天前台的小妹跟我說"喵"了哎! - -> 核磁共振成像 (NMRI) 是什麼原理都不知道? JFGI! - -> 核磁共振成像(NMRI)是什麼原理都不知道?JFGI! - -### 數字使用半形字符 - -正確: - -> 這件蛋糕只賣 1000 元。 - -錯誤: - -> 這件蛋糕只賣 1000 元。 - -例外:在設計稿、宣傳海報中如出現極少量數字的情形時,為方便文字對齊,是可以使用全形數字的。 - -### 遇到完整的英文整句、特殊名詞,其內容使用半形標點 - -正確: - -> 賈伯斯那句話是怎麼說的?「Stay hungry, stay foolish.」 - -> 推薦你閱讀《Hackers & Painters: Big Ideas from the Computer Age》,非常的有趣。 - -錯誤: - -> 賈伯斯那句話是怎麼說的?「Stay hungry,stay foolish。」 - -> 推薦你閱讀《Hackers&Painters:Big Ideas from the Computer Age》,非常的有趣。 - -## 名詞 - -### 專有名詞使用正確的大小寫 - -大小寫相關用法原屬於英文書寫範疇,不屬於本 wiki 討論內容,在這裡只對部分易錯用法進行簡述。 - -正確: - -> 使用 GitHub 登錄 - -> 我們的客戶有 GitHub、Foursquare、Microsoft Corporation、Google、Facebook, Inc.。 - -錯誤: - -> 使用 github 登錄 - -> 使用 GITHUB 登錄 - -> 使用 Github 登錄 - -> 使用 gitHub 登錄 - -> 使用 gイんĤЦ8 登錄 - -> 我們的客戶有 github、foursquare、microsoft corporation、google、facebook, inc.。 - -> 我們的客戶有 GITHUB、FOURSQUARE、MICROSOFT CORPORATION、GOOGLE、FACEBOOK, INC.。 - -> 我們的客戶有 Github、FourSquare、MicroSoft Corporation、Google、FaceBook, Inc.。 - -> 我們的客戶有 gitHub、fourSquare、microSoft Corporation、google、faceBook, Inc.。 - -> 我們的客戶有 gイんĤЦ8、キouЯƧquムгє、๓เςг๏ร๏Ŧt ς๏гק๏гคtเ๏ภn、900913、ƒ4ᄃëв๏๏к, IПᄃ.。 - -注意:當網頁中需要配合整體視覺風格而出現全部大寫/小寫的情形,HTML 中請使用標準的大小寫規範進行書寫;並通過 `text-transform: uppercase;`/`text-transform: lowercase;` 對表現形式進行定義。 - -### 不要使用不道地的縮寫 - -正確: - -> 我們需要一位熟悉 TypeScript、HTML5,至少理解一種框架(如 React、Next.js)的前端開發者。 - -錯誤: - -> 我們需要一位熟悉 Ts、h5,至少理解一種框架(如 RJS、nextjs)的 FED。 - -## 爭議 - -以下用法略帶有個人色彩,即:無論是否遵循下述規則,從語法的角度來講都是**正確**的。 - -### 超連結之間增加空格 - -用法: - -> 請 [提交一個 issue](#) 並分配给相關同事。 - -> 訪問我們網站的最新動態,請 [點擊這裡](#) 進行訂閱! - -對比用法: - -> 請[提交一個 issue](#) 並分配给相關同事。 - -> 訪問我們網站的最新動態,請[點擊這裡](#)進行訂閱! - -### 簡體中文使用直角引號 - -用法: - -> 「老师,『有条不紊』的『紊』是什么意思?」 - -對比用法: - -> “老师,‘有条不紊’的‘紊’是什么意思?” diff --git a/docs/community/faq.md b/docs/community/faq.md deleted file mode 100644 index 0f0fb830..00000000 --- a/docs/community/faq.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -sidebar_position: 5 -title: 常见问题 ---- - -# 常见问题 - -- 租户和项目在 Hippo4j 中是什么意思 -- 控制台线程池管理和线程池实例的区别 -- 示例项目为什么会有跨域请求 -- 更新代码后运行时服务端SQL报错 -- 生产环境如何不启用动态线程池 -- Server 端宕机会影响 Client 运行么 -- Hippo4j 的发布方式是怎样的?如何选择正确的版本 -- 群机器人接受不到通知报警 -- 设置线程池参数优先级问题 -- 线程池实例中修改队列容量参数问题 -- 控制台 SocketTimeoutException: connect timed out - -## 租户和项目在 Hippo4j 中是什么意思 - -Hippo4j 按照租户、项目、线程池的维度划分。 - -举个例子,小编在一家公司的公共组件团队,团队中负责消息、短链接网关等项目。公共组件是租户,消息或短链接就是项目。 - -## 控制台线程池管理和线程池实例的区别 - -在线程池管理中修改线程池参数,客户端并不能实时感知到并变更参数,需要重启客户端。而线程池实例中去对具体的实例修改参数时,客户端无需重启,可以实时感知到参数变化。如果二者针对同一线程池的参数配置不同,则在重启客户端时,客户端会去拉去线程池管理中的参数配置。 - -二者对应的定位:线程池管理中的配置是常态化配置。而线程池实例里的配置变更像是一种临时修改,比如突发的流量激增等场景,并不具备普适性。 - -## 示例项目为什么会有跨域请求 - -~~正常大家在部署时,服务端项目和客户端都在同一网络下,进行内网通信,是没有问题的。~~ - -~~因为示例项目中,服务端部署在外网,而客户端注册到服务端 IP 是内网的,所以不通。~~ - -~~涉及功能:线程池实例-查看、编辑,容器线程池。~~ - -1.2.0 版本后,服务端访问客户端已变成,浏览器访问服务端,服务端转发客户端的形式完成调用,跨域问题已解决。 - -## 更新代码后运行时服务端SQL报错 - -如果更新代码运行功能出错,大概率是因为项目新增或修改了表结构。如版本升级迭代涉及数据库表变更,会额外提供 SQL 变更文件。 - -如若第一次使用,初始化 SQL 脚本地址:[Hippo4j_manager.sql](https://github.com/longtai-cn/hippo4j/blob/develop/hippo4j-server/conf/hippo4j_manager.sql)。 - -> 友情提示:每次执行数据库表或数据变更时,一定要保持提前备份的好习惯。 - -## 生产环境如何不启用动态线程池 - -测试环境已经引入 Hippo4j,暂时不打算上线生产环境。 - -生产环境指定配置 `spring.dynamic.thread-pool.enable=false`,测试环境和生产环境配置就会隔离。 - -## Server 端宕机会影响 Client 运行么 - -不会。Client 端包含对 Server 端的健康检查机制,Server 端不可用时会停止交互,检查到可用时重新建立连接交互。 - -## Hippo4j 的发布方式是怎样的?如何选择正确的版本 - -Hippo4j 发布时可能会涉及到两端发布,分别是 Server 和 Starter。如无特殊说明,**每一次的版本升级将兼容上一版本代码**。 - -- 如涉及 Server 发布,会在 [发布列表页面](https://github.com/longtai-cn/hippo4j/releases) 创建最新的发行版本; -- 如涉及 Starter 发布,将直接推送 Starter Jar 至中央仓库,Server 包版本不变。 - -## 群机器人接受不到通知报警 - -如果是钉钉机器人,需在机器人配置自定义关键字,才可发送成功。如下所示: - -![](https://oss.open8gu.com/image-20220530200133377.png?x-oss-process=image/resize,h_500,w_800) - -如果使用 hippo4j-server,请检查在 hippo4j-server 添加的报警通知记录,是否在客户端项目启动前,因为客户端只有在启动时会去 hippo4j-server 拉取报警通知记录。 - -重启客户端项目,会重新拉取最新报警推送配置,问题解决。 - -## 设置线程池参数优先级问题 - -- 当使用 `@DynamicThreadPool` 进行修饰的方法中和在管理界面设置中同时存在的话,则管理界面设置的优先级最高; -- 如果连接 server 端失败的话,使用 `@DynamicThreadPool` 进行修饰设置的优先级最高。 - -## 线程池实例中修改队列容量参数问题 - -在线程池管理中添加时,只有当选择队列类型为 `ResizableCapacityLinkedBlockingQueue` 时,后续再进行修改容量大小时才会实时的刷新修改成功。 - -## 控制台 SocketTimeoutException: connect timed out - -控制台中触发的某些操作涉及到 hippo4j-server 调用客户端项目。如果 hippo4j-server 部署在测试环境,而客户端项目为本地启动,则会触发该问题。 - -为什么编辑线程池参数不报错?因为线程池的动态变更是客户端主动发起连接,和服务端保持了一个长轮询,所以不存在服务端主动调用客户端行为。 diff --git a/docs/community/sponsor.md b/docs/community/sponsor.md deleted file mode 100644 index 903e3bb8..00000000 --- a/docs/community/sponsor.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -sidebar_position: 6 -title: 支持开源 ---- - -如果您正在使用这个项目并感觉良好,或者是想支持我继续开发,通过以下二维码一次性捐款。 - -在这里承诺将,将收到的所有赞助支持资金完全公开化,且后续资金用途仅 Hippo4j 项目的运转。 - -![](https://oss.open8gu.com/IMG_6719_2.jpg?x-oss-process=image/resize,h_180,w_180) - -感谢给予支持的朋友,您的支持是 Hippo4j 社区前进的动力 🎉 - -| | ID | 赞赏金额 | 时间 | 备注 | -|-----|--|-------|------------|--------------------| -| 1 | 六月飞雪 | 30.00 | 2021-12-30 | 代码设计很优雅的一款框架,继续加油! | -| 2 | 孙大圣 | 26.6 | 2022-03-23 | 学习一下😁😁 | -| 3 | Easy 点 | 66.00 | 2022-04-09 | 好货好技术当加赏 | -| 4 | 捷克 | 30.00 | 2022-05-21 | 非常不错的框架,点赞 | -| 5 | 吃猫的饼干 | 88.00 | 2022-08-21 | 👍 | -| 6 | 不忘初心· | 66.00 | 2022-10-28 | Nice! | -| 7 | 时刻· | 6.00 | 2022-10-30 | -! | diff --git a/docs/community/team.md b/docs/community/team.md deleted file mode 100644 index ae24340a..00000000 --- a/docs/community/team.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -sidebar_position: 3 -title: 团队成员 ---- - -## Hippo4j 团队 - -非常感谢通过开源对 Hippo4j 贡献的开发者,项目始终保持高质量编码,以社区的力量去发展项目,并以项目反馈社区成员。我们期待对开源有兴趣的小伙伴加入团队,与社区共同成长。 - -## 开发者角色 - -Hippo4j 开发者包含 Maintainer、Committer、Contributor 三种角色,每种角色的标准定义如下。 - -### 1. Maintainer - -Maintainer 是对 Hippo4j 项目的演进和发展做出显著贡献的个人。具体包含以下的标准: - -- 完成多个关键模块或者工程的设计与开发,是项目的核心开发人员; -- 持续的投入和激情,能够积极参与社区、官网、Issue、PR 等项目相关事项的维护; -- 在社区中具有有目共睹的影响力,能够代表 Hippo4j 参加重要的社区会议和活动; -- 具有培养 Committer 和 Contributor 的意识和能力。 - -### 2. Committer - -Committer 是具有 Hippo4j 仓库写权限的个人,包含以下的标准: - -- 能够在长时间内做持续贡献 Issue、PR 的个人; -- 参与 Issue 列表的维护及重要 Feature 的讨论; -- 参与 Code review。 - -### 3. Contributor - -Contributor 是对 Hippo4j 项目有贡献的个人,标准为: - -- 提交过 PR(代码或者文档)并被合并。 - -### 4. 开发者权利及义务 - -![](https://oss.open8gu.com/image-20230412144105059.png) - -## 开发团队 - -本页面展示了 Hippo4j 的开发团队,并且还在持续扩充中。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
姓名GitHub ID角色联系方式
马称magestacksMaintainermachen@apache.org
陆宽shining-stars-lkCommitter1031900093@qq.com
王杰iwangjieCommitterwangchenmo1025@gmail.com
魏虎weihubeatsCommitterweihu@apache.org
李剑鑫BigXin0109Committer1064730540@qq.com
刘文浩pizihaoCommitterhao3073liu@163.com
叶炜shanjianqCommitter17855368071@163.com
黄成兴CreatesequenceCommitter841396397@qq.com
吴浪wulangcodeCommittersanliangitch@foxmail.com
黎金星road2masterCommitterlijinxingerm@gmail.com
严荣振yanrongzhenCommitterbruceyan@didiglobal.com
- -## 成为 Committer - -持续对 Hippo4j 进行贡献,粗略评估,至少完成 20+ PR 贡献可成为核心开发者。 其中包括完成 2 -个 [good pro issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+pro+issue%22) -或以上,以及若干个 [good first issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)。 - -:::note -会根据 PR 质量提供个性化评估,有可能一个或两个质量较高 PR -即可成为核心开发者。参考:[重构 DynamicThreadPoolExecutor 功能扩展逻辑](https://github.com/opengoofy/hippo4j/pull/854) -::: - -成为 Committer 后,会为该 GitHub 账号获取 Jetbrains 全家桶 Licenses,有效期为 1 年。不用再为破解而烦恼,感受随时升级的快乐。 - -:::note -距离到期两周前,会再次申请 Jetbrains Licenses。有点类似于无限续约的感觉,在此感谢 Jetbrains 公司对开源的支持。 -::: - -截至 `2022-10-30` 当天,已为登记的 7 位 Committer 成功申请 Licenses。 - -![](https://oss.open8gu.com/image-20221030134303060.png) diff --git a/docs/community/update-log.md b/docs/community/update-log.md deleted file mode 100644 index aec894c8..00000000 --- a/docs/community/update-log.md +++ /dev/null @@ -1,411 +0,0 @@ ---- -title: 更新日志 -sidebar_position: 5 ---- - -## 1.5.0 (Apr 15, 2023) - -这是一个大的功能增强版本,建议按照当前版本升级。具体信息可查看 Release 标签地址:[1.5.0](https://github.com/opengoofy/hippo4j/milestone/14?closed=1) - -**Use Change** - -- [Config] 配置属性中容器线程池配置命名改为 `spring.dynamic.thread-pool.web`。 - -- [Server] 为了使语义更加明确,当前版本中线程池执行超时时间的最低可设置为-1,表示不设置超时。需要注意的是,如果客户端使用的是低于1.5.0的版本,可能会存在不兼容的情况。 - -- [Common] 为了使语义更加明确,废弃 `ThreadPoolBuilder#maxPoolNum`,新增加 `ThreadPoolBuilder#maximumPoolSize`,原 API 还可以使用,将在后续版本删除。 - -**Feature** - -- [#1124 ] Config 模式支持 Web 容器配置修改通知 @yanrongzhen -- [#1148 ] 优化执行时间超时 executeTimeOut 为空或 <= 0 的场景 @sususama -- [#1128 ] 控制台前端国际化开发 @Svamei @ PleasePerfunctory -- [#1068 ] 默认线程池配置填充至线程池实例 @magestacks -- [#1055 ] 适配第三方自定义线程池,支持外部SPI方式扩展线程池类型 @lingfengcoder -- [#547 ] 支持 Consul 配置中心动态调整参数 @road2master -- [#624 ] 添加 Dubbox 线程池监控及动态变更 @iwangjie -- [#977 ] 增加 ROLE_MANAGE 角色,主要负责线程池变更审核 @magestacks -- [#821 ] 开发用户修改密码功能 @wulangcode - -**Refactor** - -- [#1092 ] 关于扩展点 SPI 方案的重构 @yanrongzhen -- [#1025 ] 优化BlockingQueueTypeEnum实现 @lianyiwuming -- [#1015 ] 重构Web线程池配置文件命名 @yanrongzhen -- [#1071 ] ThreadPoolBuilder提供全新的最大线程池API @jjiey -- [#1058 ] 客户端引入多个 Web 容器依赖导致 WebThreadPoolService 报错 @Createsequence -- [#844 ] 移除 alibaba-dingtalk-service-sdk @baymax55 - -**Bug** - -- [#1085 ] DynamicThreadPoolRegisterParameter#threadFactory序列化异常 @magestacks -- [#1163 ] Adapter 适配三方线程池启动顺序错误 @magestacks -- [#1134 ] Web容器启动时刷新最新配置失败 @yanrongzhen -- [#1129 ] Prometheus 不能正常采集 Hystrix 线程池 queue.capacity 数据 @jjiey -- [#1121 ] 线程池实例包含已关闭客户端节点 @zjHe -- [#1106 ] springBoot 1.5.x适配Web容器线程池调整 @yanrongzhen -- [#1114 ] ZipkinExecutorAdapter 可能出现空指针异常 @yult97 -- [#1074 ] Hystrix Adapter 支持 hippo4j config @jjiey -- [#1040 ]线程池参数默认配置与文档描述不符 @wulangcode -- [#1002 ] SpringBoot Nacos 动态刷新错误使用 SpringCloud Nacos 类 @BigXin0109 -- [#990 ] TTL 装饰的线程池无法执行等待任务完成插件 @Createsequence -- [#966 ] Alibaba Dubbo 无法获取线程池运行状态 @iwangjie - -**Optimize** - -- [#1159 ] 优化飞书和企业微信失败处理逻辑 @ITXiaoShiTou -- [#1156 ] 线程池通知管理调整查询租户&项目&线程池默认10条 @tudou0806 -- [#1069 ] 线程池执行超时时间最小值支持 -1 @Ronan1024 -- [#1111 ] 核心阻塞队列枚举 BlockingQueueTypeEnum.createBlockingQueue(String blockingQueueName, Integer capacity)抛出NPE问题修复 @LiXuemin -- [#1072 ] 提供公用方法安全设置 corePoolSize 和 maxPoolSize @jjiey -- [#1051 ] 前端国际化登录页面中文错误 @xiaobaisdz -- [#1001 ] 容器停止时,若线程池在等待关闭时,有任务触发超时告警会抛异常警类 @Createsequence -- [#1024 ] 客户端与 Hippo4j revision 冲突 @baymax55 -- [#720 ] 修复 Dubbo 错误的日志打印 @baymax55 -- [#992 ] 优化 Hippo4j Banner 打印时可能存在的空指针 @wulangcode -- [#976 ] 注册线程池默认指定过期时间和线程工厂 @magestacks -- [#964 ] 长轮询时配置未变更返回304状态码适配低版本客户端 @wulangcode -- [#942 ] 修改 MyBatis-Plus 数据库方言配置 @li-xiao-shuang -- [#959 ] ThreadPoolPluginRegisterPostProcessor 打印过多 WARN 日志 @Createsequence -- [#960 ] ThreadPoolPluginRegisterPostProcessor 实现 BeanPostProcessor 默认方法 postProcessBeforeInitialization @Createsequence - - -## 1.4.3 (Nov 06, 2022) - -这是一个功能增强版本,修复了少量 BUG。建议按照当前版本升级。具体信息可查看 Release 标签地址:[1.4.3](https://github.com/opengoofy/hippo4j/milestone/13?closed=1) - -**Use Change** - -- 重构线程池监控,配置层级和命名改变 -- 如果使用钉钉报警,关键字【警报】修改为【告警】 - -**Feature** - -- 重构 Spring 后置处理器创建动态线程池逻辑 -- 官网开启多版本化功能 -- 官网支持国际化,en-US -- 适配线程池延迟初始化 @wulangcode -- 添加 Codecov 相关代码覆盖率指标 -- 项目优雅关闭时停止运行状态采集 - -**Refactor** - -- DynamicThreadPoolExecutor 重构,增加插件扩展逻辑 @Createsequence -- 重构线程池监控,新增容器和三方框架线程池监控 -- 重构服务端包目录,聚合 hippo4j-server 相关 module - -**Bug** - -- dubbo 线程池无法获取运行信息 @iwangjie -- 线程池检查活跃度报警取值错误 @maxisvest -- 动态线程池修改多次后队列提示信息丢失 -- docker部署 mysql启动报错H2驱动 -- docker-startup.sh的mysql配置多个“-” @Malcolmli -- 动态注册线程池队列容量赋值错误 -- 飞书超时类型告警不存在 Trace 信息时发送错误 @mageeric - -**Optimize** - -- 修改报警文案,【警报】修改为【告警】 @wulangcode -- 自动选择H2数据库的存储路径 @iwangjie -- 服务端在客户端后面启动,依旧支持长轮训 @wulangcode -- 配置未发生变更时,长轮询返回 304 @wulangcode -- discovery服务Lease类中判断过期时间需要多等一个duration @w-jirong -- 优化 ThreadPoolBuilder#maxPoolNum 核心线程不得大于最大线程 @wulangcode -- hippo4j console ui 迁移至本项目 -- 查询 Web 线程池列表添加框架标识 -- 优化 H2 初始化逻辑 - -## 1.4.2 (Oct 18, 2022) - -这是一个功能增强版本,修复了少量 BUG。建议按照当前版本升级。具体信息可查看 Release 标签地址:[1.4.2](https://github.com/opengoofy/hippo4j/milestone/12?closed=1) - -**Feature** - -- 强制指定客户端注册的 ip + port -- 支持 spring-cloud-tencent Polaris 线程池动态更新 @weihubeats -- 服务启动时加载 MySQL、H2 数据库初始化语句 -- Adapter 初始化覆盖核心参数 @pizihao -- Server 端新增是否开启认证模式 @baymax55 - -**Refactor** - -- 替换底层网络工具类 OkHttp @yanrongzhen -- 全局移除 commons-lang3 工具包依赖 @yanrongzhen -- 去除三方工具类依赖 @pizihao -- 全局移除 Guava 工具包依赖 @road2master -- DockerFile 基于 H2 数据库重新构建 @BigXin0109 - -**Bug** - -- Dubbo 2.7.15 无法获取线程池引用 @iwangjie -- 动态线程池报警参数颠倒 @jinlingmei - -**Optimize** - -- 线程池实例运行数据采集,如果线程池id不存在,且长度超长,会报异常 @Gdk666 -- 项目中动态线程池数量为空时,存在 CPU 空转情况 -- 客户端注册服务端失败,输出服务端返回信息 @wulangcode -- 调整数据库项目 id 和线程池 id 字段长度 -- 增加代码检查工具 maven-checkstyle-plugin -- 调整控制台监控图表颜色展示 - -## 1.4.1 (Sep 12, 2022) - -这是一个功能增强版本,修复了若干 BUG。建议按照当前版本升级。具体信息可查看 Release 标签地址:[1.4.1](https://github.com/opengoofy/hippo4j/milestone/11?closed=1) - -**Feature** - -- 支持 H2 数据库 @weihubeats -- 动态线程池配置变更时,支持单个、多个或全部节点变 @pizihao -- 增加线程池活跃度和容量报警可选择关闭 -- @DynamicThreadPool 线程池不存在则创建 @shanjianq -- 支持 ETCD 配置中心动态调整参数 @weihubeats -- 创建动态线程池支持 spring 线程池 @BigXin0109 -- 线程池实例变更增加执行超时时间 -- 线程池相关查询页面增加阻塞队列属性 -- 定义动态线程池时,抽象默认配置 -- 提供 ExecutorContext 封装上下文细节 @road2master -- Docker 制作服务端镜像,帮助开发者快速启动 @BigXin0109 -- RabbitMQ 适配器增加多个 MQ 数据源 @weihubeats - -**Bug** - -- 动态线程池设置关闭时启动报错 @dousp -- ExecutorTtlWrapper 类型的 Executor 不生效 @BigXin0109 -- Undertow 获取 WebServer 类型参数异常 @shining-stars-lk -- 修复线程池核心、最大线程数校验限制 -- ByteConvertUtil#getPrintSize 单位转换错误 @onesimplecoder -- 创建线程池单选框选择错误 -- ReflectUtil#getFieldsDirectly missing fields @BigXin0109 -- 本地代码中设置的 capacity 无效 @BigXin0109 -- 服务端线程池超时时间存在拆箱空指针异常 @oreoft -- 未读取服务端返回执行超时时间属性 -- ResizableCapacityLinkedBlockingQueue#put 当前元素数量大于 capacity 未阻塞 - -**Optimize** - -- 长轮询任务判断逻辑优化 @shining-stars-lk -- 线程池存在实例不允许删除线程池 @shanjianq -- 优化租户、项目列表展示排版 -- 通知报警模块项目和线程池下拉查询排序修改 -- 动态线程池拒绝策略触发,以异步的方式报警 -- 优化框架中线程池工厂产生的线程名称 @road2master - -## 1.4.0 (Aug 16, 2022) - -`hippo4j server` 兼容历史低版本,`hippo4j config` 中部分属性名进行了调整,请参考 [hippo4j config 快速开始](https://hippo4j.cn/docs/user_docs/getting-started/hippo4j-core-start)。 - -注意事项: -1. 如果是对已运行 hippo4j server 升级,执行 `/conf/sql-upgrade` 目录下对应的升级脚本。 -2. 需客户端在 1.4.0 及以上版本才可在 hippo4j server 设置线程执行超时时间属性。 - -**Feature** - -- 添加 Alibaba Dubbo 线程池监控及动态变更 -- hippo4j server 支持任务执行超时时间动态修改 -- 阿里 TTL 框架线程池适配 -- 添加动态线程池自动注册功能 -- 订阅回调线程池参数变更 -- 动态线程池监控增加 SPI 自定义功能 -- hippo4j server 支持多种线程池监控方式,例如 Prometheus -- 通知相关参数添加动态变更功能 - -**Bug** - -- 线程池变更:executeTimeOut 变更极端情况下会出现异常 -- 用户登录时候,如果输入了不存在的用户名,后台报空指针异常 -- 修复了对 spring-boot 服务中 tomcat 线程池的兼容问题 -- 排除 Tomcat Jar 使用 Undertow 启动报错 - -**Optimize** - -- hippo4j-core-spring-boot-starter 模块修改名称为 hippo4j-config-spring-boot-starter -- 拆分容器线程池子页面:Tomcat、Undertow、Jetty -- 服务端访问客户端时对 URL 转码 -- MyBatisPlus 修改全局填充方法优化 -- 控制台线程池列表下拉框默认正序 -- 控制台线程池实例菜单,对于非可修改容量队列外,不允许修改队列容量 -- 动态线程池控制台功能变更 -- 租户和项目列表分页查询按照创建时间倒序展示 -- 线程池监控页面图表 UI 优化 -- 设置 maven-gpg-plugin 插件默认不执行 -- 前端控制台相关搜索条件添加必填提示 -- hippo4j 消息通知 & 报警抽象优化 -- 配置中心未配置线程池启动报错 -- 控制台线程池报警 UI 以及功能优化 -- Web、框架线程池编辑弹框 UI 优化 -- 线程池添加、编辑页面 UI 优化 -- 线程池运行详情页前端 UI 优化 - -**Refactor** - -- 删除自定义日志组件 -- 线程池监控功能重构 -- hippo4j core 配置中心生效判断重构 -- 配置变更通知 & 报警通知重构 -- Web 容器线程池适配迁移 hippo4j-adapter - -## 1.3.1 (July 17, 2022) - -注:这是一个兼容历史版本的小范围升级。 - -**Feature** - -- 控制台新增线程池功能设置为 Admin 权限 -- 添加 Hystrix 线程池监控及动态变更 -- 添加 Netty 上传动态线程池监控数据方式 -- 添加 GitHub Actions CI 流程 -- 添加 Spring Kafka 示例项目 -- Tomcat 版本号 >= 9.0.55 线程池适配 - -**Refactor** - -- 更多线程池拆分子目录页面 - -**Optimize** - -- hippo4j core 添加 banner 打印 -- 优化可变更容量阻塞队列名称 - -**BUG** - -- Apollo 配置修改延迟了一个版本 -- Spring Boot 环境下使用 hippo4j-core 接入,配置中心使用 nacos;启动时提示 ConfigService not found - -查看 1.3.1 版本发布:https://github.com/mabaiwan/hippo4j/milestone/9 - -## 1.3.0 (June 06, 2022) - -1.3.0 发布 **适配三方框架的基础框架**。 - -目前已完成 **Dubbo、RabbitMQ、RocketMQ、RocketMQSpringCloudStream** 的线程池适配,后续还会接入 **Kafka、Hystrix** 等框架或中间件的线程池适配。 - -注:这是一个兼容历史版本的重大升级。 - -**Feature** - -- 添加 RabbitMQ 线程池监控及动态变更 -- 添加 RocketMQ 线程池监控及动态变更 -- 添加 Dubbo 线程池监控及动态变更 -- 添加 SpringCloud Stream RocketMQ 消费线程池监控及动态变更 - -**Refactor** - -- 重构容器线程池查询及修改功能 -- 优化配置中心触发监听后,所执行的数据变更逻辑 - -**Optimize** - -- 前端控制台删除无用组件 -- 服务端页面字段未显示中文 -- 控制台 UI 优化 -- 修改线程池实例后实时刷新列表参数 -- 容器线程池编辑仅限 Admin 权限 -- SpringBoot Starter 变更包路径 - -**BUG** - -- 修复 SpringBoot Nacos 动态刷新不生效 -- 报警配置 alarm=false 不配置通知报警平台和接收人报错 - -## 1.2.1 (May 07, 2022) - -**BugFix** - -- apollo 动态配置不生效 -- 修复 hippo4j-core 后置处理器创建线程池问题 -- 重构 hippo4j-core spring 后置处理器逻辑 -- 优化ThreadPoolNotifyAlarmHandler下的空指针异常 -- 修复线程池核心、最大线程数变更问题 -- startup.cmd 未正常读取 conf 配置文件 - -**Optimize** - -- 配置文件中字段歧义 -- 修改代码中历史网址 -- InstanceInfo 的 groupKey 参数重复设置 -- ConfigFileTypeEnum 枚举字段添加注释 -- 线程资源通过线程池创建,不允许自行显示创建线程 -- Guava 版本升级至 30.0-jre 及以上版本 -- SystemClock 替换 System.currentTimeMillis() -- 添加代码格式化插件 Spotless -- 修改线程池文案 - -## 1.2.0 (Mar 13, 2022) - -**Feature** - -- hippo4j-core线程池资源对接 Prometheus 监控 -- hippo4j-core 支持 Zookeeper -- hippo4j-core 支持 Apollo - -**Optimize** - -- 适配非 Web SpringBoot 项目使用 Hippo4j -- 优化报警通知 -- 修复在 JDK 小版本中的兼容性问题 - -**BugFix** - -- server 端查看容器线程池,参数为 null -- 重构线程池查看及容器线程池查看等交互 -- 修复引入 hippo4j-spring-boot-starter 后,运行单元测试报错 -- 修复可能出现的空指针异常 - -## 1.1.0 (Mar 13, 2022) - -Hippo4j 线程池框架 1.1.0 RELEASE 版本,添加了 Hippo4j-Core(依赖配置中心的动态线程池). - -**Feature** - -- 删除 DynamicThreadPoolExecutor 内代码实现,仅通过线程池扩展点进行扩展 -- 通过动态代理实现线程池拒绝策略执行次数统计 -- 抽象通知报警消息模块 -- 抽象 hippo4j 核心组件,不依赖 server 端即可完成动态调参、监控、报警等功能 -- 前端删除线程池按钮添加 Admin 权限 -- 添加线程池任务运行超长报警 -- 容器线程池支持 Undertow -- 容器线程池支持 Jetty -- 重构服务端异常体系 - -**Optimize** - -- 前端项目 Token 失效跳转登录页 -- 优化 Server 启动脚本日志输出 -- 优化前端按钮权限控制粒度 -- 优化线程池报警推送文案 -- 前端弹框样式优化 -- 适配低版本 SpringBoot Bind -- 优化消息通知模块 - -**BugFix** - -- Duplicate entry 'xxx' for key 'uk_configinfo_datagrouptenant' - -## 1.0.0 (Feb 01, 2022) - -**Feature** - -- 线程池运行堆栈查看 -- 扩展 Web 容器线程池动态调参、监控 - -**Optimize** - -- 删除高版本 SpringBoot Api -- ListableBeanFactory#findAnnotationOnBean SpringBoot 低版本适配 -- 优化客户端关闭时调用服务端钩子函数 -- 线程池实例参数弹框添加实例 ID 和线程池状态 -- 补充线程池替换 Hippo4j 文档 -- 1.5.x springboot 引入hippo4j-spring-boot-starter配置项,bean初始化失败 -- 优化线程池参数编辑合理性校验 -- BaseInstanceRegistry 读写锁重构 - -**BugFix** - -- 本地项目线程池实例缓存无法精确清理 -- 线程池实例页面多实例不同 Active 展示错误 -- 创建动态线程池逻辑判断修复 -- 创建动态线程池增强参数未设置 -- 控制消息推送报警频率的方法有并发安全的问题 -- tomcat线程池上下文获取失败 diff --git a/docs/deploy.sh b/docs/deploy.sh deleted file mode 100644 index 0379f9fb..00000000 --- a/docs/deploy.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env sh - -# 确保脚本抛出遇到的错误 -set -e - -# 生成静态文件 -npm run build - -# 进入生成的文件夹 -cd build/ - -echo 'hippo4j.cn' > CNAME - -git init -git add -A -git commit -m "auto commit" - -# github -GIT_SSH_COMMAND="ssh -i ~/.ssh/hippo4j" git remote add origin git@github.com:hippo4j/hippo4j.github.io.git -GIT_SSH_COMMAND="ssh -i ~/.ssh/hippo4j" git push -u origin main -f - -cd - -rm -rf build/ diff --git a/docs/docs/user_docs/dev_manual/_category_.json b/docs/docs/user_docs/dev_manual/_category_.json deleted file mode 100644 index 9117307f..00000000 --- a/docs/docs/user_docs/dev_manual/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "开发者手册", - "position": 5, - "link": { - "type": "generated-index", - "description": "Hippo4j 留给使用者能够扩展的知识点。" - } -} diff --git a/docs/docs/user_docs/dev_manual/queue-custom.md b/docs/docs/user_docs/dev_manual/queue-custom.md deleted file mode 100644 index 9fb5512a..00000000 --- a/docs/docs/user_docs/dev_manual/queue-custom.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 阻塞队列自定义 - -Hippo4j 通过 SPI 的方式对拒绝策略进行扩展,可以让用户在 Hippo4j 中完成自定义阻塞队列实现。 - -## 1. 定义自定义队列类 - -实现接口 `cn.hippo4j.common.executor.support.CustomBlockingQueue`: - -```java -public class MyArrayBlockingQueue implements CustomBlockingQueue { - - @Override - public Integer getType() { - return 1001; - } - - @Override - public String getName() { - return "MyArrayBlockingQueue"; - } - - @Override - public BlockingQueue generateBlockingQueue(Integer capacity) { - int effectiveCapacity = capacity == null || capacity <= 0 ? 1024 : capacity; - return new ArrayBlockingQueue<>(effectiveCapacity); - } -} -``` - -> 兼容提示:旧版只需实现 `generateBlockingQueue()` 的实现仍然有效,框架会在未覆写新方法时回退到旧逻辑,但推荐改为覆写带 `capacity` 入参的方法,以便直接复用服务端配置。 - -## 2. 声明 SPI 文件 - -在 `src/main/resources/META-INF/services/` 目录下新增文件: -``` -cn.hippo4j.common.executor.support.CustomBlockingQueue -``` - -文件内容仅一行: -``` -com.example.queue.MyArrayBlockingQueue -``` - -## 3. 服务端生效方式 - -当服务端下发的 `queueType` 与 `capacity` 命中自定义类型时,框架会通过 SPI 自动创建队列,并将服务端配置的容量参数传入 `generateBlockingQueue(Integer capacity)`。 - -### 3.1 队列创建与验证 - -```java -// 创建队列 -BlockingQueue q = BlockingQueueTypeEnum.createBlockingQueue(queueType, capacity); - -// 或者通过队列名称创建 -BlockingQueue q2 = BlockingQueueTypeEnum.createBlockingQueue("ArrayBlockingQueue", capacity); - -// 验证队列配置 -boolean valid = BlockingQueueManager.validateQueueConfig(queueType, capacity); - -// 动态调整容量(仅 ResizableCapacityLinkedBlockingQueue 支持) -boolean ok = BlockingQueueManager.changeQueueCapacity(executor.getQueue(), newCapacity); -``` - -### 3.2 队列类型生效 - -- **配置模板**:在线程池管理页面编辑队列类型,会保存到数据库,但不会推送到运行中的客户端。 -- **生效时机**:客户端应用重启时,会从服务端读取最新配置,并使用反射替换线程池的 `workQueue` 字段。 -- **运行时调整**:运行时仅支持队列容量的动态调整(仅限 `ResizableCapacityLinkedBlockingQueue`),不支持队列类型切换。 - -服务端动态刷新处的实现: - -```java -// ServerThreadPoolDynamicRefresh#handleQueueChanges -// 仅支持容量调整,不支持队列类型切换 -if (parameter.getCapacity() != null) { - if (BlockingQueueManager.canChangeCapacity(executor.getQueue())) { - boolean success = BlockingQueueManager.changeQueueCapacity( - executor.getQueue(), parameter.getCapacity()); - if (success) { - log.info("Queue capacity changed to: {} for thread pool: {}", - parameter.getCapacity(), parameter.getTpId()); - } - } -} -``` \ No newline at end of file diff --git a/docs/docs/user_docs/dev_manual/queue-info.md b/docs/docs/user_docs/dev_manual/queue-info.md deleted file mode 100644 index 956507d3..00000000 --- a/docs/docs/user_docs/dev_manual/queue-info.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 内置阻塞队列 - -Hippo4j 内置多种常用阻塞队列类型,支持开箱即用,亦可通过 SPI 扩展自定义队列类型。 - -## 内置类型清单 - -以下类型可直接在服务端或配置中选择(枚举:`BlockingQueueTypeEnum`): - -- ArrayBlockingQueue(数组有界队列) -- LinkedBlockingQueue(链表队列) -- LinkedBlockingDeque(双端队列) -- SynchronousQueue(同步移交队列) -- LinkedTransferQueue(可转移队列) -- PriorityBlockingQueue(优先级队列) -- ResizableCapacityLinkedBlockingQueue(可在线动态调容量的链表队列) - -## 枚举定义 - -**ResizableCapacityLinkedBlockingQueue**:支持在线变更 `capacity`。 - -```java -// cn.hippo4j.common.executor.support.BlockingQueueTypeEnum -RESIZABLE_LINKED_BLOCKING_QUEUE(9, "ResizableCapacityLinkedBlockingQueue") { - @Override - BlockingQueue of(Integer capacity) { - return new ResizableCapacityLinkedBlockingQueue<>(capacity); - } - @Override - BlockingQueue of() { - return new ResizableCapacityLinkedBlockingQueue<>(); - } -} -``` - -## 使用建议 - -- 需要在线调容量:优先选择 `ResizableCapacityLinkedBlockingQueue` -- 需要严格有界:选择 `ArrayBlockingQueue` -- 需要无界吞吐:选择 `LinkedBlockingQueue` -- 需要优先级:选择 `PriorityBlockingQueue` -- 需要同步移交:选择 `SynchronousQueue` - -如需自定义队列类型,请参考《阻塞队列自定义》。 \ No newline at end of file diff --git a/docs/docs/user_docs/dev_manual/rejected-policy-custom.md b/docs/docs/user_docs/dev_manual/rejected-policy-custom.md deleted file mode 100644 index e0405061..00000000 --- a/docs/docs/user_docs/dev_manual/rejected-policy-custom.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 拒绝策略自定义 - -Hippo4j 通过 SPI 的方式对拒绝策略进行扩展,可以让用户在 Hippo4j 中完成自定义拒绝策略实现。 - -## Hippo4j Server 拒绝策略扩展 - -自定义拒绝策略,实现 `CustomRejectedExecutionHandler` 接口,示例如下: - -```java -public class ErrorLogRejectedExecutionHandler implements CustomRejectedExecutionHandler { - - @Override - public Integer getType() { - return 12; - } - - @Override - public RejectedExecutionHandler generateRejected() { - return new CustomErrorLogRejectedExecutionHandler(); - } - - public static class CustomErrorLogRejectedExecutionHandler implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - Logger logger = LoggerFactory.getLogger(this.getClass()); - logger.error("线程池抛出拒绝策略"); - } - } -} -``` - -创建 `src/main/resources/META-INF/services` 目录,创建 SPI 自定义拒绝策略文件 `cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler`。 - -`cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler` 文件内仅放一行自定义拒绝策略全限定名即可,示例: - -```text -cn.hippo4j.example.core.handler.ErrorLogRejectedExecutionHandler -``` - -创建、修改线程池页面选择 `CustomRejectedPolicy(自定义 SPI 策略)`。 - -![](https://oss.open8gu.com/image-20220813173907814.png) - -拒绝策略触发时,完成上述代码效果,仅打印异常日志提示。 - -```text -2022-08-01 21:27:49.515 ERROR 48928 --- [ateHandler.test] r$CustomErrorLogRejectedExecutionHandler : 线程池抛出拒绝策略 -``` - -:::note -具体参考 `hippo4j-example/hippo4j-spring-boot-starter-example` 模块。 -::: diff --git a/docs/docs/user_docs/dev_manual/rejected-policy-info.md b/docs/docs/user_docs/dev_manual/rejected-policy-info.md deleted file mode 100644 index d5c68138..00000000 --- a/docs/docs/user_docs/dev_manual/rejected-policy-info.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 内置拒绝策略 - -内置两种拒绝策略说明: - -**RunsOldestTaskPolicy**:添加新任务并由主线程运行最早的任务。 - -```java -public class RunsOldestTaskPolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - BlockingQueue workQueue = executor.getQueue(); - Runnable firstWork = workQueue.poll(); - boolean newTaskAdd = workQueue.offer(r); - if (firstWork != null) { - firstWork.run(); - } - if (!newTaskAdd) { - executor.execute(r); - } - } -} -``` - -**SyncPutQueuePolicy**:主线程把拒绝任务以阻塞的方式添加到队列。 - -```java -@Slf4j -public class SyncPutQueuePolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - try { - executor.getQueue().put(r); - } catch (InterruptedException e) { - log.error("Adding Queue task to thread pool failed.", e); - } - } -} -``` \ No newline at end of file diff --git a/docs/docs/user_docs/getting_started/_category_.json b/docs/docs/user_docs/getting_started/_category_.json deleted file mode 100644 index 72b1e151..00000000 --- a/docs/docs/user_docs/getting_started/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "快速开始", - "position": 3, - "link": { - "type": "generated-index" - } -} diff --git a/docs/docs/user_docs/getting_started/config/_category_.json b/docs/docs/user_docs/getting_started/config/_category_.json deleted file mode 100644 index 78b3d9c4..00000000 --- a/docs/docs/user_docs/getting_started/config/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "依赖配置中心", - "position": 2, - "collapsed": true -} diff --git a/docs/docs/user_docs/getting_started/config/hippo4j-config-default.md b/docs/docs/user_docs/getting_started/config/hippo4j-config-default.md deleted file mode 100644 index 9c9e0fc9..00000000 --- a/docs/docs/user_docs/getting_started/config/hippo4j-config-default.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 参数默认配置 - -曾有多名小伙伴反馈说,项目中线程池一多,配置文件中配置就显得很臃肿。为此 hippo4j-config 开发出了动态线程池默认配置。 - -```yaml -spring: - dynamic: - thread-pool: - default-executor: - core-pool-size: 4 - maximum-pool-size: 6 - blocking-queue: ResizableCapacityLinkedBlockingQueue - queue-capacity: 1024 - execute-time-out: 1000 - keep-alive-time: 9999 - rejected-handler: AbortPolicy - active-alarm: 90 - capacity-alarm: 85 - alarm: true - allow-core-thread-time-out: true - notify: - interval: 5 - receives: chen.ma - executors: - - thread-pool-id: message-produce - - thread-pool-id: message-consume - core-pool-size: 80 - maximum-pool-size: 100 - execute-time-out: 1000 - notify: - interval: 6 - receives: chen.ma -``` - -`spring.dynamic.thread-pool.executors` 层级下,仅需要配置 `thread-pool-id`,其余配置从 `spring.dynamic.thread-pool.default-executor` 读取。 - -如果 `spring.dynamic.thread-pool.executors` 下配置和 `spring.dynamic.thread-pool.default-executor` 冲突,以前者为主。 - -通过该自定义配置方式,可减少大量重复线程池参数配置项,提高核心配置简洁度。 - -提示:`spring.dynamic.thread-pool.default-executor` 层级下参数,不提供动态刷新功能。 diff --git a/docs/docs/user_docs/getting_started/config/hippo4j-config-monitor.md b/docs/docs/user_docs/getting_started/config/hippo4j-config-monitor.md deleted file mode 100644 index 17d665e6..00000000 --- a/docs/docs/user_docs/getting_started/config/hippo4j-config-monitor.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 线程池监控 - -## 线程池监控配置 - -监控前置条件:需要先完成 hippo4j-config 的 [接入工作](/docs/user_docs/getting_started/config/hippo4j-config-start)。 - -接下来引入 SpringBoot Actuator。Spring 2.x 一般都有版本指定,所以这里不用写版本号。 - -```xml - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - -``` - -添加动态线程池监控相关配置: - -```yaml -management: - metrics: - export: - prometheus: - enabled: true - server: - port: 29999 # 可选配置,如果不配置该 port,直接使用 ${server.port} - endpoints: - web: - exposure: - include: '*' # 测试使用,开启了所有端点,生产环境不建议 * -spring: - dynamic: - thread-pool: - monitor: - enable: true # 是否开启采集线程池运行时数据 - collect-interval: 5000 # 采集线程池运行数据频率 - collect-types: micrometer # 采集线程池运行数据的类型。eg:log、micrometer。多个可以同时使用,默认 micrometer - initial-delay: 10000 # 项目启动后延迟多久进行采集 - thread-pool-types: dynamic # 采集线程池的类型。eg:dynamic、web、adapter。可任意配置,默认 dynamic -``` - -项目启动,访问 `http://localhost:29999/actuator/prometheus` 出现 `dynamic_thread_pool_` 前缀的指标,即为成功。 - -![](https://oss.open8gu.com/image-20220912220401016.png) - -## 配置 Prometheus - -通过 Docker 启动 Prometheus 服务。 - -```shell -docker run -d -p 9090:9090 --name prometheus prom/prometheus -``` - -添加 Prometheus 抽取数据任务。 - -```shell -# 进入 prometheus 容器内部 -docker exec -it prometheus /bin/sh -# 编辑 prometheus 配置文件 -vi /etc/prometheus/prometheus.yml -``` - -scrape_configs 节点下新添加一个 job,如果 Prometheus 是 Docker 方式部署,`{scrape_configs.static_configs.targets}` 需要写本机的 IP。 - -```yaml -scrape_configs: - - job_name: 'dynamic-thread-pool-job' - scrape_interval: 5s - metrics_path: '/actuator/prometheus' - static_configs: - - targets: [ '127.0.0.1:29999' ] -``` - -配置成功后 `exit` 退出容器,并进行 Prometheus 容器重启 `docker restart prometheus`。 - -访问 Prometheus 控制台 `http://localhost:9090/graph` 路径,能够展示相关指标即为配置成功。 - -![](https://oss.open8gu.com/image-20220912221237597.png) - -## 配置 Grafana - -```shell -docker run -d -p 3000:3000 --name=grafana grafana/grafana -``` - -访问 Grafana 地址,[http://localhost:3000](http://localhost:3000) 用户名密码:`admin` - -Grafana 访问 `http://localhost:3000/datasources` 导入 Prometheus 数据源。 - -![](https://oss.open8gu.com/image-20220912221646866.png) - -> 如果 Prometheus 为 Docker 方式部署,HTTP URL 需要为本地 IP,比如:http://192.168.1.5:9090 - -关注公众号 `龙台的技术笔记`,回复:`监控`,获取 Hippo4j Grafana DashBoard JSON 配置。 - -| 公众号 | 回复关键词 | -|:------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------:| -| ![](https://oss.open8gu.com/43_65f6020ed111b6bb3808ec338576bd6b.png?x-oss-process=image/resize,h_300,w_400) | ![](https://oss.open8gu.com/image-20220327171957444.png?x-oss-process=image/resize,h_300,w_400) | - -获取到 JSON 文件后,通过 `http://localhost:3000/dashboard/import` 将 JSON 文件导入至 Grafana DashBoard。 - -![](https://oss.open8gu.com/image-20220912225627272.png) - -下拉框内动态选择创建好的 Prometheus 数据源,并点击 `Import`。 - -![](https://oss.open8gu.com/image-20220912225700200.png) - -即可使用炫酷的 Hippo4j 动态线程池监控 DashBoard。大家伙儿也可以根据个人喜好进行定制 DashBoard,如果觉得有优化点,欢迎和我联系贡献。 - -![](https://oss.open8gu.com/image-20220912225813972.png) - -如果项目客户端启动多个示例,动态线程池监控效果图如下: - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) diff --git a/docs/docs/user_docs/getting_started/config/hippo4j-config-more.md b/docs/docs/user_docs/getting_started/config/hippo4j-config-more.md deleted file mode 100644 index 09452013..00000000 --- a/docs/docs/user_docs/getting_started/config/hippo4j-config-more.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 个性化配置 - -以下所述特性自 hippo4j-config v1.4.2 及以上版本提供,由 hippo4j 核心开发者 [@pizihao](https://github.com/pizihao) 完成相应功能开发。 - -## 需求背景 - -**1)容器及三方框架线程池自定义启用** - -最初设计容器线程池和三方框架线程池的动态变更是和启动无关的。也就是说,启动时不会根据配置文件中相关参数去修改两者对应的线程池配置。 - -这么设计的初衷是因为,不想让 hippo4j 过多的去介入框架原有的功能。因为容器和三方框架都支持线程池参数的自定义。 - -也就造成,可能你在配置中心配置了对应的容器和三方框架线程池参数,启动时是无效的。但当修改配置文件任一配置,容器和三方框架线程池配置将生效。 - -为了更好的用户体验,决定加入启用标识来控制:是否在项目初始化启动时,对容器和三方框架线程池参数进行修改。 - -**2)客户端集群个性化配置** - -大家都知道,hippo4j-config 是依赖配置中心做线程池配置动态变更。这种模式有一种缺点:改动配置文件后,所有客户端都会变更。 - -有些小伙伴希望 hippo4j-config 能够像 hippo4j-server 一样,能够针对单独的客户端进行配置变更。 - -## 容器及三方框架线程池自定义启用 - -容器及三方框架线程池添加启用配置,为了保持统一,动态线程池配置中也有该参数配置。配置项默认开启。 - -```yaml -spring: - dynamic: - thread-pool: - web: - enable: true - executors: - - thread-pool-id: message-consume - enable: false - adapter-executors: - - threadPoolKey: 'input' - enable: true -``` - -## 客户端集群个性化配置 - -分别在动态线程池、容器线程池以及三方框架线程池配置下增加 `nodes` 配置节点,通过该配置可匹配需要变更的节点。 - -```yaml -spring: - dynamic: - thread-pool: - web: - nodes: 192.168.1.5:*,192.168.1.6:8080 - executors: - - thread-pool-id: message-consume - nodes: 192.168.1.5:* - adapter-executors: - - threadPoolKey: 'input' - nodes: 192.168.1.5:* -``` - -来一段代码方法中的注释,大家就基本明白如何使用了。 - -```java -/** - * Matching nodes
- * nodes is ip + port.Get 'nodes' in the new Properties,Compare this with the ip + port of Application.
- * support prefix pattern matching. e.g:
- *

    - *
  • 192.168.1.5:* -- Matches all ports of 192.168.1.5
  • - *
  • 192.168.1.*:2009 -- Matches 2009 port of 192.168.1.*
  • - *
  • * -- all
  • - *
  • empty -- all
  • - *
- * The format of ip + port is ip : port. - */ -``` - -`nodes` 可与 `enable` 同时使用。如此,基于配置中心的动态线程池实现方式,将能够更方便的支持个性化需求。 diff --git a/docs/docs/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md b/docs/docs/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md deleted file mode 100644 index a1885e0c..00000000 --- a/docs/docs/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 适配SpringBoot1x - -目前已支持 Nacos、Apollo 配置中心适配 SpringBoot 1.5.x 版本。 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-1x-starter - 1.5.0 - -``` - -Nacos SpringBoot 配置如下: - -```yaml -spring: - cloud: - nacos: - config: - ext-config: - - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP - refresh: true - server-addr: 127.0.0.1:8848 - dynamic: - thread-pool: - config-file-type: yml - nacos: - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP -``` - -Apollo SpringBoot 配置如下: - -```yaml -apollo: - autoUpdateInjectedSpringProperties: true - bootstrap: - eagerLoad: - enabled: true - enabled: true - namespaces: application - meta: http://127.0.0.1:8080 -app: - id: dynamic-threadpool-example -spring: - dynamic: - thread-pool: - apollo: - namespace: application -``` - -动态线程池通用配置如下: - -```yaml -management: - context-path: /actuator - security: - enabled: false -server: - port: 8091 - servlet: - context-path: /example -spring: - application: - name: dynamic-threadpool-example - dynamic: - thread-pool: - banner: true - check-state-interval: 5 - collect-type: micrometer - config-file-type: properties - enable: true - executors: - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-consume - thread-pool-id: message-consume - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-produce - thread-pool-id: message-produce - notify-platforms: - - platform: WECHAT - token: ac0426a5-c712-474c-9bff-72b8b8f5caff - profiles: - active: dev -``` - -具体 Demo 运行请参考以下示例模块,已验证对应线程池动态变更、报警以及运行时监控功能。 - -- `/hippo4j-config-nacos-spring-boot-1x-starter-example` -- `hippo4j-example/hippo4j-config-apollo-spring-boot-1x-starter-example` diff --git a/docs/docs/user_docs/getting_started/config/hippo4j-config-start.md b/docs/docs/user_docs/getting_started/config/hippo4j-config-start.md deleted file mode 100644 index 6ead578b..00000000 --- a/docs/docs/user_docs/getting_started/config/hippo4j-config-start.md +++ /dev/null @@ -1,193 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 接入流程 - -Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 配置中心任选其一。 - -## hippo4j 配置 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-starter - 1.5.0 - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -server: - port: 8090 - servlet: - context-path: /example - -spring: - profiles: - active: dev - - dynamic: - thread-pool: - # 是否开启动态线程池 - enable: true - # 是否打印 banner - banner: true - # 是否开启线程池数据采集,对接 Micrometer、ES、Log 等 - collect: true - # 检查线程池状态,是否达到报警条件,单位毫秒 - check-state-interval: 3000 - # 通知报警平台,请替换为自己创建的群机器人 - notify-platforms: - - platform: 'WECHAT' - token: xxx - - platform: 'DING' - token: xxx - secret: xxx # 加签专属 - - platform: 'LARK' - token: xxx - # Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 任选其一 - nacos: - data-id: xxx - group: xxx - apollo: - namespace: xxxx - # 配置中心文件格式 - config-file-type: yml - # 支持 tomcat、undertow、jetty 三种容器线程池 - web: - core-pool-size: 100 - maximum-pool-size: 200 - keep-alive-time: 1000 - # 全局通知配置-是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位秒 - alarm-interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - # 动态线程池列表 - executors: - - thread-pool-id: 'message-consume' - # 核心线程数 - core-pool-size: 1 - # 最大线程数 - maximum-pool-size: 1 - # 阻塞队列名称,参考 BlockingQueueTypeEnum,支持 SPI - blocking-queue: 'LinkedBlockingQueue' - # 阻塞队列大小 - queue-capacity: 1 - # 执行超时时间,超过此时间发起报警,单位毫秒 - execute-time-out: 1000 - # 拒绝策略名称,参考 RejectedPolicyTypeEnum,支持 SPI - rejected-handler: 'AbortPolicy' - # 线程存活时间,单位秒 - keep-alive-time: 1024 - # 是否允许核心线程超时 - allow-core-thread-time-out: true - # 线程工厂名称前缀 - thread-name-prefix: 'message-consume' - # 是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 通知配置,线程池中通知配置如果存在,则会覆盖全局通知配置 - notify: - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位分钟 - interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - - thread-pool-id: 'message-produce' - core-pool-size: 1 - maximum-pool-size: 1 - queue-capacity: 1 - execute-time-out: 1000 - blocking-queue: 'LinkedBlockingQueue' - rejected-handler: 'AbortPolicy' - keep-alive-time: 1024 - allow-core-thread-time-out: true - thread-name-prefix: 'message-consume' - alarm: true - active-alarm: 80 - capacity-alarm: 80 - notify: - interval: 8 - receives: xxx -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从配置中心拉取。 - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` diff --git a/docs/docs/user_docs/getting_started/difference.md b/docs/docs/user_docs/getting_started/difference.md deleted file mode 100644 index 549da02d..00000000 --- a/docs/docs/user_docs/getting_started/difference.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 运行模式介绍 - -1.1.0 版本发布后,Hippo4j 分为两种使用模式:轻量级依赖配置中心以及无中间件依赖版本。 - -![](https://oss.open8gu.com/image-20220319154626314.png) - -### Hippo4j config - -**轻量级动态线程池管理**,依赖 Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 等三方配置中心(任选其一)完成线程池参数动态变更,支持运行时报警、监控等功能。 - -> 监控功能配置详见:[线程池监控](/docs/user_docs/getting_started/config/hippo4j-config-monitor) - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) - -### Hippo4j server - -**部署 Hippo4j server 服务**,通过可视化 Web 界面完成线程池的创建、变更以及查看,不依赖三方中间件。 - -相比较 Hippo4j config,功能会更强大,但同时也引入了一定的复杂性。需要部署一个 Java 服务,以及依赖 MySQL 数据库。 - -![](https://oss.open8gu.com/1644032018254-min.gif) - -### 使用总结 - -| | Hippo4j config | Hippo4j server | -| ---- |-------------------------------------------------------|--------------------------------------------------------| -| 依赖 | Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 配置中心(任选其一) | 部署 Hippo4j server(内部无依赖中间件) | -| 使用 | 配置中心补充线程池相关参数 | Hippo4j server web 控制台添加线程池记录 | -| 功能 | 包含基础功能:参数动态化、运行时监控、报警等 | 基础功能之外扩展控制台界面、线程池堆栈查看、线程池运行信息实时查看、历史运行信息查看、线程池配置集群个性化等 | - -使用建议:根据公司情况选择,如果基本功能可以满足使用,选择 Hippo4j config 使用即可;如果希望更多的功能,可以选择 Hippo4j server。 - -**两者在进行替换的时候,无需修改业务代码**。 diff --git a/docs/docs/user_docs/getting_started/hippo4j-adapter.md b/docs/docs/user_docs/getting_started/hippo4j-adapter.md deleted file mode 100644 index 68a48288..00000000 --- a/docs/docs/user_docs/getting_started/hippo4j-adapter.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 三方框架线程池适配 - -Hippo4j 目前已支持的三方框架线程池列表: - -- Dubbo -- Hystrix -- RabbitMQ -- RocketMQ -- AlibabaDubbo -- RocketMQSpringCloudStream -- RabbitMQSpringCloudStream - -引入 Hippo4j Server 或 Core 的 Maven Jar 坐标后,还需要引入对应的框架适配 Jar: - -```xml - - cn.hippo4j - - hippo4j-spring-boot-starter-adapter-dubbo - - hippo4j-spring-boot-starter-adapter-alibaba-dubbo - - hippo4j-spring-boot-starter-adapter-hystrix - - hippo4j-spring-boot-starter-adapter-rabbitmq - - hippo4j-spring-boot-starter-adapter-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq - 1.5.0 - -``` - -如果想省事,仅需引入一个全量包,框架底层会根据条件判断加载具体线程池适配器。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-adapter-all - 1.5.0 - -``` - -## Hippo4j Server - -Hippo4j Server 仅需要引入上述 Jar 包,即可在 Hippo4j Server 的控制台进行查看及修改三方框架线程池。 - -![](https://oss.open8gu.com/image-20220531194810047.png) - -## Hippo4j Config - -Hippo4j Config 除了依赖上述适配 Jar 包外,还需要在配置中心添加以下配置项。 - -```yaml -spring: - dynamic: - thread-pool: - # 省略其它配置 - adapter-executors: - # threadPoolKey 代表线程池标识 - - threadPoolKey: 'input' - # mark 为三方线程池框架类型,参见文初已支持框架集合 - mark: 'RocketMQSpringCloudStream' - corePoolSize: 10 - maximumPoolSize: 10 -``` diff --git a/docs/docs/user_docs/getting_started/img/docsVersionDropdown.png b/docs/docs/user_docs/getting_started/img/docsVersionDropdown.png deleted file mode 100644 index 97e41646..00000000 Binary files a/docs/docs/user_docs/getting_started/img/docsVersionDropdown.png and /dev/null differ diff --git a/docs/docs/user_docs/getting_started/img/grafana-monitor.jpg b/docs/docs/user_docs/getting_started/img/grafana-monitor.jpg deleted file mode 100644 index 336bd980..00000000 Binary files a/docs/docs/user_docs/getting_started/img/grafana-monitor.jpg and /dev/null differ diff --git a/docs/docs/user_docs/getting_started/img/localeDropdown.png b/docs/docs/user_docs/getting_started/img/localeDropdown.png deleted file mode 100644 index e257edc1..00000000 Binary files a/docs/docs/user_docs/getting_started/img/localeDropdown.png and /dev/null differ diff --git a/docs/docs/user_docs/getting_started/server/_category_.json b/docs/docs/user_docs/getting_started/server/_category_.json deleted file mode 100644 index 4063c17f..00000000 --- a/docs/docs/user_docs/getting_started/server/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "无中间件依赖", - "position": 3, - "collapsed": true -} diff --git a/docs/docs/user_docs/getting_started/server/hippo4j-server-config.md b/docs/docs/user_docs/getting_started/server/hippo4j-server-config.md deleted file mode 100644 index e1ef853f..00000000 --- a/docs/docs/user_docs/getting_started/server/hippo4j-server-config.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 服务端配置 - -`hippo4j.core.clean-history-data-enable` - -是否开启线程池历史数据清洗,默认开启。 - -`hippo4j.core.clean-history-data-period` - -线程池历史数据保留时间,默认值:30,单位分钟。 - -服务端会保留这个配置时间的数据,超过这个时间则会被清理。比如按照默认值 30 分钟来说,12:00 收集到的数据,12:30 就会被清理删除。 - -`hippo4j.core.monitor.report-type` - -客户端监控上报服务端类型,可选值:http、netty,默认 http。服务端开启 netty 配置后,需要在客户端对应开启才可生效。用来应对大量动态线程池监控场景。 diff --git a/docs/docs/user_docs/getting_started/server/hippo4j-server-monitor.md b/docs/docs/user_docs/getting_started/server/hippo4j-server-monitor.md deleted file mode 100644 index 08d89fa2..00000000 --- a/docs/docs/user_docs/getting_started/server/hippo4j-server-monitor.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 线程池监控 - -Server 模式默认内置线程池运行时采集和监控功能,如果想要使用 Prometheus + Grafana 的方式可以查看以下内容。 - -## 线程池监控配置 - -接下来引入 SpringBoot Actuator。Spring 2.x 一般都有版本指定,所以这里不用写版本号。 - -```xml - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - -``` - -添加动态线程池监控相关配置: - -```yaml -management: - metrics: - export: - prometheus: - enabled: true - server: - port: 29999 # 可选配置,如果不配置该 port,直接使用 ${server.port} - endpoints: - web: - exposure: - include: '*' # 测试使用,开启了所有端点,生产环境不建议 * -spring: - dynamic: - thread-pool: - monitor: - enable: true # 是否开启采集线程池运行时数据 - collect-interval: 5000 # 采集线程池运行数据频率 - collect-types: server,micrometer # 采集线程池运行数据的类型。eg:server、micrometer。多个可以同时使用,默认 server - initial-delay: 10000 # 项目启动后延迟多久进行采集 - thread-pool-types: dynamic # 采集线程池的类型。eg:dynamic、web、adapter。可任意配置,默认 dynamic -``` - -如果使用 `micrometer` 类型的监控指标,需要添加以下依赖。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-monitor-micrometer - 1.5.0 - -``` - -项目启动,访问 `http://localhost:29999/actuator/prometheus` 出现 `dynamic_thread_pool_` 前缀的指标,即为成功。 - -![](https://oss.open8gu.com/image-20220912220401016.png) - -## 配置 Prometheus - -通过 Docker 启动 Prometheus 服务。 - -```shell -docker run -d -p 9090:9090 --name prometheus prom/prometheus -``` - -添加 Prometheus 抽取数据任务。 - -```shell -# 进入 prometheus 容器内部 -docker exec -it prometheus /bin/sh -# 编辑 prometheus 配置文件 -vi /etc/prometheus/prometheus.yml -``` - -scrape_configs 节点下新添加一个 job,如果 Prometheus 是 Docker 方式部署,`{scrape_configs.static_configs.targets}` 需要写本机的 IP。 - -```yaml -scrape_configs: - - job_name: 'dynamic-thread-pool-job' - scrape_interval: 5s - metrics_path: '/actuator/prometheus' - static_configs: - - targets: [ '127.0.0.1:29999' ] -``` - -配置成功后 `exit` 退出容器,并进行 Prometheus 容器重启 `docker restart prometheus`。 - -访问 Prometheus 控制台 `http://localhost:9090/graph` 路径,能够展示相关指标即为配置成功。 - -![](https://oss.open8gu.com/image-20220912221237597.png) - -## 配置 Grafana - -```shell -docker run -d -p 3000:3000 --name=grafana grafana/grafana -``` - -访问 Grafana 地址,[http://localhost:3000](http://localhost:3000) 用户名密码:`admin` - -Grafana 访问 `http://localhost:3000/datasources` 导入 Prometheus 数据源。 - -![](https://oss.open8gu.com/image-20220912221646866.png) - -> 如果 Prometheus 为 Docker 方式部署,HTTP URL 需要为本地 IP,比如:http://192.168.1.5:9090 - -关注公众号 `龙台的技术笔记`,回复:`监控`,获取 Hippo4j Grafana DashBoard JSON 配置。 - -| 公众号 | 回复关键词 | -|:------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------:| -| ![](https://oss.open8gu.com/43_65f6020ed111b6bb3808ec338576bd6b.png?x-oss-process=image/resize,h_300,w_400) | ![](https://oss.open8gu.com/image-20220327171957444.png?x-oss-process=image/resize,h_300,w_400) | - -获取到 JSON 文件后,通过 `http://localhost:3000/dashboard/import` 将 JSON 文件导入至 Grafana DashBoard。 - -![](https://oss.open8gu.com/image-20220912225627272.png) - -下拉框内动态选择创建好的 Prometheus 数据源,并点击 `Import`。 - -![](https://oss.open8gu.com/image-20220912225700200.png) - -即可使用炫酷的 Hippo4j 动态线程池监控 DashBoard。大家伙儿也可以根据个人喜好进行定制 DashBoard,如果觉得有优化点,欢迎和我联系贡献。 - -![](https://oss.open8gu.com/image-20220912225813972.png) - -如果项目客户端启动多个示例,动态线程池监控效果图如下: - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) diff --git a/docs/docs/user_docs/getting_started/server/hippo4j-server-start.md b/docs/docs/user_docs/getting_started/server/hippo4j-server-start.md deleted file mode 100644 index 17ec5224..00000000 --- a/docs/docs/user_docs/getting_started/server/hippo4j-server-start.md +++ /dev/null @@ -1,127 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 接入流程 - -部署服务端,参考 [部署手册](/docs/user_docs/ops/hippo4j-server-deploy)。 - -服务端创建 [租户、项目](/community/faq#租户和项目在-hippo4j-中是什么意思) 和线程池记录。 - -需要注意,项目 ID 需要与配置文件 `{application.name}` 保持一致。 - -:::note -租户、项目、线程池 ID 如果由多个词组成,建议以 - 进行分割。比如:message-center。 -::: - -## Hippo4j 配置 - -SpringBoot Pom 引入 Hippo4j Starter Jar。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter - 1.5.0 - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -spring: - profiles: - active: dev - application: - # 服务端创建的项目 id 需要与 application.name 保持一致 - name: dynamic-threadpool-example - dynamic: - thread-pool: - # 服务端地址 - server-addr: http://localhost:6691 - # 用户名 - username: admin - # 密码 - password: 123456 - # 租户 id, 对应 tenant 表 - namespace: prescription - # 项目 id, 对应 item 表 - item-id: ${spring.application.name} -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从 hippo4j-server 服务拉取。 - -:::note -创建线程池时建议填充实际的参数。如果在连接 Hippo4j Server 端失败时,会使用填充配置创建线程池。 -::: - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` - diff --git a/docs/docs/user_docs/intro.md b/docs/docs/user_docs/intro.md deleted file mode 100644 index af470274..00000000 --- a/docs/docs/user_docs/intro.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 简介 - -## 线程池痛点 - -线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。在高并发以及大批量的任务处理场景,线程池的使用是必不可少的。 - -如果有在项目中实际使用线程池,相信你可能会遇到以下痛点: - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -## 什么是 Hippo4j - -Hippo4j 通过对 JDK 线程池增强,以及扩展三方框架底层线程池等功能,为业务系统提高线上运行保障能力。 - -提供以下功能支持: - -- 全局管控 - 管理应用线程池实例。 - -- 动态变更 - 应用运行时动态变更线程池参数,包括不限于:核心、最大线程数、阻塞队列容量、拒绝策略等。 -- 通知报警 - 内置四种报警通知策略,线程池活跃度、容量水位、拒绝策略以及任务执行时间超长。 -- 运行监控 - 实时查看线程池运行时数据,最近半小时线程池运行数据图表展示。 -- 功能扩展 - 支持线程池任务传递上下文;项目关闭时,支持等待线程池在指定时间内完成任务。 -- 多种模式 - 内置两种使用模式:[依赖配置中心](https://hippo4j.cn/docs/user_docs/getting_started/config/hippo4j-config-start) 和 [无中间件依赖](https://hippo4j.cn/docs/user_docs/getting_started/server/hippo4j-server-start)。 -- 容器管理 - Tomcat、Jetty、Undertow 容器线程池运行时查看和线程数变更。 -- 框架适配 - Dubbo、Hystrix、RabbitMQ、RocketMQ 等消费线程池运行时数据查看和线程数变更。 - -## 快速开始 - -对于本地演示目的,请参阅 [Quick start](https://hippo4j.cn/docs/user_docs/user_guide/quick-start) - -演示环境: [http://console.hippo4j.cn/index.html](http://console.hippo4j.cn/index.html) - -## 接入登记 - -更多接入的公司,欢迎在 [登记地址](https://github.com/opengoofy/hippo4j/issues/13) 登记,登记仅仅为了产品推广。 - -## 联系我 - -开源不易,右上角点个 Star 鼓励一下吧! - -如果大家想要实时关注 Hippo4j 更新的文章以及分享的干货的话,可以关注我的公众号。 - -使用过程中有任何问题,或者对项目有什么建议,关注公众号回复:加群,和 1000+ 志同道合的朋友交流讨论。 - -![](https://oss.open8gu.com/image-20230317191041262-mini.png) - -## 友情链接 - -- [[ LiteFlow ]](https://liteflow.yomahub.com/):轻量,快速,稳定可编排的组件式规则引擎。 - -- [[ Sa-Token ]](https://github.com/dromara/sa-token):一个轻量级 java 权限认证框架,让鉴权变得简单、优雅! -- [[ HertzBeat ]](https://github.com/dromara/hertzbeat):易用友好的云监控系统, 无需 Agent, 强大自定义监控能力。 -- [[ JavaGuide ]](https://github.com/Snailclimb/JavaGuide):一份涵盖大部分 Java 程序员所需要掌握的核心知识。 -- [[ toBeBetterJavaer ]](https://github.com/itwanger/toBeBetterJavaer):一份通俗易懂、风趣幽默的 Java 学习指南。 - -## 贡献者 - -感谢所有为项目作出贡献的开发者。如果有意贡献,参考 [good first issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)。 diff --git a/docs/docs/user_docs/ops/_category_.json b/docs/docs/user_docs/ops/_category_.json deleted file mode 100644 index d5b7d1e8..00000000 --- a/docs/docs/user_docs/ops/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "运维指南", - "position": 4, - "link": { - "type": "generated-index" - } -} diff --git a/docs/docs/user_docs/ops/hippo4j-server-deploy.md b/docs/docs/user_docs/ops/hippo4j-server-deploy.md deleted file mode 100644 index ffbc2306..00000000 --- a/docs/docs/user_docs/ops/hippo4j-server-deploy.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 源码包部署 - -[RELEASE](https://github.com/opengoofy/hippo4j/releases) 页面下载对应版本并进行解压。 - -## 初始化 - -修改数据库相关信息。 - -```txt -/conf/application.properties -``` - -如果是新运行 Hippo4j,数据库执行下述 SQL 脚本即可。 - -```txt -/conf/hippo4j_manager.sql -``` - -如果是对已运行 Hippo4j 升级,请查看 `/conf/sql-upgrade` 目录下,是否有目标版本对应的升级脚本。 - -## 直接运行 - -Mac Linux 启动执行。 - -```txt -sh ./bin/startup.sh -``` - -Windows 启动执行。 - -```txt -bin/startup.cmd -``` - -## 访问控制台 - -启动成功后,访问链接。用户名密码:admin 123456 - -```txt -localhost:6691/index.html -``` diff --git a/docs/docs/user_docs/ops/server-docker.md b/docs/docs/user_docs/ops/server-docker.md deleted file mode 100644 index 0812b931..00000000 --- a/docs/docs/user_docs/ops/server-docker.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Docker部署 - -## 镜像启动 - -Docker 镜像默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -或者,底层存储数据库切换为 MySQL。`DATASOURCE_HOST` 需要切换为本地 IP,不能使用 `127.0.0.1` 或 `localhost`。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server \ --e DATASOURCE_MODE=mysql \ --e DATASOURCE_HOST=xxx.xxx.xxx.xxx \ --e DATASOURCE_PORT=3306 \ --e DATASOURCE_DB=hippo4j_manager \ --e DATASOURCE_USERNAME=root \ --e DATASOURCE_PASSWORD=root \ -hippo4j/hippo4j-server -``` - -访问 Server 控制台,路径 `http://localhost:6691/index.html` ,默认用户名密码:admin / 123456 - -## 镜像构建 - -如果想要自定义镜像,可以通过以下命令快速构建 Hippo4j Server: - -方式一: - -```shell -# 进入到 threadpool/server/bootstrap 工程路径下 -mvn clean package -Dskip.spotless.apply=true -# 进入到 docker 工程路径下 -# 默认打包是打包的 tag 是 latest -docker build -t hippo4j/hippo4j-server ../docker - -# 构建多平台版本 -docker buildx build --platform linux/arm64 -t hippo4j/hippo4j-server ../docker -docker buildx build --platform linux/amd64 -t hippo4j/hippo4j-server ../docker -``` - -方式二: - -通过 `maven docker plugin` - -```shell -# 进入到 threadpool/server/bootstrap 工程路径下 -mvn clean package -DskipTests -Dskip.spotless.apply=true docker:build -``` diff --git a/docs/docs/user_docs/other/_category_.json b/docs/docs/user_docs/other/_category_.json deleted file mode 100644 index a74d7432..00000000 --- a/docs/docs/user_docs/other/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "其它", - "position": 6, - "link": { - "type": "generated-index" - } -} diff --git a/docs/docs/user_docs/other/official-ccounts.md b/docs/docs/user_docs/other/official-ccounts.md deleted file mode 100644 index 63e07ea7..00000000 --- a/docs/docs/user_docs/other/official-ccounts.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 推荐公众号 - -## JavaGuide - -专注Java后端学习和大厂面试的公众号! - -![](https://oss.open8gu.com/JavaGuide.png) - -## HelloGitHub - -HelloGitHub,专注于开源社区技术和知识内容分享。 - -![](https://oss.open8gu.com/HelloGitHub.png) - -## macrozheng - -专注Java技术分享,解析优质开源项目。涵盖SpringBoot、SpringCloud、Docker、K8S等实用技术,作者Github开源项目mall(50K+Star)。 - -![](https://oss.open8gu.com/macrozheng.png) diff --git a/docs/docs/user_docs/other/operation.md b/docs/docs/user_docs/other/operation.md deleted file mode 100644 index 62661c55..00000000 --- a/docs/docs/user_docs/other/operation.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 公众号合作 - -## 推荐须知 - -hippo4j 作为一款新兴动态线程池框架,开源出来的时间比较晚,目前迫切需要不同的途径进行推广。 - -如果您是公众号运营者或者开源爱好者,欢迎将 hippo4j 推荐给您的粉丝。 - -1. 您无需为 hippo4j 专门撰写文案,只需要直接导入 [推荐文章](https://mp.weixin.qq.com/s/JTTwcBEiK_MnFcPTZl3zGA) 即可。 -2. 在文章底部或内容中留下项目官网或者 GitHub 仓库链接。 -3. 文章需至少 1000+ 的阅读量。 - -作为推荐回报,hippo4j 可以为您: - -1. 在框架官方文档 [推荐公众号](/docs/user_docs/other/official-ccounts) 页面处留下您的公众号二维码。 -2. 在框架官方交流群里@全体成员推广您的公众号一次,附带介绍语。 -3. 您的公众号所有新推文章都可以将链接发送到 hippo4j 交流群中,增加阅读量。 - -如果您还有除公众号以外的其它途径可以与 hippo4j 相互推荐,欢迎 [加群沟通](/group)。 diff --git a/docs/docs/user_docs/other/question.md b/docs/docs/user_docs/other/question.md deleted file mode 100644 index 49fd4d77..00000000 --- a/docs/docs/user_docs/other/question.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 问题提问 - -文档引用自:[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way) - -## 在提问之前 - -在你准备要通过电子邮件、新闻群组或者聊天室提出技术问题前,请先做到以下事情: - -1. 尝试在你准备提问的论坛的旧文章中搜索答案。 -2. 尝试上网搜索以找到答案。 -3. 尝试阅读手册以找到答案。 -4. 尝试阅读常见问题文件(FAQ)以找到答案。 -5. 尝试自己检查或试验以找到答案。 -6. 向你身边的强者朋友打听以找到答案。 -7. 如果你是程序开发者,请尝试阅读源代码以找到答案。 - -当你提出问题的时候,请先表明你已经做了上述的努力;这将有助于树立你并不是一个不劳而获且浪费别人的时间的提问者。如果你能一并表达在做了上述努力的过程中所**学到**的东西会更好,因为我们更乐于回答那些表现出能从答案中学习的人的问题。 - -## 当你提问时 - -### 慎选提问的论坛 -小心选择你要提问的场合。如果你做了下述的事情,你很可能被忽略掉或者被看作失败者: - -* 在与主题不合的论坛上贴出你的问题。 -* 在探讨进阶技术问题的论坛张贴非常初级的问题;反之亦然。 -* 在太多的不同新闻群组上重复转贴同样的问题(cross-post)。 -* 向既非熟人也没有义务解决你问题的人发送私人电邮。 - -因此,第一步是找到对的论坛。再说一次,Google 和其它搜索引擎还是你的朋友,用它们来找到与你遭遇到困难的软硬件问题最相关的网站。通常那儿都有常见问题(FAQ)、邮件列表及相关说明文件的链接。如果你的努力(包括**阅读** FAQ)都没有结果,网站上也许还有报告 Bug(Bug-reporting)的流程或链接,如果是这样,链过去看看。 - -### 使用有意义且描述明确的标题 - -在邮件列表、新闻群组或论坛中,大约 50 字以内的标题是抓住资深专家注意力的好机会。别用喋喋不休的帮帮忙、跪求、急(更别说救命啊!!!!这样让人反感的话,用这种标题会被条件反射式地忽略)来浪费这个机会。不要妄想用你的痛苦程度来打动我们,而应该是在这点空间中使用极简单扼要的描述方式来提出问题。 - -一个好标题范例是`目标 —— 差异`式的描述,许多技术支持组织就是这样做的。在`目标`部分指出是哪一个或哪一组东西有问题,在`差异`部分则描述与期望的行为不一致的地方。 - -> 蠢问题:救命啊!我的笔记本电脑不能正常显示了! - -> 聪明问题:X.org 6.8.1 的鼠标指针会变形,某牌显卡 MV1005 芯片组。 - -> 更聪明问题:X.org 6.8.1 的鼠标指针,在某牌显卡 MV1005 芯片组环境下 - 会变形。 - -### 使用清晰、正确、精准且合乎语法的语句 - -我们从经验中发现,粗心的提问者通常也会粗心地写程序与思考(我敢打包票)。回答粗心大意者的问题很不值得,我们宁愿把时间耗在别处。 - -正确的拼写、标点符号和大小写是很重要的。一般来说,如果你觉得这样做很麻烦,不想在乎这些,那我们也觉得麻烦,不想在乎你的提问。花点额外的精力斟酌一下字句,用不着太僵硬与正式 —— 事实上,黑客文化很看重能准确地使用非正式、俚语和幽默的语句。但它**必须很**准确,而且有迹象表明你是在思考和关注问题。 - -### 精确地描述问题并言之有物 - -* 仔细、清楚地描述你的问题或 Bug 的症状。 -* 描述问题发生的环境(机器配置、操作系统、应用程序、以及相关的信息),提供经销商的发行版和版本号(如:`Fedora Core 4`、`Slackware 9.1`等)。 -* 描述在提问前你是怎样去研究和理解这个问题的。 -* 描述在提问前为确定问题而采取的诊断步骤。 -* 描述最近做过什么可能相关的硬件或软件变更。 -* 尽可能地提供一个可以`重现这个问题的可控环境`的方法。 - -尽量去揣测一个黑客会怎样反问你,在你提问之前预先将黑客们可能提出的问题回答一遍。 - -以上几点中,当你报告的是你认为可能在代码中的问题时,给黑客一个可以重现你的问题的环境尤其重要。当你这么做时,你得到有效的回答的机会和速度都会大大的提升。 - -[Simon Tatham](http://www.chiark.greenend.org.uk/~sgtatham/) 写过一篇名为《[如何有效的报告 Bug](http://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html)》的出色文章。强力推荐你也读一读。 - -### 话不在多而在精 - -你需要提供精确有内容的信息。这并不是要求你简单的把成堆的出错代码或者资料完全转录到你的提问中。如果你有庞大而复杂的测试样例能重现程序挂掉的情境,尽量将它剪裁得越小越好。 - -这样做的用处至少有三点。 -第一,表现出你为简化问题付出了努力,这可以使你得到回答的机会增加; -第二,简化问题使你更有可能得到**有用**的答案; -第三,在精炼你的 bug 报告的过程中,你很可能就自己找到了解决方法或权宜之计。 - -### 别动辄声称找到 Bug - -当你在使用软件中遇到问题,除非你非常、**非常**的有根据,不要动辄声称找到了 Bug。提示:除非你能提供解决问题的源代码补丁,或者提供回归测试来表明前一版本中行为不正确,否则你都多半不够完全确信。这同样适用在网页和文件,如果你(声称)发现了文件的`Bug`,你应该能提供相应位置的修正或替代文件。 - -请记得,还有其他许多用户没遇到你发现的问题,否则你在阅读文件或搜索网页时就应该发现了(你在抱怨前[已经做了这些,是吧](#在提问之前)?)。这也意味着很有可能是你弄错了而不是软件本身有问题。 - -编写软件的人总是非常辛苦地使它尽可能完美。如果你声称找到了 Bug,也就是在质疑他们的能力,即使你是对的,也有可能会冒犯到其中某部分人。当你在标题中嚷嚷着有`Bug`时,这尤其严重。 - -提问时,即使你私下非常确信已经发现一个真正的 Bug,最好写得像是**你**做错了什么。如果真的有 Bug,你会在回复中看到这点。这样做的话,如果真有 Bug,维护者就会向你道歉,这总比你惹恼别人然后欠别人一个道歉要好一点。 - -### 低声下气不能代替你的功课 - -有些人明白他们不该粗鲁或傲慢的提问并要求得到答复,但他们选择另一个极端 —— 低声下气:`我知道我只是个可悲的新手,一个撸瑟,但...`。这既使人困扰,也没有用,尤其是伴随着与实际问题含糊不清的描述时更令人反感。 - -别用原始灵长类动物的把戏来浪费你我的时间。取而代之的是,尽可能清楚地描述背景条件和你的问题情况。这比低声下气更好地定位了你的位置。 - -有时网页论坛会设有专为新手提问的版面,如果你真的认为遇到了初学者的问题,到那去就是了,但一样别那么低声下气。 - -### 描述问题症状而非你的猜测 - -告诉黑客们你认为问题是怎样造成的并没什么帮助。(如果你的推断如此有效,还用向别人求助吗?),因此要确信你原原本本告诉了他们问题的症状,而不是你的解释和理论;让黑客们来推测和诊断。如果你认为陈述自己的猜测很重要,清楚地说明这只是你的猜测,并描述为什么它们不起作用。 - -**蠢问题** - -> 我在编译内核时接连遇到 SIG11 错误, -> 我怀疑某条飞线搭在主板的走线上了,这种情况应该怎样检查最好? - -**聪明问题** - -> 我的组装电脑是 FIC-PA2007 主机板搭载 AMD K6/233 CPU(威盛 Apollo VP2 芯片组), -> 256MB Corsair PC133 SDRAM 内存,在编译内核时,从开机 20 分钟以后就频频产生 SIG11 错误, -> 但是在头 20 分钟内从没发生过相同的问题。重新启动也没有用,但是关机一晚上就又能工作 20 分钟。 -> 所有内存都换过了,没有效果。相关部分的标准编译记录如下… - -由于以上这点似乎让许多人觉得难以配合,这里有句话可以提醒你:`所有的诊断专家都来自密苏里州。` 美国国务院的官方座右铭则是:`让我看看`(出自国会议员 Willard D. Vandiver 在 1899 年时的讲话:`我来自一个出产玉米,棉花,牛蒡和民主党人的国家,滔滔雄辩既不能说服我,也不会让我满意。我来自密苏里州,你必须让我看看。`) 针对诊断者而言,这并不是一种怀疑,而只是一种真实而有用的需求,以便让他们看到的是与你看到的原始证据尽可能一致的东西,而不是你的猜测与归纳的结论。所以,大方的展示给我们看吧! - -### 按发生时间先后列出问题症状 - -问题发生前的一系列操作,往往就是对找出问题最有帮助的线索。因此,你的说明里应该包含你的操作步骤,以及机器和软件的反应,直到问题发生。在命令行处理的情况下,提供一段操作记录(例如运行脚本工具所生成的),并引用相关的若干行(如 20 行)记录会非常有帮助。 - -如果挂掉的程序有诊断选项(如 -v 的详述开关),试着选择这些能在记录中增加调试信息的选项。记住,`多`不等于`好`。试着选取适当的调试级别以便提供有用的信息而不是让读者淹没在垃圾中。 - -如果你的说明很长(如超过四个段落),在开头简述问题,接下来再按时间顺序详述会有所帮助。这样黑客们在读你的记录时就知道该注意哪些内容了。 - -### 描述目标而不是过程 - -如果你想弄清楚如何做某事(而不是报告一个 Bug),在开头就描述你的目标,然后才陈述重现你所卡住的特定步骤。 - -经常寻求技术帮助的人在心中有个更高层次的目标,而他们在自以为能达到目标的特定道路上被卡住了,然后跑来问该怎么走,但没有意识到这条路本身就有问题。结果要费很大的劲才能搞定。 - -**蠢问题** - -> 我怎样才能从某绘图程序的颜色选择器中取得十六进制的 RGB 值? - -**聪明问题** - -> 我正试着用替换一幅图片的色码(color table)成自己选定的色码,我现在知道的唯一方法是编辑每个色码区块(table slot), -> 但却无法从某绘图程序的颜色选择器取得十六进制的 RGB 值。 - -第二种提问法比较聪明,你可能得到像是```建议采用另一个更合适的工具```的回复。 - -### 清楚明确的表达你的问题以及需求 - -漫无边际的提问是近乎无休无止的时间黑洞。最有可能给你有用答案的人通常也正是最忙的人(他们忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞相当厌恶,所以他们也倾向于厌恶那些漫无边际的提问。 - -如果你明确表述需要回答者做什么(如提供指点、发送一段代码、检查你的补丁、或是其他等等),就最有可能得到有用的答案。因为这会定出一个时间和精力的上限,便于回答者能集中精力来帮你。这么做很棒。 - -要理解专家们所处的世界,请把专业技能想像为充裕的资源,而回复的时间则是稀缺的资源。你要求他们奉献的时间越少,你越有可能从真正专业而且很忙的专家那里得到解答。 - -所以,界定一下你的问题,使专家花在辨识你的问题和回答所需要付出的时间减到最少,这技巧对你有用答案相当有帮助 —— 但这技巧通常和简化问题有所区别。因此,问`我想更好地理解 X,可否指点一下哪有好一点说明?`通常比问`你能解释一下 X 吗?`更好。如果你的代码不能运作,通常请别人看看哪里有问题,比要求别人替你改正要明智得多。 - -### 礼多人不怪,而且有时还很有帮助 - -彬彬有礼,多用`请`和`谢谢您的关注`,或`谢谢你的关照`。让大家都知道你对他们花时间免费提供帮助心存感激。 - -坦白说,这一点并没有比使用清晰、正确、精准且合乎语法和避免使用专用格式重要(也不能取而代之)。黑客们一般宁可读有点唐突但技术上鲜明的 Bug 报告,而不是那种有礼但含糊的报告。(如果这点让你不解,记住我们是按问题能教给我们什么来评价问题的价值的) - -然而,如果你有一串的问题待解决,客气一点肯定会增加你得到有用回应的机会。 - -(我们注意到,自从本指南发布后,从资深黑客那里得到的唯一严重缺陷反馈,就是对预先道谢这一条。一些黑客觉得`先谢了`意味着事后就不用再感谢任何人的暗示。我们的建议是要么先说`先谢了`,**然后**事后再对回复者表示感谢,或者换种方式表达感激,譬如用`谢谢你的关注`或`谢谢你的关照`。) - -## 不该问的问题 - -以下是几个经典蠢问题,以及黑客没回答时心中所想的: - -问题:[我能在哪找到 X 程序或 X 资源?](#q1) - -问题:[我怎样用 X 做 Y?](#q2) - -问题:[我的程序/设定/SQL 语句没有用](#q3) - -问题:[我的 Windows 电脑有问题,你能帮我吗?](#q4) - -问题:[我的程序不会动了,我认为系统工具 X 有问题](#q5) - -问题:[我在安装 Linux(或者 X )时有问题,你能帮我吗?](#q6) - -问题:[我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢?](#q7) - ---- - -> 问题:我能在哪找到 X 程序或 X 资源? - -回答:就在我找到它的地方啊,白痴 —— 搜索引擎的那一头。天哪!难道还有人不会用 [Google](https://www.google.com) 吗? - -> 问题:我怎样用 X 做 Y? - -回答:如果你想解决的是 Y ,提问时别给出可能并不恰当的方法。这种问题说明提问者不但对 X 完全无知,也对 Y 要解决的问题糊涂,还被特定形势禁锢了思维。最好忽略这种人,等他们把问题搞清楚了再说。 - -> 问题:我的{程序/设定/SQL 语句}没有用 - -回答:这不算是问题吧,我对要我问你二十个问题才找得出你真正问题的问题没兴趣 —— 我有更有意思的事要做呢。在看到这类问题的时候,我的反应通常不外如下三种 - -* 你还有什么要补充的吗? -* 真糟糕,希望你能搞定。 -* 这关我屁事? - -> 问题:我的 Windows 电脑有问题,你能帮我吗? - -回答:能啊,扔掉微软的垃圾,换个像 Linux 或 BSD 的开源操作系统吧。 - -注意:如果程序有官方版 Windows 或者与 Windows 有互动(如 Samba),你**可以**问与 Windows 相关的问题,只是别对问题是由 Windows 操作系统而不是程序本身造成的回复感到惊讶, 因为 Windows 一般来说实在太烂,这种说法通常都是对的。 - -> 问题:我的程序不会动了,我认为系统工具 X 有问题 - -回答:你完全有可能是第一个注意到被成千上万用户反复使用的系统调用与函数库文件有明显缺陷的人,更有可能的是你完全没有根据。不同凡响的说法需要不同凡响的证据,当你这样声称时,你必须有清楚而详尽的缺陷说明文件作后盾。 - -> 问题:我在安装 Linux(或者 X )时有问题,你能帮我吗? - -回答:不能,我只有亲自在你的电脑上动手才能找到毛病。还是去找你当地的 Linux 使用群组者寻求实际的指导吧(你能在[这儿](http://www.linux.org/groups/index.html)找到用户群组的清单)。 - -注意:如果安装问题与某 Linux 的发行版有关,在它的邮件列表、论坛或本地用户群组中提问也许是恰当的。此时,应描述问题的准确细节。在此之前,先用 `Linux` 和**所有**被怀疑的硬件作关键词仔细搜索。 - -> 问题:我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢? - -回答:想要这样做,说明了你是个卑鄙小人;想找个黑客帮你,说明你是个白痴! - -## 好问题与蠢问题 - -最后,我将透过举一些例子,来说明怎样聪明的提问;同一个问题的两种问法被放在一起,一种是愚蠢的,另一种才是明智的。 - -**蠢问题**: - -> 我从 foo 项目找来的源码没法编译。它怎么这么烂? - -他觉得都是别人的错,这个傲慢自大的提问者。 - -**聪明问题**: - -> foo 项目代码在 Nulix 6.2 版下无法编译通过。我读过了 FAQ,但里面没有提到跟 Nulix 有关的问题。这是我编译过程的记录,我有什么做的不对的地方吗? - -提问者已经指明了环境,也读过了 FAQ,还列出了错误,并且他没有把问题的责任推到别人头上,他的问题值得被关注。 - -**蠢问题**: - -> 我的主机板有问题了,谁来帮我? - -某黑客对这类问题的回答通常是:`好的,还要帮你拍拍背和换尿布吗?`,然后按下删除键。 - -**聪明问题**: - -> 我在 S2464 主机板上试过了 X 、 Y 和 Z ,但没什么作用,我又试了 A 、 B 和 C 。请注意当我尝试 C 时的奇怪现象。显然 florbish 正在 grommicking,但结果出人意料。通常在 Athlon MP 主机板上引起 grommicking 的原因是什么?有谁知道接下来我该做些什么测试才能找出问题? - -## 如果得不到回答 - -如果仍得不到回答,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。 - -总的来说,简单的重复张贴问题是个很糟的点子。这将被视为无意义的喧闹。有点耐心,知道你问题答案的人可能生活在不同的时区,可能正在睡觉,也有可能你的问题一开始就没有组织好。 - -你可以通过其他渠道获得帮助,这些渠道通常更适合初学者的需要。 diff --git a/docs/docs/user_docs/user_guide/_category_.json b/docs/docs/user_docs/user_guide/_category_.json deleted file mode 100644 index 9c505a51..00000000 --- a/docs/docs/user_docs/user_guide/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "用户指南", - "position": 2, - "link": { - "type": "generated-index", - "description": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。" - } -} diff --git a/docs/docs/user_docs/user_guide/frame.md b/docs/docs/user_docs/user_guide/frame.md deleted file mode 100644 index 5992f735..00000000 --- a/docs/docs/user_docs/user_guide/frame.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 为什么写 - -[美团线程池文章](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html "美团线程池文章") 介绍中,因为业务对线程池参数没有合理配置,触发过几起生产事故,进而引发了一系列思考。最终决定封装线程池动态参数调整,扩展线程池监控以及消息报警等功能。 - -在开源平台找了挺多动态线程池项目,从功能性以及健壮性而言,个人感觉不满足企业级应用。 - -因为对动态线程池比较感兴趣,加上想写一个有意义的项目,所以决定自己来造一个轻量级的轮子。 - -想给项目起一个简单易记的名字,类似于 Eureka、Nacos、Redis;后和朋友商量,决定命名:**Hippo4j**。 - -![](https://oss.open8gu.com/动态线程池功能架构-1.jpg) - -## 它解决了什么问题 - -线程池在业务系统应该都有使用到,帮助业务流程提升效率以及管理线程,多数场景应用于大量的异步任务处理。 - -虽然线程池提供了我们许多便利,但也并非尽善尽美,比如下面这些问题就无法很好解决。 - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 - -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 - -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 - -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 - -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 - -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 - -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -Hippo4j 很好解决了这些问题,它将业务中所有线程池统一管理,增强原生线程池系列功能。 - -## 它有什么特性 - -应用系统中线程池并不容易管理。参考美团的设计,Hippo4j 按照租户、项目、线程池的维度划分。再加上系统权限,让不同的开发、管理人员负责自己系统的线程池操作。 - -举个例子,小编在一家公司的公共组件团队,团队中负责消息、短链接网关等项目。公共组件是租户,消息或短链接就是项目。 - -Hippo4j 除去动态修改线程池,还包含实时查看线程池运行时指标、负载报警、配置日志管理等。 - -- `hippo4j-adapter`:适配对第三方框架中的线程池进行监控,如 Dubbo、RocketMQ、Hystrix 等; -- `hippo4j-auth`:用户、角色、权限等; -- `hippo4j-common`:多个模块公用代码实现; -- `hippo4j-config`:提供线程池准实时参数更新功能; -- `hippo4j-console`:对接前端控制台; -- `hippo4j-core`:核心的依赖,包括配置、核心包装类等; -- `hippo4j-discovery`:提供线程池项目实例注册、续约、下线等功能; -- `hippo4j-example` :示例工程; -- `hippo4j-message` :配置变更以及报警通知发送; -- `hippo4j-monitor` :线程池运行时监控; -- `hippo4j-server` :Server 端发布需要的模块聚合; -- `hippo4j-spring-boot`:SpringBoot Starter。 diff --git a/docs/docs/user_docs/user_guide/framework.md b/docs/docs/user_docs/user_guide/framework.md deleted file mode 100644 index 33e24d1c..00000000 --- a/docs/docs/user_docs/user_guide/framework.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 架构设计 - -简单来说,Hippo4j 从部署的角度上分为两种角色:Server 端和 Client 端。 - -Server 端是 Hippo4j 项目打包出的 Java 进程,功能包括用户权限、线程池监控以及执行持久化的动作。 - -Client 端指的是我们 SpringBoot 应用,通过引入 Hippo4j Starter Jar 包负责与 Server 端进行交互。 - -比如拉取 Server 端线程池数据、动态更新线程池配置以及采集上报线程池运行时数据等。 - -## 基础组件 - -### 配置中心(Config) - -配置中心位于 Server 端,它的主要作用是监控 Server 端线程池配置变更,实时通知到 Client 实例执行线程池变更流程。 - -代码设计基于 Nacos 1.x 版本的 **长轮询以及异步 Servlet 机制** 实现。 - -### 注册中心(Discovery) - -负责管理 Client 端(单机或集群)注册到 Server 端的实例,包括不限于**实例注册、续约、过期剔除** 等操作,代码基于 Eureka 源码实现。 - -上面的配置中心很容易理解,动态线程池参数变更的根本。但是注册中心是用来做什么的? - -注册中心管理 Client 端注册的实例,通过这些实例可以 **实时获取线程池的运行时参数信息**。 - -目前的设计是如此,不排除后续基于 Discovery 做更多的扩展。 - -### 控制台(Console) - -对接前端项目,包括不限于以下模块管理: - -![](https://oss.open8gu.com/image-20211107122504126.png) - -## 消息通知(Notify) - -Hippo4j 内置了很多需要通知的事件,比如:线程池参数变更通知、线程池活跃度报警、拒绝策略执行报警以及阻塞队列容量报警等。 - -目前 Notify 已经接入了钉钉、企业微信和飞书,后续持续集成邮件、短信等通知渠道;并且,Notify 模块提供了消息事件的 SPI 方案,可以接受三方自定义的推送。 - -## Hippo4j-Spring-Boot-Starter - -熟悉 SpringBoot 的小伙伴对 Starter 应该不会陌生。Hippo4j 提供以 Starter Jar 包的形式嵌套在应用内,负责与 Server 端完成交互。 - -## 功能架构 - -![](https://oss.open8gu.com/image-20211105230953626.png) diff --git a/docs/docs/user_docs/user_guide/notify.md b/docs/docs/user_docs/user_guide/notify.md deleted file mode 100644 index 3373f244..00000000 --- a/docs/docs/user_docs/user_guide/notify.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 通知报警 - -现阶段已集成钉钉、企业微信、飞书的消息推送,后续会持续接入邮箱、短信和自定义通知渠道。 - -![](https://oss.open8gu.com/image-20220904181527453.png) - -**通知平台** - -- DING:钉钉平台; - -- LARK:飞书平台; - -- WECHAT:企业微信。 - -**通知类型** - -- CONFIG:线程池配置变更推送; - -- ALARM:线程池运行报警推送。 - -**Token** - -获取 DING、LARK、WECHAT 机器人 Token。 - -**报警间隔** - -- CONFIG 类型通知没有报警间隔; - -- ALARM 类型设置报警间隔后,某一节点下的同一线程池指定间隔只会发送一次报警通知。 - -**接收者** - -```tex -多个接收者使用英文逗号 , 分割 (注意不要有空格) -DING:填写手机号 -WECHART:填写user_id会以@的消息发给用户,填写姓名则是普通的@,如:龙台 -LARK:填写ou_开头用户唯一标识会以@的消息发给用户,填写手机号则是普通的@ -``` - -## 钉钉平台 - -[钉钉创建群机器人](https://www.dingtalk.com/qidian/help-detail-20781541.html) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211013122816688.png) | ![](https://oss.open8gu.com/image-20211013113649068.png) | - -添加钉钉机器人后,需在机器人配置自定义关键字,才可发送成功。如下所示: - -![](https://oss.open8gu.com/image-20220530200133377.png?x-oss-process=image/resize,h_500,w_800) - -:::tip -如果使用 1.4.3 及以上版本,`警报` 替换为 `告警`。 -::: - -## 企业微信 - -[企业微信创建群机器人](https://open.work.weixin.qq.com/help2/pc/14931?person_id=1&from=homesearch) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211203213443242.png) | ![](https://oss.open8gu.com/image-20211203213512019.png) | - -## 飞书平台 - -[飞书创建群机器人](https://www.feishu.cn/hc/zh-CN/articles/360024984973) - -![](https://oss.open8gu.com/image-20220304081729347.png) - -![](https://oss.open8gu.com/image-20220304081507907.png) diff --git a/docs/docs/user_docs/user_guide/quick-start.md b/docs/docs/user_docs/user_guide/quick-start.md deleted file mode 100644 index 59c5cdd5..00000000 --- a/docs/docs/user_docs/user_guide/quick-start.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 快速开始 - -## 服务启动 - -使用 Docker 运行服务端,默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -> 如果没有 Docker,可以使用源码编译的方式,启动 [Hippo4j-Server/Hippo4j-Bootstrap](https://github.com/longtai-cn/hippo4j/tree/develop/hippo4j-server/hippo4j-bootstrap) 模块下 ServerApplication 应用类。 - -启动示例项目,[hippo4j-spring-boot-starter-example](https://github.com/opengoofy/hippo4j/tree/develop/hippo4j-example/hippo4j-spring-boot-starter-example) 模块下 ServerExampleApplication 应用类。 - -访问 Server 控制台,路径 `http://localhost:6691/index.html`,默认用户名密码:admin / 123456 - -## 配置变更 - -访问控制台动态线程池菜单下线程池实例,修改动态线程池相关参数。 - -![](https://oss.open8gu.com/image-20220813173811668.png) - -观察 Hippo4j-Example 控制台日志输出,日志输出包括不限于此信息即为成功。 - -```tex -2022-09-10 00:23:29.783 INFO 50322 --- [change.config_0] c.h.s.s.c.ServerThreadPoolDynamicRefresh : [message-consume] Dynamic thread pool change parameter. - corePoolSize: 2 => 4 - maximumPoolSize: 6 => 12 - capacity: 1024 => 2048 - keepAliveTime: 9999 => 9999 - executeTimeOut: 800 => 3000 - rejectedType: SyncPutQueuePolicy => RunsOldestTaskPolicy - allowCoreThreadTimeOut: true => true -``` - -另外,当 Client 集群部署时,可以修改某一个实例,或选择 `全部修改` 按钮,修改所有实例线程池信息。 diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js deleted file mode 100644 index 48983480..00000000 --- a/docs/docusaurus.config.js +++ /dev/null @@ -1,229 +0,0 @@ -// @ts-check -// Note: type annotations allow type checking and IDEs autocompletion - -const lightCodeTheme = require('prism-react-renderer/themes/github'); -const darkCodeTheme = require('prism-react-renderer/themes/dracula'); - -/** @type {import('@docusaurus/types').Config} */ -const config = { - title: 'Hippo4j', - tagline: '动态可观测线程池框架,为业务系统提高线上运行保障能力', - url: 'https://hippo4j.cn', - baseUrl: '/', - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'warn', - favicon: 'img/hippo4j_favicon.ico', - // GitHub pages deployment config. - // If you aren't using GitHub pages, you don't need these. - organizationName: 'hippo4j', // Usually your GitHub org/user name. - projectName: 'hippo4j.github.io', // Usually your repo name. - deploymentBranch: 'main', - - // Even if you don't use internalization, you can use this field to set useful - // metadata like html lang. For example, if your site is Chinese, you may want - // to replace "en" with "zh-Hans". - i18n: { - defaultLocale: 'zh', - locales: ['en', 'zh'], - localeConfigs: { - en: { - label: 'English', - direction: 'ltr', - }, - zh: { - label: '简体中文', - direction: 'ltr', - }, - }, - }, - - presets: [ - [ - 'classic', - /** @type {import('@docusaurus/preset-classic').Options} */ - ({ - docs: { - sidebarPath: require.resolve('./sidebars.js'), - // Please change this to your repo. - // Remove this to remove the "edit this page" links. - // Do not automatically expand the menu - sidebarCollapsed: true, - /*editUrl: 'https://github.com/longtai-cn',*/ - }, - blog: { - showReadingTime: true, - // Please change this to your repo. - // Remove this to remove the "edit this page" links. - editUrl: - 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', - }, - theme: { - customCss: require.resolve('./src/css/custom.css'), - }, - }), - ], - ], - - plugins: [ - [ - '@docusaurus/plugin-content-docs', - { - id: 'community', - path: 'community', - routeBasePath: 'community', - sidebarPath: require.resolve('./sidebarsCommunity.js'), - }, - ], - async function myPlugin(context, options) { - return { - name: 'docusaurus-tailwindcss', - configurePostCss(postcssOptions) { - // Appends TailwindCSS and AutoPrefixer. - postcssOptions.plugins.push(require('tailwindcss')); - postcssOptions.plugins.push(require('autoprefixer')); - return postcssOptions; - }, - }; - }, - ], - - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - autoCollapseCategories: true, - announcementBar: { - id: 'announcementBar-1', // Increment on change - content: - '⭐️ If you like hippo4j, give it a star on GitHub ⭐️', - backgroundColor: '#fafbfc', - textColor: '#091E42', - isCloseable: false, - }, - navbar: { - title: '', - logo: { - alt: 'Hippo4j 动态可观测线程池框架', - src: 'img/hippo4j.png', - }, - items: [ - { - type: 'docSidebar', - docId: 'intro', - position: 'left', - sidebarId: 'user_docs', - label: '文档', - }, - { - to: '/community/contributor-guide', - label: '社区', - position: 'left', - activeBaseRegex: `/community/`, - }, - /*{ to: "/team", label: "团队", position: "left" },*/ - { to: '/users', label: '采用公司', position: 'left' }, - { to: '/group', label: '加群沟通', position: 'left' }, - /*{to: '/blog', label: '博客', position: 'left'},*/ - { - href: 'http://console.hippo4j.cn/index.html', - label: '控制台样例', - position: 'left', - }, - { - href: 'https://nageoffer.com', - label: '🚀 拿个offer', - position: 'left', - }, - { - type: 'docsVersionDropdown', - position: 'right', - dropdownActiveClassDisabled: true, - }, - - { type: 'localeDropdown', position: 'right' }, - /*{ - href: 'https://gitee.com/mabaiwancn/hippo4j', - label: 'Gitee', - position: 'right', - },*/ - { - href: 'https://github.com/opengoofy/hippo4j', - className: 'header-github-link', - 'aria-label': 'GitHub repository', - position: 'right', - }, - - /*{ - href: 'https://github.com/opengoofy/hippo4j', - label: 'GitHub', - position: 'right', - },*/ - ], - }, - footer: { - style: 'dark', - links: [ - { - title: 'Docs', - items: [ - { - label: 'Intro', - to: '/docs/user_docs/intro', - }, - { - label: 'Config Mode', - to: '/docs/user_docs/getting_started/config/hippo4j-config-start', - }, - { - label: 'Server Mode', - to: '/docs/user_docs/getting_started/server/hippo4j-server-start', - }, - ], - }, - { - title: 'Community', - items: [ - { - label: 'Group', - href: 'http://hippo4j.cn/group', - }, - { - label: 'WeChat', - href: 'https://mp.weixin.qq.com/s/diVHYvwiuYH9aWpZDPc27g', - }, - ], - }, - { - title: 'More', - items: [ - { - label: 'Gitee', - href: 'https://gitee.com/opengoofy/hippo4j', - }, - { - label: 'GitHub', - href: 'https://github.com/opengoofy/hippo4j', - }, - ], - }, - { - title: 'Links', - items: [ - { - label: '推广合作', - href: 'http://hippo4j.cn/docs/user_docs/other/operation', - }, - ], - }, - ], - copyright: `Copyright © 2021-2023 马丁版权所有 京ICP备2021038095号 -`, - }, - prism: { - theme: lightCodeTheme, - darkTheme: darkCodeTheme, - additionalLanguages: ['java'], - }, - }), -}; - -module.exports = config; diff --git a/docs/i18n/en/code.json b/docs/i18n/en/code.json deleted file mode 100644 index d2da7eee..00000000 --- a/docs/i18n/en/code.json +++ /dev/null @@ -1,297 +0,0 @@ -{ - "homepage.titleDescription1": { - "message": "Thread Pool Framework For Java", - "description": "The homepage title description" - }, - "homepage.titleDescription2": { - "message": "Enhancing the Operational Assurance Capability for Business Systems Online.", - "description": "The homepage title description" - }, - "homepage.startButton": { - "message": "Quick Start", - "description": "The homepage start button text" - }, - "homepage.secondTitle": { - "message": "What can Hippo4j do?", - "description": "a title for introduciton part" - }, - "homepage.introduction.fristPartTitle": { - "message": "Dynamic Change", - "description": "the title for the first introduction part" - }, - "homepage.introduction.fristPartDesc": { - "message": "Application runtime dynamically changes thread pool parameters, including but not limited to core size, maximum threads, blocking queue size, and rejection policy. It supports differentiated thread pool configurations for different nodes in the application cluster.", - "description": "the desc for the first introduction part" - }, - "homepage.introduction.secondPartTitle": { - "message": "Custom Alarm", - "description": "the title for the second introduction part" - }, - "homepage.introduction.secondPartDesc": { - "message": "Application thread pool runtime point, providing four alarm dimensions: thread pool overload, blocking queue capacity, running for too long, and rejection strategy alarm. It also supports non-repetitive alarms within a custom time period.", - "description": "the desc for the second introduction part" - }, - "homepage.introduction.thirdPartTitle": { - "message": "Operation Monitoring", - "description": "the title for the third introduction part" - }, - "homepage.introduction.thirdPartDesc": { - "message": "Supports custom duration thread pool for data collection and storage, while also supporting Prometheus, InfluxDB, and other monitoring systems. Provides visualized dashboard monitoring metrics through Grafana or built-in monitoring pages.", - "description": "the desc for the third introduction part" - }, - "theme.ErrorPageContent.title": { - "message": "This page crashed.", - "description": "The title of the fallback page when the page crashed" - }, - "theme.ErrorPageContent.tryAgain": { - "message": "Try again", - "description": "The label of the button to try again when the page crashed" - }, - "theme.NotFound.title": { - "message": "Page Not Found", - "description": "The title of the 404 page" - }, - "theme.NotFound.p1": { - "message": "We could not find what you were looking for.", - "description": "The first paragraph of the 404 page" - }, - "theme.NotFound.p2": { - "message": "Please contact the owner of the site that linked you to the original URL and let them know their link is broken.", - "description": "The 2nd paragraph of the 404 page" - }, - "theme.blog.archive.title": { - "message": "Archive", - "description": "The page & hero title of the blog archive page" - }, - "theme.blog.archive.description": { - "message": "Archive", - "description": "The page & hero description of the blog archive page" - }, - "theme.blog.paginator.navAriaLabel": { - "message": "Blog list page navigation", - "description": "The ARIA label for the blog pagination" - }, - "theme.blog.paginator.newerEntries": { - "message": "Newer Entries", - "description": "The label used to navigate to the newer blog posts page (previous page)" - }, - "theme.blog.paginator.olderEntries": { - "message": "Older Entries", - "description": "The label used to navigate to the older blog posts page (next page)" - }, - "theme.admonition.note": { - "message": "note", - "description": "The default label used for the Note admonition (:::note)" - }, - "theme.admonition.tip": { - "message": "tip", - "description": "The default label used for the Tip admonition (:::tip)" - }, - "theme.admonition.danger": { - "message": "danger", - "description": "The default label used for the Danger admonition (:::danger)" - }, - "theme.admonition.info": { - "message": "info", - "description": "The default label used for the Info admonition (:::info)" - }, - "theme.admonition.caution": { - "message": "caution", - "description": "The default label used for the Caution admonition (:::caution)" - }, - "theme.BackToTopButton.buttonAriaLabel": { - "message": "Scroll back to top", - "description": "The ARIA label for the back to top button" - }, - "theme.blog.post.paginator.navAriaLabel": { - "message": "Blog post page navigation", - "description": "The ARIA label for the blog posts pagination" - }, - "theme.blog.post.paginator.newerPost": { - "message": "Newer Post", - "description": "The blog post button label to navigate to the newer/previous post" - }, - "theme.blog.post.paginator.olderPost": { - "message": "Older Post", - "description": "The blog post button label to navigate to the older/next post" - }, - "theme.blog.post.plurals": { - "message": "One post|{count} posts", - "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" - }, - "theme.blog.tagTitle": { - "message": "{nPosts} tagged with \"{tagName}\"", - "description": "The title of the page for a blog tag" - }, - "theme.tags.tagsPageLink": { - "message": "View All Tags", - "description": "The label of the link targeting the tag list page" - }, - "theme.colorToggle.ariaLabel": { - "message": "Switch between dark and light mode (currently {mode})", - "description": "The ARIA label for the navbar color mode toggle" - }, - "theme.colorToggle.ariaLabel.mode.dark": { - "message": "dark mode", - "description": "The name for the dark color mode" - }, - "theme.colorToggle.ariaLabel.mode.light": { - "message": "light mode", - "description": "The name for the light color mode" - }, - "theme.docs.breadcrumbs.home": { - "message": "Home page", - "description": "The ARIA label for the home page in the breadcrumbs" - }, - "theme.docs.breadcrumbs.navAriaLabel": { - "message": "Breadcrumbs", - "description": "The ARIA label for the breadcrumbs" - }, - "theme.docs.DocCard.categoryDescription": { - "message": "{count} items", - "description": "The default description for a category card in the generated index about how many items this category includes" - }, - "theme.docs.paginator.navAriaLabel": { - "message": "Docs pages navigation", - "description": "The ARIA label for the docs pagination" - }, - "theme.docs.paginator.previous": { - "message": "Previous", - "description": "The label used to navigate to the previous doc" - }, - "theme.docs.paginator.next": { - "message": "Next", - "description": "The label used to navigate to the next doc" - }, - "theme.docs.tagDocListPageTitle.nDocsTagged": { - "message": "One doc tagged|{count} docs tagged", - "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" - }, - "theme.docs.tagDocListPageTitle": { - "message": "{nDocsTagged} with \"{tagName}\"", - "description": "The title of the page for a docs tag" - }, - "theme.docs.versionBadge.label": { - "message": "Version: {versionLabel}" - }, - "theme.docs.versions.unreleasedVersionLabel": { - "message": "This is unreleased documentation for {siteTitle} {versionLabel} version.", - "description": "The label used to tell the user that he's browsing an unreleased doc version" - }, - "theme.docs.versions.unmaintainedVersionLabel": { - "message": "This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.", - "description": "The label used to tell the user that he's browsing an unmaintained doc version" - }, - "theme.docs.versions.latestVersionSuggestionLabel": { - "message": "For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).", - "description": "The label used to tell the user to check the latest version" - }, - "theme.docs.versions.latestVersionLinkLabel": { - "message": "latest version", - "description": "The label used for the latest version suggestion link label" - }, - "theme.common.editThisPage": { - "message": "Edit this page", - "description": "The link label to edit the current page" - }, - "theme.common.headingLinkTitle": { - "message": "Direct link to heading", - "description": "Title for link to heading" - }, - "theme.lastUpdated.atDate": { - "message": " on {date}", - "description": "The words used to describe on which date a page has been last updated" - }, - "theme.lastUpdated.byUser": { - "message": " by {user}", - "description": "The words used to describe by who the page has been last updated" - }, - "theme.lastUpdated.lastUpdatedAtBy": { - "message": "Last updated{atDate}{byUser}", - "description": "The sentence used to display when a page has been last updated, and by who" - }, - "theme.navbar.mobileVersionsDropdown.label": { - "message": "Versions", - "description": "The label for the navbar versions dropdown on mobile view" - }, - "theme.common.skipToMainContent": { - "message": "Skip to main content", - "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" - }, - "theme.tags.tagsListLabel": { - "message": "Tags:", - "description": "The label alongside a tag list" - }, - "theme.AnnouncementBar.closeButtonAriaLabel": { - "message": "Close", - "description": "The ARIA label for close button of announcement bar" - }, - "theme.blog.sidebar.navAriaLabel": { - "message": "Blog recent posts navigation", - "description": "The ARIA label for recent posts in the blog sidebar" - }, - "theme.CodeBlock.copied": { - "message": "Copied", - "description": "The copied button label on code blocks" - }, - "theme.CodeBlock.copyButtonAriaLabel": { - "message": "Copy code to clipboard", - "description": "The ARIA label for copy code blocks button" - }, - "theme.CodeBlock.copy": { - "message": "Copy", - "description": "The copy button label on code blocks" - }, - "theme.CodeBlock.wordWrapToggle": { - "message": "Toggle word wrap", - "description": "The title attribute for toggle word wrapping button of code block lines" - }, - "theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel": { - "message": "Toggle the collapsible sidebar category '{label}'", - "description": "The ARIA label to toggle the collapsible sidebar category" - }, - "theme.navbar.mobileLanguageDropdown.label": { - "message": "Languages", - "description": "The label for the mobile language switcher dropdown" - }, - "theme.TOCCollapsible.toggleButtonLabel": { - "message": "On this page", - "description": "The label used by the button on the collapsible TOC component" - }, - "theme.blog.post.readMore": { - "message": "Read More", - "description": "The label used in blog post item excerpts to link to full blog posts" - }, - "theme.blog.post.readMoreLabel": { - "message": "Read more about {title}", - "description": "The ARIA label for the link to full blog posts from excerpts" - }, - "theme.blog.post.readingTime.plurals": { - "message": "One min read|{readingTime} min read", - "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" - }, - "theme.docs.sidebar.collapseButtonTitle": { - "message": "Collapse sidebar", - "description": "The title attribute for collapse button of doc sidebar" - }, - "theme.docs.sidebar.collapseButtonAriaLabel": { - "message": "Collapse sidebar", - "description": "The title attribute for collapse button of doc sidebar" - }, - "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { - "message": "← Back to main menu", - "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" - }, - "theme.docs.sidebar.expandButtonTitle": { - "message": "Expand sidebar", - "description": "The ARIA label and title attribute for expand button of doc sidebar" - }, - "theme.docs.sidebar.expandButtonAriaLabel": { - "message": "Expand sidebar", - "description": "The ARIA label and title attribute for expand button of doc sidebar" - }, - "theme.tags.tagsPageTitle": { - "message": "Tags", - "description": "The title of the tag list page" - } -} diff --git a/docs/i18n/en/docusaurus-plugin-content-blog/options.json b/docs/i18n/en/docusaurus-plugin-content-blog/options.json deleted file mode 100644 index 9239ff70..00000000 --- a/docs/i18n/en/docusaurus-plugin-content-blog/options.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "title": { - "message": "Blog", - "description": "The title for the blog used in SEO" - }, - "description": { - "message": "Blog", - "description": "The description for the blog used in SEO" - }, - "sidebar.title": { - "message": "Recent posts", - "description": "The label for the left sidebar" - } -} diff --git a/docs/i18n/en/docusaurus-plugin-content-docs-community/current.json b/docs/i18n/en/docusaurus-plugin-content-docs-community/current.json deleted file mode 100644 index 647c4069..00000000 --- a/docs/i18n/en/docusaurus-plugin-content-docs-community/current.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "version.label": { - "message": "Next", - "description": "The label for version current" - }, - "sidebar.community.category.贡献规约": { - "message": "贡献规约", - "description": "The label for category 贡献规约 in sidebar community" - } -} diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current.json b/docs/i18n/en/docusaurus-plugin-content-docs/current.json deleted file mode 100644 index 780bc3c9..00000000 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "version.label": { - "message": "Next", - "description": "The label for version current" - }, - "sidebar.tutorialSidebar.category.user_docs": { - "message": "user_docs", - "description": "The label for category user_docs in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar tutorialSidebar" - }, - "sidebar.user_docs.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar user_docs" - }, - "sidebar.user_docs.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar user_docs" - }, - "sidebar.user_docs.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar user_docs" - }, - "sidebar.user_docs.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar user_docs" - } -} diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/version-1.4.2.json b/docs/i18n/en/docusaurus-plugin-content-docs/version-1.4.2.json deleted file mode 100644 index 4393497b..00000000 --- a/docs/i18n/en/docusaurus-plugin-content-docs/version-1.4.2.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "version.label": { - "message": "1.4.2", - "description": "The label for version 1.4.2" - }, - "sidebar.tutorialSidebar.category.user_docs": { - "message": "user_docs", - "description": "The label for category user_docs in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar tutorialSidebar" - }, - "sidebar.user_docs.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar user_docs" - }, - "sidebar.user_docs.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar user_docs" - }, - "sidebar.user_docs.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar user_docs" - }, - "sidebar.user_docs.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar user_docs" - } -} diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/version-1.4.3.json b/docs/i18n/en/docusaurus-plugin-content-docs/version-1.4.3.json deleted file mode 100644 index a395bb56..00000000 --- a/docs/i18n/en/docusaurus-plugin-content-docs/version-1.4.3.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "version.label": { - "message": "1.4.3", - "description": "The label for version 1.4.3" - }, - "sidebar.tutorialSidebar.category.user_docs": { - "message": "user_docs", - "description": "The label for category user_docs in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar tutorialSidebar" - }, - "sidebar.user_docs.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar user_docs" - }, - "sidebar.user_docs.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar user_docs" - }, - "sidebar.user_docs.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar user_docs" - }, - "sidebar.user_docs.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar user_docs" - } -} diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/version-1.5.0.json b/docs/i18n/en/docusaurus-plugin-content-docs/version-1.5.0.json deleted file mode 100644 index 13116144..00000000 --- a/docs/i18n/en/docusaurus-plugin-content-docs/version-1.5.0.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "version.label": { - "message": "1.5.0", - "description": "The label for version 1.5.0" - }, - "sidebar.tutorialSidebar.category.user_docs": { - "message": "user_docs", - "description": "The label for category user_docs in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar tutorialSidebar" - }, - "sidebar.user_docs.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar user_docs" - }, - "sidebar.user_docs.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar user_docs" - }, - "sidebar.user_docs.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar user_docs" - }, - "sidebar.user_docs.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar user_docs" - } -} diff --git a/docs/i18n/en/docusaurus-theme-classic/footer.json b/docs/i18n/en/docusaurus-theme-classic/footer.json deleted file mode 100644 index d4f9ae14..00000000 --- a/docs/i18n/en/docusaurus-theme-classic/footer.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "link.title.Docs": { - "message": "Docs", - "description": "The title of the footer links column with title=Docs in the footer" - }, - "link.title.Community": { - "message": "Community", - "description": "The title of the footer links column with title=Community in the footer" - }, - "link.title.More": { - "message": "More", - "description": "The title of the footer links column with title=More in the footer" - }, - "link.title.Links": { - "message": "Links", - "description": "The title of the footer links column with title=Links in the footer" - }, - "link.item.label.Intro": { - "message": "Intro", - "description": "The label of footer link with label=Intro linking to /docs/user_docs/intro" - }, - "link.item.label.Config Mode": { - "message": "Config Mode", - "description": "The label of footer link with label=Config Mode linking to /docs/user_docs/getting_started/config/hippo4j-config-start" - }, - "link.item.label.Server Mode": { - "message": "Server Mode", - "description": "The label of footer link with label=Server Mode linking to /docs/user_docs/getting_started/server/hippo4j-server-start" - }, - "link.item.label.Group": { - "message": "Group", - "description": "The label of footer link with label=Group linking to http://hippo4j.cn/group" - }, - "link.item.label.WeChat": { - "message": "WeChat", - "description": "The label of footer link with label=WeChat linking to https://mp.weixin.qq.com/s/diVHYvwiuYH9aWpZDPc27g" - }, - "link.item.label.Gitee": { - "message": "Gitee", - "description": "The label of footer link with label=Gitee linking to https://gitee.com/opengoofy/hippo4j" - }, - "link.item.label.GitHub": { - "message": "GitHub", - "description": "The label of footer link with label=GitHub linking to https://github.com/opengoofy/hippo4j" - }, - "link.item.label.推广合作": { - "message": "推广合作", - "description": "The label of footer link with label=推广合作 linking to http://hippo4j.cn/docs/user_docs/other/operation" - }, - "copyright": { - "message": "Copyright © 2021-2023 马丁版权所有 京ICP备2021038095号\n", - "description": "The footer copyright" - } -} diff --git a/docs/i18n/en/docusaurus-theme-classic/navbar.json b/docs/i18n/en/docusaurus-theme-classic/navbar.json deleted file mode 100644 index d746aabf..00000000 --- a/docs/i18n/en/docusaurus-theme-classic/navbar.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "item.label.文档": { - "message": "Docs", - "description": "Navbar item with label 文档" - }, - "item.label.社区": { - "message": "Community", - "description": "Navbar item with label 社区" - }, - "item.label.采用公司": { - "message": "Users", - "description": "Navbar item with label 采用公司" - }, - "item.label.加群沟通": { - "message": "Communication", - "description": "Navbar item with label 加群沟通" - }, - "item.label.控制台样例": { - "message": "Example", - "description": "Navbar item with label 控制台样例" - }, - "item.label.🚀 拿个offer": { - "message": "🚀 GetOffer", - "description": "Navbar item with label 🚀 拿个offer" - } -} diff --git a/docs/i18n/zh/code.json b/docs/i18n/zh/code.json deleted file mode 100644 index d52a7d77..00000000 --- a/docs/i18n/zh/code.json +++ /dev/null @@ -1,364 +0,0 @@ -{ - "theme.ErrorPageContent.title": { - "message": "页面已崩溃。", - "description": "The title of the fallback page when the page crashed" - }, - "theme.ErrorPageContent.tryAgain": { - "message": "重试", - "description": "The label of the button to try again when the page crashed" - }, - "theme.NotFound.title": { - "message": "找不到页面", - "description": "The title of the 404 page" - }, - "theme.NotFound.p1": { - "message": "我们找不到您要找的页面。", - "description": "The first paragraph of the 404 page" - }, - "theme.NotFound.p2": { - "message": "请联系原始链接来源网站的所有者,并告知他们链接已损坏。", - "description": "The 2nd paragraph of the 404 page" - }, - "theme.admonition.note": { - "message": "备注", - "description": "The default label used for the Note admonition (:::note)" - }, - "theme.admonition.tip": { - "message": "提示", - "description": "The default label used for the Tip admonition (:::tip)" - }, - "theme.admonition.danger": { - "message": "危险", - "description": "The default label used for the Danger admonition (:::danger)" - }, - "theme.admonition.info": { - "message": "信息", - "description": "The default label used for the Info admonition (:::info)" - }, - "theme.admonition.caution": { - "message": "警告", - "description": "The default label used for the Caution admonition (:::caution)" - }, - "theme.BackToTopButton.buttonAriaLabel": { - "message": "回到顶部", - "description": "The ARIA label for the back to top button" - }, - "theme.blog.paginator.navAriaLabel": { - "message": "博文列表分页导航", - "description": "The ARIA label for the blog pagination" - }, - "theme.blog.paginator.newerEntries": { - "message": "较新的博文", - "description": "The label used to navigate to the newer blog posts page (previous page)" - }, - "theme.blog.paginator.olderEntries": { - "message": "较旧的博文", - "description": "The label used to navigate to the older blog posts page (next page)" - }, - "theme.blog.archive.title": { - "message": "历史博文", - "description": "The page & hero title of the blog archive page" - }, - "theme.blog.archive.description": { - "message": "历史博文", - "description": "The page & hero description of the blog archive page" - }, - "theme.blog.post.paginator.navAriaLabel": { - "message": "博文分页导航", - "description": "The ARIA label for the blog posts pagination" - }, - "theme.blog.post.paginator.newerPost": { - "message": "较新一篇", - "description": "The blog post button label to navigate to the newer/previous post" - }, - "theme.blog.post.paginator.olderPost": { - "message": "较旧一篇", - "description": "The blog post button label to navigate to the older/next post" - }, - "theme.colorToggle.ariaLabel": { - "message": "切换浅色/暗黑模式(当前为{mode})", - "description": "The ARIA label for the navbar color mode toggle" - }, - "theme.colorToggle.ariaLabel.mode.dark": { - "message": "暗黑模式", - "description": "The name for the dark color mode" - }, - "theme.colorToggle.ariaLabel.mode.light": { - "message": "浅色模式", - "description": "The name for the light color mode" - }, - "theme.blog.post.plurals": { - "message": "{count} 篇博文", - "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" - }, - "theme.blog.tagTitle": { - "message": "{nPosts} 含有标签「{tagName}」", - "description": "The title of the page for a blog tag" - }, - "theme.tags.tagsPageLink": { - "message": "查看所有标签", - "description": "The label of the link targeting the tag list page" - }, - "theme.docs.breadcrumbs.home": { - "message": "主页面", - "description": "The ARIA label for the home page in the breadcrumbs" - }, - "theme.docs.breadcrumbs.navAriaLabel": { - "message": "页面路径", - "description": "The ARIA label for the breadcrumbs" - }, - "theme.docs.DocCard.categoryDescription": { - "message": "{count} 个项目", - "description": "The default description for a category card in the generated index about how many items this category includes" - }, - "theme.docs.paginator.navAriaLabel": { - "message": "文档分页导航", - "description": "The ARIA label for the docs pagination" - }, - "theme.docs.paginator.previous": { - "message": "上一页", - "description": "The label used to navigate to the previous doc" - }, - "theme.docs.paginator.next": { - "message": "下一页", - "description": "The label used to navigate to the next doc" - }, - "theme.docs.tagDocListPageTitle.nDocsTagged": { - "message": "{count} 篇文档带有标签", - "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" - }, - "theme.docs.tagDocListPageTitle": { - "message": "{nDocsTagged}「{tagName}」", - "description": "The title of the page for a docs tag" - }, - "theme.docs.versionBadge.label": { - "message": "版本:{versionLabel}" - }, - "theme.docs.versions.unreleasedVersionLabel": { - "message": "此为 {siteTitle} {versionLabel} 版尚未发行的文档。", - "description": "The label used to tell the user that he's browsing an unreleased doc version" - }, - "theme.docs.versions.unmaintainedVersionLabel": { - "message": "此为 {siteTitle} {versionLabel} 版的文档,现已不再积极维护。", - "description": "The label used to tell the user that he's browsing an unmaintained doc version" - }, - "theme.docs.versions.latestVersionSuggestionLabel": { - "message": "最新的文档请参阅 {latestVersionLink} ({versionLabel})。", - "description": "The label used to tell the user to check the latest version" - }, - "theme.docs.versions.latestVersionLinkLabel": { - "message": "最新版本", - "description": "The label used for the latest version suggestion link label" - }, - "theme.common.editThisPage": { - "message": "编辑此页", - "description": "The link label to edit the current page" - }, - "theme.common.headingLinkTitle": { - "message": "标题的直接链接", - "description": "Title for link to heading" - }, - "theme.lastUpdated.atDate": { - "message": "于 {date} ", - "description": "The words used to describe on which date a page has been last updated" - }, - "theme.lastUpdated.byUser": { - "message": "由 {user} ", - "description": "The words used to describe by who the page has been last updated" - }, - "theme.lastUpdated.lastUpdatedAtBy": { - "message": "最后{byUser}{atDate}更新", - "description": "The sentence used to display when a page has been last updated, and by who" - }, - "theme.navbar.mobileVersionsDropdown.label": { - "message": "选择版本", - "description": "The label for the navbar versions dropdown on mobile view" - }, - "theme.common.skipToMainContent": { - "message": "跳到主要内容", - "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" - }, - "theme.tags.tagsListLabel": { - "message": "标签:", - "description": "The label alongside a tag list" - }, - "theme.AnnouncementBar.closeButtonAriaLabel": { - "message": "关闭", - "description": "The ARIA label for close button of announcement bar" - }, - "theme.blog.sidebar.navAriaLabel": { - "message": "最近博文导航", - "description": "The ARIA label for recent posts in the blog sidebar" - }, - "theme.CodeBlock.copied": { - "message": "复制成功", - "description": "The copied button label on code blocks" - }, - "theme.CodeBlock.copyButtonAriaLabel": { - "message": "复制代码到剪贴板", - "description": "The ARIA label for copy code blocks button" - }, - "theme.CodeBlock.copy": { - "message": "复制", - "description": "The copy button label on code blocks" - }, - "theme.CodeBlock.wordWrapToggle": { - "message": "切换自动换行", - "description": "The title attribute for toggle word wrapping button of code block lines" - }, - "theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel": { - "message": "打开/收起侧边栏菜单「{label}」", - "description": "The ARIA label to toggle the collapsible sidebar category" - }, - "theme.navbar.mobileLanguageDropdown.label": { - "message": "选择语言", - "description": "The label for the mobile language switcher dropdown" - }, - "theme.TOCCollapsible.toggleButtonLabel": { - "message": "本页总览", - "description": "The label used by the button on the collapsible TOC component" - }, - "theme.docs.sidebar.collapseButtonTitle": { - "message": "收起侧边栏", - "description": "The title attribute for collapse button of doc sidebar" - }, - "theme.docs.sidebar.collapseButtonAriaLabel": { - "message": "收起侧边栏", - "description": "The title attribute for collapse button of doc sidebar" - }, - "theme.blog.post.readingTime.plurals": { - "message": "阅读需 {readingTime} 分钟", - "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" - }, - "theme.blog.post.readMore": { - "message": "阅读更多", - "description": "The label used in blog post item excerpts to link to full blog posts" - }, - "theme.blog.post.readMoreLabel": { - "message": "阅读 {title} 的全文", - "description": "The ARIA label for the link to full blog posts from excerpts" - }, - "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { - "message": "← 回到主菜单", - "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" - }, - "theme.docs.sidebar.expandButtonTitle": { - "message": "展开侧边栏", - "description": "The ARIA label and title attribute for expand button of doc sidebar" - }, - "theme.docs.sidebar.expandButtonAriaLabel": { - "message": "展开侧边栏", - "description": "The ARIA label and title attribute for expand button of doc sidebar" - }, - "theme.tags.tagsPageTitle": { - "message": "标签", - "description": "The title of the tag list page" - }, - "Community": { - "message": "社区" - }, - "homepage.titleDescription1": { - "message": "Java线程池框架", - "description": "The homepage title description" - }, - "homepage.titleDescription2": { - "message": "动态可观测Java线程池框架,为你的业务系统提高线上运行保障能力", - "description": "The homepage title description" - }, - "homepage.startButton": { - "message": "快速开始", - "description": "The homepage start button text" - }, - "homepage.secondTitle": { - "message": "Hippo4j能做什么?", - "description": "The title for the introduction part" - }, - "homepage.introduction.fristPartTitle": { - "message": "动态变更", - "description": "the title for the first introduction part" - }, - "homepage.introduction.fristPartDesc": { - "message": "应用运行时动态变更线程池参数,包括不限于核心、最大线程、阻塞队列大小和拒绝策略等,支持应用集群下不同节点线程池配置差异化", - "description": "the desc for the first introduction part" - }, - "homepage.introduction.secondPartTitle": { - "message": "自定义报警", - "description": "the title for the second introduction part" - }, - "homepage.introduction.secondPartDesc": { - "message": "应用线程池运行时埋点,提供四种报警维度,线程池过载、阻塞队列容量、运行超长以及拒绝策略报警,并支持自定义时间内不重复报警", - "description": "the desc for the second introduction part" - }, - "homepage.introduction.thirdPartTitle": { - "message": "运行监控", - "description": "the title for the third introduction part" - }, - "homepage.introduction.thirdPartDesc": { - "message": "支持自定义时长线程池运行数据采集存储,同时也支持 Prometheus、InfluxDB 等采集监控,通过 Grafana 或内置监控页面提供可视化大屏监控运行指标", - "description": "the desc for the third introduction part" - }, - "companyPage.title": { - "message": "谁在使用 Hippo4j ?", - "description": "the title for the company page" - }, - "companyPage.descriptionText": { - "message": "非常感谢大家对 Hippo4j 的关注和支持,这是我们前进最大的动力。", - "description": "the description for the company page" - }, - "companyPage.questionText": { - "message": "正在使用Hippo4j ?", - "description": "the text for the company question" - }, - "companyPage.linkText": { - "message": "点击进行登记", - "description": "the text for the company page link" - }, - "homepage.introduction.fristPartDesc1": { - "message": "应用程序运行时动态更改线程池参数。", - "description": "The first desc for fristPart " - }, - "homepage.introduction.fristPartDesc2": { - "message": "包括但不限于核心大小、最大线程数、阻塞队列大小和拒绝策略。", - "description": "The second desc for fristPart " - }, - "homepage.introduction.fristPartDesc3": { - "message": "支持应用集群中不同节点的差异化线程池配置。", - "description": "The third desc for fristPart " - }, - "homepage.introduction.secondPartDesc1": { - "message": "应用程序线程池运行时点,提供四个告警维度,并支持自定义时间内不重复报警。", - "description": "The first desc for secondPart " - }, - "homepage.introduction.secondPartDesc2": { - "message": "线程池超载,阻塞队列容量,运行时间过长以及拒绝策略警报。", - "description": "The second desc for secondPart " - }, - "homepage.introduction.secondPartDesc3": { - "message": "它还支持在自定义时间段内的非重复闹钟。", - "description": "The third desc for secondPart " - }, - "homepage.introduction.thirdPartDesc1": { - "message": "支持为数据收集和存储设置自定义持续时间的线程池。", - "description": "The first desc for thirdPart " - }, - "homepage.introduction.thirdPartDesc2": { - "message": "同时还支持Prometheus、InfluxDB和其他监控系统。", - "description": "The second desc for thirdPart " - }, - "homepage.introduction.thirdPartDesc3": { - "message": "通过Grafana或内置的监控页面提供可视化仪表盘监控指标。", - "description": "The third desc for thirdPart " - }, - "homepage.secondTitleDesc1": { - "message": "Hippo4j是一个Java线程池框架。", - "description": "The p1 for the secondTitle part" - }, - "homepage.secondTitleDesc2": { - "message": "提供了线程池核心参数动态调整、运行告警和监控等功能。", - "description": "The p1 for the secondTitle part" - }, - "homepage.secondTitleDesc3": { - "message": "帮助业务系统提高线上稳定运行能力。", - "description": "The p2 for the secondTitle part" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-blog/2022-06-06-hippo4j/index.md b/docs/i18n/zh/docusaurus-plugin-content-blog/2022-06-06-hippo4j/index.md deleted file mode 100644 index e5aaba49..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-blog/2022-06-06-hippo4j/index.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -slug: Hippo-4J发布1.3.0版本 -title: Hippo-4J发布1.3.0版本 -authors: [xiaomage] -tags: [hippo4j, release, 1.3.0] ---- - -大家好,我是 **小马哥**。 - -Hippo4j 距离上一个版本 1.2.1 已经过去一个月的时间。在此期间,由 **8 位贡献者** 提交了 **170+ commits**,正式发布 **1.3.0** 版本。 - -注:这是一个 **兼容历史版本** 的重大升级。 - -## HIPPO-4J 1.3.0 - -### Feature - -1. 添加 RabbitMQ 线程池监控及动态变更 -2. 添加 RocketMQ 线程池监控及动态变更 -3. 添加 Dubbo 线程池监控及动态变更 -4. 添加 SpringCloud Stream RocketMQ 消费线程池监控及动态变更 - -### Refactor - -1. 重构容器线程池查询及修改功能 -2. 优化配置中心触发监听后,所执行的数据变更逻辑 - -### Optimize - -1. 前端控制台删除无用组件 -2. 服务端页面字段未显示中文 -3. 控制台 UI 优化 -4. 修改线程池实例后实时刷新列表参数 -5. 容器线程池编辑仅限 Admin 权限 -6. SpringBoot Starter 变更包路径 - -### BUG - -1. 修复 SpringBoot Nacos 动态刷新不生效 -2. 报警配置 alarm=false 不配置通知报警平台和接收人报错 - -## 三方框架线程池适配 - -Hippo4j 1.3.0 最大的功能发布就是开发出了 **适配三方框架的基础框架**。 - -目前已完成 **Dubbo、RabbitMQ、RocketMQ、RocketMQSpringCloudStream** 的线程池适配,后续还会接入 **Kafka、Hystrix** 等框架或中间件的线程池适配。 - -### 引入适配三方框架 Jar 包 - -引入 Hippo4j server 或 core 的 maven jar 坐标后,还需要引入对应的框架适配 jar: - -```xml - - cn.hippo4j - - hippo4j-spring-boot-starter-adapter-dubbo - - hippo4j-spring-boot-starter-adapter-rabbitmq - - hippo4j-spring-boot-starter-adapter-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq - 1.3.0 - -``` - -如果想觉得引入多个 jar 包繁琐,可以仅需引入一个全量包,Hippo4j 框架底层会根据各中间件的条件,判断加载具体线程池适配器。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-adapter-all - 1.3.0 - -``` - -### HIPPO-4J Server - -Hippo4j server 引入上述适配 jar 包后,即可在 Hippo4j server 的控制台进行查看及修改三方框架线程池。 - -![图1 线程池适配列表](https://oss.open8gu.com/image-20220531194810047.png) - - - -点击编辑即可修改该 Java 应用对应的框架底层线程池。 - -![图2 修改三方线程池](https://oss.open8gu.com/image-20220605152549732.png) - - - -点击 **全部修改** 按钮可以修改当前组下所有应用实例的线程池配置。 - -修改成功后,应用控制台打印以下日志,即为修改成功。 - -```java -[input] RocketMQ consumption thread pool parameter change. coreSize :: 1 => 10, maximumSize :: 1 => 10 -``` - -### HIPPO-4J Core - -Hippo4j core 除了依赖上述适配 Jar 包外,还需要在配置中心添加以下配置项。 - -```yaml -spring: - dynamic: - thread-pool: - # 省略其它配置 - adapter-executors: - # threadPoolKey 代表线程池标识 - - threadPoolKey: 'input' - # mark 为三方线程池框架类型,参见文初已支持框架集合 - mark: 'RocketMQSpringCloudStream' - corePoolSize: 10 - maximumPoolSize: 10 -``` - -## Gitee GVP - -Hippo4j 获得了一些宝贵的荣誉,这属于每一位对 Hippo4j 做出过贡献的成员。 - -![图3 GVP 证书](https://oss.open8gu.com/170607238-7308c9be-1d63-46a6-852c-eef2e4cf7405.jpeg) - - - -感谢所有为 Hippo4j 做出贡献的开发者! - -https://github.com/opengoofy/hippo4j/graphs/contributors - -![图4 Hippo4j 开发者](https://oss.open8gu.com/image-20220605151136276.png) - - - -## 最后总结 - -开源不易,如果各位小伙伴看了 Hippo4j 框架后有所收获,希望能帮忙在 Github、Gitee 点个 star,谢谢。 - -**Github**:https://github.com/opengoofy/hippo4j - -**Gitee**:https://gitee.com/mabaiwancn/hippo4j - -目前已有 **10+** 公司在生产环境使用 Hippo4j,如果贵公司使用了 Hippo4j,请在下方 Issue 登记,谢谢。 - -**Issue**:https://github.com/opengoofy/hippo4j/issues/13 - -登记使用不会对公司有任何影响,仅为了扩大 Hippo4j 影响力,帮助它能走得更远。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-blog/authors.yml b/docs/i18n/zh/docusaurus-plugin-content-blog/authors.yml deleted file mode 100644 index ffffe8d4..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-blog/authors.yml +++ /dev/null @@ -1,5 +0,0 @@ -xiaomage: - name: 小马哥 - title: hippo4j 作者 - url: https://github.com/magegoofy - image_url: https://avatars.githubusercontent.com/u/77398366?v=4 diff --git a/docs/i18n/zh/docusaurus-plugin-content-blog/options.json b/docs/i18n/zh/docusaurus-plugin-content-blog/options.json deleted file mode 100644 index 9239ff70..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-blog/options.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "title": { - "message": "Blog", - "description": "The title for the blog used in SEO" - }, - "description": { - "message": "Blog", - "description": "The description for the blog used in SEO" - }, - "sidebar.title": { - "message": "Recent posts", - "description": "The label for the left sidebar" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current.json b/docs/i18n/zh/docusaurus-plugin-content-docs-community/current.json deleted file mode 100644 index 1c24558f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "version.label": { - "message": "Next", - "description": "The label for version current" - }, - "sidebar.tutorialSidebar.category.社区": { - "message": "社区", - "description": "The label for category 社区 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.贡献规约": { - "message": "贡献规约", - "description": "The label for category 贡献规约 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.user_docs": { - "message": "user_docs", - "description": "The label for category user_docs in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar tutorialSidebar" - }, - "sidebar.user_docs.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar user_docs" - }, - "sidebar.user_docs.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar user_docs" - }, - "sidebar.user_docs.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar user_docs" - }, - "sidebar.user_docs.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar user_docs" - }, - "sidebar.community.category.贡献规约": { - "message": "贡献规约", - "description": "The label for category 贡献规约 in sidebar community" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/_category_.json deleted file mode 100644 index bcd256c9..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "社区", - "position": 1, - "link": { - "type": "generated-index" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/contributor.md b/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/contributor.md deleted file mode 100644 index dd77fa3d..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/contributor.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -id: contributor-guide -sidebar_position: 1 -title: 贡献指南 ---- - -Git Commit Log 尽量使用英文。 - -Pull Request 尽量保持单一,不同语义的代码贡献应拆分多个 Pull Request。 - -为了让您的 GitHub ID 显示在 Contributor 列表中,别忘了以下设置: - -```shell -git config --global user.name "username" -git config --global user.email "GitHub 账号邮箱" -``` \ No newline at end of file diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/dev_convention/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/dev_convention/_category_.json deleted file mode 100644 index cb875453..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/dev_convention/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "贡献规约", - "position": 2, - "link": { - "type": "generated-index" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/dev_convention/code.md b/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/dev_convention/code.md deleted file mode 100644 index f91acdbe..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/dev_convention/code.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 代码规约 - -1. 代码提交前,执行 `mvn spotless:apply` 保证代码格式符合规范。 -2. 代码中不要出现无意义的空行。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/dev_convention/document.md b/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/dev_convention/document.md deleted file mode 100644 index 923ad81d..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/dev_convention/document.md +++ /dev/null @@ -1,227 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 文档规约 - -文档引用自:[中文文案排版指北](https://github.com/sparanoid/chinese-copywriting-guidelines) - -## 空格 - -> 「有研究顯示,打字的時候不喜歡在中文和英文之間加空格的人,感情路都走得很辛苦,有七成的比例會在 34 歲的時候跟自己不愛的人結婚,而其餘三成的人最後只能把遺產留給自己的貓。畢竟愛情跟書寫都需要適時地留白。 -> -> 與大家共勉之。」——[vinta/paranoid-auto-spacing](https://github.com/vinta/pangu.js) - -### 中英文之間需要增加空格 - -正確: - -> 在 LeanCloud 上,數據儲存是圍繞 `AVObject` 進行的。 - -錯誤: - -> 在LeanCloud上,數據儲存是圍繞`AVObject`進行的。 - -> 在 LeanCloud上,數據儲存是圍繞`AVObject` 進行的。 - -完整的正確用法: - -> 在 LeanCloud 上,數據儲存是圍繞 `AVObject` 進行的。每個 `AVObject` 都包含了與 JSON 兼容的 key-value 對應的數據。數據是 schema-free 的,你不需要在每個 `AVObject` 上提前指定存在哪些键,只要直接設定對應的 key-value 即可。 - -例外:「豆瓣FM」等產品名詞,按照官方所定義的格式書寫。 - -### 中文與數字之間需要增加空格 - -正確: - -> 今天出去買菜花了 5000 元。 - -錯誤: - -> 今天出去買菜花了 5000元。 - -> 今天出去買菜花了5000元。 - -### 數字與單位之間需要增加空格 - -正確: - -> 我家的光纖入屋寬頻有 10 Gbps,SSD 一共有 20 TB。 - -錯誤: - -> 我家的光纖入屋寬頻有 10Gbps,SSD 一共有 20TB。 - -例外:度數/百分比與數字之間不需要增加空格: - -正確: - -> 角度為 90° 的角,就是直角。 - -> 新 MacBook Pro 有 15% 的 CPU 性能提升。 - -錯誤: - -> 角度為 90 ° 的角,就是直角。 - -> 新 MacBook Pro 有 15 % 的 CPU 性能提升。 - -### 全形標點與其他字符之間不加空格 - -正確: - -> 剛剛買了一部 iPhone,好開心! - -錯誤: - -> 剛剛買了一部 iPhone ,好開心! - -> 剛剛買了一部 iPhone, 好開心! - -### `text-spacing` to the rescue? - -CSS Text Module Level 4 的 [`text-spacing`](https://www.w3.org/TR/css-text-4/#text-spacing-property) 和 Microsoft 的 [`-ms-text-autospace`](https://msdn.microsoft.com/library/ms531164(v=vs.85).aspx) 可以實現自動為中英文之間增加空白。不過目前並未普及,另外在其他應用場景,例如 macOS、iOS、Windows 等用戶介面目前並不存在這個特性,所以請繼續保持隨手加空格的習慣。 - -## 標點符號 - -### 不重複使用標點符號 - -即使中國大陸的標點符號用法允許重複使用標點符號,但是這麼做會破壞句子的美觀性。 - -正確: - -> 德國隊竟然戰勝了巴西隊! - -> 她竟然對你說「喵」?! - -錯誤: - -> 德國隊竟然戰勝了巴西隊!! - -> 德國隊竟然戰勝了巴西隊!!!!!!!! - -> 她竟然對你說「喵」??!! - -> 她竟然對你說「喵」?!?!??!! - -## 全形和半形 - -不明白什麼是全形(全角)與半形(半角)符號?請查看維基百科條目『[全形和半形](https://zh.wikipedia.org/wiki/%E5%85%A8%E5%BD%A2%E5%92%8C%E5%8D%8A%E5%BD%A2)』。 - -### 使用全形中文標點 - -正確: - -> 嗨!你知道嘛?今天前台的小妹跟我說「喵」了哎! - -> 核磁共振成像(NMRI)是什麼原理都不知道?JFGI! - -錯誤: - -> 嗨! 你知道嘛? 今天前台的小妹跟我說 "喵" 了哎! - -> 嗨!你知道嘛?今天前台的小妹跟我說"喵"了哎! - -> 核磁共振成像 (NMRI) 是什麼原理都不知道? JFGI! - -> 核磁共振成像(NMRI)是什麼原理都不知道?JFGI! - -### 數字使用半形字符 - -正確: - -> 這件蛋糕只賣 1000 元。 - -錯誤: - -> 這件蛋糕只賣 1000 元。 - -例外:在設計稿、宣傳海報中如出現極少量數字的情形時,為方便文字對齊,是可以使用全形數字的。 - -### 遇到完整的英文整句、特殊名詞,其內容使用半形標點 - -正確: - -> 賈伯斯那句話是怎麼說的?「Stay hungry, stay foolish.」 - -> 推薦你閱讀《Hackers & Painters: Big Ideas from the Computer Age》,非常的有趣。 - -錯誤: - -> 賈伯斯那句話是怎麼說的?「Stay hungry,stay foolish。」 - -> 推薦你閱讀《Hackers&Painters:Big Ideas from the Computer Age》,非常的有趣。 - -## 名詞 - -### 專有名詞使用正確的大小寫 - -大小寫相關用法原屬於英文書寫範疇,不屬於本 wiki 討論內容,在這裡只對部分易錯用法進行簡述。 - -正確: - -> 使用 GitHub 登錄 - -> 我們的客戶有 GitHub、Foursquare、Microsoft Corporation、Google、Facebook, Inc.。 - -錯誤: - -> 使用 github 登錄 - -> 使用 GITHUB 登錄 - -> 使用 Github 登錄 - -> 使用 gitHub 登錄 - -> 使用 gイんĤЦ8 登錄 - -> 我們的客戶有 github、foursquare、microsoft corporation、google、facebook, inc.。 - -> 我們的客戶有 GITHUB、FOURSQUARE、MICROSOFT CORPORATION、GOOGLE、FACEBOOK, INC.。 - -> 我們的客戶有 Github、FourSquare、MicroSoft Corporation、Google、FaceBook, Inc.。 - -> 我們的客戶有 gitHub、fourSquare、microSoft Corporation、google、faceBook, Inc.。 - -> 我們的客戶有 gイんĤЦ8、キouЯƧquムгє、๓เςг๏ร๏Ŧt ς๏гק๏гคtเ๏ภn、900913、ƒ4ᄃëв๏๏к, IПᄃ.。 - -注意:當網頁中需要配合整體視覺風格而出現全部大寫/小寫的情形,HTML 中請使用標準的大小寫規範進行書寫;並通過 `text-transform: uppercase;`/`text-transform: lowercase;` 對表現形式進行定義。 - -### 不要使用不道地的縮寫 - -正確: - -> 我們需要一位熟悉 TypeScript、HTML5,至少理解一種框架(如 React、Next.js)的前端開發者。 - -錯誤: - -> 我們需要一位熟悉 Ts、h5,至少理解一種框架(如 RJS、nextjs)的 FED。 - -## 爭議 - -以下用法略帶有個人色彩,即:無論是否遵循下述規則,從語法的角度來講都是**正確**的。 - -### 超連結之間增加空格 - -用法: - -> 請 [提交一個 issue](#) 並分配给相關同事。 - -> 訪問我們網站的最新動態,請 [點擊這裡](#) 進行訂閱! - -對比用法: - -> 請[提交一個 issue](#) 並分配给相關同事。 - -> 訪問我們網站的最新動態,請[點擊這裡](#)進行訂閱! - -### 簡體中文使用直角引號 - -用法: - -> 「老师,『有条不紊』的『紊』是什么意思?」 - -對比用法: - -> “老师,‘有条不紊’的‘紊’是什么意思?” diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/faq.md b/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/faq.md deleted file mode 100644 index 0f0fb830..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/faq.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -sidebar_position: 5 -title: 常见问题 ---- - -# 常见问题 - -- 租户和项目在 Hippo4j 中是什么意思 -- 控制台线程池管理和线程池实例的区别 -- 示例项目为什么会有跨域请求 -- 更新代码后运行时服务端SQL报错 -- 生产环境如何不启用动态线程池 -- Server 端宕机会影响 Client 运行么 -- Hippo4j 的发布方式是怎样的?如何选择正确的版本 -- 群机器人接受不到通知报警 -- 设置线程池参数优先级问题 -- 线程池实例中修改队列容量参数问题 -- 控制台 SocketTimeoutException: connect timed out - -## 租户和项目在 Hippo4j 中是什么意思 - -Hippo4j 按照租户、项目、线程池的维度划分。 - -举个例子,小编在一家公司的公共组件团队,团队中负责消息、短链接网关等项目。公共组件是租户,消息或短链接就是项目。 - -## 控制台线程池管理和线程池实例的区别 - -在线程池管理中修改线程池参数,客户端并不能实时感知到并变更参数,需要重启客户端。而线程池实例中去对具体的实例修改参数时,客户端无需重启,可以实时感知到参数变化。如果二者针对同一线程池的参数配置不同,则在重启客户端时,客户端会去拉去线程池管理中的参数配置。 - -二者对应的定位:线程池管理中的配置是常态化配置。而线程池实例里的配置变更像是一种临时修改,比如突发的流量激增等场景,并不具备普适性。 - -## 示例项目为什么会有跨域请求 - -~~正常大家在部署时,服务端项目和客户端都在同一网络下,进行内网通信,是没有问题的。~~ - -~~因为示例项目中,服务端部署在外网,而客户端注册到服务端 IP 是内网的,所以不通。~~ - -~~涉及功能:线程池实例-查看、编辑,容器线程池。~~ - -1.2.0 版本后,服务端访问客户端已变成,浏览器访问服务端,服务端转发客户端的形式完成调用,跨域问题已解决。 - -## 更新代码后运行时服务端SQL报错 - -如果更新代码运行功能出错,大概率是因为项目新增或修改了表结构。如版本升级迭代涉及数据库表变更,会额外提供 SQL 变更文件。 - -如若第一次使用,初始化 SQL 脚本地址:[Hippo4j_manager.sql](https://github.com/longtai-cn/hippo4j/blob/develop/hippo4j-server/conf/hippo4j_manager.sql)。 - -> 友情提示:每次执行数据库表或数据变更时,一定要保持提前备份的好习惯。 - -## 生产环境如何不启用动态线程池 - -测试环境已经引入 Hippo4j,暂时不打算上线生产环境。 - -生产环境指定配置 `spring.dynamic.thread-pool.enable=false`,测试环境和生产环境配置就会隔离。 - -## Server 端宕机会影响 Client 运行么 - -不会。Client 端包含对 Server 端的健康检查机制,Server 端不可用时会停止交互,检查到可用时重新建立连接交互。 - -## Hippo4j 的发布方式是怎样的?如何选择正确的版本 - -Hippo4j 发布时可能会涉及到两端发布,分别是 Server 和 Starter。如无特殊说明,**每一次的版本升级将兼容上一版本代码**。 - -- 如涉及 Server 发布,会在 [发布列表页面](https://github.com/longtai-cn/hippo4j/releases) 创建最新的发行版本; -- 如涉及 Starter 发布,将直接推送 Starter Jar 至中央仓库,Server 包版本不变。 - -## 群机器人接受不到通知报警 - -如果是钉钉机器人,需在机器人配置自定义关键字,才可发送成功。如下所示: - -![](https://oss.open8gu.com/image-20220530200133377.png?x-oss-process=image/resize,h_500,w_800) - -如果使用 hippo4j-server,请检查在 hippo4j-server 添加的报警通知记录,是否在客户端项目启动前,因为客户端只有在启动时会去 hippo4j-server 拉取报警通知记录。 - -重启客户端项目,会重新拉取最新报警推送配置,问题解决。 - -## 设置线程池参数优先级问题 - -- 当使用 `@DynamicThreadPool` 进行修饰的方法中和在管理界面设置中同时存在的话,则管理界面设置的优先级最高; -- 如果连接 server 端失败的话,使用 `@DynamicThreadPool` 进行修饰设置的优先级最高。 - -## 线程池实例中修改队列容量参数问题 - -在线程池管理中添加时,只有当选择队列类型为 `ResizableCapacityLinkedBlockingQueue` 时,后续再进行修改容量大小时才会实时的刷新修改成功。 - -## 控制台 SocketTimeoutException: connect timed out - -控制台中触发的某些操作涉及到 hippo4j-server 调用客户端项目。如果 hippo4j-server 部署在测试环境,而客户端项目为本地启动,则会触发该问题。 - -为什么编辑线程池参数不报错?因为线程池的动态变更是客户端主动发起连接,和服务端保持了一个长轮询,所以不存在服务端主动调用客户端行为。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/sponsor.md b/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/sponsor.md deleted file mode 100644 index b68062dd..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/sponsor.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 支持开源 - -如果您正在使用这个项目并感觉良好,或者是想支持我继续开发,通过以下二维码一次性捐款。 - -在这里承诺将,将收到的所有赞助支持资金完全公开化,且后续资金用途仅 Hippo4j 项目的运转。 - -![](https://oss.open8gu.com/IMG_6719_2.jpg?x-oss-process=image/resize,h_180,w_180) - -感谢给予支持的朋友,您的支持是 Hippo4j 社区前进的动力 🎉 - -| | ID | 赞赏金额 | 时间 | 备注 | -|-----|--|-------|------------|--------------------| -| 1 | 六月飞雪 | 30.00 | 2021-12-30 | 代码设计很优雅的一款框架,继续加油! | -| 2 | 孙大圣 | 26.6 | 2022-03-23 | 学习一下😁😁 | -| 3 | Easy 点 | 66.00 | 2022-04-09 | 好货好技术当加赏 | -| 4 | 捷克 | 30.00 | 2022-05-21 | 非常不错的框架,点赞 | -| 5 | 吃猫的饼干 | 88.00 | 2022-08-21 | 👍 | -| 6 | 不忘初心· | 66.00 | 2022-10-28 | Nice! | -| 7 | 时刻· | 6.00 | 2022-10-30 | -! | diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/team.md b/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/team.md deleted file mode 100644 index ae24340a..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/team.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -sidebar_position: 3 -title: 团队成员 ---- - -## Hippo4j 团队 - -非常感谢通过开源对 Hippo4j 贡献的开发者,项目始终保持高质量编码,以社区的力量去发展项目,并以项目反馈社区成员。我们期待对开源有兴趣的小伙伴加入团队,与社区共同成长。 - -## 开发者角色 - -Hippo4j 开发者包含 Maintainer、Committer、Contributor 三种角色,每种角色的标准定义如下。 - -### 1. Maintainer - -Maintainer 是对 Hippo4j 项目的演进和发展做出显著贡献的个人。具体包含以下的标准: - -- 完成多个关键模块或者工程的设计与开发,是项目的核心开发人员; -- 持续的投入和激情,能够积极参与社区、官网、Issue、PR 等项目相关事项的维护; -- 在社区中具有有目共睹的影响力,能够代表 Hippo4j 参加重要的社区会议和活动; -- 具有培养 Committer 和 Contributor 的意识和能力。 - -### 2. Committer - -Committer 是具有 Hippo4j 仓库写权限的个人,包含以下的标准: - -- 能够在长时间内做持续贡献 Issue、PR 的个人; -- 参与 Issue 列表的维护及重要 Feature 的讨论; -- 参与 Code review。 - -### 3. Contributor - -Contributor 是对 Hippo4j 项目有贡献的个人,标准为: - -- 提交过 PR(代码或者文档)并被合并。 - -### 4. 开发者权利及义务 - -![](https://oss.open8gu.com/image-20230412144105059.png) - -## 开发团队 - -本页面展示了 Hippo4j 的开发团队,并且还在持续扩充中。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
姓名GitHub ID角色联系方式
马称magestacksMaintainermachen@apache.org
陆宽shining-stars-lkCommitter1031900093@qq.com
王杰iwangjieCommitterwangchenmo1025@gmail.com
魏虎weihubeatsCommitterweihu@apache.org
李剑鑫BigXin0109Committer1064730540@qq.com
刘文浩pizihaoCommitterhao3073liu@163.com
叶炜shanjianqCommitter17855368071@163.com
黄成兴CreatesequenceCommitter841396397@qq.com
吴浪wulangcodeCommittersanliangitch@foxmail.com
黎金星road2masterCommitterlijinxingerm@gmail.com
严荣振yanrongzhenCommitterbruceyan@didiglobal.com
- -## 成为 Committer - -持续对 Hippo4j 进行贡献,粗略评估,至少完成 20+ PR 贡献可成为核心开发者。 其中包括完成 2 -个 [good pro issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+pro+issue%22) -或以上,以及若干个 [good first issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)。 - -:::note -会根据 PR 质量提供个性化评估,有可能一个或两个质量较高 PR -即可成为核心开发者。参考:[重构 DynamicThreadPoolExecutor 功能扩展逻辑](https://github.com/opengoofy/hippo4j/pull/854) -::: - -成为 Committer 后,会为该 GitHub 账号获取 Jetbrains 全家桶 Licenses,有效期为 1 年。不用再为破解而烦恼,感受随时升级的快乐。 - -:::note -距离到期两周前,会再次申请 Jetbrains Licenses。有点类似于无限续约的感觉,在此感谢 Jetbrains 公司对开源的支持。 -::: - -截至 `2022-10-30` 当天,已为登记的 7 位 Committer 成功申请 Licenses。 - -![](https://oss.open8gu.com/image-20221030134303060.png) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/update-log.md b/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/update-log.md deleted file mode 100644 index 720742bb..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs-community/current/update-log.md +++ /dev/null @@ -1,411 +0,0 @@ ---- -title: 更新日志 -sidebar_position: 5 ---- - -## 1.5.0 (Apr 15, 2023) - -这是一个大的功能增强版本,建议按照当前版本升级。具体信息可查看 Release 标签地址:[1.5.0](https://github.com/opengoofy/hippo4j/milestone/14?closed=1) - -**Use Change** - -- [Config] 配置属性中容器线程池配置命名改为 `spring.dynamic.thread-pool.web`。 - -- [Server] 为了使语义更加明确,当前版本中线程池执行超时时间的最低可设置为-1,表示不设置超时。需要注意的是,如果客户端使用的是低于1.5.0的版本,可能会存在不兼容的情况。 - -- [Common] 为了使语义更加明确,废弃 `ThreadPoolBuilder#maxPoolNum`,新增加 `ThreadPoolBuilder#maximumPoolSize`,原 API 还可以使用,将在后续版本删除。 - -**Feature** - -- [#1124 ] Config 模式支持 Web 容器配置修改通知 @yanrongzhen -- [#1148 ] 优化执行时间超时 executeTimeOut 为空或 <= 0 的场景 @sususama -- [#1128 ] 控制台前端国际化开发 @Svamei @ PleasePerfunctory -- [#1068 ] 默认线程池配置填充至线程池实例 @magestacks -- [#1055 ] 适配第三方自定义线程池,支持外部SPI方式扩展线程池类型 @lingfengcoder -- [#547 ] 支持 Consul 配置中心动态调整参数 @road2master -- [#624 ] 添加 Dubbox 线程池监控及动态变更 @iwangjie -- [#977 ] 增加 ROLE_MANAGE 角色,主要负责线程池变更审核 @magestacks -- [#821 ] 开发用户修改密码功能 @wulangcode - -**Refactor** - -- [#1092 ] 关于扩展点 SPI 方案的重构 @yanrongzhen -- [#1025 ] 优化BlockingQueueTypeEnum实现 @lianyiwuming -- [#1015 ] 重构Web线程池配置文件命名 @yanrongzhen -- [#1071 ] ThreadPoolBuilder提供全新的最大线程池API @jjiey -- [#1058 ] 客户端引入多个 Web 容器依赖导致 WebThreadPoolService 报错 @Createsequence -- [#844 ] 移除 alibaba-dingtalk-service-sdk @baymax55 - -**Bug** - -- [#1085 ] DynamicThreadPoolRegisterParameter#threadFactory序列化异常 @magestacks -- [#1163 ] Adapter 适配三方线程池启动顺序错误 @magestacks -- [#1134 ] Web容器启动时刷新最新配置失败 @yanrongzhen -- [#1129 ] Prometheus 不能正常采集 Hystrix 线程池 queue.capacity 数据 @jjiey -- [#1121 ] 线程池实例包含已关闭客户端节点 @zjHe -- [#1106 ] springBoot 1.5.x适配Web容器线程池调整 @yanrongzhen -- [#1114 ] ZipkinExecutorAdapter 可能出现空指针异常 @yult97 -- [#1074 ] Hystrix Adapter 支持 hippo4j config @jjiey -- [#1040 ]线程池参数默认配置与文档描述不符 @wulangcode -- [#1002 ] SpringBoot Nacos 动态刷新错误使用 SpringCloud Nacos 类 @BigXin0109 -- [#990 ] TTL 装饰的线程池无法执行等待任务完成插件 @Createsequence -- [#966 ] Alibaba Dubbo 无法获取线程池运行状态 @iwangjie - -**Optimize** - -- [#1159 ] 优化飞书和企业微信失败处理逻辑 @ITXiaoShiTou -- [#1156 ] 线程池通知管理调整查询租户&项目&线程池默认10条 @tudou0806 -- [#1069 ] 线程池执行超时时间最小值支持 -1 @Ronan1024 -- [#1111 ] 核心阻塞队列枚举 BlockingQueueTypeEnum.createBlockingQueue(String blockingQueueName, Integer capacity)抛出NPE问题修复 @LiXuemin -- [#1072 ] 提供公用方法安全设置 corePoolSize 和 maxPoolSize @jjiey -- [#1051 ] 前端国际化登录页面中文错误 @xiaobaisdz -- [#1001 ] 容器停止时,若线程池在等待关闭时,有任务触发超时告警会抛异常警类 @Createsequence -- [#1024 ] 客户端与 Hippo4j revision 冲突 @baymax55 -- [#720 ] 修复 Dubbo 错误的日志打印 @baymax55 -- [#992 ] 优化 Hippo4j Banner 打印时可能存在的空指针 @wulangcode -- [#976 ] 注册线程池默认指定过期时间和线程工厂 @magestacks -- [#964 ] 长轮询时配置未变更返回304状态码适配低版本客户端 @wulangcode -- [#942 ] 修改 MyBatis-Plus 数据库方言配置 @li-xiao-shuang -- [#959 ] ThreadPoolPluginRegisterPostProcessor 打印过多 WARN 日志 @Createsequence -- [#960 ] ThreadPoolPluginRegisterPostProcessor 实现 BeanPostProcessor 默认方法 postProcessBeforeInitialization @Createsequence - - -## 1.4.3 (Nov 06, 2022) - -这是一个功能增强版本,修复了少量 BUG。建议按照当前版本升级。具体信息可查看 Release 标签地址:[1.4.3](https://github.com/opengoofy/hippo4j/milestone/13?closed=1) - -**Use Change** - -- 重构线程池监控,配置层级和命名改变 -- 如果使用钉钉报警,关键字【警报】修改为【告警】 - -**Feature** - -- 重构 Spring 后置处理器创建动态线程池逻辑 -- 官网开启多版本化功能 -- 官网支持国际化,en-US -- 适配线程池延迟初始化 @wulangcode -- 添加 Codecov 相关代码覆盖率指标 -- 项目优雅关闭时停止运行状态采集 - -**Refactor** - -- DynamicThreadPoolExecutor 重构,增加插件扩展逻辑 @Createsequence -- 重构线程池监控,新增容器和三方框架线程池监控 -- 重构服务端包目录,聚合 hippo4j-server 相关 module - -**Bug** - -- dubbo 线程池无法获取运行信息 @iwangjie -- 线程池检查活跃度报警取值错误 @maxisvest -- 动态线程池修改多次后队列提示信息丢失 -- docker部署 mysql启动报错H2驱动 -- docker-startup.sh的mysql配置多个“-” @Malcolmli -- 动态注册线程池队列容量赋值错误 -- 飞书超时类型告警不存在 Trace 信息时发送错误 @mageeric - -**Optimize** - -- 修改报警文案,【警报】修改为【告警】 @wulangcode -- 自动选择H2数据库的存储路径 @iwangjie -- 服务端在客户端后面启动,依旧支持长轮训 @wulangcode -- 配置未发生变更时,长轮询返回 304 @wulangcode -- discovery服务Lease类中判断过期时间需要多等一个duration @w-jirong -- 优化 ThreadPoolBuilder#maxPoolNum 核心线程不得大于最大线程 @wulangcode -- hippo4j console ui 迁移至本项目 -- 查询 Web 线程池列表添加框架标识 -- 优化 H2 初始化逻辑 - -## 1.4.2 (Oct 18, 2022) - -这是一个功能增强版本,修复了少量 BUG。建议按照当前版本升级。具体信息可查看 Release 标签地址:[1.4.2](https://github.com/opengoofy/hippo4j/milestone/12?closed=1) - -**Feature** - -- 强制指定客户端注册的 ip + port -- 支持 spring-cloud-tencent Polaris 线程池动态更新 @weihubeats -- 服务启动时加载 MySQL、H2 数据库初始化语句 -- Adapter 初始化覆盖核心参数 @pizihao -- Server 端新增是否开启认证模式 @baymax55 - -**Refactor** - -- 替换底层网络工具类 OkHttp @yanrongzhen -- 全局移除 commons-lang3 工具包依赖 @yanrongzhen -- 去除三方工具类依赖 @pizihao -- 全局移除 Guava 工具包依赖 @road2master -- DockerFile 基于 H2 数据库重新构建 @BigXin0109 - -**Bug** - -- Dubbo 2.7.15 无法获取线程池引用 @iwangjie -- 动态线程池报警参数颠倒 @jinlingmei - -**Optimize** - -- 线程池实例运行数据采集,如果线程池id不存在,且长度超长,会报异常 @Gdk666 -- 项目中动态线程池数量为空时,存在 CPU 空转情况 -- 客户端注册服务端失败,输出服务端返回信息 @wulangcode -- 调整数据库项目 id 和线程池 id 字段长度 -- 增加代码检查工具 maven-checkstyle-plugin -- 调整控制台监控图表颜色展示 - -## 1.4.1 (Sep 12, 2022) - -这是一个功能增强版本,修复了若干 BUG。建议按照当前版本升级。具体信息可查看 Release 标签地址:[1.4.1](https://github.com/opengoofy/hippo4j/milestone/11?closed=1) - -**Feature** - -- 支持 H2 数据库 @weihubeats -- 动态线程池配置变更时,支持单个、多个或全部节点变 @pizihao -- 增加线程池活跃度和容量报警可选择关闭 -- @DynamicThreadPool 线程池不存在则创建 @shanjianq -- 支持 ETCD 配置中心动态调整参数 @weihubeats -- 创建动态线程池支持 spring 线程池 @BigXin0109 -- 线程池实例变更增加执行超时时间 -- 线程池相关查询页面增加阻塞队列属性 -- 定义动态线程池时,抽象默认配置 -- 提供 ExecutorContext 封装上下文细节 @road2master -- Docker 制作服务端镜像,帮助开发者快速启动 @BigXin0109 -- RabbitMQ 适配器增加多个 MQ 数据源 @weihubeats - -**Bug** - -- 动态线程池设置关闭时启动报错 @dousp -- ExecutorTtlWrapper 类型的 Executor 不生效 @BigXin0109 -- Undertow 获取 WebServer 类型参数异常 @shining-stars-lk -- 修复线程池核心、最大线程数校验限制 -- ByteConvertUtil#getPrintSize 单位转换错误 @onesimplecoder -- 创建线程池单选框选择错误 -- ReflectUtil#getFieldsDirectly missing fields @BigXin0109 -- 本地代码中设置的 capacity 无效 @BigXin0109 -- 服务端线程池超时时间存在拆箱空指针异常 @oreoft -- 未读取服务端返回执行超时时间属性 -- ResizableCapacityLinkedBlockingQueue#put 当前元素数量大于 capacity 未阻塞 - -**Optimize** - -- 长轮询任务判断逻辑优化 @shining-stars-lk -- 线程池存在实例不允许删除线程池 @shanjianq -- 优化租户、项目列表展示排版 -- 通知报警模块项目和线程池下拉查询排序修改 -- 动态线程池拒绝策略触发,以异步的方式报警 -- 优化框架中线程池工厂产生的线程名称 @road2master - -## 1.4.0 (Aug 16, 2022) - -`hippo4j server` 兼容历史低版本,`hippo4j config` 中部分属性名进行了调整,请参考 [hippo4j config 快速开始](https://hippo4j.cn/docs/user_docs/getting-started/hippo4j-core-start)。 - -注意事项: -1. 如果是对已运行 hippo4j server 升级,执行 `/conf/sql-upgrade` 目录下对应的升级脚本。 -2. 需客户端在 1.4.0 及以上版本才可在 hippo4j server 设置线程执行超时时间属性。 - -**Feature** - -- 添加 Alibaba Dubbo 线程池监控及动态变更 -- hippo4j server 支持任务执行超时时间动态修改 -- 阿里 TTL 框架线程池适配 -- 添加动态线程池自动注册功能 -- 订阅回调线程池参数变更 -- 动态线程池监控增加 SPI 自定义功能 -- hippo4j server 支持多种线程池监控方式,例如 Prometheus -- 通知相关参数添加动态变更功能 - -**Bug** - -- 线程池变更:executeTimeOut 变更极端情况下会出现异常 -- 用户登录时候,如果输入了不存在的用户名,后台报空指针异常 -- 修复了对 spring-boot 服务中 tomcat 线程池的兼容问题 -- 排除 Tomcat Jar 使用 Undertow 启动报错 - -**Optimize** - -- hippo4j-core-spring-boot-starter 模块修改名称为 hippo4j-config-spring-boot-starter -- 拆分容器线程池子页面:Tomcat、Undertow、Jetty -- 服务端访问客户端时对 URL 转码 -- MyBatisPlus 修改全局填充方法优化 -- 控制台线程池列表下拉框默认正序 -- 控制台线程池实例菜单,对于非可修改容量队列外,不允许修改队列容量 -- 动态线程池控制台功能变更 -- 租户和项目列表分页查询按照创建时间倒序展示 -- 线程池监控页面图表 UI 优化 -- 设置 maven-gpg-plugin 插件默认不执行 -- 前端控制台相关搜索条件添加必填提示 -- hippo4j 消息通知 & 报警抽象优化 -- 配置中心未配置线程池启动报错 -- 控制台线程池报警 UI 以及功能优化 -- Web、框架线程池编辑弹框 UI 优化 -- 线程池添加、编辑页面 UI 优化 -- 线程池运行详情页前端 UI 优化 - -**Refactor** - -- 删除自定义日志组件 -- 线程池监控功能重构 -- hippo4j core 配置中心生效判断重构 -- 配置变更通知 & 报警通知重构 -- Web 容器线程池适配迁移 hippo4j-adapter - -## 1.3.1 (July 17, 2022) - -注:这是一个兼容历史版本的小范围升级。 - -**Feature** - -- 控制台新增线程池功能设置为 Admin 权限 -- 添加 Hystrix 线程池监控及动态变更 -- 添加 Netty 上传动态线程池监控数据方式 -- 添加 GitHub Actions CI 流程 -- 添加 Spring Kafka 示例项目 -- Tomcat 版本号 >= 9.0.55 线程池适配 - -**Refactor** - -- 更多线程池拆分子目录页面 - -**Optimize** - -- hippo4j core 添加 banner 打印 -- 优化可变更容量阻塞队列名称 - -**BUG** - -- Apollo 配置修改延迟了一个版本 -- Spring Boot 环境下使用 hippo4j-core 接入,配置中心使用 nacos;启动时提示 ConfigService not found - -查看 1.3.1 版本发布:https://github.com/mabaiwan/hippo4j/milestone/9 - -## 1.3.0 (June 06, 2022) - -1.3.0 发布 **适配三方框架的基础框架**。 - -目前已完成 **Dubbo、RabbitMQ、RocketMQ、RocketMQSpringCloudStream** 的线程池适配,后续还会接入 **Kafka、Hystrix** 等框架或中间件的线程池适配。 - -注:这是一个兼容历史版本的重大升级。 - -**Feature** - -- 添加 RabbitMQ 线程池监控及动态变更 -- 添加 RocketMQ 线程池监控及动态变更 -- 添加 Dubbo 线程池监控及动态变更 -- 添加 SpringCloud Stream RocketMQ 消费线程池监控及动态变更 - -**Refactor** - -- 重构容器线程池查询及修改功能 -- 优化配置中心触发监听后,所执行的数据变更逻辑 - -**Optimize** - -- 前端控制台删除无用组件 -- 服务端页面字段未显示中文 -- 控制台 UI 优化 -- 修改线程池实例后实时刷新列表参数 -- 容器线程池编辑仅限 Admin 权限 -- SpringBoot Starter 变更包路径 - -**BUG** - -- 修复 SpringBoot Nacos 动态刷新不生效 -- 报警配置 alarm=false 不配置通知报警平台和接收人报错 - -## 1.2.1 (May 07, 2022) - -**BugFix** - -- apollo 动态配置不生效 -- 修复 hippo4j-core 后置处理器创建线程池问题 -- 重构 hippo4j-core spring 后置处理器逻辑 -- 优化ThreadPoolNotifyAlarmHandler下的空指针异常 -- 修复线程池核心、最大线程数变更问题 -- startup.cmd 未正常读取 conf 配置文件 - -**Optimize** - -- 配置文件中字段歧义 -- 修改代码中历史网址 -- InstanceInfo 的 groupKey 参数重复设置 -- ConfigFileTypeEnum 枚举字段添加注释 -- 线程资源通过线程池创建,不允许自行显示创建线程 -- Guava 版本升级至 30.0-jre 及以上版本 -- SystemClock 替换 System.currentTimeMillis() -- 添加代码格式化插件 Spotless -- 修改线程池文案 - -## 1.2.0 (Mar 13, 2022) - -**Feature** - -- hippo4j-core线程池资源对接 Prometheus 监控 -- hippo4j-core 支持 Zookeeper -- hippo4j-core 支持 Apollo - -**Optimize** - -- 适配非 Web SpringBoot 项目使用 Hippo4j -- 优化报警通知 -- 修复在 JDK 小版本中的兼容性问题 - -**BugFix** - -- server 端查看容器线程池,参数为 null -- 重构线程池查看及容器线程池查看等交互 -- 修复引入 hippo4j-spring-boot-starter 后,运行单元测试报错 -- 修复可能出现的空指针异常 - -## 1.1.0 (Mar 13, 2022) - -Hippo4j 线程池框架 1.1.0 RELEASE 版本,添加了 Hippo4j-Core(依赖配置中心的动态线程池). - -**Feature** - -- 删除 DynamicThreadPoolExecutor 内代码实现,仅通过线程池扩展点进行扩展 -- 通过动态代理实现线程池拒绝策略执行次数统计 -- 抽象通知报警消息模块 -- 抽象 hippo4j 核心组件,不依赖 server 端即可完成动态调参、监控、报警等功能 -- 前端删除线程池按钮添加 Admin 权限 -- 添加线程池任务运行超长报警 -- 容器线程池支持 Undertow -- 容器线程池支持 Jetty -- 重构服务端异常体系 - -**Optimize** - -- 前端项目 Token 失效跳转登录页 -- 优化 Server 启动脚本日志输出 -- 优化前端按钮权限控制粒度 -- 优化线程池报警推送文案 -- 前端弹框样式优化 -- 适配低版本 SpringBoot Bind -- 优化消息通知模块 - -**BugFix** - -- Duplicate entry 'xxx' for key 'uk_configinfo_datagrouptenant' - -## 1.0.0 (Feb 01, 2022) - -**Feature** - -- 线程池运行堆栈查看 -- 扩展 Web 容器线程池动态调参、监控 - -**Optimize** - -- 删除高版本 SpringBoot Api -- ListableBeanFactory#findAnnotationOnBean SpringBoot 低版本适配 -- 优化客户端关闭时调用服务端钩子函数 -- 线程池实例参数弹框添加实例 ID 和线程池状态 -- 补充线程池替换 Hippo4j 文档 -- 1.5.x springboot 引入hippo4j-spring-boot-starter配置项,bean初始化失败 -- 优化线程池参数编辑合理性校验 -- BaseInstanceRegistry 读写锁重构 - -**BugFix** - -- 本地项目线程池实例缓存无法精确清理 -- 线程池实例页面多实例不同 Active 展示错误 -- 创建动态线程池逻辑判断修复 -- 创建动态线程池增强参数未设置 -- 控制消息推送报警频率的方法有并发安全的问题 -- tomcat线程池上下文获取失败 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current.json b/docs/i18n/zh/docusaurus-plugin-content-docs/current.json deleted file mode 100644 index 1c24558f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "version.label": { - "message": "Next", - "description": "The label for version current" - }, - "sidebar.tutorialSidebar.category.社区": { - "message": "社区", - "description": "The label for category 社区 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.贡献规约": { - "message": "贡献规约", - "description": "The label for category 贡献规约 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.user_docs": { - "message": "user_docs", - "description": "The label for category user_docs in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar tutorialSidebar" - }, - "sidebar.user_docs.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar user_docs" - }, - "sidebar.user_docs.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar user_docs" - }, - "sidebar.user_docs.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar user_docs" - }, - "sidebar.user_docs.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar user_docs" - }, - "sidebar.community.category.贡献规约": { - "message": "贡献规约", - "description": "The label for category 贡献规约 in sidebar community" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/dev_manual/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/dev_manual/_category_.json deleted file mode 100644 index 9117307f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/dev_manual/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "开发者手册", - "position": 5, - "link": { - "type": "generated-index", - "description": "Hippo4j 留给使用者能够扩展的知识点。" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/dev_manual/queue-custom.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/dev_manual/queue-custom.md deleted file mode 100644 index 9fb5512a..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/dev_manual/queue-custom.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 阻塞队列自定义 - -Hippo4j 通过 SPI 的方式对拒绝策略进行扩展,可以让用户在 Hippo4j 中完成自定义阻塞队列实现。 - -## 1. 定义自定义队列类 - -实现接口 `cn.hippo4j.common.executor.support.CustomBlockingQueue`: - -```java -public class MyArrayBlockingQueue implements CustomBlockingQueue { - - @Override - public Integer getType() { - return 1001; - } - - @Override - public String getName() { - return "MyArrayBlockingQueue"; - } - - @Override - public BlockingQueue generateBlockingQueue(Integer capacity) { - int effectiveCapacity = capacity == null || capacity <= 0 ? 1024 : capacity; - return new ArrayBlockingQueue<>(effectiveCapacity); - } -} -``` - -> 兼容提示:旧版只需实现 `generateBlockingQueue()` 的实现仍然有效,框架会在未覆写新方法时回退到旧逻辑,但推荐改为覆写带 `capacity` 入参的方法,以便直接复用服务端配置。 - -## 2. 声明 SPI 文件 - -在 `src/main/resources/META-INF/services/` 目录下新增文件: -``` -cn.hippo4j.common.executor.support.CustomBlockingQueue -``` - -文件内容仅一行: -``` -com.example.queue.MyArrayBlockingQueue -``` - -## 3. 服务端生效方式 - -当服务端下发的 `queueType` 与 `capacity` 命中自定义类型时,框架会通过 SPI 自动创建队列,并将服务端配置的容量参数传入 `generateBlockingQueue(Integer capacity)`。 - -### 3.1 队列创建与验证 - -```java -// 创建队列 -BlockingQueue q = BlockingQueueTypeEnum.createBlockingQueue(queueType, capacity); - -// 或者通过队列名称创建 -BlockingQueue q2 = BlockingQueueTypeEnum.createBlockingQueue("ArrayBlockingQueue", capacity); - -// 验证队列配置 -boolean valid = BlockingQueueManager.validateQueueConfig(queueType, capacity); - -// 动态调整容量(仅 ResizableCapacityLinkedBlockingQueue 支持) -boolean ok = BlockingQueueManager.changeQueueCapacity(executor.getQueue(), newCapacity); -``` - -### 3.2 队列类型生效 - -- **配置模板**:在线程池管理页面编辑队列类型,会保存到数据库,但不会推送到运行中的客户端。 -- **生效时机**:客户端应用重启时,会从服务端读取最新配置,并使用反射替换线程池的 `workQueue` 字段。 -- **运行时调整**:运行时仅支持队列容量的动态调整(仅限 `ResizableCapacityLinkedBlockingQueue`),不支持队列类型切换。 - -服务端动态刷新处的实现: - -```java -// ServerThreadPoolDynamicRefresh#handleQueueChanges -// 仅支持容量调整,不支持队列类型切换 -if (parameter.getCapacity() != null) { - if (BlockingQueueManager.canChangeCapacity(executor.getQueue())) { - boolean success = BlockingQueueManager.changeQueueCapacity( - executor.getQueue(), parameter.getCapacity()); - if (success) { - log.info("Queue capacity changed to: {} for thread pool: {}", - parameter.getCapacity(), parameter.getTpId()); - } - } -} -``` \ No newline at end of file diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/dev_manual/queue-info.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/dev_manual/queue-info.md deleted file mode 100644 index 956507d3..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/dev_manual/queue-info.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 内置阻塞队列 - -Hippo4j 内置多种常用阻塞队列类型,支持开箱即用,亦可通过 SPI 扩展自定义队列类型。 - -## 内置类型清单 - -以下类型可直接在服务端或配置中选择(枚举:`BlockingQueueTypeEnum`): - -- ArrayBlockingQueue(数组有界队列) -- LinkedBlockingQueue(链表队列) -- LinkedBlockingDeque(双端队列) -- SynchronousQueue(同步移交队列) -- LinkedTransferQueue(可转移队列) -- PriorityBlockingQueue(优先级队列) -- ResizableCapacityLinkedBlockingQueue(可在线动态调容量的链表队列) - -## 枚举定义 - -**ResizableCapacityLinkedBlockingQueue**:支持在线变更 `capacity`。 - -```java -// cn.hippo4j.common.executor.support.BlockingQueueTypeEnum -RESIZABLE_LINKED_BLOCKING_QUEUE(9, "ResizableCapacityLinkedBlockingQueue") { - @Override - BlockingQueue of(Integer capacity) { - return new ResizableCapacityLinkedBlockingQueue<>(capacity); - } - @Override - BlockingQueue of() { - return new ResizableCapacityLinkedBlockingQueue<>(); - } -} -``` - -## 使用建议 - -- 需要在线调容量:优先选择 `ResizableCapacityLinkedBlockingQueue` -- 需要严格有界:选择 `ArrayBlockingQueue` -- 需要无界吞吐:选择 `LinkedBlockingQueue` -- 需要优先级:选择 `PriorityBlockingQueue` -- 需要同步移交:选择 `SynchronousQueue` - -如需自定义队列类型,请参考《阻塞队列自定义》。 \ No newline at end of file diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/dev_manual/rejected-policy-custom.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/dev_manual/rejected-policy-custom.md deleted file mode 100644 index e0405061..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/dev_manual/rejected-policy-custom.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 拒绝策略自定义 - -Hippo4j 通过 SPI 的方式对拒绝策略进行扩展,可以让用户在 Hippo4j 中完成自定义拒绝策略实现。 - -## Hippo4j Server 拒绝策略扩展 - -自定义拒绝策略,实现 `CustomRejectedExecutionHandler` 接口,示例如下: - -```java -public class ErrorLogRejectedExecutionHandler implements CustomRejectedExecutionHandler { - - @Override - public Integer getType() { - return 12; - } - - @Override - public RejectedExecutionHandler generateRejected() { - return new CustomErrorLogRejectedExecutionHandler(); - } - - public static class CustomErrorLogRejectedExecutionHandler implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - Logger logger = LoggerFactory.getLogger(this.getClass()); - logger.error("线程池抛出拒绝策略"); - } - } -} -``` - -创建 `src/main/resources/META-INF/services` 目录,创建 SPI 自定义拒绝策略文件 `cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler`。 - -`cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler` 文件内仅放一行自定义拒绝策略全限定名即可,示例: - -```text -cn.hippo4j.example.core.handler.ErrorLogRejectedExecutionHandler -``` - -创建、修改线程池页面选择 `CustomRejectedPolicy(自定义 SPI 策略)`。 - -![](https://oss.open8gu.com/image-20220813173907814.png) - -拒绝策略触发时,完成上述代码效果,仅打印异常日志提示。 - -```text -2022-08-01 21:27:49.515 ERROR 48928 --- [ateHandler.test] r$CustomErrorLogRejectedExecutionHandler : 线程池抛出拒绝策略 -``` - -:::note -具体参考 `hippo4j-example/hippo4j-spring-boot-starter-example` 模块。 -::: diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/dev_manual/rejected-policy-info.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/dev_manual/rejected-policy-info.md deleted file mode 100644 index d5c68138..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/dev_manual/rejected-policy-info.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 内置拒绝策略 - -内置两种拒绝策略说明: - -**RunsOldestTaskPolicy**:添加新任务并由主线程运行最早的任务。 - -```java -public class RunsOldestTaskPolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - BlockingQueue workQueue = executor.getQueue(); - Runnable firstWork = workQueue.poll(); - boolean newTaskAdd = workQueue.offer(r); - if (firstWork != null) { - firstWork.run(); - } - if (!newTaskAdd) { - executor.execute(r); - } - } -} -``` - -**SyncPutQueuePolicy**:主线程把拒绝任务以阻塞的方式添加到队列。 - -```java -@Slf4j -public class SyncPutQueuePolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - try { - executor.getQueue().put(r); - } catch (InterruptedException e) { - log.error("Adding Queue task to thread pool failed.", e); - } - } -} -``` \ No newline at end of file diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/_category_.json deleted file mode 100644 index 72b1e151..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "快速开始", - "position": 3, - "link": { - "type": "generated-index" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/_category_.json deleted file mode 100644 index 78b3d9c4..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "依赖配置中心", - "position": 2, - "collapsed": true -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/hippo4j-config-default.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/hippo4j-config-default.md deleted file mode 100644 index 9c9e0fc9..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/hippo4j-config-default.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 参数默认配置 - -曾有多名小伙伴反馈说,项目中线程池一多,配置文件中配置就显得很臃肿。为此 hippo4j-config 开发出了动态线程池默认配置。 - -```yaml -spring: - dynamic: - thread-pool: - default-executor: - core-pool-size: 4 - maximum-pool-size: 6 - blocking-queue: ResizableCapacityLinkedBlockingQueue - queue-capacity: 1024 - execute-time-out: 1000 - keep-alive-time: 9999 - rejected-handler: AbortPolicy - active-alarm: 90 - capacity-alarm: 85 - alarm: true - allow-core-thread-time-out: true - notify: - interval: 5 - receives: chen.ma - executors: - - thread-pool-id: message-produce - - thread-pool-id: message-consume - core-pool-size: 80 - maximum-pool-size: 100 - execute-time-out: 1000 - notify: - interval: 6 - receives: chen.ma -``` - -`spring.dynamic.thread-pool.executors` 层级下,仅需要配置 `thread-pool-id`,其余配置从 `spring.dynamic.thread-pool.default-executor` 读取。 - -如果 `spring.dynamic.thread-pool.executors` 下配置和 `spring.dynamic.thread-pool.default-executor` 冲突,以前者为主。 - -通过该自定义配置方式,可减少大量重复线程池参数配置项,提高核心配置简洁度。 - -提示:`spring.dynamic.thread-pool.default-executor` 层级下参数,不提供动态刷新功能。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/hippo4j-config-monitor.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/hippo4j-config-monitor.md deleted file mode 100644 index 17d665e6..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/hippo4j-config-monitor.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 线程池监控 - -## 线程池监控配置 - -监控前置条件:需要先完成 hippo4j-config 的 [接入工作](/docs/user_docs/getting_started/config/hippo4j-config-start)。 - -接下来引入 SpringBoot Actuator。Spring 2.x 一般都有版本指定,所以这里不用写版本号。 - -```xml - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - -``` - -添加动态线程池监控相关配置: - -```yaml -management: - metrics: - export: - prometheus: - enabled: true - server: - port: 29999 # 可选配置,如果不配置该 port,直接使用 ${server.port} - endpoints: - web: - exposure: - include: '*' # 测试使用,开启了所有端点,生产环境不建议 * -spring: - dynamic: - thread-pool: - monitor: - enable: true # 是否开启采集线程池运行时数据 - collect-interval: 5000 # 采集线程池运行数据频率 - collect-types: micrometer # 采集线程池运行数据的类型。eg:log、micrometer。多个可以同时使用,默认 micrometer - initial-delay: 10000 # 项目启动后延迟多久进行采集 - thread-pool-types: dynamic # 采集线程池的类型。eg:dynamic、web、adapter。可任意配置,默认 dynamic -``` - -项目启动,访问 `http://localhost:29999/actuator/prometheus` 出现 `dynamic_thread_pool_` 前缀的指标,即为成功。 - -![](https://oss.open8gu.com/image-20220912220401016.png) - -## 配置 Prometheus - -通过 Docker 启动 Prometheus 服务。 - -```shell -docker run -d -p 9090:9090 --name prometheus prom/prometheus -``` - -添加 Prometheus 抽取数据任务。 - -```shell -# 进入 prometheus 容器内部 -docker exec -it prometheus /bin/sh -# 编辑 prometheus 配置文件 -vi /etc/prometheus/prometheus.yml -``` - -scrape_configs 节点下新添加一个 job,如果 Prometheus 是 Docker 方式部署,`{scrape_configs.static_configs.targets}` 需要写本机的 IP。 - -```yaml -scrape_configs: - - job_name: 'dynamic-thread-pool-job' - scrape_interval: 5s - metrics_path: '/actuator/prometheus' - static_configs: - - targets: [ '127.0.0.1:29999' ] -``` - -配置成功后 `exit` 退出容器,并进行 Prometheus 容器重启 `docker restart prometheus`。 - -访问 Prometheus 控制台 `http://localhost:9090/graph` 路径,能够展示相关指标即为配置成功。 - -![](https://oss.open8gu.com/image-20220912221237597.png) - -## 配置 Grafana - -```shell -docker run -d -p 3000:3000 --name=grafana grafana/grafana -``` - -访问 Grafana 地址,[http://localhost:3000](http://localhost:3000) 用户名密码:`admin` - -Grafana 访问 `http://localhost:3000/datasources` 导入 Prometheus 数据源。 - -![](https://oss.open8gu.com/image-20220912221646866.png) - -> 如果 Prometheus 为 Docker 方式部署,HTTP URL 需要为本地 IP,比如:http://192.168.1.5:9090 - -关注公众号 `龙台的技术笔记`,回复:`监控`,获取 Hippo4j Grafana DashBoard JSON 配置。 - -| 公众号 | 回复关键词 | -|:------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------:| -| ![](https://oss.open8gu.com/43_65f6020ed111b6bb3808ec338576bd6b.png?x-oss-process=image/resize,h_300,w_400) | ![](https://oss.open8gu.com/image-20220327171957444.png?x-oss-process=image/resize,h_300,w_400) | - -获取到 JSON 文件后,通过 `http://localhost:3000/dashboard/import` 将 JSON 文件导入至 Grafana DashBoard。 - -![](https://oss.open8gu.com/image-20220912225627272.png) - -下拉框内动态选择创建好的 Prometheus 数据源,并点击 `Import`。 - -![](https://oss.open8gu.com/image-20220912225700200.png) - -即可使用炫酷的 Hippo4j 动态线程池监控 DashBoard。大家伙儿也可以根据个人喜好进行定制 DashBoard,如果觉得有优化点,欢迎和我联系贡献。 - -![](https://oss.open8gu.com/image-20220912225813972.png) - -如果项目客户端启动多个示例,动态线程池监控效果图如下: - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/hippo4j-config-more.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/hippo4j-config-more.md deleted file mode 100644 index 09452013..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/hippo4j-config-more.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 个性化配置 - -以下所述特性自 hippo4j-config v1.4.2 及以上版本提供,由 hippo4j 核心开发者 [@pizihao](https://github.com/pizihao) 完成相应功能开发。 - -## 需求背景 - -**1)容器及三方框架线程池自定义启用** - -最初设计容器线程池和三方框架线程池的动态变更是和启动无关的。也就是说,启动时不会根据配置文件中相关参数去修改两者对应的线程池配置。 - -这么设计的初衷是因为,不想让 hippo4j 过多的去介入框架原有的功能。因为容器和三方框架都支持线程池参数的自定义。 - -也就造成,可能你在配置中心配置了对应的容器和三方框架线程池参数,启动时是无效的。但当修改配置文件任一配置,容器和三方框架线程池配置将生效。 - -为了更好的用户体验,决定加入启用标识来控制:是否在项目初始化启动时,对容器和三方框架线程池参数进行修改。 - -**2)客户端集群个性化配置** - -大家都知道,hippo4j-config 是依赖配置中心做线程池配置动态变更。这种模式有一种缺点:改动配置文件后,所有客户端都会变更。 - -有些小伙伴希望 hippo4j-config 能够像 hippo4j-server 一样,能够针对单独的客户端进行配置变更。 - -## 容器及三方框架线程池自定义启用 - -容器及三方框架线程池添加启用配置,为了保持统一,动态线程池配置中也有该参数配置。配置项默认开启。 - -```yaml -spring: - dynamic: - thread-pool: - web: - enable: true - executors: - - thread-pool-id: message-consume - enable: false - adapter-executors: - - threadPoolKey: 'input' - enable: true -``` - -## 客户端集群个性化配置 - -分别在动态线程池、容器线程池以及三方框架线程池配置下增加 `nodes` 配置节点,通过该配置可匹配需要变更的节点。 - -```yaml -spring: - dynamic: - thread-pool: - web: - nodes: 192.168.1.5:*,192.168.1.6:8080 - executors: - - thread-pool-id: message-consume - nodes: 192.168.1.5:* - adapter-executors: - - threadPoolKey: 'input' - nodes: 192.168.1.5:* -``` - -来一段代码方法中的注释,大家就基本明白如何使用了。 - -```java -/** - * Matching nodes
- * nodes is ip + port.Get 'nodes' in the new Properties,Compare this with the ip + port of Application.
- * support prefix pattern matching. e.g:
- *
    - *
  • 192.168.1.5:* -- Matches all ports of 192.168.1.5
  • - *
  • 192.168.1.*:2009 -- Matches 2009 port of 192.168.1.*
  • - *
  • * -- all
  • - *
  • empty -- all
  • - *
- * The format of ip + port is ip : port. - */ -``` - -`nodes` 可与 `enable` 同时使用。如此,基于配置中心的动态线程池实现方式,将能够更方便的支持个性化需求。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md deleted file mode 100644 index a1885e0c..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 适配SpringBoot1x - -目前已支持 Nacos、Apollo 配置中心适配 SpringBoot 1.5.x 版本。 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-1x-starter - 1.5.0 - -``` - -Nacos SpringBoot 配置如下: - -```yaml -spring: - cloud: - nacos: - config: - ext-config: - - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP - refresh: true - server-addr: 127.0.0.1:8848 - dynamic: - thread-pool: - config-file-type: yml - nacos: - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP -``` - -Apollo SpringBoot 配置如下: - -```yaml -apollo: - autoUpdateInjectedSpringProperties: true - bootstrap: - eagerLoad: - enabled: true - enabled: true - namespaces: application - meta: http://127.0.0.1:8080 -app: - id: dynamic-threadpool-example -spring: - dynamic: - thread-pool: - apollo: - namespace: application -``` - -动态线程池通用配置如下: - -```yaml -management: - context-path: /actuator - security: - enabled: false -server: - port: 8091 - servlet: - context-path: /example -spring: - application: - name: dynamic-threadpool-example - dynamic: - thread-pool: - banner: true - check-state-interval: 5 - collect-type: micrometer - config-file-type: properties - enable: true - executors: - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-consume - thread-pool-id: message-consume - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-produce - thread-pool-id: message-produce - notify-platforms: - - platform: WECHAT - token: ac0426a5-c712-474c-9bff-72b8b8f5caff - profiles: - active: dev -``` - -具体 Demo 运行请参考以下示例模块,已验证对应线程池动态变更、报警以及运行时监控功能。 - -- `/hippo4j-config-nacos-spring-boot-1x-starter-example` -- `hippo4j-example/hippo4j-config-apollo-spring-boot-1x-starter-example` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/hippo4j-config-start.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/hippo4j-config-start.md deleted file mode 100644 index 6ead578b..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/config/hippo4j-config-start.md +++ /dev/null @@ -1,193 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 接入流程 - -Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 配置中心任选其一。 - -## hippo4j 配置 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-starter - 1.5.0 - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -server: - port: 8090 - servlet: - context-path: /example - -spring: - profiles: - active: dev - - dynamic: - thread-pool: - # 是否开启动态线程池 - enable: true - # 是否打印 banner - banner: true - # 是否开启线程池数据采集,对接 Micrometer、ES、Log 等 - collect: true - # 检查线程池状态,是否达到报警条件,单位毫秒 - check-state-interval: 3000 - # 通知报警平台,请替换为自己创建的群机器人 - notify-platforms: - - platform: 'WECHAT' - token: xxx - - platform: 'DING' - token: xxx - secret: xxx # 加签专属 - - platform: 'LARK' - token: xxx - # Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 任选其一 - nacos: - data-id: xxx - group: xxx - apollo: - namespace: xxxx - # 配置中心文件格式 - config-file-type: yml - # 支持 tomcat、undertow、jetty 三种容器线程池 - web: - core-pool-size: 100 - maximum-pool-size: 200 - keep-alive-time: 1000 - # 全局通知配置-是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位秒 - alarm-interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - # 动态线程池列表 - executors: - - thread-pool-id: 'message-consume' - # 核心线程数 - core-pool-size: 1 - # 最大线程数 - maximum-pool-size: 1 - # 阻塞队列名称,参考 BlockingQueueTypeEnum,支持 SPI - blocking-queue: 'LinkedBlockingQueue' - # 阻塞队列大小 - queue-capacity: 1 - # 执行超时时间,超过此时间发起报警,单位毫秒 - execute-time-out: 1000 - # 拒绝策略名称,参考 RejectedPolicyTypeEnum,支持 SPI - rejected-handler: 'AbortPolicy' - # 线程存活时间,单位秒 - keep-alive-time: 1024 - # 是否允许核心线程超时 - allow-core-thread-time-out: true - # 线程工厂名称前缀 - thread-name-prefix: 'message-consume' - # 是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 通知配置,线程池中通知配置如果存在,则会覆盖全局通知配置 - notify: - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位分钟 - interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - - thread-pool-id: 'message-produce' - core-pool-size: 1 - maximum-pool-size: 1 - queue-capacity: 1 - execute-time-out: 1000 - blocking-queue: 'LinkedBlockingQueue' - rejected-handler: 'AbortPolicy' - keep-alive-time: 1024 - allow-core-thread-time-out: true - thread-name-prefix: 'message-consume' - alarm: true - active-alarm: 80 - capacity-alarm: 80 - notify: - interval: 8 - receives: xxx -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从配置中心拉取。 - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/difference.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/difference.md deleted file mode 100644 index 549da02d..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/difference.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 运行模式介绍 - -1.1.0 版本发布后,Hippo4j 分为两种使用模式:轻量级依赖配置中心以及无中间件依赖版本。 - -![](https://oss.open8gu.com/image-20220319154626314.png) - -### Hippo4j config - -**轻量级动态线程池管理**,依赖 Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 等三方配置中心(任选其一)完成线程池参数动态变更,支持运行时报警、监控等功能。 - -> 监控功能配置详见:[线程池监控](/docs/user_docs/getting_started/config/hippo4j-config-monitor) - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) - -### Hippo4j server - -**部署 Hippo4j server 服务**,通过可视化 Web 界面完成线程池的创建、变更以及查看,不依赖三方中间件。 - -相比较 Hippo4j config,功能会更强大,但同时也引入了一定的复杂性。需要部署一个 Java 服务,以及依赖 MySQL 数据库。 - -![](https://oss.open8gu.com/1644032018254-min.gif) - -### 使用总结 - -| | Hippo4j config | Hippo4j server | -| ---- |-------------------------------------------------------|--------------------------------------------------------| -| 依赖 | Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 配置中心(任选其一) | 部署 Hippo4j server(内部无依赖中间件) | -| 使用 | 配置中心补充线程池相关参数 | Hippo4j server web 控制台添加线程池记录 | -| 功能 | 包含基础功能:参数动态化、运行时监控、报警等 | 基础功能之外扩展控制台界面、线程池堆栈查看、线程池运行信息实时查看、历史运行信息查看、线程池配置集群个性化等 | - -使用建议:根据公司情况选择,如果基本功能可以满足使用,选择 Hippo4j config 使用即可;如果希望更多的功能,可以选择 Hippo4j server。 - -**两者在进行替换的时候,无需修改业务代码**。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/hippo4j-adapter.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/hippo4j-adapter.md deleted file mode 100644 index 68a48288..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/hippo4j-adapter.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 三方框架线程池适配 - -Hippo4j 目前已支持的三方框架线程池列表: - -- Dubbo -- Hystrix -- RabbitMQ -- RocketMQ -- AlibabaDubbo -- RocketMQSpringCloudStream -- RabbitMQSpringCloudStream - -引入 Hippo4j Server 或 Core 的 Maven Jar 坐标后,还需要引入对应的框架适配 Jar: - -```xml - - cn.hippo4j - - hippo4j-spring-boot-starter-adapter-dubbo - - hippo4j-spring-boot-starter-adapter-alibaba-dubbo - - hippo4j-spring-boot-starter-adapter-hystrix - - hippo4j-spring-boot-starter-adapter-rabbitmq - - hippo4j-spring-boot-starter-adapter-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq - 1.5.0 - -``` - -如果想省事,仅需引入一个全量包,框架底层会根据条件判断加载具体线程池适配器。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-adapter-all - 1.5.0 - -``` - -## Hippo4j Server - -Hippo4j Server 仅需要引入上述 Jar 包,即可在 Hippo4j Server 的控制台进行查看及修改三方框架线程池。 - -![](https://oss.open8gu.com/image-20220531194810047.png) - -## Hippo4j Config - -Hippo4j Config 除了依赖上述适配 Jar 包外,还需要在配置中心添加以下配置项。 - -```yaml -spring: - dynamic: - thread-pool: - # 省略其它配置 - adapter-executors: - # threadPoolKey 代表线程池标识 - - threadPoolKey: 'input' - # mark 为三方线程池框架类型,参见文初已支持框架集合 - mark: 'RocketMQSpringCloudStream' - corePoolSize: 10 - maximumPoolSize: 10 -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/img/docsVersionDropdown.png b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/img/docsVersionDropdown.png deleted file mode 100644 index 97e41646..00000000 Binary files a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/img/docsVersionDropdown.png and /dev/null differ diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/img/grafana-monitor.jpg b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/img/grafana-monitor.jpg deleted file mode 100644 index 336bd980..00000000 Binary files a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/img/grafana-monitor.jpg and /dev/null differ diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/img/localeDropdown.png b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/img/localeDropdown.png deleted file mode 100644 index e257edc1..00000000 Binary files a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/img/localeDropdown.png and /dev/null differ diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/server/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/server/_category_.json deleted file mode 100644 index 4063c17f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/server/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "无中间件依赖", - "position": 3, - "collapsed": true -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/server/hippo4j-server-config.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/server/hippo4j-server-config.md deleted file mode 100644 index e1ef853f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/server/hippo4j-server-config.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 服务端配置 - -`hippo4j.core.clean-history-data-enable` - -是否开启线程池历史数据清洗,默认开启。 - -`hippo4j.core.clean-history-data-period` - -线程池历史数据保留时间,默认值:30,单位分钟。 - -服务端会保留这个配置时间的数据,超过这个时间则会被清理。比如按照默认值 30 分钟来说,12:00 收集到的数据,12:30 就会被清理删除。 - -`hippo4j.core.monitor.report-type` - -客户端监控上报服务端类型,可选值:http、netty,默认 http。服务端开启 netty 配置后,需要在客户端对应开启才可生效。用来应对大量动态线程池监控场景。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/server/hippo4j-server-monitor.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/server/hippo4j-server-monitor.md deleted file mode 100644 index 08d89fa2..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/server/hippo4j-server-monitor.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 线程池监控 - -Server 模式默认内置线程池运行时采集和监控功能,如果想要使用 Prometheus + Grafana 的方式可以查看以下内容。 - -## 线程池监控配置 - -接下来引入 SpringBoot Actuator。Spring 2.x 一般都有版本指定,所以这里不用写版本号。 - -```xml - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - -``` - -添加动态线程池监控相关配置: - -```yaml -management: - metrics: - export: - prometheus: - enabled: true - server: - port: 29999 # 可选配置,如果不配置该 port,直接使用 ${server.port} - endpoints: - web: - exposure: - include: '*' # 测试使用,开启了所有端点,生产环境不建议 * -spring: - dynamic: - thread-pool: - monitor: - enable: true # 是否开启采集线程池运行时数据 - collect-interval: 5000 # 采集线程池运行数据频率 - collect-types: server,micrometer # 采集线程池运行数据的类型。eg:server、micrometer。多个可以同时使用,默认 server - initial-delay: 10000 # 项目启动后延迟多久进行采集 - thread-pool-types: dynamic # 采集线程池的类型。eg:dynamic、web、adapter。可任意配置,默认 dynamic -``` - -如果使用 `micrometer` 类型的监控指标,需要添加以下依赖。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-monitor-micrometer - 1.5.0 - -``` - -项目启动,访问 `http://localhost:29999/actuator/prometheus` 出现 `dynamic_thread_pool_` 前缀的指标,即为成功。 - -![](https://oss.open8gu.com/image-20220912220401016.png) - -## 配置 Prometheus - -通过 Docker 启动 Prometheus 服务。 - -```shell -docker run -d -p 9090:9090 --name prometheus prom/prometheus -``` - -添加 Prometheus 抽取数据任务。 - -```shell -# 进入 prometheus 容器内部 -docker exec -it prometheus /bin/sh -# 编辑 prometheus 配置文件 -vi /etc/prometheus/prometheus.yml -``` - -scrape_configs 节点下新添加一个 job,如果 Prometheus 是 Docker 方式部署,`{scrape_configs.static_configs.targets}` 需要写本机的 IP。 - -```yaml -scrape_configs: - - job_name: 'dynamic-thread-pool-job' - scrape_interval: 5s - metrics_path: '/actuator/prometheus' - static_configs: - - targets: [ '127.0.0.1:29999' ] -``` - -配置成功后 `exit` 退出容器,并进行 Prometheus 容器重启 `docker restart prometheus`。 - -访问 Prometheus 控制台 `http://localhost:9090/graph` 路径,能够展示相关指标即为配置成功。 - -![](https://oss.open8gu.com/image-20220912221237597.png) - -## 配置 Grafana - -```shell -docker run -d -p 3000:3000 --name=grafana grafana/grafana -``` - -访问 Grafana 地址,[http://localhost:3000](http://localhost:3000) 用户名密码:`admin` - -Grafana 访问 `http://localhost:3000/datasources` 导入 Prometheus 数据源。 - -![](https://oss.open8gu.com/image-20220912221646866.png) - -> 如果 Prometheus 为 Docker 方式部署,HTTP URL 需要为本地 IP,比如:http://192.168.1.5:9090 - -关注公众号 `龙台的技术笔记`,回复:`监控`,获取 Hippo4j Grafana DashBoard JSON 配置。 - -| 公众号 | 回复关键词 | -|:------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------:| -| ![](https://oss.open8gu.com/43_65f6020ed111b6bb3808ec338576bd6b.png?x-oss-process=image/resize,h_300,w_400) | ![](https://oss.open8gu.com/image-20220327171957444.png?x-oss-process=image/resize,h_300,w_400) | - -获取到 JSON 文件后,通过 `http://localhost:3000/dashboard/import` 将 JSON 文件导入至 Grafana DashBoard。 - -![](https://oss.open8gu.com/image-20220912225627272.png) - -下拉框内动态选择创建好的 Prometheus 数据源,并点击 `Import`。 - -![](https://oss.open8gu.com/image-20220912225700200.png) - -即可使用炫酷的 Hippo4j 动态线程池监控 DashBoard。大家伙儿也可以根据个人喜好进行定制 DashBoard,如果觉得有优化点,欢迎和我联系贡献。 - -![](https://oss.open8gu.com/image-20220912225813972.png) - -如果项目客户端启动多个示例,动态线程池监控效果图如下: - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/server/hippo4j-server-start.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/server/hippo4j-server-start.md deleted file mode 100644 index 17ec5224..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/getting_started/server/hippo4j-server-start.md +++ /dev/null @@ -1,127 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 接入流程 - -部署服务端,参考 [部署手册](/docs/user_docs/ops/hippo4j-server-deploy)。 - -服务端创建 [租户、项目](/community/faq#租户和项目在-hippo4j-中是什么意思) 和线程池记录。 - -需要注意,项目 ID 需要与配置文件 `{application.name}` 保持一致。 - -:::note -租户、项目、线程池 ID 如果由多个词组成,建议以 - 进行分割。比如:message-center。 -::: - -## Hippo4j 配置 - -SpringBoot Pom 引入 Hippo4j Starter Jar。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter - 1.5.0 - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -spring: - profiles: - active: dev - application: - # 服务端创建的项目 id 需要与 application.name 保持一致 - name: dynamic-threadpool-example - dynamic: - thread-pool: - # 服务端地址 - server-addr: http://localhost:6691 - # 用户名 - username: admin - # 密码 - password: 123456 - # 租户 id, 对应 tenant 表 - namespace: prescription - # 项目 id, 对应 item 表 - item-id: ${spring.application.name} -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从 hippo4j-server 服务拉取。 - -:::note -创建线程池时建议填充实际的参数。如果在连接 Hippo4j Server 端失败时,会使用填充配置创建线程池。 -::: - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` - diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/intro.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/intro.md deleted file mode 100644 index af470274..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/intro.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 简介 - -## 线程池痛点 - -线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。在高并发以及大批量的任务处理场景,线程池的使用是必不可少的。 - -如果有在项目中实际使用线程池,相信你可能会遇到以下痛点: - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -## 什么是 Hippo4j - -Hippo4j 通过对 JDK 线程池增强,以及扩展三方框架底层线程池等功能,为业务系统提高线上运行保障能力。 - -提供以下功能支持: - -- 全局管控 - 管理应用线程池实例。 - -- 动态变更 - 应用运行时动态变更线程池参数,包括不限于:核心、最大线程数、阻塞队列容量、拒绝策略等。 -- 通知报警 - 内置四种报警通知策略,线程池活跃度、容量水位、拒绝策略以及任务执行时间超长。 -- 运行监控 - 实时查看线程池运行时数据,最近半小时线程池运行数据图表展示。 -- 功能扩展 - 支持线程池任务传递上下文;项目关闭时,支持等待线程池在指定时间内完成任务。 -- 多种模式 - 内置两种使用模式:[依赖配置中心](https://hippo4j.cn/docs/user_docs/getting_started/config/hippo4j-config-start) 和 [无中间件依赖](https://hippo4j.cn/docs/user_docs/getting_started/server/hippo4j-server-start)。 -- 容器管理 - Tomcat、Jetty、Undertow 容器线程池运行时查看和线程数变更。 -- 框架适配 - Dubbo、Hystrix、RabbitMQ、RocketMQ 等消费线程池运行时数据查看和线程数变更。 - -## 快速开始 - -对于本地演示目的,请参阅 [Quick start](https://hippo4j.cn/docs/user_docs/user_guide/quick-start) - -演示环境: [http://console.hippo4j.cn/index.html](http://console.hippo4j.cn/index.html) - -## 接入登记 - -更多接入的公司,欢迎在 [登记地址](https://github.com/opengoofy/hippo4j/issues/13) 登记,登记仅仅为了产品推广。 - -## 联系我 - -开源不易,右上角点个 Star 鼓励一下吧! - -如果大家想要实时关注 Hippo4j 更新的文章以及分享的干货的话,可以关注我的公众号。 - -使用过程中有任何问题,或者对项目有什么建议,关注公众号回复:加群,和 1000+ 志同道合的朋友交流讨论。 - -![](https://oss.open8gu.com/image-20230317191041262-mini.png) - -## 友情链接 - -- [[ LiteFlow ]](https://liteflow.yomahub.com/):轻量,快速,稳定可编排的组件式规则引擎。 - -- [[ Sa-Token ]](https://github.com/dromara/sa-token):一个轻量级 java 权限认证框架,让鉴权变得简单、优雅! -- [[ HertzBeat ]](https://github.com/dromara/hertzbeat):易用友好的云监控系统, 无需 Agent, 强大自定义监控能力。 -- [[ JavaGuide ]](https://github.com/Snailclimb/JavaGuide):一份涵盖大部分 Java 程序员所需要掌握的核心知识。 -- [[ toBeBetterJavaer ]](https://github.com/itwanger/toBeBetterJavaer):一份通俗易懂、风趣幽默的 Java 学习指南。 - -## 贡献者 - -感谢所有为项目作出贡献的开发者。如果有意贡献,参考 [good first issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/ops/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/ops/_category_.json deleted file mode 100644 index d5b7d1e8..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/ops/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "运维指南", - "position": 4, - "link": { - "type": "generated-index" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/ops/hippo4j-server-deploy.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/ops/hippo4j-server-deploy.md deleted file mode 100644 index ffbc2306..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/ops/hippo4j-server-deploy.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 源码包部署 - -[RELEASE](https://github.com/opengoofy/hippo4j/releases) 页面下载对应版本并进行解压。 - -## 初始化 - -修改数据库相关信息。 - -```txt -/conf/application.properties -``` - -如果是新运行 Hippo4j,数据库执行下述 SQL 脚本即可。 - -```txt -/conf/hippo4j_manager.sql -``` - -如果是对已运行 Hippo4j 升级,请查看 `/conf/sql-upgrade` 目录下,是否有目标版本对应的升级脚本。 - -## 直接运行 - -Mac Linux 启动执行。 - -```txt -sh ./bin/startup.sh -``` - -Windows 启动执行。 - -```txt -bin/startup.cmd -``` - -## 访问控制台 - -启动成功后,访问链接。用户名密码:admin 123456 - -```txt -localhost:6691/index.html -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/ops/server-docker.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/ops/server-docker.md deleted file mode 100644 index 0812b931..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/ops/server-docker.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Docker部署 - -## 镜像启动 - -Docker 镜像默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -或者,底层存储数据库切换为 MySQL。`DATASOURCE_HOST` 需要切换为本地 IP,不能使用 `127.0.0.1` 或 `localhost`。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server \ --e DATASOURCE_MODE=mysql \ --e DATASOURCE_HOST=xxx.xxx.xxx.xxx \ --e DATASOURCE_PORT=3306 \ --e DATASOURCE_DB=hippo4j_manager \ --e DATASOURCE_USERNAME=root \ --e DATASOURCE_PASSWORD=root \ -hippo4j/hippo4j-server -``` - -访问 Server 控制台,路径 `http://localhost:6691/index.html` ,默认用户名密码:admin / 123456 - -## 镜像构建 - -如果想要自定义镜像,可以通过以下命令快速构建 Hippo4j Server: - -方式一: - -```shell -# 进入到 threadpool/server/bootstrap 工程路径下 -mvn clean package -Dskip.spotless.apply=true -# 进入到 docker 工程路径下 -# 默认打包是打包的 tag 是 latest -docker build -t hippo4j/hippo4j-server ../docker - -# 构建多平台版本 -docker buildx build --platform linux/arm64 -t hippo4j/hippo4j-server ../docker -docker buildx build --platform linux/amd64 -t hippo4j/hippo4j-server ../docker -``` - -方式二: - -通过 `maven docker plugin` - -```shell -# 进入到 threadpool/server/bootstrap 工程路径下 -mvn clean package -DskipTests -Dskip.spotless.apply=true docker:build -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/other/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/other/_category_.json deleted file mode 100644 index a74d7432..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/other/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "其它", - "position": 6, - "link": { - "type": "generated-index" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/other/official-ccounts.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/other/official-ccounts.md deleted file mode 100644 index 63e07ea7..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/other/official-ccounts.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 推荐公众号 - -## JavaGuide - -专注Java后端学习和大厂面试的公众号! - -![](https://oss.open8gu.com/JavaGuide.png) - -## HelloGitHub - -HelloGitHub,专注于开源社区技术和知识内容分享。 - -![](https://oss.open8gu.com/HelloGitHub.png) - -## macrozheng - -专注Java技术分享,解析优质开源项目。涵盖SpringBoot、SpringCloud、Docker、K8S等实用技术,作者Github开源项目mall(50K+Star)。 - -![](https://oss.open8gu.com/macrozheng.png) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/other/operation.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/other/operation.md deleted file mode 100644 index 62661c55..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/other/operation.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 公众号合作 - -## 推荐须知 - -hippo4j 作为一款新兴动态线程池框架,开源出来的时间比较晚,目前迫切需要不同的途径进行推广。 - -如果您是公众号运营者或者开源爱好者,欢迎将 hippo4j 推荐给您的粉丝。 - -1. 您无需为 hippo4j 专门撰写文案,只需要直接导入 [推荐文章](https://mp.weixin.qq.com/s/JTTwcBEiK_MnFcPTZl3zGA) 即可。 -2. 在文章底部或内容中留下项目官网或者 GitHub 仓库链接。 -3. 文章需至少 1000+ 的阅读量。 - -作为推荐回报,hippo4j 可以为您: - -1. 在框架官方文档 [推荐公众号](/docs/user_docs/other/official-ccounts) 页面处留下您的公众号二维码。 -2. 在框架官方交流群里@全体成员推广您的公众号一次,附带介绍语。 -3. 您的公众号所有新推文章都可以将链接发送到 hippo4j 交流群中,增加阅读量。 - -如果您还有除公众号以外的其它途径可以与 hippo4j 相互推荐,欢迎 [加群沟通](/group)。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/other/question.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/other/question.md deleted file mode 100644 index 49fd4d77..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/other/question.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 问题提问 - -文档引用自:[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way) - -## 在提问之前 - -在你准备要通过电子邮件、新闻群组或者聊天室提出技术问题前,请先做到以下事情: - -1. 尝试在你准备提问的论坛的旧文章中搜索答案。 -2. 尝试上网搜索以找到答案。 -3. 尝试阅读手册以找到答案。 -4. 尝试阅读常见问题文件(FAQ)以找到答案。 -5. 尝试自己检查或试验以找到答案。 -6. 向你身边的强者朋友打听以找到答案。 -7. 如果你是程序开发者,请尝试阅读源代码以找到答案。 - -当你提出问题的时候,请先表明你已经做了上述的努力;这将有助于树立你并不是一个不劳而获且浪费别人的时间的提问者。如果你能一并表达在做了上述努力的过程中所**学到**的东西会更好,因为我们更乐于回答那些表现出能从答案中学习的人的问题。 - -## 当你提问时 - -### 慎选提问的论坛 -小心选择你要提问的场合。如果你做了下述的事情,你很可能被忽略掉或者被看作失败者: - -* 在与主题不合的论坛上贴出你的问题。 -* 在探讨进阶技术问题的论坛张贴非常初级的问题;反之亦然。 -* 在太多的不同新闻群组上重复转贴同样的问题(cross-post)。 -* 向既非熟人也没有义务解决你问题的人发送私人电邮。 - -因此,第一步是找到对的论坛。再说一次,Google 和其它搜索引擎还是你的朋友,用它们来找到与你遭遇到困难的软硬件问题最相关的网站。通常那儿都有常见问题(FAQ)、邮件列表及相关说明文件的链接。如果你的努力(包括**阅读** FAQ)都没有结果,网站上也许还有报告 Bug(Bug-reporting)的流程或链接,如果是这样,链过去看看。 - -### 使用有意义且描述明确的标题 - -在邮件列表、新闻群组或论坛中,大约 50 字以内的标题是抓住资深专家注意力的好机会。别用喋喋不休的帮帮忙、跪求、急(更别说救命啊!!!!这样让人反感的话,用这种标题会被条件反射式地忽略)来浪费这个机会。不要妄想用你的痛苦程度来打动我们,而应该是在这点空间中使用极简单扼要的描述方式来提出问题。 - -一个好标题范例是`目标 —— 差异`式的描述,许多技术支持组织就是这样做的。在`目标`部分指出是哪一个或哪一组东西有问题,在`差异`部分则描述与期望的行为不一致的地方。 - -> 蠢问题:救命啊!我的笔记本电脑不能正常显示了! - -> 聪明问题:X.org 6.8.1 的鼠标指针会变形,某牌显卡 MV1005 芯片组。 - -> 更聪明问题:X.org 6.8.1 的鼠标指针,在某牌显卡 MV1005 芯片组环境下 - 会变形。 - -### 使用清晰、正确、精准且合乎语法的语句 - -我们从经验中发现,粗心的提问者通常也会粗心地写程序与思考(我敢打包票)。回答粗心大意者的问题很不值得,我们宁愿把时间耗在别处。 - -正确的拼写、标点符号和大小写是很重要的。一般来说,如果你觉得这样做很麻烦,不想在乎这些,那我们也觉得麻烦,不想在乎你的提问。花点额外的精力斟酌一下字句,用不着太僵硬与正式 —— 事实上,黑客文化很看重能准确地使用非正式、俚语和幽默的语句。但它**必须很**准确,而且有迹象表明你是在思考和关注问题。 - -### 精确地描述问题并言之有物 - -* 仔细、清楚地描述你的问题或 Bug 的症状。 -* 描述问题发生的环境(机器配置、操作系统、应用程序、以及相关的信息),提供经销商的发行版和版本号(如:`Fedora Core 4`、`Slackware 9.1`等)。 -* 描述在提问前你是怎样去研究和理解这个问题的。 -* 描述在提问前为确定问题而采取的诊断步骤。 -* 描述最近做过什么可能相关的硬件或软件变更。 -* 尽可能地提供一个可以`重现这个问题的可控环境`的方法。 - -尽量去揣测一个黑客会怎样反问你,在你提问之前预先将黑客们可能提出的问题回答一遍。 - -以上几点中,当你报告的是你认为可能在代码中的问题时,给黑客一个可以重现你的问题的环境尤其重要。当你这么做时,你得到有效的回答的机会和速度都会大大的提升。 - -[Simon Tatham](http://www.chiark.greenend.org.uk/~sgtatham/) 写过一篇名为《[如何有效的报告 Bug](http://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html)》的出色文章。强力推荐你也读一读。 - -### 话不在多而在精 - -你需要提供精确有内容的信息。这并不是要求你简单的把成堆的出错代码或者资料完全转录到你的提问中。如果你有庞大而复杂的测试样例能重现程序挂掉的情境,尽量将它剪裁得越小越好。 - -这样做的用处至少有三点。 -第一,表现出你为简化问题付出了努力,这可以使你得到回答的机会增加; -第二,简化问题使你更有可能得到**有用**的答案; -第三,在精炼你的 bug 报告的过程中,你很可能就自己找到了解决方法或权宜之计。 - -### 别动辄声称找到 Bug - -当你在使用软件中遇到问题,除非你非常、**非常**的有根据,不要动辄声称找到了 Bug。提示:除非你能提供解决问题的源代码补丁,或者提供回归测试来表明前一版本中行为不正确,否则你都多半不够完全确信。这同样适用在网页和文件,如果你(声称)发现了文件的`Bug`,你应该能提供相应位置的修正或替代文件。 - -请记得,还有其他许多用户没遇到你发现的问题,否则你在阅读文件或搜索网页时就应该发现了(你在抱怨前[已经做了这些,是吧](#在提问之前)?)。这也意味着很有可能是你弄错了而不是软件本身有问题。 - -编写软件的人总是非常辛苦地使它尽可能完美。如果你声称找到了 Bug,也就是在质疑他们的能力,即使你是对的,也有可能会冒犯到其中某部分人。当你在标题中嚷嚷着有`Bug`时,这尤其严重。 - -提问时,即使你私下非常确信已经发现一个真正的 Bug,最好写得像是**你**做错了什么。如果真的有 Bug,你会在回复中看到这点。这样做的话,如果真有 Bug,维护者就会向你道歉,这总比你惹恼别人然后欠别人一个道歉要好一点。 - -### 低声下气不能代替你的功课 - -有些人明白他们不该粗鲁或傲慢的提问并要求得到答复,但他们选择另一个极端 —— 低声下气:`我知道我只是个可悲的新手,一个撸瑟,但...`。这既使人困扰,也没有用,尤其是伴随着与实际问题含糊不清的描述时更令人反感。 - -别用原始灵长类动物的把戏来浪费你我的时间。取而代之的是,尽可能清楚地描述背景条件和你的问题情况。这比低声下气更好地定位了你的位置。 - -有时网页论坛会设有专为新手提问的版面,如果你真的认为遇到了初学者的问题,到那去就是了,但一样别那么低声下气。 - -### 描述问题症状而非你的猜测 - -告诉黑客们你认为问题是怎样造成的并没什么帮助。(如果你的推断如此有效,还用向别人求助吗?),因此要确信你原原本本告诉了他们问题的症状,而不是你的解释和理论;让黑客们来推测和诊断。如果你认为陈述自己的猜测很重要,清楚地说明这只是你的猜测,并描述为什么它们不起作用。 - -**蠢问题** - -> 我在编译内核时接连遇到 SIG11 错误, -> 我怀疑某条飞线搭在主板的走线上了,这种情况应该怎样检查最好? - -**聪明问题** - -> 我的组装电脑是 FIC-PA2007 主机板搭载 AMD K6/233 CPU(威盛 Apollo VP2 芯片组), -> 256MB Corsair PC133 SDRAM 内存,在编译内核时,从开机 20 分钟以后就频频产生 SIG11 错误, -> 但是在头 20 分钟内从没发生过相同的问题。重新启动也没有用,但是关机一晚上就又能工作 20 分钟。 -> 所有内存都换过了,没有效果。相关部分的标准编译记录如下… - -由于以上这点似乎让许多人觉得难以配合,这里有句话可以提醒你:`所有的诊断专家都来自密苏里州。` 美国国务院的官方座右铭则是:`让我看看`(出自国会议员 Willard D. Vandiver 在 1899 年时的讲话:`我来自一个出产玉米,棉花,牛蒡和民主党人的国家,滔滔雄辩既不能说服我,也不会让我满意。我来自密苏里州,你必须让我看看。`) 针对诊断者而言,这并不是一种怀疑,而只是一种真实而有用的需求,以便让他们看到的是与你看到的原始证据尽可能一致的东西,而不是你的猜测与归纳的结论。所以,大方的展示给我们看吧! - -### 按发生时间先后列出问题症状 - -问题发生前的一系列操作,往往就是对找出问题最有帮助的线索。因此,你的说明里应该包含你的操作步骤,以及机器和软件的反应,直到问题发生。在命令行处理的情况下,提供一段操作记录(例如运行脚本工具所生成的),并引用相关的若干行(如 20 行)记录会非常有帮助。 - -如果挂掉的程序有诊断选项(如 -v 的详述开关),试着选择这些能在记录中增加调试信息的选项。记住,`多`不等于`好`。试着选取适当的调试级别以便提供有用的信息而不是让读者淹没在垃圾中。 - -如果你的说明很长(如超过四个段落),在开头简述问题,接下来再按时间顺序详述会有所帮助。这样黑客们在读你的记录时就知道该注意哪些内容了。 - -### 描述目标而不是过程 - -如果你想弄清楚如何做某事(而不是报告一个 Bug),在开头就描述你的目标,然后才陈述重现你所卡住的特定步骤。 - -经常寻求技术帮助的人在心中有个更高层次的目标,而他们在自以为能达到目标的特定道路上被卡住了,然后跑来问该怎么走,但没有意识到这条路本身就有问题。结果要费很大的劲才能搞定。 - -**蠢问题** - -> 我怎样才能从某绘图程序的颜色选择器中取得十六进制的 RGB 值? - -**聪明问题** - -> 我正试着用替换一幅图片的色码(color table)成自己选定的色码,我现在知道的唯一方法是编辑每个色码区块(table slot), -> 但却无法从某绘图程序的颜色选择器取得十六进制的 RGB 值。 - -第二种提问法比较聪明,你可能得到像是```建议采用另一个更合适的工具```的回复。 - -### 清楚明确的表达你的问题以及需求 - -漫无边际的提问是近乎无休无止的时间黑洞。最有可能给你有用答案的人通常也正是最忙的人(他们忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞相当厌恶,所以他们也倾向于厌恶那些漫无边际的提问。 - -如果你明确表述需要回答者做什么(如提供指点、发送一段代码、检查你的补丁、或是其他等等),就最有可能得到有用的答案。因为这会定出一个时间和精力的上限,便于回答者能集中精力来帮你。这么做很棒。 - -要理解专家们所处的世界,请把专业技能想像为充裕的资源,而回复的时间则是稀缺的资源。你要求他们奉献的时间越少,你越有可能从真正专业而且很忙的专家那里得到解答。 - -所以,界定一下你的问题,使专家花在辨识你的问题和回答所需要付出的时间减到最少,这技巧对你有用答案相当有帮助 —— 但这技巧通常和简化问题有所区别。因此,问`我想更好地理解 X,可否指点一下哪有好一点说明?`通常比问`你能解释一下 X 吗?`更好。如果你的代码不能运作,通常请别人看看哪里有问题,比要求别人替你改正要明智得多。 - -### 礼多人不怪,而且有时还很有帮助 - -彬彬有礼,多用`请`和`谢谢您的关注`,或`谢谢你的关照`。让大家都知道你对他们花时间免费提供帮助心存感激。 - -坦白说,这一点并没有比使用清晰、正确、精准且合乎语法和避免使用专用格式重要(也不能取而代之)。黑客们一般宁可读有点唐突但技术上鲜明的 Bug 报告,而不是那种有礼但含糊的报告。(如果这点让你不解,记住我们是按问题能教给我们什么来评价问题的价值的) - -然而,如果你有一串的问题待解决,客气一点肯定会增加你得到有用回应的机会。 - -(我们注意到,自从本指南发布后,从资深黑客那里得到的唯一严重缺陷反馈,就是对预先道谢这一条。一些黑客觉得`先谢了`意味着事后就不用再感谢任何人的暗示。我们的建议是要么先说`先谢了`,**然后**事后再对回复者表示感谢,或者换种方式表达感激,譬如用`谢谢你的关注`或`谢谢你的关照`。) - -## 不该问的问题 - -以下是几个经典蠢问题,以及黑客没回答时心中所想的: - -问题:[我能在哪找到 X 程序或 X 资源?](#q1) - -问题:[我怎样用 X 做 Y?](#q2) - -问题:[我的程序/设定/SQL 语句没有用](#q3) - -问题:[我的 Windows 电脑有问题,你能帮我吗?](#q4) - -问题:[我的程序不会动了,我认为系统工具 X 有问题](#q5) - -问题:[我在安装 Linux(或者 X )时有问题,你能帮我吗?](#q6) - -问题:[我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢?](#q7) - ---- - -> 问题:我能在哪找到 X 程序或 X 资源? - -回答:就在我找到它的地方啊,白痴 —— 搜索引擎的那一头。天哪!难道还有人不会用 [Google](https://www.google.com) 吗? - -> 问题:我怎样用 X 做 Y? - -回答:如果你想解决的是 Y ,提问时别给出可能并不恰当的方法。这种问题说明提问者不但对 X 完全无知,也对 Y 要解决的问题糊涂,还被特定形势禁锢了思维。最好忽略这种人,等他们把问题搞清楚了再说。 - -> 问题:我的{程序/设定/SQL 语句}没有用 - -回答:这不算是问题吧,我对要我问你二十个问题才找得出你真正问题的问题没兴趣 —— 我有更有意思的事要做呢。在看到这类问题的时候,我的反应通常不外如下三种 - -* 你还有什么要补充的吗? -* 真糟糕,希望你能搞定。 -* 这关我屁事? - -> 问题:我的 Windows 电脑有问题,你能帮我吗? - -回答:能啊,扔掉微软的垃圾,换个像 Linux 或 BSD 的开源操作系统吧。 - -注意:如果程序有官方版 Windows 或者与 Windows 有互动(如 Samba),你**可以**问与 Windows 相关的问题,只是别对问题是由 Windows 操作系统而不是程序本身造成的回复感到惊讶, 因为 Windows 一般来说实在太烂,这种说法通常都是对的。 - -> 问题:我的程序不会动了,我认为系统工具 X 有问题 - -回答:你完全有可能是第一个注意到被成千上万用户反复使用的系统调用与函数库文件有明显缺陷的人,更有可能的是你完全没有根据。不同凡响的说法需要不同凡响的证据,当你这样声称时,你必须有清楚而详尽的缺陷说明文件作后盾。 - -> 问题:我在安装 Linux(或者 X )时有问题,你能帮我吗? - -回答:不能,我只有亲自在你的电脑上动手才能找到毛病。还是去找你当地的 Linux 使用群组者寻求实际的指导吧(你能在[这儿](http://www.linux.org/groups/index.html)找到用户群组的清单)。 - -注意:如果安装问题与某 Linux 的发行版有关,在它的邮件列表、论坛或本地用户群组中提问也许是恰当的。此时,应描述问题的准确细节。在此之前,先用 `Linux` 和**所有**被怀疑的硬件作关键词仔细搜索。 - -> 问题:我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢? - -回答:想要这样做,说明了你是个卑鄙小人;想找个黑客帮你,说明你是个白痴! - -## 好问题与蠢问题 - -最后,我将透过举一些例子,来说明怎样聪明的提问;同一个问题的两种问法被放在一起,一种是愚蠢的,另一种才是明智的。 - -**蠢问题**: - -> 我从 foo 项目找来的源码没法编译。它怎么这么烂? - -他觉得都是别人的错,这个傲慢自大的提问者。 - -**聪明问题**: - -> foo 项目代码在 Nulix 6.2 版下无法编译通过。我读过了 FAQ,但里面没有提到跟 Nulix 有关的问题。这是我编译过程的记录,我有什么做的不对的地方吗? - -提问者已经指明了环境,也读过了 FAQ,还列出了错误,并且他没有把问题的责任推到别人头上,他的问题值得被关注。 - -**蠢问题**: - -> 我的主机板有问题了,谁来帮我? - -某黑客对这类问题的回答通常是:`好的,还要帮你拍拍背和换尿布吗?`,然后按下删除键。 - -**聪明问题**: - -> 我在 S2464 主机板上试过了 X 、 Y 和 Z ,但没什么作用,我又试了 A 、 B 和 C 。请注意当我尝试 C 时的奇怪现象。显然 florbish 正在 grommicking,但结果出人意料。通常在 Athlon MP 主机板上引起 grommicking 的原因是什么?有谁知道接下来我该做些什么测试才能找出问题? - -## 如果得不到回答 - -如果仍得不到回答,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。 - -总的来说,简单的重复张贴问题是个很糟的点子。这将被视为无意义的喧闹。有点耐心,知道你问题答案的人可能生活在不同的时区,可能正在睡觉,也有可能你的问题一开始就没有组织好。 - -你可以通过其他渠道获得帮助,这些渠道通常更适合初学者的需要。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/user_guide/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/user_guide/_category_.json deleted file mode 100644 index 9c505a51..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/user_guide/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "用户指南", - "position": 2, - "link": { - "type": "generated-index", - "description": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/user_guide/frame.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/user_guide/frame.md deleted file mode 100644 index 5992f735..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/user_guide/frame.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 为什么写 - -[美团线程池文章](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html "美团线程池文章") 介绍中,因为业务对线程池参数没有合理配置,触发过几起生产事故,进而引发了一系列思考。最终决定封装线程池动态参数调整,扩展线程池监控以及消息报警等功能。 - -在开源平台找了挺多动态线程池项目,从功能性以及健壮性而言,个人感觉不满足企业级应用。 - -因为对动态线程池比较感兴趣,加上想写一个有意义的项目,所以决定自己来造一个轻量级的轮子。 - -想给项目起一个简单易记的名字,类似于 Eureka、Nacos、Redis;后和朋友商量,决定命名:**Hippo4j**。 - -![](https://oss.open8gu.com/动态线程池功能架构-1.jpg) - -## 它解决了什么问题 - -线程池在业务系统应该都有使用到,帮助业务流程提升效率以及管理线程,多数场景应用于大量的异步任务处理。 - -虽然线程池提供了我们许多便利,但也并非尽善尽美,比如下面这些问题就无法很好解决。 - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 - -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 - -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 - -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 - -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 - -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 - -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -Hippo4j 很好解决了这些问题,它将业务中所有线程池统一管理,增强原生线程池系列功能。 - -## 它有什么特性 - -应用系统中线程池并不容易管理。参考美团的设计,Hippo4j 按照租户、项目、线程池的维度划分。再加上系统权限,让不同的开发、管理人员负责自己系统的线程池操作。 - -举个例子,小编在一家公司的公共组件团队,团队中负责消息、短链接网关等项目。公共组件是租户,消息或短链接就是项目。 - -Hippo4j 除去动态修改线程池,还包含实时查看线程池运行时指标、负载报警、配置日志管理等。 - -- `hippo4j-adapter`:适配对第三方框架中的线程池进行监控,如 Dubbo、RocketMQ、Hystrix 等; -- `hippo4j-auth`:用户、角色、权限等; -- `hippo4j-common`:多个模块公用代码实现; -- `hippo4j-config`:提供线程池准实时参数更新功能; -- `hippo4j-console`:对接前端控制台; -- `hippo4j-core`:核心的依赖,包括配置、核心包装类等; -- `hippo4j-discovery`:提供线程池项目实例注册、续约、下线等功能; -- `hippo4j-example` :示例工程; -- `hippo4j-message` :配置变更以及报警通知发送; -- `hippo4j-monitor` :线程池运行时监控; -- `hippo4j-server` :Server 端发布需要的模块聚合; -- `hippo4j-spring-boot`:SpringBoot Starter。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/user_guide/framework.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/user_guide/framework.md deleted file mode 100644 index 33e24d1c..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/user_guide/framework.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 架构设计 - -简单来说,Hippo4j 从部署的角度上分为两种角色:Server 端和 Client 端。 - -Server 端是 Hippo4j 项目打包出的 Java 进程,功能包括用户权限、线程池监控以及执行持久化的动作。 - -Client 端指的是我们 SpringBoot 应用,通过引入 Hippo4j Starter Jar 包负责与 Server 端进行交互。 - -比如拉取 Server 端线程池数据、动态更新线程池配置以及采集上报线程池运行时数据等。 - -## 基础组件 - -### 配置中心(Config) - -配置中心位于 Server 端,它的主要作用是监控 Server 端线程池配置变更,实时通知到 Client 实例执行线程池变更流程。 - -代码设计基于 Nacos 1.x 版本的 **长轮询以及异步 Servlet 机制** 实现。 - -### 注册中心(Discovery) - -负责管理 Client 端(单机或集群)注册到 Server 端的实例,包括不限于**实例注册、续约、过期剔除** 等操作,代码基于 Eureka 源码实现。 - -上面的配置中心很容易理解,动态线程池参数变更的根本。但是注册中心是用来做什么的? - -注册中心管理 Client 端注册的实例,通过这些实例可以 **实时获取线程池的运行时参数信息**。 - -目前的设计是如此,不排除后续基于 Discovery 做更多的扩展。 - -### 控制台(Console) - -对接前端项目,包括不限于以下模块管理: - -![](https://oss.open8gu.com/image-20211107122504126.png) - -## 消息通知(Notify) - -Hippo4j 内置了很多需要通知的事件,比如:线程池参数变更通知、线程池活跃度报警、拒绝策略执行报警以及阻塞队列容量报警等。 - -目前 Notify 已经接入了钉钉、企业微信和飞书,后续持续集成邮件、短信等通知渠道;并且,Notify 模块提供了消息事件的 SPI 方案,可以接受三方自定义的推送。 - -## Hippo4j-Spring-Boot-Starter - -熟悉 SpringBoot 的小伙伴对 Starter 应该不会陌生。Hippo4j 提供以 Starter Jar 包的形式嵌套在应用内,负责与 Server 端完成交互。 - -## 功能架构 - -![](https://oss.open8gu.com/image-20211105230953626.png) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/user_guide/notify.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/user_guide/notify.md deleted file mode 100644 index 7aa7e915..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/user_guide/notify.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 通知报警 - -现阶段已集成钉钉、企业微信、飞书的消息推送,后续会持续接入邮箱、短信和自定义通知渠道。 - -![](https://oss.open8gu.com/image-20220904181527453.png) - -**通知平台** - -- DING:钉钉平台; - -- LARK:飞书平台; - -- WECHAT:企业微信。 - -**通知类型** - -- CONFIG:线程池配置变更推送; - -- ALARM:线程池运行报警推送。 - -**Token** - -获取 DING、LARK、WECHAT 机器人 Token。 - -**报警间隔** - -- CONFIG 类型通知没有报警间隔; - -- ALARM 类型设置报警间隔后,某一节点下的同一线程池指定间隔只会发送一次报警通知。 - -**接收者** - -```tex -多个接收者使用英文逗号 , 分割 (注意不要有空格) -DING:填写手机号 -WECHART:填写user_id会以@的消息发给用户,填写姓名则是普通的@,如:龙台 -LARK:填写ou_开头用户唯一标识会以@的消息发给用户,填写手机号则是普通的@ -``` - - -## 钉钉平台 - -[钉钉创建群机器人](https://www.dingtalk.com/qidian/help-detail-20781541.html) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211013122816688.png) | ![](https://oss.open8gu.com/image-20211013113649068.png) | - -添加钉钉机器人后,需在机器人配置自定义关键字,才可发送成功。如下所示: - -![](https://oss.open8gu.com/image-20220530200133377.png?x-oss-process=image/resize,h_500,w_800) - -:::tip -如果使用 1.4.3 及以上版本,`警报` 替换为 `告警`。 -::: - -## 企业微信 - -[企业微信创建群机器人](https://open.work.weixin.qq.com/help2/pc/14931?person_id=1&from=homesearch) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211203213443242.png) | ![](https://oss.open8gu.com/image-20211203213512019.png) | - -## 飞书平台 - -[飞书创建群机器人](https://www.feishu.cn/hc/zh-CN/articles/360024984973) - -![](https://oss.open8gu.com/image-20220304081729347.png) - -![](https://oss.open8gu.com/image-20220304081507907.png) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/user_guide/quick-start.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/user_guide/quick-start.md deleted file mode 100644 index 59c5cdd5..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/user_docs/user_guide/quick-start.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 快速开始 - -## 服务启动 - -使用 Docker 运行服务端,默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -> 如果没有 Docker,可以使用源码编译的方式,启动 [Hippo4j-Server/Hippo4j-Bootstrap](https://github.com/longtai-cn/hippo4j/tree/develop/hippo4j-server/hippo4j-bootstrap) 模块下 ServerApplication 应用类。 - -启动示例项目,[hippo4j-spring-boot-starter-example](https://github.com/opengoofy/hippo4j/tree/develop/hippo4j-example/hippo4j-spring-boot-starter-example) 模块下 ServerExampleApplication 应用类。 - -访问 Server 控制台,路径 `http://localhost:6691/index.html`,默认用户名密码:admin / 123456 - -## 配置变更 - -访问控制台动态线程池菜单下线程池实例,修改动态线程池相关参数。 - -![](https://oss.open8gu.com/image-20220813173811668.png) - -观察 Hippo4j-Example 控制台日志输出,日志输出包括不限于此信息即为成功。 - -```tex -2022-09-10 00:23:29.783 INFO 50322 --- [change.config_0] c.h.s.s.c.ServerThreadPoolDynamicRefresh : [message-consume] Dynamic thread pool change parameter. - corePoolSize: 2 => 4 - maximumPoolSize: 6 => 12 - capacity: 1024 => 2048 - keepAliveTime: 9999 => 9999 - executeTimeOut: 800 => 3000 - rejectedType: SyncPutQueuePolicy => RunsOldestTaskPolicy - allowCoreThreadTimeOut: true => true -``` - -另外,当 Client 集群部署时,可以修改某一个实例,或选择 `全部修改` 按钮,修改所有实例线程池信息。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2.json deleted file mode 100644 index 4393497b..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "version.label": { - "message": "1.4.2", - "description": "The label for version 1.4.2" - }, - "sidebar.tutorialSidebar.category.user_docs": { - "message": "user_docs", - "description": "The label for category user_docs in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar tutorialSidebar" - }, - "sidebar.user_docs.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar user_docs" - }, - "sidebar.user_docs.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar user_docs" - }, - "sidebar.user_docs.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar user_docs" - }, - "sidebar.user_docs.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar user_docs" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/dev_manual/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/dev_manual/_category_.json deleted file mode 100644 index 9117307f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/dev_manual/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "开发者手册", - "position": 5, - "link": { - "type": "generated-index", - "description": "Hippo4j 留给使用者能够扩展的知识点。" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/dev_manual/rejected-policy-custom.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/dev_manual/rejected-policy-custom.md deleted file mode 100644 index e0405061..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/dev_manual/rejected-policy-custom.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 拒绝策略自定义 - -Hippo4j 通过 SPI 的方式对拒绝策略进行扩展,可以让用户在 Hippo4j 中完成自定义拒绝策略实现。 - -## Hippo4j Server 拒绝策略扩展 - -自定义拒绝策略,实现 `CustomRejectedExecutionHandler` 接口,示例如下: - -```java -public class ErrorLogRejectedExecutionHandler implements CustomRejectedExecutionHandler { - - @Override - public Integer getType() { - return 12; - } - - @Override - public RejectedExecutionHandler generateRejected() { - return new CustomErrorLogRejectedExecutionHandler(); - } - - public static class CustomErrorLogRejectedExecutionHandler implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - Logger logger = LoggerFactory.getLogger(this.getClass()); - logger.error("线程池抛出拒绝策略"); - } - } -} -``` - -创建 `src/main/resources/META-INF/services` 目录,创建 SPI 自定义拒绝策略文件 `cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler`。 - -`cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler` 文件内仅放一行自定义拒绝策略全限定名即可,示例: - -```text -cn.hippo4j.example.core.handler.ErrorLogRejectedExecutionHandler -``` - -创建、修改线程池页面选择 `CustomRejectedPolicy(自定义 SPI 策略)`。 - -![](https://oss.open8gu.com/image-20220813173907814.png) - -拒绝策略触发时,完成上述代码效果,仅打印异常日志提示。 - -```text -2022-08-01 21:27:49.515 ERROR 48928 --- [ateHandler.test] r$CustomErrorLogRejectedExecutionHandler : 线程池抛出拒绝策略 -``` - -:::note -具体参考 `hippo4j-example/hippo4j-spring-boot-starter-example` 模块。 -::: diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/dev_manual/rejected-policy-info.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/dev_manual/rejected-policy-info.md deleted file mode 100644 index d5c68138..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/dev_manual/rejected-policy-info.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 内置拒绝策略 - -内置两种拒绝策略说明: - -**RunsOldestTaskPolicy**:添加新任务并由主线程运行最早的任务。 - -```java -public class RunsOldestTaskPolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - BlockingQueue workQueue = executor.getQueue(); - Runnable firstWork = workQueue.poll(); - boolean newTaskAdd = workQueue.offer(r); - if (firstWork != null) { - firstWork.run(); - } - if (!newTaskAdd) { - executor.execute(r); - } - } -} -``` - -**SyncPutQueuePolicy**:主线程把拒绝任务以阻塞的方式添加到队列。 - -```java -@Slf4j -public class SyncPutQueuePolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - try { - executor.getQueue().put(r); - } catch (InterruptedException e) { - log.error("Adding Queue task to thread pool failed.", e); - } - } -} -``` \ No newline at end of file diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/_category_.json deleted file mode 100644 index 72b1e151..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "快速开始", - "position": 3, - "link": { - "type": "generated-index" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/_category_.json deleted file mode 100644 index 78b3d9c4..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "依赖配置中心", - "position": 2, - "collapsed": true -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-default.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-default.md deleted file mode 100644 index 9c9e0fc9..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-default.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 参数默认配置 - -曾有多名小伙伴反馈说,项目中线程池一多,配置文件中配置就显得很臃肿。为此 hippo4j-config 开发出了动态线程池默认配置。 - -```yaml -spring: - dynamic: - thread-pool: - default-executor: - core-pool-size: 4 - maximum-pool-size: 6 - blocking-queue: ResizableCapacityLinkedBlockingQueue - queue-capacity: 1024 - execute-time-out: 1000 - keep-alive-time: 9999 - rejected-handler: AbortPolicy - active-alarm: 90 - capacity-alarm: 85 - alarm: true - allow-core-thread-time-out: true - notify: - interval: 5 - receives: chen.ma - executors: - - thread-pool-id: message-produce - - thread-pool-id: message-consume - core-pool-size: 80 - maximum-pool-size: 100 - execute-time-out: 1000 - notify: - interval: 6 - receives: chen.ma -``` - -`spring.dynamic.thread-pool.executors` 层级下,仅需要配置 `thread-pool-id`,其余配置从 `spring.dynamic.thread-pool.default-executor` 读取。 - -如果 `spring.dynamic.thread-pool.executors` 下配置和 `spring.dynamic.thread-pool.default-executor` 冲突,以前者为主。 - -通过该自定义配置方式,可减少大量重复线程池参数配置项,提高核心配置简洁度。 - -提示:`spring.dynamic.thread-pool.default-executor` 层级下参数,不提供动态刷新功能。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-monitor.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-monitor.md deleted file mode 100644 index e4aade51..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-monitor.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 线程池监控 - -## 线程池监控配置 - -监控前置条件:需要先完成 hippo4j-config 的 [接入工作](/docs/user_docs/getting_started/config/hippo4j-config-start)。 - -接下来引入 SpringBoot Actuator。Spring 2.x 一般都有版本指定,所以这里不用写版本号。 - -```xml - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - -``` - -添加动态线程池监控相关配置: - -```yaml -management: - metrics: - export: - prometheus: - enabled: true - server: - port: 29999 # 可选配置,如果不配置该 port,直接使用 ${server.port} - endpoints: - web: - exposure: - include: '*' # 测试使用,开启了所有端点,生产环境不建议 * -spring: - dynamic: - thread-pool: - collect-type: micrometer -``` - -项目启动,访问 `http://localhost:29999/actuator/prometheus` 出现 `dynamic_thread_pool_` 前缀的指标,即为成功。 - -![](https://oss.open8gu.com/image-20220912220401016.png) - -## 配置 Prometheus - -通过 Docker 启动 Prometheus 服务。 - -```shell -docker run -d -p 9090:9090 --name prometheus prom/prometheus -``` - -添加 Prometheus 抽取数据任务。 - -```shell -# 进入 prometheus 容器内部 -docker exec -it prometheus /bin/sh -# 编辑 prometheus 配置文件 -vi /etc/prometheus/prometheus.yml -``` - -scrape_configs 节点下新添加一个 job,如果 Prometheus 是 Docker 方式部署,`{scrape_configs.static_configs.targets}` 需要写本机的 IP。 - -```yaml -scrape_configs: - - job_name: 'dynamic-thread-pool-job' - scrape_interval: 5s - metrics_path: '/actuator/prometheus' - static_configs: - - targets: [ '127.0.0.1:29999' ] -``` - -配置成功后 `exit` 退出容器,并进行 Prometheus 容器重启 `docker restart prometheus`。 - -访问 Prometheus 控制台 `http://localhost:9090/graph` 路径,能够展示相关指标即为配置成功。 - -![](https://oss.open8gu.com/image-20220912221237597.png) - -## 配置 Grafana - -```shell -docker run -d -p 3000:3000 --name=grafana grafana/grafana -``` - -访问 Grafana 地址,[http://localhost:3000](http://localhost:3000) 用户名密码:`admin` - -Grafana 访问 `http://localhost:3000/datasources` 导入 Prometheus 数据源。 - -![](https://oss.open8gu.com/image-20220912221646866.png) - -> 如果 Prometheus 为 Docker 方式部署,HTTP URL 需要为本地 IP,比如:http://192.168.1.5:9090 - -关注公众号 `龙台的技术笔记`,回复:`监控`,获取 Hippo4j Grafana DashBoard JSON 配置。 - -| 公众号 | 回复关键词 | -|:------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------:| -| ![](https://oss.open8gu.com/43_65f6020ed111b6bb3808ec338576bd6b.png?x-oss-process=image/resize,h_300,w_400) | ![](https://oss.open8gu.com/image-20220327171957444.png?x-oss-process=image/resize,h_300,w_400) | - -获取到 JSON 文件后,通过 `http://localhost:3000/dashboard/import` 将 JSON 文件导入至 Grafana DashBoard。 - -![](https://oss.open8gu.com/image-20220912225627272.png) - -下拉框内动态选择创建好的 Prometheus 数据源,并点击 `Import`。 - -![](https://oss.open8gu.com/image-20220912225700200.png) - -即可使用炫酷的 Hippo4j 动态线程池监控 DashBoard。大家伙儿也可以根据个人喜好进行定制 DashBoard,如果觉得有优化点,欢迎和我联系贡献。 - -![](https://oss.open8gu.com/image-20220912225813972.png) - -如果项目客户端启动多个示例,动态线程池监控效果图如下: - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-more.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-more.md deleted file mode 100644 index 2511b4f3..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-more.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 个性化配置 - -以下所述特性自 hippo4j-config v1.4.2 及以上版本提供,由 hippo4j 核心开发者 [@pizihao](https://github.com/pizihao) 完成相应功能开发。 - -## 需求背景 - -**1)容器及三方框架线程池自定义启用** - -最初设计容器线程池和三方框架线程池的动态变更是和启动无关的。也就是说,启动时不会根据配置文件中相关参数去修改两者对应的线程池配置。 - -这么设计的初衷是因为,不想让 hippo4j 过多的去介入框架原有的功能。因为容器和三方框架都支持线程池参数的自定义。 - -也就造成,可能你在配置中心配置了对应的容器和三方框架线程池参数,启动时是无效的。但当修改配置文件任一配置,容器和三方框架线程池配置将生效。 - -为了更好的用户体验,决定加入启用标识来控制:是否在项目初始化启动时,对容器和三方框架线程池参数进行修改。 - -**2)客户端集群个性化配置** - -大家都知道,hippo4j-config 是依赖配置中心做线程池配置动态变更。这种模式有一种缺点:改动配置文件后,所有客户端都会变更。 - -有些小伙伴希望 hippo4j-config 能够像 hippo4j-server 一样,能够针对单独的客户端进行配置变更。 - -## 容器及三方框架线程池自定义启用 - -容器及三方框架线程池添加启用配置,为了保持统一,动态线程池配置中也有该参数配置。配置项默认开启。 - -```yaml -spring: - dynamic: - thread-pool: - tomcat: - enable: true - executors: - - thread-pool-id: message-consume - enable: false - adapter-executors: - - threadPoolKey: 'input' - enable: true -``` - -## 客户端集群个性化配置 - -分别在动态线程池、容器线程池以及三方框架线程池配置下增加 `nodes` 配置节点,通过该配置可匹配需要变更的节点。 - -```yaml -spring: - dynamic: - thread-pool: - tomcat: - nodes: 192.168.1.5:*,192.168.1.6:8080 - executors: - - thread-pool-id: message-consume - nodes: 192.168.1.5:* - adapter-executors: - - threadPoolKey: 'input' - nodes: 192.168.1.5:* -``` - -来一段代码方法中的注释,大家就基本明白如何使用了。 - -```java -/** - * Matching nodes
- * nodes is ip + port.Get 'nodes' in the new Properties,Compare this with the ip + port of Application.
- * support prefix pattern matching. e.g:
- *
    - *
  • 192.168.1.5:* -- Matches all ports of 192.168.1.5
  • - *
  • 192.168.1.*:2009 -- Matches 2009 port of 192.168.1.*
  • - *
  • * -- all
  • - *
  • empty -- all
  • - *
- * The format of ip + port is ip : port. - */ -``` - -`nodes` 可与 `enable` 同时使用。如此,基于配置中心的动态线程池实现方式,将能够更方便的支持个性化需求。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md deleted file mode 100644 index 693dd341..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 适配SpringBoot1x - -目前已支持 Nacos、Apollo 配置中心适配 SpringBoot 1.5.x 版本。 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-1x-starter - 1.4.2 - -``` - -Nacos SpringBoot 配置如下: - -```yaml -spring: - cloud: - nacos: - config: - ext-config: - - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP - refresh: true - server-addr: 127.0.0.1:8848 - dynamic: - thread-pool: - config-file-type: yml - nacos: - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP -``` - -Apollo SpringBoot 配置如下: - -```yaml -apollo: - autoUpdateInjectedSpringProperties: true - bootstrap: - eagerLoad: - enabled: true - enabled: true - namespaces: application - meta: http://127.0.0.1:8080 -app: - id: dynamic-threadpool-example -spring: - dynamic: - thread-pool: - apollo: - namespace: application -``` - -动态线程池通用配置如下: - -```yaml -management: - context-path: /actuator - security: - enabled: false -server: - port: 8091 - servlet: - context-path: /example -spring: - application: - name: dynamic-threadpool-example - dynamic: - thread-pool: - banner: true - check-state-interval: 5 - collect-type: micrometer - config-file-type: properties - enable: true - executors: - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-consume - thread-pool-id: message-consume - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-produce - thread-pool-id: message-produce - notify-platforms: - - platform: WECHAT - token: ac0426a5-c712-474c-9bff-72b8b8f5caff - profiles: - active: dev -``` - -具体 Demo 运行请参考以下示例模块,已验证对应线程池动态变更、报警以及运行时监控功能。 - -- `/hippo4j-config-nacos-spring-boot-1x-starter-example` -- `hippo4j-example/hippo4j-config-apollo-spring-boot-1x-starter-example` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-start.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-start.md deleted file mode 100644 index 33f658c2..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-start.md +++ /dev/null @@ -1,193 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 接入流程 - -Nacos、Apollo、Zookeeper、ETCD、Polaris 配置中心任选其一。 - -## hippo4j 配置 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-starter - 1.4.2 - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -server: - port: 8090 - servlet: - context-path: /example - -spring: - profiles: - active: dev - - dynamic: - thread-pool: - # 是否开启动态线程池 - enable: true - # 是否打印 banner - banner: true - # 是否开启线程池数据采集,对接 Micrometer、ES、Log 等 - collect: true - # 检查线程池状态,是否达到报警条件,单位毫秒 - check-state-interval: 3000 - # 通知报警平台,请替换为自己创建的群机器人 - notify-platforms: - - platform: 'WECHAT' - token: xxx - - platform: 'DING' - token: xxx - secret: xxx # 加签专属 - - platform: 'LARK' - token: xxx - # Nacos、Apollo、Zookeeper、ETCD、Polaris 任选其一 - nacos: - data-id: xxx - group: xxx - apollo: - namespace: xxxx - # 配置中心文件格式 - config-file-type: yml - # tomcat、undertow、jetty 三种容器线程池,任选其一 - undertow: - core-pool-size: 100 - maximum-pool-size: 200 - keep-alive-time: 1000 - # 全局通知配置-是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位秒 - alarm-interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - # 动态线程池列表 - executors: - - thread-pool-id: 'message-consume' - # 核心线程数 - core-pool-size: 1 - # 最大线程数 - maximum-pool-size: 1 - # 阻塞队列名称,参考 BlockingQueueTypeEnum,支持 SPI - blocking-queue: 'LinkedBlockingQueue' - # 阻塞队列大小 - queue-capacity: 1 - # 执行超时时间,超过此时间发起报警,单位毫秒 - execute-time-out: 1000 - # 拒绝策略名称,参考 RejectedPolicyTypeEnum,支持 SPI - rejected-handler: 'AbortPolicy' - # 线程存活时间,单位秒 - keep-alive-time: 1024 - # 是否允许核心线程超时 - allow-core-thread-time-out: true - # 线程工厂名称前缀 - thread-name-prefix: 'message-consume' - # 是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 通知配置,线程池中通知配置如果存在,则会覆盖全局通知配置 - notify: - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位分钟 - interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - - thread-pool-id: 'message-produce' - core-pool-size: 1 - maximum-pool-size: 1 - queue-capacity: 1 - execute-time-out: 1000 - blocking-queue: 'LinkedBlockingQueue' - rejected-handler: 'AbortPolicy' - keep-alive-time: 1024 - allow-core-thread-time-out: true - thread-name-prefix: 'message-consume' - alarm: true - active-alarm: 80 - capacity-alarm: 80 - notify: - interval: 8 - receives: xxx -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从配置中心拉取。 - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/difference.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/difference.md deleted file mode 100644 index eddaa550..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/difference.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 运行模式介绍 - -1.1.0 版本发布后,Hippo4j 分为两种使用模式:轻量级依赖配置中心以及无中间件依赖版本。 - -![](https://oss.open8gu.com/image-20220319154626314.png) - -### hippo4j-config - -**轻量级动态线程池管理**,依赖 Nacos、Apollo、Zookeeper、ETCD、Polaris 等三方配置中心(任选其一)完成线程池参数动态变更,支持运行时报警、监控等功能。 - -> 监控功能配置详见:[线程池监控](/docs/user_docs/getting_started/config/hippo4j-config-monitor) - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) - -### hippo4j-server - -**部署 hippo4j-server 服务**,通过可视化 Web 界面完成线程池的创建、变更以及查看,不依赖三方中间件。 - -相比较 hippo4j-config,功能会更强大,但同时也引入了一定的复杂性。需要部署一个 Java 服务,以及依赖 MySQL 数据库。 - -![](https://oss.open8gu.com/1644032018254-min.gif) - -### 使用总结 - -| | hippo4j-config | hippo4j-server | -| ---- | ---------------------------------------------------- | ------------------------------------------------------------ | -| 依赖 | Nacos、Apollo、Zookeeper、ETCD、Polaris 配置中心(任选其一) | 部署 Hippo4j Server(内部无依赖中间件) | -| 使用 | 配置中心补充线程池相关参数 | Hippo4j Server Web 控制台添加线程池记录 | -| 功能 | 包含基础功能:参数动态化、运行时监控、报警等 | 基础功能之外扩展控制台界面、线程池堆栈查看、线程池运行信息实时查看、历史运行信息查看、线程池配置集群个性化等 | - -使用建议:根据公司情况选择,如果基本功能可以满足使用,选择 hippo4j-config 使用即可;如果希望更多的功能,可以选择 hippo4j-server。 - -**两者在进行替换的时候,无需修改业务代码**。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/hippo4j-adapter.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/hippo4j-adapter.md deleted file mode 100644 index 6fac0e9d..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/hippo4j-adapter.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 三方框架线程池适配 - -Hippo4j 目前已支持的三方框架线程池列表: - -- Dubbo -- Hystrix -- RabbitMQ -- RocketMQ -- AlibabaDubbo -- RocketMQSpringCloudStream -- RabbitMQSpringCloudStream - -引入 Hippo4j Server 或 Core 的 Maven Jar 坐标后,还需要引入对应的框架适配 Jar: - -```xml - - cn.hippo4j - - hippo4j-spring-boot-starter-adapter-dubbo - - hippo4j-spring-boot-starter-adapter-alibaba-dubbo - - hippo4j-spring-boot-starter-adapter-hystrix - - hippo4j-spring-boot-starter-adapter-rabbitmq - - hippo4j-spring-boot-starter-adapter-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq - 1.4.2 - -``` - -如果想省事,仅需引入一个全量包,框架底层会根据条件判断加载具体线程池适配器。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-adapter-all - 1.4.2 - -``` - -## Hippo4j Server - -Hippo4j Server 仅需要引入上述 Jar 包,即可在 Hippo4j Server 的控制台进行查看及修改三方框架线程池。 - -![](https://oss.open8gu.com/image-20220531194810047.png) - -## Hippo4j Config - -Hippo4j Config 除了依赖上述适配 Jar 包外,还需要在配置中心添加以下配置项。 - -```yaml -spring: - dynamic: - thread-pool: - # 省略其它配置 - adapter-executors: - # threadPoolKey 代表线程池标识 - - threadPoolKey: 'input' - # mark 为三方线程池框架类型,参见文初已支持框架集合 - mark: 'RocketMQSpringCloudStream' - corePoolSize: 10 - maximumPoolSize: 10 -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/img/docsVersionDropdown.png b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/img/docsVersionDropdown.png deleted file mode 100644 index 97e41646..00000000 Binary files a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/img/docsVersionDropdown.png and /dev/null differ diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/img/grafana-monitor.jpg b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/img/grafana-monitor.jpg deleted file mode 100644 index 336bd980..00000000 Binary files a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/img/grafana-monitor.jpg and /dev/null differ diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/img/localeDropdown.png b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/img/localeDropdown.png deleted file mode 100644 index e257edc1..00000000 Binary files a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/img/localeDropdown.png and /dev/null differ diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/server/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/server/_category_.json deleted file mode 100644 index 4063c17f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/server/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "无中间件依赖", - "position": 3, - "collapsed": true -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/server/hippo4j-server-config.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/server/hippo4j-server-config.md deleted file mode 100644 index 24bf9a13..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/server/hippo4j-server-config.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 服务端配置 - -`hippo4j.core.clean-history-data-enable` - -是否开启线程池历史数据清洗,默认开启。 - -`hippo4j.core.clean-history-data-period` - -线程池历史数据保留时间,默认值:30,单位分钟。 - -服务端会保留这个配置时间的数据,超过这个时间则会被清理。比如按照默认值 30 分钟来说,12:00 收集到的数据,12:30 就会被清理删除。 - -`hippo4j.core.monitor.report-type` - -客户端监控上报服务端类型,可选值:http、netty,默认 http。服务端开启 netty 配置后,需要在客户端对应开启才可生效。用来应对大量动态线程池监控场景。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/server/hippo4j-server-start.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/server/hippo4j-server-start.md deleted file mode 100644 index a04aca3d..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/getting_started/server/hippo4j-server-start.md +++ /dev/null @@ -1,127 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 接入流程 - -部署服务端,参考 [部署手册](/docs/user_docs/ops/hippo4j-server-deploy)。 - -服务端创建 [租户、项目](/community/faq#租户和项目在-hippo4j-中是什么意思) 和线程池记录。 - -需要注意,项目 ID 需要与配置文件 `{application.name}` 保持一致。 - -:::note -租户、项目、线程池 ID 如果由多个词组成,建议以 - 进行分割。比如:message-center。 -::: - -## Hippo4j 配置 - -SpringBoot Pom 引入 Hippo4j Starter Jar。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter - 1.4.2 - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -spring: - profiles: - active: dev - application: - # 服务端创建的项目 id 需要与 application.name 保持一致 - name: dynamic-threadpool-example - dynamic: - thread-pool: - # 服务端地址 - server-addr: http://localhost:6691 - # 用户名 - username: admin - # 密码 - password: 123456 - # 租户 id, 对应 tenant 表 - namespace: prescription - # 项目 id, 对应 item 表 - item-id: ${spring.application.name} -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从 hippo4j-server 服务拉取。 - -:::note -创建线程池时建议填充实际的参数。如果在连接 Hippo4j Server 端失败时,会使用填充配置创建线程池。 -::: - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` - diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/intro.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/intro.md deleted file mode 100644 index 4bdab7d8..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/intro.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 简介 - -## 线程池痛点 - -线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。在高并发以及大批量的任务处理场景,线程池的使用是必不可少的。 - -如果有在项目中实际使用线程池,相信你可能会遇到以下痛点: - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -## 什么是 Hippo4j - -Hippo4j 通过对 JDK 线程池增强,以及扩展三方框架底层线程池等功能,为业务系统提高线上运行保障能力。 - -提供以下功能支持: - -- 全局管控 - 管理应用线程池实例。 - -- 动态变更 - 应用运行时动态变更线程池参数,包括不限于:核心、最大线程数、阻塞队列容量、拒绝策略等。 -- 通知报警 - 内置四种报警通知策略,线程池活跃度、容量水位、拒绝策略以及任务执行时间超长。 -- 运行监控 - 实时查看线程池运行时数据,最近半小时线程池运行数据图表展示。 -- 功能扩展 - 支持线程池任务传递上下文;项目关闭时,支持等待线程池在指定时间内完成任务。 -- 多种模式 - 内置两种使用模式:[依赖配置中心](https://hippo4j.cn/docs/user_docs/getting_started/config/hippo4j-config-start) 和 [无中间件依赖](https://hippo4j.cn/docs/user_docs/getting_started/server/hippo4j-server-start)。 -- 容器管理 - Tomcat、Jetty、Undertow 容器线程池运行时查看和线程数变更。 -- 框架适配 - Dubbo、Hystrix、RabbitMQ、RocketMQ 等消费线程池运行时数据查看和线程数变更。 - -## 快速开始 - -对于本地演示目的,请参阅 [Quick start](https://hippo4j.cn/docs/user_docs/user_guide/quick-start) - -演示环境: [http://console.hippo4j.cn/index.html](http://console.hippo4j.cn/index.html) - -## 接入登记 - -更多接入的公司,欢迎在 [登记地址](https://github.com/opengoofy/hippo4j/issues/13) 登记,登记仅仅为了产品推广。 - -## 联系我 - -开源不易,右上角点个 Star 鼓励一下吧! - -如果大家想要实时关注 Hippo4j 更新的文章以及分享的干货的话,可以关注我的公众号。 - -使用过程中有任何问题,或者对项目有什么建议,关注公众号回复:加群,和 1000+ 志同道合的朋友交流讨论。 - -![](https://oss.open8gu.com/image-20230317191041262-mini.png) - -## 友情链接 -- [[ LiteFlow ]](https://liteflow.yomahub.com/):轻量,快速,稳定可编排的组件式规则引擎。 - -- [[ Sa-Token ]](https://github.com/dromara/sa-token):一个轻量级 java 权限认证框架,让鉴权变得简单、优雅! -- [[ HertzBeat ]](https://github.com/dromara/hertzbeat):易用友好的云监控系统, 无需 Agent, 强大自定义监控能力。 -- [[ JavaGuide ]](https://github.com/Snailclimb/JavaGuide):一份涵盖大部分 Java 程序员所需要掌握的核心知识。 -- [[ toBeBetterJavaer ]](https://github.com/itwanger/toBeBetterJavaer):一份通俗易懂、风趣幽默的 Java 学习指南。 - -## 贡献者 - -感谢所有为项目作出贡献的开发者。如果有意贡献,参考 [good first issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/ops/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/ops/_category_.json deleted file mode 100644 index d5b7d1e8..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/ops/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "运维指南", - "position": 4, - "link": { - "type": "generated-index" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/ops/hippo4j-server-deploy.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/ops/hippo4j-server-deploy.md deleted file mode 100644 index ffbc2306..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/ops/hippo4j-server-deploy.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 源码包部署 - -[RELEASE](https://github.com/opengoofy/hippo4j/releases) 页面下载对应版本并进行解压。 - -## 初始化 - -修改数据库相关信息。 - -```txt -/conf/application.properties -``` - -如果是新运行 Hippo4j,数据库执行下述 SQL 脚本即可。 - -```txt -/conf/hippo4j_manager.sql -``` - -如果是对已运行 Hippo4j 升级,请查看 `/conf/sql-upgrade` 目录下,是否有目标版本对应的升级脚本。 - -## 直接运行 - -Mac Linux 启动执行。 - -```txt -sh ./bin/startup.sh -``` - -Windows 启动执行。 - -```txt -bin/startup.cmd -``` - -## 访问控制台 - -启动成功后,访问链接。用户名密码:admin 123456 - -```txt -localhost:6691/index.html -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/ops/server-docker.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/ops/server-docker.md deleted file mode 100644 index 826bb99f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/ops/server-docker.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Docker部署 - -## 镜像启动 - -Docker 镜像默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -或者,底层存储数据库切换为 MySQL。`DATASOURCE_HOST` 需要切换为本地 IP,不能使用 `127.0.0.1` 或 `localhost`。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server \ --e DATASOURCE_MODE=mysql \ --e DATASOURCE_HOST=xxx.xxx.xxx.xxx \ --e DATASOURCE_PORT=3306 \ --e DATASOURCE_DB=hippo4j_manager \ --e DATASOURCE_USERNAME=root \ --e DATASOURCE_PASSWORD=root \ -hippo4j/hippo4j-server -``` - -访问 Server 控制台,路径 `http://localhost:6691/index.html` ,默认用户名密码:admin / 123456 - -## 镜像构建 - -如果想要自定义镜像,可以通过以下命令快速构建 Hippo4j Server: - -方式一: - -```shell -# 进入到 hippo4j-server/hippo4j-bootstrap 工程路径下 -mvn clean package -Dskip.spotless.apply=true -# 默认打包是打包的 tag 是 latest -docker build -t hippo4j/hippo4j-server ../hippo4j-bootstrap -``` - -方式二: - -通过 `maven docker plugin` - -```shell -# 进入到 hippo4j-server 工程路径下 -mvn clean package -DskipTests -Dskip.spotless.apply=true docker:build -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/other/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/other/_category_.json deleted file mode 100644 index a74d7432..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/other/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "其它", - "position": 6, - "link": { - "type": "generated-index" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/other/official-ccounts.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/other/official-ccounts.md deleted file mode 100644 index 63e07ea7..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/other/official-ccounts.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 推荐公众号 - -## JavaGuide - -专注Java后端学习和大厂面试的公众号! - -![](https://oss.open8gu.com/JavaGuide.png) - -## HelloGitHub - -HelloGitHub,专注于开源社区技术和知识内容分享。 - -![](https://oss.open8gu.com/HelloGitHub.png) - -## macrozheng - -专注Java技术分享,解析优质开源项目。涵盖SpringBoot、SpringCloud、Docker、K8S等实用技术,作者Github开源项目mall(50K+Star)。 - -![](https://oss.open8gu.com/macrozheng.png) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/other/operation.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/other/operation.md deleted file mode 100644 index 62661c55..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/other/operation.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 公众号合作 - -## 推荐须知 - -hippo4j 作为一款新兴动态线程池框架,开源出来的时间比较晚,目前迫切需要不同的途径进行推广。 - -如果您是公众号运营者或者开源爱好者,欢迎将 hippo4j 推荐给您的粉丝。 - -1. 您无需为 hippo4j 专门撰写文案,只需要直接导入 [推荐文章](https://mp.weixin.qq.com/s/JTTwcBEiK_MnFcPTZl3zGA) 即可。 -2. 在文章底部或内容中留下项目官网或者 GitHub 仓库链接。 -3. 文章需至少 1000+ 的阅读量。 - -作为推荐回报,hippo4j 可以为您: - -1. 在框架官方文档 [推荐公众号](/docs/user_docs/other/official-ccounts) 页面处留下您的公众号二维码。 -2. 在框架官方交流群里@全体成员推广您的公众号一次,附带介绍语。 -3. 您的公众号所有新推文章都可以将链接发送到 hippo4j 交流群中,增加阅读量。 - -如果您还有除公众号以外的其它途径可以与 hippo4j 相互推荐,欢迎 [加群沟通](/group)。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/other/question.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/other/question.md deleted file mode 100644 index 49fd4d77..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/other/question.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 问题提问 - -文档引用自:[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way) - -## 在提问之前 - -在你准备要通过电子邮件、新闻群组或者聊天室提出技术问题前,请先做到以下事情: - -1. 尝试在你准备提问的论坛的旧文章中搜索答案。 -2. 尝试上网搜索以找到答案。 -3. 尝试阅读手册以找到答案。 -4. 尝试阅读常见问题文件(FAQ)以找到答案。 -5. 尝试自己检查或试验以找到答案。 -6. 向你身边的强者朋友打听以找到答案。 -7. 如果你是程序开发者,请尝试阅读源代码以找到答案。 - -当你提出问题的时候,请先表明你已经做了上述的努力;这将有助于树立你并不是一个不劳而获且浪费别人的时间的提问者。如果你能一并表达在做了上述努力的过程中所**学到**的东西会更好,因为我们更乐于回答那些表现出能从答案中学习的人的问题。 - -## 当你提问时 - -### 慎选提问的论坛 -小心选择你要提问的场合。如果你做了下述的事情,你很可能被忽略掉或者被看作失败者: - -* 在与主题不合的论坛上贴出你的问题。 -* 在探讨进阶技术问题的论坛张贴非常初级的问题;反之亦然。 -* 在太多的不同新闻群组上重复转贴同样的问题(cross-post)。 -* 向既非熟人也没有义务解决你问题的人发送私人电邮。 - -因此,第一步是找到对的论坛。再说一次,Google 和其它搜索引擎还是你的朋友,用它们来找到与你遭遇到困难的软硬件问题最相关的网站。通常那儿都有常见问题(FAQ)、邮件列表及相关说明文件的链接。如果你的努力(包括**阅读** FAQ)都没有结果,网站上也许还有报告 Bug(Bug-reporting)的流程或链接,如果是这样,链过去看看。 - -### 使用有意义且描述明确的标题 - -在邮件列表、新闻群组或论坛中,大约 50 字以内的标题是抓住资深专家注意力的好机会。别用喋喋不休的帮帮忙、跪求、急(更别说救命啊!!!!这样让人反感的话,用这种标题会被条件反射式地忽略)来浪费这个机会。不要妄想用你的痛苦程度来打动我们,而应该是在这点空间中使用极简单扼要的描述方式来提出问题。 - -一个好标题范例是`目标 —— 差异`式的描述,许多技术支持组织就是这样做的。在`目标`部分指出是哪一个或哪一组东西有问题,在`差异`部分则描述与期望的行为不一致的地方。 - -> 蠢问题:救命啊!我的笔记本电脑不能正常显示了! - -> 聪明问题:X.org 6.8.1 的鼠标指针会变形,某牌显卡 MV1005 芯片组。 - -> 更聪明问题:X.org 6.8.1 的鼠标指针,在某牌显卡 MV1005 芯片组环境下 - 会变形。 - -### 使用清晰、正确、精准且合乎语法的语句 - -我们从经验中发现,粗心的提问者通常也会粗心地写程序与思考(我敢打包票)。回答粗心大意者的问题很不值得,我们宁愿把时间耗在别处。 - -正确的拼写、标点符号和大小写是很重要的。一般来说,如果你觉得这样做很麻烦,不想在乎这些,那我们也觉得麻烦,不想在乎你的提问。花点额外的精力斟酌一下字句,用不着太僵硬与正式 —— 事实上,黑客文化很看重能准确地使用非正式、俚语和幽默的语句。但它**必须很**准确,而且有迹象表明你是在思考和关注问题。 - -### 精确地描述问题并言之有物 - -* 仔细、清楚地描述你的问题或 Bug 的症状。 -* 描述问题发生的环境(机器配置、操作系统、应用程序、以及相关的信息),提供经销商的发行版和版本号(如:`Fedora Core 4`、`Slackware 9.1`等)。 -* 描述在提问前你是怎样去研究和理解这个问题的。 -* 描述在提问前为确定问题而采取的诊断步骤。 -* 描述最近做过什么可能相关的硬件或软件变更。 -* 尽可能地提供一个可以`重现这个问题的可控环境`的方法。 - -尽量去揣测一个黑客会怎样反问你,在你提问之前预先将黑客们可能提出的问题回答一遍。 - -以上几点中,当你报告的是你认为可能在代码中的问题时,给黑客一个可以重现你的问题的环境尤其重要。当你这么做时,你得到有效的回答的机会和速度都会大大的提升。 - -[Simon Tatham](http://www.chiark.greenend.org.uk/~sgtatham/) 写过一篇名为《[如何有效的报告 Bug](http://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html)》的出色文章。强力推荐你也读一读。 - -### 话不在多而在精 - -你需要提供精确有内容的信息。这并不是要求你简单的把成堆的出错代码或者资料完全转录到你的提问中。如果你有庞大而复杂的测试样例能重现程序挂掉的情境,尽量将它剪裁得越小越好。 - -这样做的用处至少有三点。 -第一,表现出你为简化问题付出了努力,这可以使你得到回答的机会增加; -第二,简化问题使你更有可能得到**有用**的答案; -第三,在精炼你的 bug 报告的过程中,你很可能就自己找到了解决方法或权宜之计。 - -### 别动辄声称找到 Bug - -当你在使用软件中遇到问题,除非你非常、**非常**的有根据,不要动辄声称找到了 Bug。提示:除非你能提供解决问题的源代码补丁,或者提供回归测试来表明前一版本中行为不正确,否则你都多半不够完全确信。这同样适用在网页和文件,如果你(声称)发现了文件的`Bug`,你应该能提供相应位置的修正或替代文件。 - -请记得,还有其他许多用户没遇到你发现的问题,否则你在阅读文件或搜索网页时就应该发现了(你在抱怨前[已经做了这些,是吧](#在提问之前)?)。这也意味着很有可能是你弄错了而不是软件本身有问题。 - -编写软件的人总是非常辛苦地使它尽可能完美。如果你声称找到了 Bug,也就是在质疑他们的能力,即使你是对的,也有可能会冒犯到其中某部分人。当你在标题中嚷嚷着有`Bug`时,这尤其严重。 - -提问时,即使你私下非常确信已经发现一个真正的 Bug,最好写得像是**你**做错了什么。如果真的有 Bug,你会在回复中看到这点。这样做的话,如果真有 Bug,维护者就会向你道歉,这总比你惹恼别人然后欠别人一个道歉要好一点。 - -### 低声下气不能代替你的功课 - -有些人明白他们不该粗鲁或傲慢的提问并要求得到答复,但他们选择另一个极端 —— 低声下气:`我知道我只是个可悲的新手,一个撸瑟,但...`。这既使人困扰,也没有用,尤其是伴随着与实际问题含糊不清的描述时更令人反感。 - -别用原始灵长类动物的把戏来浪费你我的时间。取而代之的是,尽可能清楚地描述背景条件和你的问题情况。这比低声下气更好地定位了你的位置。 - -有时网页论坛会设有专为新手提问的版面,如果你真的认为遇到了初学者的问题,到那去就是了,但一样别那么低声下气。 - -### 描述问题症状而非你的猜测 - -告诉黑客们你认为问题是怎样造成的并没什么帮助。(如果你的推断如此有效,还用向别人求助吗?),因此要确信你原原本本告诉了他们问题的症状,而不是你的解释和理论;让黑客们来推测和诊断。如果你认为陈述自己的猜测很重要,清楚地说明这只是你的猜测,并描述为什么它们不起作用。 - -**蠢问题** - -> 我在编译内核时接连遇到 SIG11 错误, -> 我怀疑某条飞线搭在主板的走线上了,这种情况应该怎样检查最好? - -**聪明问题** - -> 我的组装电脑是 FIC-PA2007 主机板搭载 AMD K6/233 CPU(威盛 Apollo VP2 芯片组), -> 256MB Corsair PC133 SDRAM 内存,在编译内核时,从开机 20 分钟以后就频频产生 SIG11 错误, -> 但是在头 20 分钟内从没发生过相同的问题。重新启动也没有用,但是关机一晚上就又能工作 20 分钟。 -> 所有内存都换过了,没有效果。相关部分的标准编译记录如下… - -由于以上这点似乎让许多人觉得难以配合,这里有句话可以提醒你:`所有的诊断专家都来自密苏里州。` 美国国务院的官方座右铭则是:`让我看看`(出自国会议员 Willard D. Vandiver 在 1899 年时的讲话:`我来自一个出产玉米,棉花,牛蒡和民主党人的国家,滔滔雄辩既不能说服我,也不会让我满意。我来自密苏里州,你必须让我看看。`) 针对诊断者而言,这并不是一种怀疑,而只是一种真实而有用的需求,以便让他们看到的是与你看到的原始证据尽可能一致的东西,而不是你的猜测与归纳的结论。所以,大方的展示给我们看吧! - -### 按发生时间先后列出问题症状 - -问题发生前的一系列操作,往往就是对找出问题最有帮助的线索。因此,你的说明里应该包含你的操作步骤,以及机器和软件的反应,直到问题发生。在命令行处理的情况下,提供一段操作记录(例如运行脚本工具所生成的),并引用相关的若干行(如 20 行)记录会非常有帮助。 - -如果挂掉的程序有诊断选项(如 -v 的详述开关),试着选择这些能在记录中增加调试信息的选项。记住,`多`不等于`好`。试着选取适当的调试级别以便提供有用的信息而不是让读者淹没在垃圾中。 - -如果你的说明很长(如超过四个段落),在开头简述问题,接下来再按时间顺序详述会有所帮助。这样黑客们在读你的记录时就知道该注意哪些内容了。 - -### 描述目标而不是过程 - -如果你想弄清楚如何做某事(而不是报告一个 Bug),在开头就描述你的目标,然后才陈述重现你所卡住的特定步骤。 - -经常寻求技术帮助的人在心中有个更高层次的目标,而他们在自以为能达到目标的特定道路上被卡住了,然后跑来问该怎么走,但没有意识到这条路本身就有问题。结果要费很大的劲才能搞定。 - -**蠢问题** - -> 我怎样才能从某绘图程序的颜色选择器中取得十六进制的 RGB 值? - -**聪明问题** - -> 我正试着用替换一幅图片的色码(color table)成自己选定的色码,我现在知道的唯一方法是编辑每个色码区块(table slot), -> 但却无法从某绘图程序的颜色选择器取得十六进制的 RGB 值。 - -第二种提问法比较聪明,你可能得到像是```建议采用另一个更合适的工具```的回复。 - -### 清楚明确的表达你的问题以及需求 - -漫无边际的提问是近乎无休无止的时间黑洞。最有可能给你有用答案的人通常也正是最忙的人(他们忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞相当厌恶,所以他们也倾向于厌恶那些漫无边际的提问。 - -如果你明确表述需要回答者做什么(如提供指点、发送一段代码、检查你的补丁、或是其他等等),就最有可能得到有用的答案。因为这会定出一个时间和精力的上限,便于回答者能集中精力来帮你。这么做很棒。 - -要理解专家们所处的世界,请把专业技能想像为充裕的资源,而回复的时间则是稀缺的资源。你要求他们奉献的时间越少,你越有可能从真正专业而且很忙的专家那里得到解答。 - -所以,界定一下你的问题,使专家花在辨识你的问题和回答所需要付出的时间减到最少,这技巧对你有用答案相当有帮助 —— 但这技巧通常和简化问题有所区别。因此,问`我想更好地理解 X,可否指点一下哪有好一点说明?`通常比问`你能解释一下 X 吗?`更好。如果你的代码不能运作,通常请别人看看哪里有问题,比要求别人替你改正要明智得多。 - -### 礼多人不怪,而且有时还很有帮助 - -彬彬有礼,多用`请`和`谢谢您的关注`,或`谢谢你的关照`。让大家都知道你对他们花时间免费提供帮助心存感激。 - -坦白说,这一点并没有比使用清晰、正确、精准且合乎语法和避免使用专用格式重要(也不能取而代之)。黑客们一般宁可读有点唐突但技术上鲜明的 Bug 报告,而不是那种有礼但含糊的报告。(如果这点让你不解,记住我们是按问题能教给我们什么来评价问题的价值的) - -然而,如果你有一串的问题待解决,客气一点肯定会增加你得到有用回应的机会。 - -(我们注意到,自从本指南发布后,从资深黑客那里得到的唯一严重缺陷反馈,就是对预先道谢这一条。一些黑客觉得`先谢了`意味着事后就不用再感谢任何人的暗示。我们的建议是要么先说`先谢了`,**然后**事后再对回复者表示感谢,或者换种方式表达感激,譬如用`谢谢你的关注`或`谢谢你的关照`。) - -## 不该问的问题 - -以下是几个经典蠢问题,以及黑客没回答时心中所想的: - -问题:[我能在哪找到 X 程序或 X 资源?](#q1) - -问题:[我怎样用 X 做 Y?](#q2) - -问题:[我的程序/设定/SQL 语句没有用](#q3) - -问题:[我的 Windows 电脑有问题,你能帮我吗?](#q4) - -问题:[我的程序不会动了,我认为系统工具 X 有问题](#q5) - -问题:[我在安装 Linux(或者 X )时有问题,你能帮我吗?](#q6) - -问题:[我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢?](#q7) - ---- - -> 问题:我能在哪找到 X 程序或 X 资源? - -回答:就在我找到它的地方啊,白痴 —— 搜索引擎的那一头。天哪!难道还有人不会用 [Google](https://www.google.com) 吗? - -> 问题:我怎样用 X 做 Y? - -回答:如果你想解决的是 Y ,提问时别给出可能并不恰当的方法。这种问题说明提问者不但对 X 完全无知,也对 Y 要解决的问题糊涂,还被特定形势禁锢了思维。最好忽略这种人,等他们把问题搞清楚了再说。 - -> 问题:我的{程序/设定/SQL 语句}没有用 - -回答:这不算是问题吧,我对要我问你二十个问题才找得出你真正问题的问题没兴趣 —— 我有更有意思的事要做呢。在看到这类问题的时候,我的反应通常不外如下三种 - -* 你还有什么要补充的吗? -* 真糟糕,希望你能搞定。 -* 这关我屁事? - -> 问题:我的 Windows 电脑有问题,你能帮我吗? - -回答:能啊,扔掉微软的垃圾,换个像 Linux 或 BSD 的开源操作系统吧。 - -注意:如果程序有官方版 Windows 或者与 Windows 有互动(如 Samba),你**可以**问与 Windows 相关的问题,只是别对问题是由 Windows 操作系统而不是程序本身造成的回复感到惊讶, 因为 Windows 一般来说实在太烂,这种说法通常都是对的。 - -> 问题:我的程序不会动了,我认为系统工具 X 有问题 - -回答:你完全有可能是第一个注意到被成千上万用户反复使用的系统调用与函数库文件有明显缺陷的人,更有可能的是你完全没有根据。不同凡响的说法需要不同凡响的证据,当你这样声称时,你必须有清楚而详尽的缺陷说明文件作后盾。 - -> 问题:我在安装 Linux(或者 X )时有问题,你能帮我吗? - -回答:不能,我只有亲自在你的电脑上动手才能找到毛病。还是去找你当地的 Linux 使用群组者寻求实际的指导吧(你能在[这儿](http://www.linux.org/groups/index.html)找到用户群组的清单)。 - -注意:如果安装问题与某 Linux 的发行版有关,在它的邮件列表、论坛或本地用户群组中提问也许是恰当的。此时,应描述问题的准确细节。在此之前,先用 `Linux` 和**所有**被怀疑的硬件作关键词仔细搜索。 - -> 问题:我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢? - -回答:想要这样做,说明了你是个卑鄙小人;想找个黑客帮你,说明你是个白痴! - -## 好问题与蠢问题 - -最后,我将透过举一些例子,来说明怎样聪明的提问;同一个问题的两种问法被放在一起,一种是愚蠢的,另一种才是明智的。 - -**蠢问题**: - -> 我从 foo 项目找来的源码没法编译。它怎么这么烂? - -他觉得都是别人的错,这个傲慢自大的提问者。 - -**聪明问题**: - -> foo 项目代码在 Nulix 6.2 版下无法编译通过。我读过了 FAQ,但里面没有提到跟 Nulix 有关的问题。这是我编译过程的记录,我有什么做的不对的地方吗? - -提问者已经指明了环境,也读过了 FAQ,还列出了错误,并且他没有把问题的责任推到别人头上,他的问题值得被关注。 - -**蠢问题**: - -> 我的主机板有问题了,谁来帮我? - -某黑客对这类问题的回答通常是:`好的,还要帮你拍拍背和换尿布吗?`,然后按下删除键。 - -**聪明问题**: - -> 我在 S2464 主机板上试过了 X 、 Y 和 Z ,但没什么作用,我又试了 A 、 B 和 C 。请注意当我尝试 C 时的奇怪现象。显然 florbish 正在 grommicking,但结果出人意料。通常在 Athlon MP 主机板上引起 grommicking 的原因是什么?有谁知道接下来我该做些什么测试才能找出问题? - -## 如果得不到回答 - -如果仍得不到回答,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。 - -总的来说,简单的重复张贴问题是个很糟的点子。这将被视为无意义的喧闹。有点耐心,知道你问题答案的人可能生活在不同的时区,可能正在睡觉,也有可能你的问题一开始就没有组织好。 - -你可以通过其他渠道获得帮助,这些渠道通常更适合初学者的需要。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/user_guide/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/user_guide/_category_.json deleted file mode 100644 index 9c505a51..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/user_guide/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "用户指南", - "position": 2, - "link": { - "type": "generated-index", - "description": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/user_guide/frame.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/user_guide/frame.md deleted file mode 100644 index 5992f735..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/user_guide/frame.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 为什么写 - -[美团线程池文章](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html "美团线程池文章") 介绍中,因为业务对线程池参数没有合理配置,触发过几起生产事故,进而引发了一系列思考。最终决定封装线程池动态参数调整,扩展线程池监控以及消息报警等功能。 - -在开源平台找了挺多动态线程池项目,从功能性以及健壮性而言,个人感觉不满足企业级应用。 - -因为对动态线程池比较感兴趣,加上想写一个有意义的项目,所以决定自己来造一个轻量级的轮子。 - -想给项目起一个简单易记的名字,类似于 Eureka、Nacos、Redis;后和朋友商量,决定命名:**Hippo4j**。 - -![](https://oss.open8gu.com/动态线程池功能架构-1.jpg) - -## 它解决了什么问题 - -线程池在业务系统应该都有使用到,帮助业务流程提升效率以及管理线程,多数场景应用于大量的异步任务处理。 - -虽然线程池提供了我们许多便利,但也并非尽善尽美,比如下面这些问题就无法很好解决。 - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 - -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 - -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 - -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 - -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 - -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 - -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -Hippo4j 很好解决了这些问题,它将业务中所有线程池统一管理,增强原生线程池系列功能。 - -## 它有什么特性 - -应用系统中线程池并不容易管理。参考美团的设计,Hippo4j 按照租户、项目、线程池的维度划分。再加上系统权限,让不同的开发、管理人员负责自己系统的线程池操作。 - -举个例子,小编在一家公司的公共组件团队,团队中负责消息、短链接网关等项目。公共组件是租户,消息或短链接就是项目。 - -Hippo4j 除去动态修改线程池,还包含实时查看线程池运行时指标、负载报警、配置日志管理等。 - -- `hippo4j-adapter`:适配对第三方框架中的线程池进行监控,如 Dubbo、RocketMQ、Hystrix 等; -- `hippo4j-auth`:用户、角色、权限等; -- `hippo4j-common`:多个模块公用代码实现; -- `hippo4j-config`:提供线程池准实时参数更新功能; -- `hippo4j-console`:对接前端控制台; -- `hippo4j-core`:核心的依赖,包括配置、核心包装类等; -- `hippo4j-discovery`:提供线程池项目实例注册、续约、下线等功能; -- `hippo4j-example` :示例工程; -- `hippo4j-message` :配置变更以及报警通知发送; -- `hippo4j-monitor` :线程池运行时监控; -- `hippo4j-server` :Server 端发布需要的模块聚合; -- `hippo4j-spring-boot`:SpringBoot Starter。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/user_guide/framework.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/user_guide/framework.md deleted file mode 100644 index 33e24d1c..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/user_guide/framework.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 架构设计 - -简单来说,Hippo4j 从部署的角度上分为两种角色:Server 端和 Client 端。 - -Server 端是 Hippo4j 项目打包出的 Java 进程,功能包括用户权限、线程池监控以及执行持久化的动作。 - -Client 端指的是我们 SpringBoot 应用,通过引入 Hippo4j Starter Jar 包负责与 Server 端进行交互。 - -比如拉取 Server 端线程池数据、动态更新线程池配置以及采集上报线程池运行时数据等。 - -## 基础组件 - -### 配置中心(Config) - -配置中心位于 Server 端,它的主要作用是监控 Server 端线程池配置变更,实时通知到 Client 实例执行线程池变更流程。 - -代码设计基于 Nacos 1.x 版本的 **长轮询以及异步 Servlet 机制** 实现。 - -### 注册中心(Discovery) - -负责管理 Client 端(单机或集群)注册到 Server 端的实例,包括不限于**实例注册、续约、过期剔除** 等操作,代码基于 Eureka 源码实现。 - -上面的配置中心很容易理解,动态线程池参数变更的根本。但是注册中心是用来做什么的? - -注册中心管理 Client 端注册的实例,通过这些实例可以 **实时获取线程池的运行时参数信息**。 - -目前的设计是如此,不排除后续基于 Discovery 做更多的扩展。 - -### 控制台(Console) - -对接前端项目,包括不限于以下模块管理: - -![](https://oss.open8gu.com/image-20211107122504126.png) - -## 消息通知(Notify) - -Hippo4j 内置了很多需要通知的事件,比如:线程池参数变更通知、线程池活跃度报警、拒绝策略执行报警以及阻塞队列容量报警等。 - -目前 Notify 已经接入了钉钉、企业微信和飞书,后续持续集成邮件、短信等通知渠道;并且,Notify 模块提供了消息事件的 SPI 方案,可以接受三方自定义的推送。 - -## Hippo4j-Spring-Boot-Starter - -熟悉 SpringBoot 的小伙伴对 Starter 应该不会陌生。Hippo4j 提供以 Starter Jar 包的形式嵌套在应用内,负责与 Server 端完成交互。 - -## 功能架构 - -![](https://oss.open8gu.com/image-20211105230953626.png) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/user_guide/notify.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/user_guide/notify.md deleted file mode 100644 index 1be09e37..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/user_guide/notify.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 通知报警 - -现阶段已集成钉钉、企业微信、飞书的消息推送,后续会持续接入邮箱、短信和自定义通知渠道。 - -![](https://oss.open8gu.com/image-20220904181527453.png) - -**通知平台** - -- DING:钉钉平台; - -- LARK:飞书平台; - -- WECHAT:企业微信。 - -**通知类型** - -- CONFIG:线程池配置变更推送; - -- ALARM:线程池运行报警推送。 - -**Token** - -获取 DING、LARK、WECHAT 机器人 Token。 - -**报警间隔** - -- CONFIG 类型通知没有报警间隔; - -- ALARM 类型设置报警间隔后,某一节点下的同一线程池指定间隔只会发送一次报警通知。 - -**接收者** - -```tex -多个接收者使用英文逗号 , 分割 (注意不要有空格) -DING:填写手机号 -WECHART:填写user_id会以@的消息发给用户,填写姓名则是普通的@,如:龙台 -LARK:填写ou_开头用户唯一标识会以@的消息发给用户,填写手机号则是普通的@ -``` - - -## 钉钉平台 - -[钉钉创建群机器人](https://www.dingtalk.com/qidian/help-detail-20781541.html) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211013122816688.png) | ![](https://oss.open8gu.com/image-20211013113649068.png) | - -添加钉钉机器人后,需在机器人配置自定义关键字,才可发送成功。如下所示: - -![](https://oss.open8gu.com/image-20220530200133377.png?x-oss-process=image/resize,h_500,w_800) - -## 企业微信 - -[企业微信创建群机器人](https://open.work.weixin.qq.com/help2/pc/14931?person_id=1&from=homesearch) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211203213443242.png) | ![](https://oss.open8gu.com/image-20211203213512019.png) | - -## 飞书平台 - -[飞书创建群机器人](https://www.feishu.cn/hc/zh-CN/articles/360024984973) - -![](https://oss.open8gu.com/image-20220304081729347.png) - -![](https://oss.open8gu.com/image-20220304081507907.png) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/user_guide/quick-start.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/user_guide/quick-start.md deleted file mode 100644 index 59c5cdd5..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.2/user_docs/user_guide/quick-start.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 快速开始 - -## 服务启动 - -使用 Docker 运行服务端,默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -> 如果没有 Docker,可以使用源码编译的方式,启动 [Hippo4j-Server/Hippo4j-Bootstrap](https://github.com/longtai-cn/hippo4j/tree/develop/hippo4j-server/hippo4j-bootstrap) 模块下 ServerApplication 应用类。 - -启动示例项目,[hippo4j-spring-boot-starter-example](https://github.com/opengoofy/hippo4j/tree/develop/hippo4j-example/hippo4j-spring-boot-starter-example) 模块下 ServerExampleApplication 应用类。 - -访问 Server 控制台,路径 `http://localhost:6691/index.html`,默认用户名密码:admin / 123456 - -## 配置变更 - -访问控制台动态线程池菜单下线程池实例,修改动态线程池相关参数。 - -![](https://oss.open8gu.com/image-20220813173811668.png) - -观察 Hippo4j-Example 控制台日志输出,日志输出包括不限于此信息即为成功。 - -```tex -2022-09-10 00:23:29.783 INFO 50322 --- [change.config_0] c.h.s.s.c.ServerThreadPoolDynamicRefresh : [message-consume] Dynamic thread pool change parameter. - corePoolSize: 2 => 4 - maximumPoolSize: 6 => 12 - capacity: 1024 => 2048 - keepAliveTime: 9999 => 9999 - executeTimeOut: 800 => 3000 - rejectedType: SyncPutQueuePolicy => RunsOldestTaskPolicy - allowCoreThreadTimeOut: true => true -``` - -另外,当 Client 集群部署时,可以修改某一个实例,或选择 `全部修改` 按钮,修改所有实例线程池信息。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3.json deleted file mode 100644 index a395bb56..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "version.label": { - "message": "1.4.3", - "description": "The label for version 1.4.3" - }, - "sidebar.tutorialSidebar.category.user_docs": { - "message": "user_docs", - "description": "The label for category user_docs in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar tutorialSidebar" - }, - "sidebar.user_docs.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar user_docs" - }, - "sidebar.user_docs.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar user_docs" - }, - "sidebar.user_docs.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar user_docs" - }, - "sidebar.user_docs.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar user_docs" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/dev_manual/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/dev_manual/_category_.json deleted file mode 100644 index 9117307f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/dev_manual/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "开发者手册", - "position": 5, - "link": { - "type": "generated-index", - "description": "Hippo4j 留给使用者能够扩展的知识点。" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/dev_manual/rejected-policy-custom.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/dev_manual/rejected-policy-custom.md deleted file mode 100644 index e0405061..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/dev_manual/rejected-policy-custom.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 拒绝策略自定义 - -Hippo4j 通过 SPI 的方式对拒绝策略进行扩展,可以让用户在 Hippo4j 中完成自定义拒绝策略实现。 - -## Hippo4j Server 拒绝策略扩展 - -自定义拒绝策略,实现 `CustomRejectedExecutionHandler` 接口,示例如下: - -```java -public class ErrorLogRejectedExecutionHandler implements CustomRejectedExecutionHandler { - - @Override - public Integer getType() { - return 12; - } - - @Override - public RejectedExecutionHandler generateRejected() { - return new CustomErrorLogRejectedExecutionHandler(); - } - - public static class CustomErrorLogRejectedExecutionHandler implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - Logger logger = LoggerFactory.getLogger(this.getClass()); - logger.error("线程池抛出拒绝策略"); - } - } -} -``` - -创建 `src/main/resources/META-INF/services` 目录,创建 SPI 自定义拒绝策略文件 `cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler`。 - -`cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler` 文件内仅放一行自定义拒绝策略全限定名即可,示例: - -```text -cn.hippo4j.example.core.handler.ErrorLogRejectedExecutionHandler -``` - -创建、修改线程池页面选择 `CustomRejectedPolicy(自定义 SPI 策略)`。 - -![](https://oss.open8gu.com/image-20220813173907814.png) - -拒绝策略触发时,完成上述代码效果,仅打印异常日志提示。 - -```text -2022-08-01 21:27:49.515 ERROR 48928 --- [ateHandler.test] r$CustomErrorLogRejectedExecutionHandler : 线程池抛出拒绝策略 -``` - -:::note -具体参考 `hippo4j-example/hippo4j-spring-boot-starter-example` 模块。 -::: diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/dev_manual/rejected-policy-info.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/dev_manual/rejected-policy-info.md deleted file mode 100644 index d5c68138..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/dev_manual/rejected-policy-info.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 内置拒绝策略 - -内置两种拒绝策略说明: - -**RunsOldestTaskPolicy**:添加新任务并由主线程运行最早的任务。 - -```java -public class RunsOldestTaskPolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - BlockingQueue workQueue = executor.getQueue(); - Runnable firstWork = workQueue.poll(); - boolean newTaskAdd = workQueue.offer(r); - if (firstWork != null) { - firstWork.run(); - } - if (!newTaskAdd) { - executor.execute(r); - } - } -} -``` - -**SyncPutQueuePolicy**:主线程把拒绝任务以阻塞的方式添加到队列。 - -```java -@Slf4j -public class SyncPutQueuePolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - try { - executor.getQueue().put(r); - } catch (InterruptedException e) { - log.error("Adding Queue task to thread pool failed.", e); - } - } -} -``` \ No newline at end of file diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/_category_.json deleted file mode 100644 index 72b1e151..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "快速开始", - "position": 3, - "link": { - "type": "generated-index" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/_category_.json deleted file mode 100644 index 78b3d9c4..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "依赖配置中心", - "position": 2, - "collapsed": true -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-default.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-default.md deleted file mode 100644 index 9c9e0fc9..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-default.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 参数默认配置 - -曾有多名小伙伴反馈说,项目中线程池一多,配置文件中配置就显得很臃肿。为此 hippo4j-config 开发出了动态线程池默认配置。 - -```yaml -spring: - dynamic: - thread-pool: - default-executor: - core-pool-size: 4 - maximum-pool-size: 6 - blocking-queue: ResizableCapacityLinkedBlockingQueue - queue-capacity: 1024 - execute-time-out: 1000 - keep-alive-time: 9999 - rejected-handler: AbortPolicy - active-alarm: 90 - capacity-alarm: 85 - alarm: true - allow-core-thread-time-out: true - notify: - interval: 5 - receives: chen.ma - executors: - - thread-pool-id: message-produce - - thread-pool-id: message-consume - core-pool-size: 80 - maximum-pool-size: 100 - execute-time-out: 1000 - notify: - interval: 6 - receives: chen.ma -``` - -`spring.dynamic.thread-pool.executors` 层级下,仅需要配置 `thread-pool-id`,其余配置从 `spring.dynamic.thread-pool.default-executor` 读取。 - -如果 `spring.dynamic.thread-pool.executors` 下配置和 `spring.dynamic.thread-pool.default-executor` 冲突,以前者为主。 - -通过该自定义配置方式,可减少大量重复线程池参数配置项,提高核心配置简洁度。 - -提示:`spring.dynamic.thread-pool.default-executor` 层级下参数,不提供动态刷新功能。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-monitor.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-monitor.md deleted file mode 100644 index 17d665e6..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-monitor.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 线程池监控 - -## 线程池监控配置 - -监控前置条件:需要先完成 hippo4j-config 的 [接入工作](/docs/user_docs/getting_started/config/hippo4j-config-start)。 - -接下来引入 SpringBoot Actuator。Spring 2.x 一般都有版本指定,所以这里不用写版本号。 - -```xml - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - -``` - -添加动态线程池监控相关配置: - -```yaml -management: - metrics: - export: - prometheus: - enabled: true - server: - port: 29999 # 可选配置,如果不配置该 port,直接使用 ${server.port} - endpoints: - web: - exposure: - include: '*' # 测试使用,开启了所有端点,生产环境不建议 * -spring: - dynamic: - thread-pool: - monitor: - enable: true # 是否开启采集线程池运行时数据 - collect-interval: 5000 # 采集线程池运行数据频率 - collect-types: micrometer # 采集线程池运行数据的类型。eg:log、micrometer。多个可以同时使用,默认 micrometer - initial-delay: 10000 # 项目启动后延迟多久进行采集 - thread-pool-types: dynamic # 采集线程池的类型。eg:dynamic、web、adapter。可任意配置,默认 dynamic -``` - -项目启动,访问 `http://localhost:29999/actuator/prometheus` 出现 `dynamic_thread_pool_` 前缀的指标,即为成功。 - -![](https://oss.open8gu.com/image-20220912220401016.png) - -## 配置 Prometheus - -通过 Docker 启动 Prometheus 服务。 - -```shell -docker run -d -p 9090:9090 --name prometheus prom/prometheus -``` - -添加 Prometheus 抽取数据任务。 - -```shell -# 进入 prometheus 容器内部 -docker exec -it prometheus /bin/sh -# 编辑 prometheus 配置文件 -vi /etc/prometheus/prometheus.yml -``` - -scrape_configs 节点下新添加一个 job,如果 Prometheus 是 Docker 方式部署,`{scrape_configs.static_configs.targets}` 需要写本机的 IP。 - -```yaml -scrape_configs: - - job_name: 'dynamic-thread-pool-job' - scrape_interval: 5s - metrics_path: '/actuator/prometheus' - static_configs: - - targets: [ '127.0.0.1:29999' ] -``` - -配置成功后 `exit` 退出容器,并进行 Prometheus 容器重启 `docker restart prometheus`。 - -访问 Prometheus 控制台 `http://localhost:9090/graph` 路径,能够展示相关指标即为配置成功。 - -![](https://oss.open8gu.com/image-20220912221237597.png) - -## 配置 Grafana - -```shell -docker run -d -p 3000:3000 --name=grafana grafana/grafana -``` - -访问 Grafana 地址,[http://localhost:3000](http://localhost:3000) 用户名密码:`admin` - -Grafana 访问 `http://localhost:3000/datasources` 导入 Prometheus 数据源。 - -![](https://oss.open8gu.com/image-20220912221646866.png) - -> 如果 Prometheus 为 Docker 方式部署,HTTP URL 需要为本地 IP,比如:http://192.168.1.5:9090 - -关注公众号 `龙台的技术笔记`,回复:`监控`,获取 Hippo4j Grafana DashBoard JSON 配置。 - -| 公众号 | 回复关键词 | -|:------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------:| -| ![](https://oss.open8gu.com/43_65f6020ed111b6bb3808ec338576bd6b.png?x-oss-process=image/resize,h_300,w_400) | ![](https://oss.open8gu.com/image-20220327171957444.png?x-oss-process=image/resize,h_300,w_400) | - -获取到 JSON 文件后,通过 `http://localhost:3000/dashboard/import` 将 JSON 文件导入至 Grafana DashBoard。 - -![](https://oss.open8gu.com/image-20220912225627272.png) - -下拉框内动态选择创建好的 Prometheus 数据源,并点击 `Import`。 - -![](https://oss.open8gu.com/image-20220912225700200.png) - -即可使用炫酷的 Hippo4j 动态线程池监控 DashBoard。大家伙儿也可以根据个人喜好进行定制 DashBoard,如果觉得有优化点,欢迎和我联系贡献。 - -![](https://oss.open8gu.com/image-20220912225813972.png) - -如果项目客户端启动多个示例,动态线程池监控效果图如下: - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-more.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-more.md deleted file mode 100644 index 2511b4f3..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-more.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 个性化配置 - -以下所述特性自 hippo4j-config v1.4.2 及以上版本提供,由 hippo4j 核心开发者 [@pizihao](https://github.com/pizihao) 完成相应功能开发。 - -## 需求背景 - -**1)容器及三方框架线程池自定义启用** - -最初设计容器线程池和三方框架线程池的动态变更是和启动无关的。也就是说,启动时不会根据配置文件中相关参数去修改两者对应的线程池配置。 - -这么设计的初衷是因为,不想让 hippo4j 过多的去介入框架原有的功能。因为容器和三方框架都支持线程池参数的自定义。 - -也就造成,可能你在配置中心配置了对应的容器和三方框架线程池参数,启动时是无效的。但当修改配置文件任一配置,容器和三方框架线程池配置将生效。 - -为了更好的用户体验,决定加入启用标识来控制:是否在项目初始化启动时,对容器和三方框架线程池参数进行修改。 - -**2)客户端集群个性化配置** - -大家都知道,hippo4j-config 是依赖配置中心做线程池配置动态变更。这种模式有一种缺点:改动配置文件后,所有客户端都会变更。 - -有些小伙伴希望 hippo4j-config 能够像 hippo4j-server 一样,能够针对单独的客户端进行配置变更。 - -## 容器及三方框架线程池自定义启用 - -容器及三方框架线程池添加启用配置,为了保持统一,动态线程池配置中也有该参数配置。配置项默认开启。 - -```yaml -spring: - dynamic: - thread-pool: - tomcat: - enable: true - executors: - - thread-pool-id: message-consume - enable: false - adapter-executors: - - threadPoolKey: 'input' - enable: true -``` - -## 客户端集群个性化配置 - -分别在动态线程池、容器线程池以及三方框架线程池配置下增加 `nodes` 配置节点,通过该配置可匹配需要变更的节点。 - -```yaml -spring: - dynamic: - thread-pool: - tomcat: - nodes: 192.168.1.5:*,192.168.1.6:8080 - executors: - - thread-pool-id: message-consume - nodes: 192.168.1.5:* - adapter-executors: - - threadPoolKey: 'input' - nodes: 192.168.1.5:* -``` - -来一段代码方法中的注释,大家就基本明白如何使用了。 - -```java -/** - * Matching nodes
- * nodes is ip + port.Get 'nodes' in the new Properties,Compare this with the ip + port of Application.
- * support prefix pattern matching. e.g:
- *
    - *
  • 192.168.1.5:* -- Matches all ports of 192.168.1.5
  • - *
  • 192.168.1.*:2009 -- Matches 2009 port of 192.168.1.*
  • - *
  • * -- all
  • - *
  • empty -- all
  • - *
- * The format of ip + port is ip : port. - */ -``` - -`nodes` 可与 `enable` 同时使用。如此,基于配置中心的动态线程池实现方式,将能够更方便的支持个性化需求。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md deleted file mode 100644 index 709e882a..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 适配SpringBoot1x - -目前已支持 Nacos、Apollo 配置中心适配 SpringBoot 1.5.x 版本。 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-1x-starter - 1.4.3-upgrade - -``` - -Nacos SpringBoot 配置如下: - -```yaml -spring: - cloud: - nacos: - config: - ext-config: - - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP - refresh: true - server-addr: 127.0.0.1:8848 - dynamic: - thread-pool: - config-file-type: yml - nacos: - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP -``` - -Apollo SpringBoot 配置如下: - -```yaml -apollo: - autoUpdateInjectedSpringProperties: true - bootstrap: - eagerLoad: - enabled: true - enabled: true - namespaces: application - meta: http://127.0.0.1:8080 -app: - id: dynamic-threadpool-example -spring: - dynamic: - thread-pool: - apollo: - namespace: application -``` - -动态线程池通用配置如下: - -```yaml -management: - context-path: /actuator - security: - enabled: false -server: - port: 8091 - servlet: - context-path: /example -spring: - application: - name: dynamic-threadpool-example - dynamic: - thread-pool: - banner: true - check-state-interval: 5 - collect-type: micrometer - config-file-type: properties - enable: true - executors: - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-consume - thread-pool-id: message-consume - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-produce - thread-pool-id: message-produce - notify-platforms: - - platform: WECHAT - token: ac0426a5-c712-474c-9bff-72b8b8f5caff - profiles: - active: dev -``` - -具体 Demo 运行请参考以下示例模块,已验证对应线程池动态变更、报警以及运行时监控功能。 - -- `/hippo4j-config-nacos-spring-boot-1x-starter-example` -- `hippo4j-example/hippo4j-config-apollo-spring-boot-1x-starter-example` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-start.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-start.md deleted file mode 100644 index 51907ae7..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-start.md +++ /dev/null @@ -1,193 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 接入流程 - -Nacos、Apollo、Zookeeper、ETCD、Polaris 配置中心任选其一。 - -## hippo4j 配置 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-starter - 1.4.3-upgrade - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -server: - port: 8090 - servlet: - context-path: /example - -spring: - profiles: - active: dev - - dynamic: - thread-pool: - # 是否开启动态线程池 - enable: true - # 是否打印 banner - banner: true - # 是否开启线程池数据采集,对接 Micrometer、ES、Log 等 - collect: true - # 检查线程池状态,是否达到报警条件,单位毫秒 - check-state-interval: 3000 - # 通知报警平台,请替换为自己创建的群机器人 - notify-platforms: - - platform: 'WECHAT' - token: xxx - - platform: 'DING' - token: xxx - secret: xxx # 加签专属 - - platform: 'LARK' - token: xxx - # Nacos、Apollo、Zookeeper、ETCD、Polaris 任选其一 - nacos: - data-id: xxx - group: xxx - apollo: - namespace: xxxx - # 配置中心文件格式 - config-file-type: yml - # tomcat、undertow、jetty 三种容器线程池,任选其一 - undertow: - core-pool-size: 100 - maximum-pool-size: 200 - keep-alive-time: 1000 - # 全局通知配置-是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位秒 - alarm-interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - # 动态线程池列表 - executors: - - thread-pool-id: 'message-consume' - # 核心线程数 - core-pool-size: 1 - # 最大线程数 - maximum-pool-size: 1 - # 阻塞队列名称,参考 BlockingQueueTypeEnum,支持 SPI - blocking-queue: 'LinkedBlockingQueue' - # 阻塞队列大小 - queue-capacity: 1 - # 执行超时时间,超过此时间发起报警,单位毫秒 - execute-time-out: 1000 - # 拒绝策略名称,参考 RejectedPolicyTypeEnum,支持 SPI - rejected-handler: 'AbortPolicy' - # 线程存活时间,单位秒 - keep-alive-time: 1024 - # 是否允许核心线程超时 - allow-core-thread-time-out: true - # 线程工厂名称前缀 - thread-name-prefix: 'message-consume' - # 是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 通知配置,线程池中通知配置如果存在,则会覆盖全局通知配置 - notify: - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位分钟 - interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - - thread-pool-id: 'message-produce' - core-pool-size: 1 - maximum-pool-size: 1 - queue-capacity: 1 - execute-time-out: 1000 - blocking-queue: 'LinkedBlockingQueue' - rejected-handler: 'AbortPolicy' - keep-alive-time: 1024 - allow-core-thread-time-out: true - thread-name-prefix: 'message-consume' - alarm: true - active-alarm: 80 - capacity-alarm: 80 - notify: - interval: 8 - receives: xxx -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从配置中心拉取。 - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/difference.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/difference.md deleted file mode 100644 index eddaa550..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/difference.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 运行模式介绍 - -1.1.0 版本发布后,Hippo4j 分为两种使用模式:轻量级依赖配置中心以及无中间件依赖版本。 - -![](https://oss.open8gu.com/image-20220319154626314.png) - -### hippo4j-config - -**轻量级动态线程池管理**,依赖 Nacos、Apollo、Zookeeper、ETCD、Polaris 等三方配置中心(任选其一)完成线程池参数动态变更,支持运行时报警、监控等功能。 - -> 监控功能配置详见:[线程池监控](/docs/user_docs/getting_started/config/hippo4j-config-monitor) - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) - -### hippo4j-server - -**部署 hippo4j-server 服务**,通过可视化 Web 界面完成线程池的创建、变更以及查看,不依赖三方中间件。 - -相比较 hippo4j-config,功能会更强大,但同时也引入了一定的复杂性。需要部署一个 Java 服务,以及依赖 MySQL 数据库。 - -![](https://oss.open8gu.com/1644032018254-min.gif) - -### 使用总结 - -| | hippo4j-config | hippo4j-server | -| ---- | ---------------------------------------------------- | ------------------------------------------------------------ | -| 依赖 | Nacos、Apollo、Zookeeper、ETCD、Polaris 配置中心(任选其一) | 部署 Hippo4j Server(内部无依赖中间件) | -| 使用 | 配置中心补充线程池相关参数 | Hippo4j Server Web 控制台添加线程池记录 | -| 功能 | 包含基础功能:参数动态化、运行时监控、报警等 | 基础功能之外扩展控制台界面、线程池堆栈查看、线程池运行信息实时查看、历史运行信息查看、线程池配置集群个性化等 | - -使用建议:根据公司情况选择,如果基本功能可以满足使用,选择 hippo4j-config 使用即可;如果希望更多的功能,可以选择 hippo4j-server。 - -**两者在进行替换的时候,无需修改业务代码**。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/hippo4j-adapter.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/hippo4j-adapter.md deleted file mode 100644 index 50599d06..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/hippo4j-adapter.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 三方框架线程池适配 - -Hippo4j 目前已支持的三方框架线程池列表: - -- Dubbo -- Hystrix -- RabbitMQ -- RocketMQ -- AlibabaDubbo -- RocketMQSpringCloudStream -- RabbitMQSpringCloudStream - -引入 Hippo4j Server 或 Core 的 Maven Jar 坐标后,还需要引入对应的框架适配 Jar: - -```xml - - cn.hippo4j - - hippo4j-spring-boot-starter-adapter-dubbo - - hippo4j-spring-boot-starter-adapter-alibaba-dubbo - - hippo4j-spring-boot-starter-adapter-hystrix - - hippo4j-spring-boot-starter-adapter-rabbitmq - - hippo4j-spring-boot-starter-adapter-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq - 1.4.3-upgrade - -``` - -如果想省事,仅需引入一个全量包,框架底层会根据条件判断加载具体线程池适配器。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-adapter-all - 1.4.3-upgrade - -``` - -## Hippo4j Server - -Hippo4j Server 仅需要引入上述 Jar 包,即可在 Hippo4j Server 的控制台进行查看及修改三方框架线程池。 - -![](https://oss.open8gu.com/image-20220531194810047.png) - -## Hippo4j Config - -Hippo4j Config 除了依赖上述适配 Jar 包外,还需要在配置中心添加以下配置项。 - -```yaml -spring: - dynamic: - thread-pool: - # 省略其它配置 - adapter-executors: - # threadPoolKey 代表线程池标识 - - threadPoolKey: 'input' - # mark 为三方线程池框架类型,参见文初已支持框架集合 - mark: 'RocketMQSpringCloudStream' - corePoolSize: 10 - maximumPoolSize: 10 -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/img/docsVersionDropdown.png b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/img/docsVersionDropdown.png deleted file mode 100644 index 97e41646..00000000 Binary files a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/img/docsVersionDropdown.png and /dev/null differ diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/img/grafana-monitor.jpg b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/img/grafana-monitor.jpg deleted file mode 100644 index 336bd980..00000000 Binary files a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/img/grafana-monitor.jpg and /dev/null differ diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/img/localeDropdown.png b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/img/localeDropdown.png deleted file mode 100644 index e257edc1..00000000 Binary files a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/img/localeDropdown.png and /dev/null differ diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/server/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/server/_category_.json deleted file mode 100644 index 4063c17f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/server/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "无中间件依赖", - "position": 3, - "collapsed": true -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-config.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-config.md deleted file mode 100644 index e1ef853f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-config.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 服务端配置 - -`hippo4j.core.clean-history-data-enable` - -是否开启线程池历史数据清洗,默认开启。 - -`hippo4j.core.clean-history-data-period` - -线程池历史数据保留时间,默认值:30,单位分钟。 - -服务端会保留这个配置时间的数据,超过这个时间则会被清理。比如按照默认值 30 分钟来说,12:00 收集到的数据,12:30 就会被清理删除。 - -`hippo4j.core.monitor.report-type` - -客户端监控上报服务端类型,可选值:http、netty,默认 http。服务端开启 netty 配置后,需要在客户端对应开启才可生效。用来应对大量动态线程池监控场景。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-monitor.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-monitor.md deleted file mode 100644 index 6e0592fa..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-monitor.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 线程池监控 - -Server 模式默认内置线程池运行时采集和监控功能,如果想要使用 Prometheus + Grafana 的方式可以查看以下内容。 - -## 线程池监控配置 - -接下来引入 SpringBoot Actuator。Spring 2.x 一般都有版本指定,所以这里不用写版本号。 - -```xml - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - -``` - -添加动态线程池监控相关配置: - -```yaml -management: - metrics: - export: - prometheus: - enabled: true - server: - port: 29999 # 可选配置,如果不配置该 port,直接使用 ${server.port} - endpoints: - web: - exposure: - include: '*' # 测试使用,开启了所有端点,生产环境不建议 * -spring: - dynamic: - thread-pool: - monitor: - enable: true # 是否开启采集线程池运行时数据 - collect-interval: 5000 # 采集线程池运行数据频率 - collect-types: server,micrometer # 采集线程池运行数据的类型。eg:server、micrometer。多个可以同时使用,默认 server - initial-delay: 10000 # 项目启动后延迟多久进行采集 - thread-pool-types: dynamic # 采集线程池的类型。eg:dynamic、web、adapter。可任意配置,默认 dynamic -``` - -如果使用 `micrometer` 类型的监控指标,需要添加以下依赖。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-monitor-micrometer - 1.4.3-upgrade - -``` - -项目启动,访问 `http://localhost:29999/actuator/prometheus` 出现 `dynamic_thread_pool_` 前缀的指标,即为成功。 - -![](https://oss.open8gu.com/image-20220912220401016.png) - -## 配置 Prometheus - -通过 Docker 启动 Prometheus 服务。 - -```shell -docker run -d -p 9090:9090 --name prometheus prom/prometheus -``` - -添加 Prometheus 抽取数据任务。 - -```shell -# 进入 prometheus 容器内部 -docker exec -it prometheus /bin/sh -# 编辑 prometheus 配置文件 -vi /etc/prometheus/prometheus.yml -``` - -scrape_configs 节点下新添加一个 job,如果 Prometheus 是 Docker 方式部署,`{scrape_configs.static_configs.targets}` 需要写本机的 IP。 - -```yaml -scrape_configs: - - job_name: 'dynamic-thread-pool-job' - scrape_interval: 5s - metrics_path: '/actuator/prometheus' - static_configs: - - targets: [ '127.0.0.1:29999' ] -``` - -配置成功后 `exit` 退出容器,并进行 Prometheus 容器重启 `docker restart prometheus`。 - -访问 Prometheus 控制台 `http://localhost:9090/graph` 路径,能够展示相关指标即为配置成功。 - -![](https://oss.open8gu.com/image-20220912221237597.png) - -## 配置 Grafana - -```shell -docker run -d -p 3000:3000 --name=grafana grafana/grafana -``` - -访问 Grafana 地址,[http://localhost:3000](http://localhost:3000) 用户名密码:`admin` - -Grafana 访问 `http://localhost:3000/datasources` 导入 Prometheus 数据源。 - -![](https://oss.open8gu.com/image-20220912221646866.png) - -> 如果 Prometheus 为 Docker 方式部署,HTTP URL 需要为本地 IP,比如:http://192.168.1.5:9090 - -关注公众号 `龙台的技术笔记`,回复:`监控`,获取 Hippo4j Grafana DashBoard JSON 配置。 - -| 公众号 | 回复关键词 | -|:------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------:| -| ![](https://oss.open8gu.com/43_65f6020ed111b6bb3808ec338576bd6b.png?x-oss-process=image/resize,h_300,w_400) | ![](https://oss.open8gu.com/image-20220327171957444.png?x-oss-process=image/resize,h_300,w_400) | - -获取到 JSON 文件后,通过 `http://localhost:3000/dashboard/import` 将 JSON 文件导入至 Grafana DashBoard。 - -![](https://oss.open8gu.com/image-20220912225627272.png) - -下拉框内动态选择创建好的 Prometheus 数据源,并点击 `Import`。 - -![](https://oss.open8gu.com/image-20220912225700200.png) - -即可使用炫酷的 Hippo4j 动态线程池监控 DashBoard。大家伙儿也可以根据个人喜好进行定制 DashBoard,如果觉得有优化点,欢迎和我联系贡献。 - -![](https://oss.open8gu.com/image-20220912225813972.png) - -如果项目客户端启动多个示例,动态线程池监控效果图如下: - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-start.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-start.md deleted file mode 100644 index ad702ca5..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-start.md +++ /dev/null @@ -1,127 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 接入流程 - -部署服务端,参考 [部署手册](/docs/user_docs/ops/hippo4j-server-deploy)。 - -服务端创建 [租户、项目](/community/faq#租户和项目在-hippo4j-中是什么意思) 和线程池记录。 - -需要注意,项目 ID 需要与配置文件 `{application.name}` 保持一致。 - -:::note -租户、项目、线程池 ID 如果由多个词组成,建议以 - 进行分割。比如:message-center。 -::: - -## Hippo4j 配置 - -SpringBoot Pom 引入 Hippo4j Starter Jar。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter - 1.4.3-upgrade - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -spring: - profiles: - active: dev - application: - # 服务端创建的项目 id 需要与 application.name 保持一致 - name: dynamic-threadpool-example - dynamic: - thread-pool: - # 服务端地址 - server-addr: http://localhost:6691 - # 用户名 - username: admin - # 密码 - password: 123456 - # 租户 id, 对应 tenant 表 - namespace: prescription - # 项目 id, 对应 item 表 - item-id: ${spring.application.name} -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从 hippo4j-server 服务拉取。 - -:::note -创建线程池时建议填充实际的参数。如果在连接 Hippo4j Server 端失败时,会使用填充配置创建线程池。 -::: - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` - diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/intro.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/intro.md deleted file mode 100644 index 4bdab7d8..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/intro.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 简介 - -## 线程池痛点 - -线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。在高并发以及大批量的任务处理场景,线程池的使用是必不可少的。 - -如果有在项目中实际使用线程池,相信你可能会遇到以下痛点: - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -## 什么是 Hippo4j - -Hippo4j 通过对 JDK 线程池增强,以及扩展三方框架底层线程池等功能,为业务系统提高线上运行保障能力。 - -提供以下功能支持: - -- 全局管控 - 管理应用线程池实例。 - -- 动态变更 - 应用运行时动态变更线程池参数,包括不限于:核心、最大线程数、阻塞队列容量、拒绝策略等。 -- 通知报警 - 内置四种报警通知策略,线程池活跃度、容量水位、拒绝策略以及任务执行时间超长。 -- 运行监控 - 实时查看线程池运行时数据,最近半小时线程池运行数据图表展示。 -- 功能扩展 - 支持线程池任务传递上下文;项目关闭时,支持等待线程池在指定时间内完成任务。 -- 多种模式 - 内置两种使用模式:[依赖配置中心](https://hippo4j.cn/docs/user_docs/getting_started/config/hippo4j-config-start) 和 [无中间件依赖](https://hippo4j.cn/docs/user_docs/getting_started/server/hippo4j-server-start)。 -- 容器管理 - Tomcat、Jetty、Undertow 容器线程池运行时查看和线程数变更。 -- 框架适配 - Dubbo、Hystrix、RabbitMQ、RocketMQ 等消费线程池运行时数据查看和线程数变更。 - -## 快速开始 - -对于本地演示目的,请参阅 [Quick start](https://hippo4j.cn/docs/user_docs/user_guide/quick-start) - -演示环境: [http://console.hippo4j.cn/index.html](http://console.hippo4j.cn/index.html) - -## 接入登记 - -更多接入的公司,欢迎在 [登记地址](https://github.com/opengoofy/hippo4j/issues/13) 登记,登记仅仅为了产品推广。 - -## 联系我 - -开源不易,右上角点个 Star 鼓励一下吧! - -如果大家想要实时关注 Hippo4j 更新的文章以及分享的干货的话,可以关注我的公众号。 - -使用过程中有任何问题,或者对项目有什么建议,关注公众号回复:加群,和 1000+ 志同道合的朋友交流讨论。 - -![](https://oss.open8gu.com/image-20230317191041262-mini.png) - -## 友情链接 -- [[ LiteFlow ]](https://liteflow.yomahub.com/):轻量,快速,稳定可编排的组件式规则引擎。 - -- [[ Sa-Token ]](https://github.com/dromara/sa-token):一个轻量级 java 权限认证框架,让鉴权变得简单、优雅! -- [[ HertzBeat ]](https://github.com/dromara/hertzbeat):易用友好的云监控系统, 无需 Agent, 强大自定义监控能力。 -- [[ JavaGuide ]](https://github.com/Snailclimb/JavaGuide):一份涵盖大部分 Java 程序员所需要掌握的核心知识。 -- [[ toBeBetterJavaer ]](https://github.com/itwanger/toBeBetterJavaer):一份通俗易懂、风趣幽默的 Java 学习指南。 - -## 贡献者 - -感谢所有为项目作出贡献的开发者。如果有意贡献,参考 [good first issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/ops/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/ops/_category_.json deleted file mode 100644 index d5b7d1e8..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/ops/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "运维指南", - "position": 4, - "link": { - "type": "generated-index" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/ops/hippo4j-server-deploy.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/ops/hippo4j-server-deploy.md deleted file mode 100644 index ffbc2306..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/ops/hippo4j-server-deploy.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 源码包部署 - -[RELEASE](https://github.com/opengoofy/hippo4j/releases) 页面下载对应版本并进行解压。 - -## 初始化 - -修改数据库相关信息。 - -```txt -/conf/application.properties -``` - -如果是新运行 Hippo4j,数据库执行下述 SQL 脚本即可。 - -```txt -/conf/hippo4j_manager.sql -``` - -如果是对已运行 Hippo4j 升级,请查看 `/conf/sql-upgrade` 目录下,是否有目标版本对应的升级脚本。 - -## 直接运行 - -Mac Linux 启动执行。 - -```txt -sh ./bin/startup.sh -``` - -Windows 启动执行。 - -```txt -bin/startup.cmd -``` - -## 访问控制台 - -启动成功后,访问链接。用户名密码:admin 123456 - -```txt -localhost:6691/index.html -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/ops/server-docker.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/ops/server-docker.md deleted file mode 100644 index 826bb99f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/ops/server-docker.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Docker部署 - -## 镜像启动 - -Docker 镜像默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -或者,底层存储数据库切换为 MySQL。`DATASOURCE_HOST` 需要切换为本地 IP,不能使用 `127.0.0.1` 或 `localhost`。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server \ --e DATASOURCE_MODE=mysql \ --e DATASOURCE_HOST=xxx.xxx.xxx.xxx \ --e DATASOURCE_PORT=3306 \ --e DATASOURCE_DB=hippo4j_manager \ --e DATASOURCE_USERNAME=root \ --e DATASOURCE_PASSWORD=root \ -hippo4j/hippo4j-server -``` - -访问 Server 控制台,路径 `http://localhost:6691/index.html` ,默认用户名密码:admin / 123456 - -## 镜像构建 - -如果想要自定义镜像,可以通过以下命令快速构建 Hippo4j Server: - -方式一: - -```shell -# 进入到 hippo4j-server/hippo4j-bootstrap 工程路径下 -mvn clean package -Dskip.spotless.apply=true -# 默认打包是打包的 tag 是 latest -docker build -t hippo4j/hippo4j-server ../hippo4j-bootstrap -``` - -方式二: - -通过 `maven docker plugin` - -```shell -# 进入到 hippo4j-server 工程路径下 -mvn clean package -DskipTests -Dskip.spotless.apply=true docker:build -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/other/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/other/_category_.json deleted file mode 100644 index a74d7432..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/other/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "其它", - "position": 6, - "link": { - "type": "generated-index" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/other/official-ccounts.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/other/official-ccounts.md deleted file mode 100644 index 63e07ea7..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/other/official-ccounts.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 推荐公众号 - -## JavaGuide - -专注Java后端学习和大厂面试的公众号! - -![](https://oss.open8gu.com/JavaGuide.png) - -## HelloGitHub - -HelloGitHub,专注于开源社区技术和知识内容分享。 - -![](https://oss.open8gu.com/HelloGitHub.png) - -## macrozheng - -专注Java技术分享,解析优质开源项目。涵盖SpringBoot、SpringCloud、Docker、K8S等实用技术,作者Github开源项目mall(50K+Star)。 - -![](https://oss.open8gu.com/macrozheng.png) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/other/operation.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/other/operation.md deleted file mode 100644 index 62661c55..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/other/operation.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 公众号合作 - -## 推荐须知 - -hippo4j 作为一款新兴动态线程池框架,开源出来的时间比较晚,目前迫切需要不同的途径进行推广。 - -如果您是公众号运营者或者开源爱好者,欢迎将 hippo4j 推荐给您的粉丝。 - -1. 您无需为 hippo4j 专门撰写文案,只需要直接导入 [推荐文章](https://mp.weixin.qq.com/s/JTTwcBEiK_MnFcPTZl3zGA) 即可。 -2. 在文章底部或内容中留下项目官网或者 GitHub 仓库链接。 -3. 文章需至少 1000+ 的阅读量。 - -作为推荐回报,hippo4j 可以为您: - -1. 在框架官方文档 [推荐公众号](/docs/user_docs/other/official-ccounts) 页面处留下您的公众号二维码。 -2. 在框架官方交流群里@全体成员推广您的公众号一次,附带介绍语。 -3. 您的公众号所有新推文章都可以将链接发送到 hippo4j 交流群中,增加阅读量。 - -如果您还有除公众号以外的其它途径可以与 hippo4j 相互推荐,欢迎 [加群沟通](/group)。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/other/question.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/other/question.md deleted file mode 100644 index 49fd4d77..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/other/question.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 问题提问 - -文档引用自:[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way) - -## 在提问之前 - -在你准备要通过电子邮件、新闻群组或者聊天室提出技术问题前,请先做到以下事情: - -1. 尝试在你准备提问的论坛的旧文章中搜索答案。 -2. 尝试上网搜索以找到答案。 -3. 尝试阅读手册以找到答案。 -4. 尝试阅读常见问题文件(FAQ)以找到答案。 -5. 尝试自己检查或试验以找到答案。 -6. 向你身边的强者朋友打听以找到答案。 -7. 如果你是程序开发者,请尝试阅读源代码以找到答案。 - -当你提出问题的时候,请先表明你已经做了上述的努力;这将有助于树立你并不是一个不劳而获且浪费别人的时间的提问者。如果你能一并表达在做了上述努力的过程中所**学到**的东西会更好,因为我们更乐于回答那些表现出能从答案中学习的人的问题。 - -## 当你提问时 - -### 慎选提问的论坛 -小心选择你要提问的场合。如果你做了下述的事情,你很可能被忽略掉或者被看作失败者: - -* 在与主题不合的论坛上贴出你的问题。 -* 在探讨进阶技术问题的论坛张贴非常初级的问题;反之亦然。 -* 在太多的不同新闻群组上重复转贴同样的问题(cross-post)。 -* 向既非熟人也没有义务解决你问题的人发送私人电邮。 - -因此,第一步是找到对的论坛。再说一次,Google 和其它搜索引擎还是你的朋友,用它们来找到与你遭遇到困难的软硬件问题最相关的网站。通常那儿都有常见问题(FAQ)、邮件列表及相关说明文件的链接。如果你的努力(包括**阅读** FAQ)都没有结果,网站上也许还有报告 Bug(Bug-reporting)的流程或链接,如果是这样,链过去看看。 - -### 使用有意义且描述明确的标题 - -在邮件列表、新闻群组或论坛中,大约 50 字以内的标题是抓住资深专家注意力的好机会。别用喋喋不休的帮帮忙、跪求、急(更别说救命啊!!!!这样让人反感的话,用这种标题会被条件反射式地忽略)来浪费这个机会。不要妄想用你的痛苦程度来打动我们,而应该是在这点空间中使用极简单扼要的描述方式来提出问题。 - -一个好标题范例是`目标 —— 差异`式的描述,许多技术支持组织就是这样做的。在`目标`部分指出是哪一个或哪一组东西有问题,在`差异`部分则描述与期望的行为不一致的地方。 - -> 蠢问题:救命啊!我的笔记本电脑不能正常显示了! - -> 聪明问题:X.org 6.8.1 的鼠标指针会变形,某牌显卡 MV1005 芯片组。 - -> 更聪明问题:X.org 6.8.1 的鼠标指针,在某牌显卡 MV1005 芯片组环境下 - 会变形。 - -### 使用清晰、正确、精准且合乎语法的语句 - -我们从经验中发现,粗心的提问者通常也会粗心地写程序与思考(我敢打包票)。回答粗心大意者的问题很不值得,我们宁愿把时间耗在别处。 - -正确的拼写、标点符号和大小写是很重要的。一般来说,如果你觉得这样做很麻烦,不想在乎这些,那我们也觉得麻烦,不想在乎你的提问。花点额外的精力斟酌一下字句,用不着太僵硬与正式 —— 事实上,黑客文化很看重能准确地使用非正式、俚语和幽默的语句。但它**必须很**准确,而且有迹象表明你是在思考和关注问题。 - -### 精确地描述问题并言之有物 - -* 仔细、清楚地描述你的问题或 Bug 的症状。 -* 描述问题发生的环境(机器配置、操作系统、应用程序、以及相关的信息),提供经销商的发行版和版本号(如:`Fedora Core 4`、`Slackware 9.1`等)。 -* 描述在提问前你是怎样去研究和理解这个问题的。 -* 描述在提问前为确定问题而采取的诊断步骤。 -* 描述最近做过什么可能相关的硬件或软件变更。 -* 尽可能地提供一个可以`重现这个问题的可控环境`的方法。 - -尽量去揣测一个黑客会怎样反问你,在你提问之前预先将黑客们可能提出的问题回答一遍。 - -以上几点中,当你报告的是你认为可能在代码中的问题时,给黑客一个可以重现你的问题的环境尤其重要。当你这么做时,你得到有效的回答的机会和速度都会大大的提升。 - -[Simon Tatham](http://www.chiark.greenend.org.uk/~sgtatham/) 写过一篇名为《[如何有效的报告 Bug](http://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html)》的出色文章。强力推荐你也读一读。 - -### 话不在多而在精 - -你需要提供精确有内容的信息。这并不是要求你简单的把成堆的出错代码或者资料完全转录到你的提问中。如果你有庞大而复杂的测试样例能重现程序挂掉的情境,尽量将它剪裁得越小越好。 - -这样做的用处至少有三点。 -第一,表现出你为简化问题付出了努力,这可以使你得到回答的机会增加; -第二,简化问题使你更有可能得到**有用**的答案; -第三,在精炼你的 bug 报告的过程中,你很可能就自己找到了解决方法或权宜之计。 - -### 别动辄声称找到 Bug - -当你在使用软件中遇到问题,除非你非常、**非常**的有根据,不要动辄声称找到了 Bug。提示:除非你能提供解决问题的源代码补丁,或者提供回归测试来表明前一版本中行为不正确,否则你都多半不够完全确信。这同样适用在网页和文件,如果你(声称)发现了文件的`Bug`,你应该能提供相应位置的修正或替代文件。 - -请记得,还有其他许多用户没遇到你发现的问题,否则你在阅读文件或搜索网页时就应该发现了(你在抱怨前[已经做了这些,是吧](#在提问之前)?)。这也意味着很有可能是你弄错了而不是软件本身有问题。 - -编写软件的人总是非常辛苦地使它尽可能完美。如果你声称找到了 Bug,也就是在质疑他们的能力,即使你是对的,也有可能会冒犯到其中某部分人。当你在标题中嚷嚷着有`Bug`时,这尤其严重。 - -提问时,即使你私下非常确信已经发现一个真正的 Bug,最好写得像是**你**做错了什么。如果真的有 Bug,你会在回复中看到这点。这样做的话,如果真有 Bug,维护者就会向你道歉,这总比你惹恼别人然后欠别人一个道歉要好一点。 - -### 低声下气不能代替你的功课 - -有些人明白他们不该粗鲁或傲慢的提问并要求得到答复,但他们选择另一个极端 —— 低声下气:`我知道我只是个可悲的新手,一个撸瑟,但...`。这既使人困扰,也没有用,尤其是伴随着与实际问题含糊不清的描述时更令人反感。 - -别用原始灵长类动物的把戏来浪费你我的时间。取而代之的是,尽可能清楚地描述背景条件和你的问题情况。这比低声下气更好地定位了你的位置。 - -有时网页论坛会设有专为新手提问的版面,如果你真的认为遇到了初学者的问题,到那去就是了,但一样别那么低声下气。 - -### 描述问题症状而非你的猜测 - -告诉黑客们你认为问题是怎样造成的并没什么帮助。(如果你的推断如此有效,还用向别人求助吗?),因此要确信你原原本本告诉了他们问题的症状,而不是你的解释和理论;让黑客们来推测和诊断。如果你认为陈述自己的猜测很重要,清楚地说明这只是你的猜测,并描述为什么它们不起作用。 - -**蠢问题** - -> 我在编译内核时接连遇到 SIG11 错误, -> 我怀疑某条飞线搭在主板的走线上了,这种情况应该怎样检查最好? - -**聪明问题** - -> 我的组装电脑是 FIC-PA2007 主机板搭载 AMD K6/233 CPU(威盛 Apollo VP2 芯片组), -> 256MB Corsair PC133 SDRAM 内存,在编译内核时,从开机 20 分钟以后就频频产生 SIG11 错误, -> 但是在头 20 分钟内从没发生过相同的问题。重新启动也没有用,但是关机一晚上就又能工作 20 分钟。 -> 所有内存都换过了,没有效果。相关部分的标准编译记录如下… - -由于以上这点似乎让许多人觉得难以配合,这里有句话可以提醒你:`所有的诊断专家都来自密苏里州。` 美国国务院的官方座右铭则是:`让我看看`(出自国会议员 Willard D. Vandiver 在 1899 年时的讲话:`我来自一个出产玉米,棉花,牛蒡和民主党人的国家,滔滔雄辩既不能说服我,也不会让我满意。我来自密苏里州,你必须让我看看。`) 针对诊断者而言,这并不是一种怀疑,而只是一种真实而有用的需求,以便让他们看到的是与你看到的原始证据尽可能一致的东西,而不是你的猜测与归纳的结论。所以,大方的展示给我们看吧! - -### 按发生时间先后列出问题症状 - -问题发生前的一系列操作,往往就是对找出问题最有帮助的线索。因此,你的说明里应该包含你的操作步骤,以及机器和软件的反应,直到问题发生。在命令行处理的情况下,提供一段操作记录(例如运行脚本工具所生成的),并引用相关的若干行(如 20 行)记录会非常有帮助。 - -如果挂掉的程序有诊断选项(如 -v 的详述开关),试着选择这些能在记录中增加调试信息的选项。记住,`多`不等于`好`。试着选取适当的调试级别以便提供有用的信息而不是让读者淹没在垃圾中。 - -如果你的说明很长(如超过四个段落),在开头简述问题,接下来再按时间顺序详述会有所帮助。这样黑客们在读你的记录时就知道该注意哪些内容了。 - -### 描述目标而不是过程 - -如果你想弄清楚如何做某事(而不是报告一个 Bug),在开头就描述你的目标,然后才陈述重现你所卡住的特定步骤。 - -经常寻求技术帮助的人在心中有个更高层次的目标,而他们在自以为能达到目标的特定道路上被卡住了,然后跑来问该怎么走,但没有意识到这条路本身就有问题。结果要费很大的劲才能搞定。 - -**蠢问题** - -> 我怎样才能从某绘图程序的颜色选择器中取得十六进制的 RGB 值? - -**聪明问题** - -> 我正试着用替换一幅图片的色码(color table)成自己选定的色码,我现在知道的唯一方法是编辑每个色码区块(table slot), -> 但却无法从某绘图程序的颜色选择器取得十六进制的 RGB 值。 - -第二种提问法比较聪明,你可能得到像是```建议采用另一个更合适的工具```的回复。 - -### 清楚明确的表达你的问题以及需求 - -漫无边际的提问是近乎无休无止的时间黑洞。最有可能给你有用答案的人通常也正是最忙的人(他们忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞相当厌恶,所以他们也倾向于厌恶那些漫无边际的提问。 - -如果你明确表述需要回答者做什么(如提供指点、发送一段代码、检查你的补丁、或是其他等等),就最有可能得到有用的答案。因为这会定出一个时间和精力的上限,便于回答者能集中精力来帮你。这么做很棒。 - -要理解专家们所处的世界,请把专业技能想像为充裕的资源,而回复的时间则是稀缺的资源。你要求他们奉献的时间越少,你越有可能从真正专业而且很忙的专家那里得到解答。 - -所以,界定一下你的问题,使专家花在辨识你的问题和回答所需要付出的时间减到最少,这技巧对你有用答案相当有帮助 —— 但这技巧通常和简化问题有所区别。因此,问`我想更好地理解 X,可否指点一下哪有好一点说明?`通常比问`你能解释一下 X 吗?`更好。如果你的代码不能运作,通常请别人看看哪里有问题,比要求别人替你改正要明智得多。 - -### 礼多人不怪,而且有时还很有帮助 - -彬彬有礼,多用`请`和`谢谢您的关注`,或`谢谢你的关照`。让大家都知道你对他们花时间免费提供帮助心存感激。 - -坦白说,这一点并没有比使用清晰、正确、精准且合乎语法和避免使用专用格式重要(也不能取而代之)。黑客们一般宁可读有点唐突但技术上鲜明的 Bug 报告,而不是那种有礼但含糊的报告。(如果这点让你不解,记住我们是按问题能教给我们什么来评价问题的价值的) - -然而,如果你有一串的问题待解决,客气一点肯定会增加你得到有用回应的机会。 - -(我们注意到,自从本指南发布后,从资深黑客那里得到的唯一严重缺陷反馈,就是对预先道谢这一条。一些黑客觉得`先谢了`意味着事后就不用再感谢任何人的暗示。我们的建议是要么先说`先谢了`,**然后**事后再对回复者表示感谢,或者换种方式表达感激,譬如用`谢谢你的关注`或`谢谢你的关照`。) - -## 不该问的问题 - -以下是几个经典蠢问题,以及黑客没回答时心中所想的: - -问题:[我能在哪找到 X 程序或 X 资源?](#q1) - -问题:[我怎样用 X 做 Y?](#q2) - -问题:[我的程序/设定/SQL 语句没有用](#q3) - -问题:[我的 Windows 电脑有问题,你能帮我吗?](#q4) - -问题:[我的程序不会动了,我认为系统工具 X 有问题](#q5) - -问题:[我在安装 Linux(或者 X )时有问题,你能帮我吗?](#q6) - -问题:[我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢?](#q7) - ---- - -> 问题:我能在哪找到 X 程序或 X 资源? - -回答:就在我找到它的地方啊,白痴 —— 搜索引擎的那一头。天哪!难道还有人不会用 [Google](https://www.google.com) 吗? - -> 问题:我怎样用 X 做 Y? - -回答:如果你想解决的是 Y ,提问时别给出可能并不恰当的方法。这种问题说明提问者不但对 X 完全无知,也对 Y 要解决的问题糊涂,还被特定形势禁锢了思维。最好忽略这种人,等他们把问题搞清楚了再说。 - -> 问题:我的{程序/设定/SQL 语句}没有用 - -回答:这不算是问题吧,我对要我问你二十个问题才找得出你真正问题的问题没兴趣 —— 我有更有意思的事要做呢。在看到这类问题的时候,我的反应通常不外如下三种 - -* 你还有什么要补充的吗? -* 真糟糕,希望你能搞定。 -* 这关我屁事? - -> 问题:我的 Windows 电脑有问题,你能帮我吗? - -回答:能啊,扔掉微软的垃圾,换个像 Linux 或 BSD 的开源操作系统吧。 - -注意:如果程序有官方版 Windows 或者与 Windows 有互动(如 Samba),你**可以**问与 Windows 相关的问题,只是别对问题是由 Windows 操作系统而不是程序本身造成的回复感到惊讶, 因为 Windows 一般来说实在太烂,这种说法通常都是对的。 - -> 问题:我的程序不会动了,我认为系统工具 X 有问题 - -回答:你完全有可能是第一个注意到被成千上万用户反复使用的系统调用与函数库文件有明显缺陷的人,更有可能的是你完全没有根据。不同凡响的说法需要不同凡响的证据,当你这样声称时,你必须有清楚而详尽的缺陷说明文件作后盾。 - -> 问题:我在安装 Linux(或者 X )时有问题,你能帮我吗? - -回答:不能,我只有亲自在你的电脑上动手才能找到毛病。还是去找你当地的 Linux 使用群组者寻求实际的指导吧(你能在[这儿](http://www.linux.org/groups/index.html)找到用户群组的清单)。 - -注意:如果安装问题与某 Linux 的发行版有关,在它的邮件列表、论坛或本地用户群组中提问也许是恰当的。此时,应描述问题的准确细节。在此之前,先用 `Linux` 和**所有**被怀疑的硬件作关键词仔细搜索。 - -> 问题:我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢? - -回答:想要这样做,说明了你是个卑鄙小人;想找个黑客帮你,说明你是个白痴! - -## 好问题与蠢问题 - -最后,我将透过举一些例子,来说明怎样聪明的提问;同一个问题的两种问法被放在一起,一种是愚蠢的,另一种才是明智的。 - -**蠢问题**: - -> 我从 foo 项目找来的源码没法编译。它怎么这么烂? - -他觉得都是别人的错,这个傲慢自大的提问者。 - -**聪明问题**: - -> foo 项目代码在 Nulix 6.2 版下无法编译通过。我读过了 FAQ,但里面没有提到跟 Nulix 有关的问题。这是我编译过程的记录,我有什么做的不对的地方吗? - -提问者已经指明了环境,也读过了 FAQ,还列出了错误,并且他没有把问题的责任推到别人头上,他的问题值得被关注。 - -**蠢问题**: - -> 我的主机板有问题了,谁来帮我? - -某黑客对这类问题的回答通常是:`好的,还要帮你拍拍背和换尿布吗?`,然后按下删除键。 - -**聪明问题**: - -> 我在 S2464 主机板上试过了 X 、 Y 和 Z ,但没什么作用,我又试了 A 、 B 和 C 。请注意当我尝试 C 时的奇怪现象。显然 florbish 正在 grommicking,但结果出人意料。通常在 Athlon MP 主机板上引起 grommicking 的原因是什么?有谁知道接下来我该做些什么测试才能找出问题? - -## 如果得不到回答 - -如果仍得不到回答,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。 - -总的来说,简单的重复张贴问题是个很糟的点子。这将被视为无意义的喧闹。有点耐心,知道你问题答案的人可能生活在不同的时区,可能正在睡觉,也有可能你的问题一开始就没有组织好。 - -你可以通过其他渠道获得帮助,这些渠道通常更适合初学者的需要。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/user_guide/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/user_guide/_category_.json deleted file mode 100644 index 9c505a51..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/user_guide/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "用户指南", - "position": 2, - "link": { - "type": "generated-index", - "description": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/user_guide/frame.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/user_guide/frame.md deleted file mode 100644 index 5992f735..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/user_guide/frame.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 为什么写 - -[美团线程池文章](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html "美团线程池文章") 介绍中,因为业务对线程池参数没有合理配置,触发过几起生产事故,进而引发了一系列思考。最终决定封装线程池动态参数调整,扩展线程池监控以及消息报警等功能。 - -在开源平台找了挺多动态线程池项目,从功能性以及健壮性而言,个人感觉不满足企业级应用。 - -因为对动态线程池比较感兴趣,加上想写一个有意义的项目,所以决定自己来造一个轻量级的轮子。 - -想给项目起一个简单易记的名字,类似于 Eureka、Nacos、Redis;后和朋友商量,决定命名:**Hippo4j**。 - -![](https://oss.open8gu.com/动态线程池功能架构-1.jpg) - -## 它解决了什么问题 - -线程池在业务系统应该都有使用到,帮助业务流程提升效率以及管理线程,多数场景应用于大量的异步任务处理。 - -虽然线程池提供了我们许多便利,但也并非尽善尽美,比如下面这些问题就无法很好解决。 - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 - -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 - -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 - -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 - -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 - -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 - -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -Hippo4j 很好解决了这些问题,它将业务中所有线程池统一管理,增强原生线程池系列功能。 - -## 它有什么特性 - -应用系统中线程池并不容易管理。参考美团的设计,Hippo4j 按照租户、项目、线程池的维度划分。再加上系统权限,让不同的开发、管理人员负责自己系统的线程池操作。 - -举个例子,小编在一家公司的公共组件团队,团队中负责消息、短链接网关等项目。公共组件是租户,消息或短链接就是项目。 - -Hippo4j 除去动态修改线程池,还包含实时查看线程池运行时指标、负载报警、配置日志管理等。 - -- `hippo4j-adapter`:适配对第三方框架中的线程池进行监控,如 Dubbo、RocketMQ、Hystrix 等; -- `hippo4j-auth`:用户、角色、权限等; -- `hippo4j-common`:多个模块公用代码实现; -- `hippo4j-config`:提供线程池准实时参数更新功能; -- `hippo4j-console`:对接前端控制台; -- `hippo4j-core`:核心的依赖,包括配置、核心包装类等; -- `hippo4j-discovery`:提供线程池项目实例注册、续约、下线等功能; -- `hippo4j-example` :示例工程; -- `hippo4j-message` :配置变更以及报警通知发送; -- `hippo4j-monitor` :线程池运行时监控; -- `hippo4j-server` :Server 端发布需要的模块聚合; -- `hippo4j-spring-boot`:SpringBoot Starter。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/user_guide/framework.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/user_guide/framework.md deleted file mode 100644 index 33e24d1c..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/user_guide/framework.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 架构设计 - -简单来说,Hippo4j 从部署的角度上分为两种角色:Server 端和 Client 端。 - -Server 端是 Hippo4j 项目打包出的 Java 进程,功能包括用户权限、线程池监控以及执行持久化的动作。 - -Client 端指的是我们 SpringBoot 应用,通过引入 Hippo4j Starter Jar 包负责与 Server 端进行交互。 - -比如拉取 Server 端线程池数据、动态更新线程池配置以及采集上报线程池运行时数据等。 - -## 基础组件 - -### 配置中心(Config) - -配置中心位于 Server 端,它的主要作用是监控 Server 端线程池配置变更,实时通知到 Client 实例执行线程池变更流程。 - -代码设计基于 Nacos 1.x 版本的 **长轮询以及异步 Servlet 机制** 实现。 - -### 注册中心(Discovery) - -负责管理 Client 端(单机或集群)注册到 Server 端的实例,包括不限于**实例注册、续约、过期剔除** 等操作,代码基于 Eureka 源码实现。 - -上面的配置中心很容易理解,动态线程池参数变更的根本。但是注册中心是用来做什么的? - -注册中心管理 Client 端注册的实例,通过这些实例可以 **实时获取线程池的运行时参数信息**。 - -目前的设计是如此,不排除后续基于 Discovery 做更多的扩展。 - -### 控制台(Console) - -对接前端项目,包括不限于以下模块管理: - -![](https://oss.open8gu.com/image-20211107122504126.png) - -## 消息通知(Notify) - -Hippo4j 内置了很多需要通知的事件,比如:线程池参数变更通知、线程池活跃度报警、拒绝策略执行报警以及阻塞队列容量报警等。 - -目前 Notify 已经接入了钉钉、企业微信和飞书,后续持续集成邮件、短信等通知渠道;并且,Notify 模块提供了消息事件的 SPI 方案,可以接受三方自定义的推送。 - -## Hippo4j-Spring-Boot-Starter - -熟悉 SpringBoot 的小伙伴对 Starter 应该不会陌生。Hippo4j 提供以 Starter Jar 包的形式嵌套在应用内,负责与 Server 端完成交互。 - -## 功能架构 - -![](https://oss.open8gu.com/image-20211105230953626.png) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/user_guide/notify.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/user_guide/notify.md deleted file mode 100644 index 7aa7e915..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/user_guide/notify.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 通知报警 - -现阶段已集成钉钉、企业微信、飞书的消息推送,后续会持续接入邮箱、短信和自定义通知渠道。 - -![](https://oss.open8gu.com/image-20220904181527453.png) - -**通知平台** - -- DING:钉钉平台; - -- LARK:飞书平台; - -- WECHAT:企业微信。 - -**通知类型** - -- CONFIG:线程池配置变更推送; - -- ALARM:线程池运行报警推送。 - -**Token** - -获取 DING、LARK、WECHAT 机器人 Token。 - -**报警间隔** - -- CONFIG 类型通知没有报警间隔; - -- ALARM 类型设置报警间隔后,某一节点下的同一线程池指定间隔只会发送一次报警通知。 - -**接收者** - -```tex -多个接收者使用英文逗号 , 分割 (注意不要有空格) -DING:填写手机号 -WECHART:填写user_id会以@的消息发给用户,填写姓名则是普通的@,如:龙台 -LARK:填写ou_开头用户唯一标识会以@的消息发给用户,填写手机号则是普通的@ -``` - - -## 钉钉平台 - -[钉钉创建群机器人](https://www.dingtalk.com/qidian/help-detail-20781541.html) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211013122816688.png) | ![](https://oss.open8gu.com/image-20211013113649068.png) | - -添加钉钉机器人后,需在机器人配置自定义关键字,才可发送成功。如下所示: - -![](https://oss.open8gu.com/image-20220530200133377.png?x-oss-process=image/resize,h_500,w_800) - -:::tip -如果使用 1.4.3 及以上版本,`警报` 替换为 `告警`。 -::: - -## 企业微信 - -[企业微信创建群机器人](https://open.work.weixin.qq.com/help2/pc/14931?person_id=1&from=homesearch) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211203213443242.png) | ![](https://oss.open8gu.com/image-20211203213512019.png) | - -## 飞书平台 - -[飞书创建群机器人](https://www.feishu.cn/hc/zh-CN/articles/360024984973) - -![](https://oss.open8gu.com/image-20220304081729347.png) - -![](https://oss.open8gu.com/image-20220304081507907.png) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/user_guide/quick-start.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/user_guide/quick-start.md deleted file mode 100644 index 59c5cdd5..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.4.3/user_docs/user_guide/quick-start.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 快速开始 - -## 服务启动 - -使用 Docker 运行服务端,默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -> 如果没有 Docker,可以使用源码编译的方式,启动 [Hippo4j-Server/Hippo4j-Bootstrap](https://github.com/longtai-cn/hippo4j/tree/develop/hippo4j-server/hippo4j-bootstrap) 模块下 ServerApplication 应用类。 - -启动示例项目,[hippo4j-spring-boot-starter-example](https://github.com/opengoofy/hippo4j/tree/develop/hippo4j-example/hippo4j-spring-boot-starter-example) 模块下 ServerExampleApplication 应用类。 - -访问 Server 控制台,路径 `http://localhost:6691/index.html`,默认用户名密码:admin / 123456 - -## 配置变更 - -访问控制台动态线程池菜单下线程池实例,修改动态线程池相关参数。 - -![](https://oss.open8gu.com/image-20220813173811668.png) - -观察 Hippo4j-Example 控制台日志输出,日志输出包括不限于此信息即为成功。 - -```tex -2022-09-10 00:23:29.783 INFO 50322 --- [change.config_0] c.h.s.s.c.ServerThreadPoolDynamicRefresh : [message-consume] Dynamic thread pool change parameter. - corePoolSize: 2 => 4 - maximumPoolSize: 6 => 12 - capacity: 1024 => 2048 - keepAliveTime: 9999 => 9999 - executeTimeOut: 800 => 3000 - rejectedType: SyncPutQueuePolicy => RunsOldestTaskPolicy - allowCoreThreadTimeOut: true => true -``` - -另外,当 Client 集群部署时,可以修改某一个实例,或选择 `全部修改` 按钮,修改所有实例线程池信息。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0.json deleted file mode 100644 index 13116144..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "version.label": { - "message": "1.5.0", - "description": "The label for version 1.5.0" - }, - "sidebar.tutorialSidebar.category.user_docs": { - "message": "user_docs", - "description": "The label for category user_docs in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar" - }, - "sidebar.tutorialSidebar.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar tutorialSidebar" - }, - "sidebar.user_docs.category.用户指南": { - "message": "用户指南", - "description": "The label for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.用户指南.link.generated-index.description": { - "message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。", - "description": "The generated-index page description for category 用户指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.快速开始": { - "message": "快速开始", - "description": "The label for category 快速开始 in sidebar user_docs" - }, - "sidebar.user_docs.category.依赖配置中心": { - "message": "依赖配置中心", - "description": "The label for category 依赖配置中心 in sidebar user_docs" - }, - "sidebar.user_docs.category.无中间件依赖": { - "message": "无中间件依赖", - "description": "The label for category 无中间件依赖 in sidebar user_docs" - }, - "sidebar.user_docs.category.运维指南": { - "message": "运维指南", - "description": "The label for category 运维指南 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册": { - "message": "开发者手册", - "description": "The label for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.开发者手册.link.generated-index.description": { - "message": "Hippo4j 留给使用者能够扩展的知识点。", - "description": "The generated-index page description for category 开发者手册 in sidebar user_docs" - }, - "sidebar.user_docs.category.其它": { - "message": "其它", - "description": "The label for category 其它 in sidebar user_docs" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/dev_manual/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/dev_manual/_category_.json deleted file mode 100644 index 9117307f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/dev_manual/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "开发者手册", - "position": 5, - "link": { - "type": "generated-index", - "description": "Hippo4j 留给使用者能够扩展的知识点。" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/dev_manual/rejected-policy-custom.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/dev_manual/rejected-policy-custom.md deleted file mode 100644 index e0405061..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/dev_manual/rejected-policy-custom.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 拒绝策略自定义 - -Hippo4j 通过 SPI 的方式对拒绝策略进行扩展,可以让用户在 Hippo4j 中完成自定义拒绝策略实现。 - -## Hippo4j Server 拒绝策略扩展 - -自定义拒绝策略,实现 `CustomRejectedExecutionHandler` 接口,示例如下: - -```java -public class ErrorLogRejectedExecutionHandler implements CustomRejectedExecutionHandler { - - @Override - public Integer getType() { - return 12; - } - - @Override - public RejectedExecutionHandler generateRejected() { - return new CustomErrorLogRejectedExecutionHandler(); - } - - public static class CustomErrorLogRejectedExecutionHandler implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - Logger logger = LoggerFactory.getLogger(this.getClass()); - logger.error("线程池抛出拒绝策略"); - } - } -} -``` - -创建 `src/main/resources/META-INF/services` 目录,创建 SPI 自定义拒绝策略文件 `cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler`。 - -`cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler` 文件内仅放一行自定义拒绝策略全限定名即可,示例: - -```text -cn.hippo4j.example.core.handler.ErrorLogRejectedExecutionHandler -``` - -创建、修改线程池页面选择 `CustomRejectedPolicy(自定义 SPI 策略)`。 - -![](https://oss.open8gu.com/image-20220813173907814.png) - -拒绝策略触发时,完成上述代码效果,仅打印异常日志提示。 - -```text -2022-08-01 21:27:49.515 ERROR 48928 --- [ateHandler.test] r$CustomErrorLogRejectedExecutionHandler : 线程池抛出拒绝策略 -``` - -:::note -具体参考 `hippo4j-example/hippo4j-spring-boot-starter-example` 模块。 -::: diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/dev_manual/rejected-policy-info.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/dev_manual/rejected-policy-info.md deleted file mode 100644 index d5c68138..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/dev_manual/rejected-policy-info.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 内置拒绝策略 - -内置两种拒绝策略说明: - -**RunsOldestTaskPolicy**:添加新任务并由主线程运行最早的任务。 - -```java -public class RunsOldestTaskPolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - BlockingQueue workQueue = executor.getQueue(); - Runnable firstWork = workQueue.poll(); - boolean newTaskAdd = workQueue.offer(r); - if (firstWork != null) { - firstWork.run(); - } - if (!newTaskAdd) { - executor.execute(r); - } - } -} -``` - -**SyncPutQueuePolicy**:主线程把拒绝任务以阻塞的方式添加到队列。 - -```java -@Slf4j -public class SyncPutQueuePolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - try { - executor.getQueue().put(r); - } catch (InterruptedException e) { - log.error("Adding Queue task to thread pool failed.", e); - } - } -} -``` \ No newline at end of file diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/_category_.json deleted file mode 100644 index 72b1e151..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "快速开始", - "position": 3, - "link": { - "type": "generated-index" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/_category_.json deleted file mode 100644 index 78b3d9c4..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "依赖配置中心", - "position": 2, - "collapsed": true -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-default.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-default.md deleted file mode 100644 index 9c9e0fc9..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-default.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 参数默认配置 - -曾有多名小伙伴反馈说,项目中线程池一多,配置文件中配置就显得很臃肿。为此 hippo4j-config 开发出了动态线程池默认配置。 - -```yaml -spring: - dynamic: - thread-pool: - default-executor: - core-pool-size: 4 - maximum-pool-size: 6 - blocking-queue: ResizableCapacityLinkedBlockingQueue - queue-capacity: 1024 - execute-time-out: 1000 - keep-alive-time: 9999 - rejected-handler: AbortPolicy - active-alarm: 90 - capacity-alarm: 85 - alarm: true - allow-core-thread-time-out: true - notify: - interval: 5 - receives: chen.ma - executors: - - thread-pool-id: message-produce - - thread-pool-id: message-consume - core-pool-size: 80 - maximum-pool-size: 100 - execute-time-out: 1000 - notify: - interval: 6 - receives: chen.ma -``` - -`spring.dynamic.thread-pool.executors` 层级下,仅需要配置 `thread-pool-id`,其余配置从 `spring.dynamic.thread-pool.default-executor` 读取。 - -如果 `spring.dynamic.thread-pool.executors` 下配置和 `spring.dynamic.thread-pool.default-executor` 冲突,以前者为主。 - -通过该自定义配置方式,可减少大量重复线程池参数配置项,提高核心配置简洁度。 - -提示:`spring.dynamic.thread-pool.default-executor` 层级下参数,不提供动态刷新功能。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-monitor.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-monitor.md deleted file mode 100644 index 17d665e6..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-monitor.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 线程池监控 - -## 线程池监控配置 - -监控前置条件:需要先完成 hippo4j-config 的 [接入工作](/docs/user_docs/getting_started/config/hippo4j-config-start)。 - -接下来引入 SpringBoot Actuator。Spring 2.x 一般都有版本指定,所以这里不用写版本号。 - -```xml - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - -``` - -添加动态线程池监控相关配置: - -```yaml -management: - metrics: - export: - prometheus: - enabled: true - server: - port: 29999 # 可选配置,如果不配置该 port,直接使用 ${server.port} - endpoints: - web: - exposure: - include: '*' # 测试使用,开启了所有端点,生产环境不建议 * -spring: - dynamic: - thread-pool: - monitor: - enable: true # 是否开启采集线程池运行时数据 - collect-interval: 5000 # 采集线程池运行数据频率 - collect-types: micrometer # 采集线程池运行数据的类型。eg:log、micrometer。多个可以同时使用,默认 micrometer - initial-delay: 10000 # 项目启动后延迟多久进行采集 - thread-pool-types: dynamic # 采集线程池的类型。eg:dynamic、web、adapter。可任意配置,默认 dynamic -``` - -项目启动,访问 `http://localhost:29999/actuator/prometheus` 出现 `dynamic_thread_pool_` 前缀的指标,即为成功。 - -![](https://oss.open8gu.com/image-20220912220401016.png) - -## 配置 Prometheus - -通过 Docker 启动 Prometheus 服务。 - -```shell -docker run -d -p 9090:9090 --name prometheus prom/prometheus -``` - -添加 Prometheus 抽取数据任务。 - -```shell -# 进入 prometheus 容器内部 -docker exec -it prometheus /bin/sh -# 编辑 prometheus 配置文件 -vi /etc/prometheus/prometheus.yml -``` - -scrape_configs 节点下新添加一个 job,如果 Prometheus 是 Docker 方式部署,`{scrape_configs.static_configs.targets}` 需要写本机的 IP。 - -```yaml -scrape_configs: - - job_name: 'dynamic-thread-pool-job' - scrape_interval: 5s - metrics_path: '/actuator/prometheus' - static_configs: - - targets: [ '127.0.0.1:29999' ] -``` - -配置成功后 `exit` 退出容器,并进行 Prometheus 容器重启 `docker restart prometheus`。 - -访问 Prometheus 控制台 `http://localhost:9090/graph` 路径,能够展示相关指标即为配置成功。 - -![](https://oss.open8gu.com/image-20220912221237597.png) - -## 配置 Grafana - -```shell -docker run -d -p 3000:3000 --name=grafana grafana/grafana -``` - -访问 Grafana 地址,[http://localhost:3000](http://localhost:3000) 用户名密码:`admin` - -Grafana 访问 `http://localhost:3000/datasources` 导入 Prometheus 数据源。 - -![](https://oss.open8gu.com/image-20220912221646866.png) - -> 如果 Prometheus 为 Docker 方式部署,HTTP URL 需要为本地 IP,比如:http://192.168.1.5:9090 - -关注公众号 `龙台的技术笔记`,回复:`监控`,获取 Hippo4j Grafana DashBoard JSON 配置。 - -| 公众号 | 回复关键词 | -|:------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------:| -| ![](https://oss.open8gu.com/43_65f6020ed111b6bb3808ec338576bd6b.png?x-oss-process=image/resize,h_300,w_400) | ![](https://oss.open8gu.com/image-20220327171957444.png?x-oss-process=image/resize,h_300,w_400) | - -获取到 JSON 文件后,通过 `http://localhost:3000/dashboard/import` 将 JSON 文件导入至 Grafana DashBoard。 - -![](https://oss.open8gu.com/image-20220912225627272.png) - -下拉框内动态选择创建好的 Prometheus 数据源,并点击 `Import`。 - -![](https://oss.open8gu.com/image-20220912225700200.png) - -即可使用炫酷的 Hippo4j 动态线程池监控 DashBoard。大家伙儿也可以根据个人喜好进行定制 DashBoard,如果觉得有优化点,欢迎和我联系贡献。 - -![](https://oss.open8gu.com/image-20220912225813972.png) - -如果项目客户端启动多个示例,动态线程池监控效果图如下: - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-more.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-more.md deleted file mode 100644 index 2511b4f3..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-more.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 个性化配置 - -以下所述特性自 hippo4j-config v1.4.2 及以上版本提供,由 hippo4j 核心开发者 [@pizihao](https://github.com/pizihao) 完成相应功能开发。 - -## 需求背景 - -**1)容器及三方框架线程池自定义启用** - -最初设计容器线程池和三方框架线程池的动态变更是和启动无关的。也就是说,启动时不会根据配置文件中相关参数去修改两者对应的线程池配置。 - -这么设计的初衷是因为,不想让 hippo4j 过多的去介入框架原有的功能。因为容器和三方框架都支持线程池参数的自定义。 - -也就造成,可能你在配置中心配置了对应的容器和三方框架线程池参数,启动时是无效的。但当修改配置文件任一配置,容器和三方框架线程池配置将生效。 - -为了更好的用户体验,决定加入启用标识来控制:是否在项目初始化启动时,对容器和三方框架线程池参数进行修改。 - -**2)客户端集群个性化配置** - -大家都知道,hippo4j-config 是依赖配置中心做线程池配置动态变更。这种模式有一种缺点:改动配置文件后,所有客户端都会变更。 - -有些小伙伴希望 hippo4j-config 能够像 hippo4j-server 一样,能够针对单独的客户端进行配置变更。 - -## 容器及三方框架线程池自定义启用 - -容器及三方框架线程池添加启用配置,为了保持统一,动态线程池配置中也有该参数配置。配置项默认开启。 - -```yaml -spring: - dynamic: - thread-pool: - tomcat: - enable: true - executors: - - thread-pool-id: message-consume - enable: false - adapter-executors: - - threadPoolKey: 'input' - enable: true -``` - -## 客户端集群个性化配置 - -分别在动态线程池、容器线程池以及三方框架线程池配置下增加 `nodes` 配置节点,通过该配置可匹配需要变更的节点。 - -```yaml -spring: - dynamic: - thread-pool: - tomcat: - nodes: 192.168.1.5:*,192.168.1.6:8080 - executors: - - thread-pool-id: message-consume - nodes: 192.168.1.5:* - adapter-executors: - - threadPoolKey: 'input' - nodes: 192.168.1.5:* -``` - -来一段代码方法中的注释,大家就基本明白如何使用了。 - -```java -/** - * Matching nodes
- * nodes is ip + port.Get 'nodes' in the new Properties,Compare this with the ip + port of Application.
- * support prefix pattern matching. e.g:
- *
    - *
  • 192.168.1.5:* -- Matches all ports of 192.168.1.5
  • - *
  • 192.168.1.*:2009 -- Matches 2009 port of 192.168.1.*
  • - *
  • * -- all
  • - *
  • empty -- all
  • - *
- * The format of ip + port is ip : port. - */ -``` - -`nodes` 可与 `enable` 同时使用。如此,基于配置中心的动态线程池实现方式,将能够更方便的支持个性化需求。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md deleted file mode 100644 index a1885e0c..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 适配SpringBoot1x - -目前已支持 Nacos、Apollo 配置中心适配 SpringBoot 1.5.x 版本。 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-1x-starter - 1.5.0 - -``` - -Nacos SpringBoot 配置如下: - -```yaml -spring: - cloud: - nacos: - config: - ext-config: - - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP - refresh: true - server-addr: 127.0.0.1:8848 - dynamic: - thread-pool: - config-file-type: yml - nacos: - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP -``` - -Apollo SpringBoot 配置如下: - -```yaml -apollo: - autoUpdateInjectedSpringProperties: true - bootstrap: - eagerLoad: - enabled: true - enabled: true - namespaces: application - meta: http://127.0.0.1:8080 -app: - id: dynamic-threadpool-example -spring: - dynamic: - thread-pool: - apollo: - namespace: application -``` - -动态线程池通用配置如下: - -```yaml -management: - context-path: /actuator - security: - enabled: false -server: - port: 8091 - servlet: - context-path: /example -spring: - application: - name: dynamic-threadpool-example - dynamic: - thread-pool: - banner: true - check-state-interval: 5 - collect-type: micrometer - config-file-type: properties - enable: true - executors: - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-consume - thread-pool-id: message-consume - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-produce - thread-pool-id: message-produce - notify-platforms: - - platform: WECHAT - token: ac0426a5-c712-474c-9bff-72b8b8f5caff - profiles: - active: dev -``` - -具体 Demo 运行请参考以下示例模块,已验证对应线程池动态变更、报警以及运行时监控功能。 - -- `/hippo4j-config-nacos-spring-boot-1x-starter-example` -- `hippo4j-example/hippo4j-config-apollo-spring-boot-1x-starter-example` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-start.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-start.md deleted file mode 100644 index 6ead578b..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-start.md +++ /dev/null @@ -1,193 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 接入流程 - -Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 配置中心任选其一。 - -## hippo4j 配置 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-starter - 1.5.0 - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -server: - port: 8090 - servlet: - context-path: /example - -spring: - profiles: - active: dev - - dynamic: - thread-pool: - # 是否开启动态线程池 - enable: true - # 是否打印 banner - banner: true - # 是否开启线程池数据采集,对接 Micrometer、ES、Log 等 - collect: true - # 检查线程池状态,是否达到报警条件,单位毫秒 - check-state-interval: 3000 - # 通知报警平台,请替换为自己创建的群机器人 - notify-platforms: - - platform: 'WECHAT' - token: xxx - - platform: 'DING' - token: xxx - secret: xxx # 加签专属 - - platform: 'LARK' - token: xxx - # Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 任选其一 - nacos: - data-id: xxx - group: xxx - apollo: - namespace: xxxx - # 配置中心文件格式 - config-file-type: yml - # 支持 tomcat、undertow、jetty 三种容器线程池 - web: - core-pool-size: 100 - maximum-pool-size: 200 - keep-alive-time: 1000 - # 全局通知配置-是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位秒 - alarm-interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - # 动态线程池列表 - executors: - - thread-pool-id: 'message-consume' - # 核心线程数 - core-pool-size: 1 - # 最大线程数 - maximum-pool-size: 1 - # 阻塞队列名称,参考 BlockingQueueTypeEnum,支持 SPI - blocking-queue: 'LinkedBlockingQueue' - # 阻塞队列大小 - queue-capacity: 1 - # 执行超时时间,超过此时间发起报警,单位毫秒 - execute-time-out: 1000 - # 拒绝策略名称,参考 RejectedPolicyTypeEnum,支持 SPI - rejected-handler: 'AbortPolicy' - # 线程存活时间,单位秒 - keep-alive-time: 1024 - # 是否允许核心线程超时 - allow-core-thread-time-out: true - # 线程工厂名称前缀 - thread-name-prefix: 'message-consume' - # 是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 通知配置,线程池中通知配置如果存在,则会覆盖全局通知配置 - notify: - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位分钟 - interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - - thread-pool-id: 'message-produce' - core-pool-size: 1 - maximum-pool-size: 1 - queue-capacity: 1 - execute-time-out: 1000 - blocking-queue: 'LinkedBlockingQueue' - rejected-handler: 'AbortPolicy' - keep-alive-time: 1024 - allow-core-thread-time-out: true - thread-name-prefix: 'message-consume' - alarm: true - active-alarm: 80 - capacity-alarm: 80 - notify: - interval: 8 - receives: xxx -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从配置中心拉取。 - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/difference.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/difference.md deleted file mode 100644 index 549da02d..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/difference.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 运行模式介绍 - -1.1.0 版本发布后,Hippo4j 分为两种使用模式:轻量级依赖配置中心以及无中间件依赖版本。 - -![](https://oss.open8gu.com/image-20220319154626314.png) - -### Hippo4j config - -**轻量级动态线程池管理**,依赖 Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 等三方配置中心(任选其一)完成线程池参数动态变更,支持运行时报警、监控等功能。 - -> 监控功能配置详见:[线程池监控](/docs/user_docs/getting_started/config/hippo4j-config-monitor) - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) - -### Hippo4j server - -**部署 Hippo4j server 服务**,通过可视化 Web 界面完成线程池的创建、变更以及查看,不依赖三方中间件。 - -相比较 Hippo4j config,功能会更强大,但同时也引入了一定的复杂性。需要部署一个 Java 服务,以及依赖 MySQL 数据库。 - -![](https://oss.open8gu.com/1644032018254-min.gif) - -### 使用总结 - -| | Hippo4j config | Hippo4j server | -| ---- |-------------------------------------------------------|--------------------------------------------------------| -| 依赖 | Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 配置中心(任选其一) | 部署 Hippo4j server(内部无依赖中间件) | -| 使用 | 配置中心补充线程池相关参数 | Hippo4j server web 控制台添加线程池记录 | -| 功能 | 包含基础功能:参数动态化、运行时监控、报警等 | 基础功能之外扩展控制台界面、线程池堆栈查看、线程池运行信息实时查看、历史运行信息查看、线程池配置集群个性化等 | - -使用建议:根据公司情况选择,如果基本功能可以满足使用,选择 Hippo4j config 使用即可;如果希望更多的功能,可以选择 Hippo4j server。 - -**两者在进行替换的时候,无需修改业务代码**。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/hippo4j-adapter.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/hippo4j-adapter.md deleted file mode 100644 index 68a48288..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/hippo4j-adapter.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 三方框架线程池适配 - -Hippo4j 目前已支持的三方框架线程池列表: - -- Dubbo -- Hystrix -- RabbitMQ -- RocketMQ -- AlibabaDubbo -- RocketMQSpringCloudStream -- RabbitMQSpringCloudStream - -引入 Hippo4j Server 或 Core 的 Maven Jar 坐标后,还需要引入对应的框架适配 Jar: - -```xml - - cn.hippo4j - - hippo4j-spring-boot-starter-adapter-dubbo - - hippo4j-spring-boot-starter-adapter-alibaba-dubbo - - hippo4j-spring-boot-starter-adapter-hystrix - - hippo4j-spring-boot-starter-adapter-rabbitmq - - hippo4j-spring-boot-starter-adapter-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq - 1.5.0 - -``` - -如果想省事,仅需引入一个全量包,框架底层会根据条件判断加载具体线程池适配器。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-adapter-all - 1.5.0 - -``` - -## Hippo4j Server - -Hippo4j Server 仅需要引入上述 Jar 包,即可在 Hippo4j Server 的控制台进行查看及修改三方框架线程池。 - -![](https://oss.open8gu.com/image-20220531194810047.png) - -## Hippo4j Config - -Hippo4j Config 除了依赖上述适配 Jar 包外,还需要在配置中心添加以下配置项。 - -```yaml -spring: - dynamic: - thread-pool: - # 省略其它配置 - adapter-executors: - # threadPoolKey 代表线程池标识 - - threadPoolKey: 'input' - # mark 为三方线程池框架类型,参见文初已支持框架集合 - mark: 'RocketMQSpringCloudStream' - corePoolSize: 10 - maximumPoolSize: 10 -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/img/docsVersionDropdown.png b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/img/docsVersionDropdown.png deleted file mode 100644 index 97e41646..00000000 Binary files a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/img/docsVersionDropdown.png and /dev/null differ diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/img/grafana-monitor.jpg b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/img/grafana-monitor.jpg deleted file mode 100644 index 336bd980..00000000 Binary files a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/img/grafana-monitor.jpg and /dev/null differ diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/img/localeDropdown.png b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/img/localeDropdown.png deleted file mode 100644 index e257edc1..00000000 Binary files a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/img/localeDropdown.png and /dev/null differ diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/server/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/server/_category_.json deleted file mode 100644 index 4063c17f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/server/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "无中间件依赖", - "position": 3, - "collapsed": true -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-config.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-config.md deleted file mode 100644 index e1ef853f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-config.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 服务端配置 - -`hippo4j.core.clean-history-data-enable` - -是否开启线程池历史数据清洗,默认开启。 - -`hippo4j.core.clean-history-data-period` - -线程池历史数据保留时间,默认值:30,单位分钟。 - -服务端会保留这个配置时间的数据,超过这个时间则会被清理。比如按照默认值 30 分钟来说,12:00 收集到的数据,12:30 就会被清理删除。 - -`hippo4j.core.monitor.report-type` - -客户端监控上报服务端类型,可选值:http、netty,默认 http。服务端开启 netty 配置后,需要在客户端对应开启才可生效。用来应对大量动态线程池监控场景。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-monitor.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-monitor.md deleted file mode 100644 index 08d89fa2..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-monitor.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 线程池监控 - -Server 模式默认内置线程池运行时采集和监控功能,如果想要使用 Prometheus + Grafana 的方式可以查看以下内容。 - -## 线程池监控配置 - -接下来引入 SpringBoot Actuator。Spring 2.x 一般都有版本指定,所以这里不用写版本号。 - -```xml - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - -``` - -添加动态线程池监控相关配置: - -```yaml -management: - metrics: - export: - prometheus: - enabled: true - server: - port: 29999 # 可选配置,如果不配置该 port,直接使用 ${server.port} - endpoints: - web: - exposure: - include: '*' # 测试使用,开启了所有端点,生产环境不建议 * -spring: - dynamic: - thread-pool: - monitor: - enable: true # 是否开启采集线程池运行时数据 - collect-interval: 5000 # 采集线程池运行数据频率 - collect-types: server,micrometer # 采集线程池运行数据的类型。eg:server、micrometer。多个可以同时使用,默认 server - initial-delay: 10000 # 项目启动后延迟多久进行采集 - thread-pool-types: dynamic # 采集线程池的类型。eg:dynamic、web、adapter。可任意配置,默认 dynamic -``` - -如果使用 `micrometer` 类型的监控指标,需要添加以下依赖。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-monitor-micrometer - 1.5.0 - -``` - -项目启动,访问 `http://localhost:29999/actuator/prometheus` 出现 `dynamic_thread_pool_` 前缀的指标,即为成功。 - -![](https://oss.open8gu.com/image-20220912220401016.png) - -## 配置 Prometheus - -通过 Docker 启动 Prometheus 服务。 - -```shell -docker run -d -p 9090:9090 --name prometheus prom/prometheus -``` - -添加 Prometheus 抽取数据任务。 - -```shell -# 进入 prometheus 容器内部 -docker exec -it prometheus /bin/sh -# 编辑 prometheus 配置文件 -vi /etc/prometheus/prometheus.yml -``` - -scrape_configs 节点下新添加一个 job,如果 Prometheus 是 Docker 方式部署,`{scrape_configs.static_configs.targets}` 需要写本机的 IP。 - -```yaml -scrape_configs: - - job_name: 'dynamic-thread-pool-job' - scrape_interval: 5s - metrics_path: '/actuator/prometheus' - static_configs: - - targets: [ '127.0.0.1:29999' ] -``` - -配置成功后 `exit` 退出容器,并进行 Prometheus 容器重启 `docker restart prometheus`。 - -访问 Prometheus 控制台 `http://localhost:9090/graph` 路径,能够展示相关指标即为配置成功。 - -![](https://oss.open8gu.com/image-20220912221237597.png) - -## 配置 Grafana - -```shell -docker run -d -p 3000:3000 --name=grafana grafana/grafana -``` - -访问 Grafana 地址,[http://localhost:3000](http://localhost:3000) 用户名密码:`admin` - -Grafana 访问 `http://localhost:3000/datasources` 导入 Prometheus 数据源。 - -![](https://oss.open8gu.com/image-20220912221646866.png) - -> 如果 Prometheus 为 Docker 方式部署,HTTP URL 需要为本地 IP,比如:http://192.168.1.5:9090 - -关注公众号 `龙台的技术笔记`,回复:`监控`,获取 Hippo4j Grafana DashBoard JSON 配置。 - -| 公众号 | 回复关键词 | -|:------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------:| -| ![](https://oss.open8gu.com/43_65f6020ed111b6bb3808ec338576bd6b.png?x-oss-process=image/resize,h_300,w_400) | ![](https://oss.open8gu.com/image-20220327171957444.png?x-oss-process=image/resize,h_300,w_400) | - -获取到 JSON 文件后,通过 `http://localhost:3000/dashboard/import` 将 JSON 文件导入至 Grafana DashBoard。 - -![](https://oss.open8gu.com/image-20220912225627272.png) - -下拉框内动态选择创建好的 Prometheus 数据源,并点击 `Import`。 - -![](https://oss.open8gu.com/image-20220912225700200.png) - -即可使用炫酷的 Hippo4j 动态线程池监控 DashBoard。大家伙儿也可以根据个人喜好进行定制 DashBoard,如果觉得有优化点,欢迎和我联系贡献。 - -![](https://oss.open8gu.com/image-20220912225813972.png) - -如果项目客户端启动多个示例,动态线程池监控效果图如下: - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-start.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-start.md deleted file mode 100644 index 17ec5224..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-start.md +++ /dev/null @@ -1,127 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 接入流程 - -部署服务端,参考 [部署手册](/docs/user_docs/ops/hippo4j-server-deploy)。 - -服务端创建 [租户、项目](/community/faq#租户和项目在-hippo4j-中是什么意思) 和线程池记录。 - -需要注意,项目 ID 需要与配置文件 `{application.name}` 保持一致。 - -:::note -租户、项目、线程池 ID 如果由多个词组成,建议以 - 进行分割。比如:message-center。 -::: - -## Hippo4j 配置 - -SpringBoot Pom 引入 Hippo4j Starter Jar。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter - 1.5.0 - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -spring: - profiles: - active: dev - application: - # 服务端创建的项目 id 需要与 application.name 保持一致 - name: dynamic-threadpool-example - dynamic: - thread-pool: - # 服务端地址 - server-addr: http://localhost:6691 - # 用户名 - username: admin - # 密码 - password: 123456 - # 租户 id, 对应 tenant 表 - namespace: prescription - # 项目 id, 对应 item 表 - item-id: ${spring.application.name} -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从 hippo4j-server 服务拉取。 - -:::note -创建线程池时建议填充实际的参数。如果在连接 Hippo4j Server 端失败时,会使用填充配置创建线程池。 -::: - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` - diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/intro.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/intro.md deleted file mode 100644 index af470274..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/intro.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 简介 - -## 线程池痛点 - -线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。在高并发以及大批量的任务处理场景,线程池的使用是必不可少的。 - -如果有在项目中实际使用线程池,相信你可能会遇到以下痛点: - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -## 什么是 Hippo4j - -Hippo4j 通过对 JDK 线程池增强,以及扩展三方框架底层线程池等功能,为业务系统提高线上运行保障能力。 - -提供以下功能支持: - -- 全局管控 - 管理应用线程池实例。 - -- 动态变更 - 应用运行时动态变更线程池参数,包括不限于:核心、最大线程数、阻塞队列容量、拒绝策略等。 -- 通知报警 - 内置四种报警通知策略,线程池活跃度、容量水位、拒绝策略以及任务执行时间超长。 -- 运行监控 - 实时查看线程池运行时数据,最近半小时线程池运行数据图表展示。 -- 功能扩展 - 支持线程池任务传递上下文;项目关闭时,支持等待线程池在指定时间内完成任务。 -- 多种模式 - 内置两种使用模式:[依赖配置中心](https://hippo4j.cn/docs/user_docs/getting_started/config/hippo4j-config-start) 和 [无中间件依赖](https://hippo4j.cn/docs/user_docs/getting_started/server/hippo4j-server-start)。 -- 容器管理 - Tomcat、Jetty、Undertow 容器线程池运行时查看和线程数变更。 -- 框架适配 - Dubbo、Hystrix、RabbitMQ、RocketMQ 等消费线程池运行时数据查看和线程数变更。 - -## 快速开始 - -对于本地演示目的,请参阅 [Quick start](https://hippo4j.cn/docs/user_docs/user_guide/quick-start) - -演示环境: [http://console.hippo4j.cn/index.html](http://console.hippo4j.cn/index.html) - -## 接入登记 - -更多接入的公司,欢迎在 [登记地址](https://github.com/opengoofy/hippo4j/issues/13) 登记,登记仅仅为了产品推广。 - -## 联系我 - -开源不易,右上角点个 Star 鼓励一下吧! - -如果大家想要实时关注 Hippo4j 更新的文章以及分享的干货的话,可以关注我的公众号。 - -使用过程中有任何问题,或者对项目有什么建议,关注公众号回复:加群,和 1000+ 志同道合的朋友交流讨论。 - -![](https://oss.open8gu.com/image-20230317191041262-mini.png) - -## 友情链接 - -- [[ LiteFlow ]](https://liteflow.yomahub.com/):轻量,快速,稳定可编排的组件式规则引擎。 - -- [[ Sa-Token ]](https://github.com/dromara/sa-token):一个轻量级 java 权限认证框架,让鉴权变得简单、优雅! -- [[ HertzBeat ]](https://github.com/dromara/hertzbeat):易用友好的云监控系统, 无需 Agent, 强大自定义监控能力。 -- [[ JavaGuide ]](https://github.com/Snailclimb/JavaGuide):一份涵盖大部分 Java 程序员所需要掌握的核心知识。 -- [[ toBeBetterJavaer ]](https://github.com/itwanger/toBeBetterJavaer):一份通俗易懂、风趣幽默的 Java 学习指南。 - -## 贡献者 - -感谢所有为项目作出贡献的开发者。如果有意贡献,参考 [good first issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/ops/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/ops/_category_.json deleted file mode 100644 index d5b7d1e8..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/ops/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "运维指南", - "position": 4, - "link": { - "type": "generated-index" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/ops/hippo4j-server-deploy.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/ops/hippo4j-server-deploy.md deleted file mode 100644 index ffbc2306..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/ops/hippo4j-server-deploy.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 源码包部署 - -[RELEASE](https://github.com/opengoofy/hippo4j/releases) 页面下载对应版本并进行解压。 - -## 初始化 - -修改数据库相关信息。 - -```txt -/conf/application.properties -``` - -如果是新运行 Hippo4j,数据库执行下述 SQL 脚本即可。 - -```txt -/conf/hippo4j_manager.sql -``` - -如果是对已运行 Hippo4j 升级,请查看 `/conf/sql-upgrade` 目录下,是否有目标版本对应的升级脚本。 - -## 直接运行 - -Mac Linux 启动执行。 - -```txt -sh ./bin/startup.sh -``` - -Windows 启动执行。 - -```txt -bin/startup.cmd -``` - -## 访问控制台 - -启动成功后,访问链接。用户名密码:admin 123456 - -```txt -localhost:6691/index.html -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/ops/server-docker.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/ops/server-docker.md deleted file mode 100644 index 826bb99f..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/ops/server-docker.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Docker部署 - -## 镜像启动 - -Docker 镜像默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -或者,底层存储数据库切换为 MySQL。`DATASOURCE_HOST` 需要切换为本地 IP,不能使用 `127.0.0.1` 或 `localhost`。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server \ --e DATASOURCE_MODE=mysql \ --e DATASOURCE_HOST=xxx.xxx.xxx.xxx \ --e DATASOURCE_PORT=3306 \ --e DATASOURCE_DB=hippo4j_manager \ --e DATASOURCE_USERNAME=root \ --e DATASOURCE_PASSWORD=root \ -hippo4j/hippo4j-server -``` - -访问 Server 控制台,路径 `http://localhost:6691/index.html` ,默认用户名密码:admin / 123456 - -## 镜像构建 - -如果想要自定义镜像,可以通过以下命令快速构建 Hippo4j Server: - -方式一: - -```shell -# 进入到 hippo4j-server/hippo4j-bootstrap 工程路径下 -mvn clean package -Dskip.spotless.apply=true -# 默认打包是打包的 tag 是 latest -docker build -t hippo4j/hippo4j-server ../hippo4j-bootstrap -``` - -方式二: - -通过 `maven docker plugin` - -```shell -# 进入到 hippo4j-server 工程路径下 -mvn clean package -DskipTests -Dskip.spotless.apply=true docker:build -``` diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/other/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/other/_category_.json deleted file mode 100644 index a74d7432..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/other/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "其它", - "position": 6, - "link": { - "type": "generated-index" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/other/official-ccounts.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/other/official-ccounts.md deleted file mode 100644 index 63e07ea7..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/other/official-ccounts.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 推荐公众号 - -## JavaGuide - -专注Java后端学习和大厂面试的公众号! - -![](https://oss.open8gu.com/JavaGuide.png) - -## HelloGitHub - -HelloGitHub,专注于开源社区技术和知识内容分享。 - -![](https://oss.open8gu.com/HelloGitHub.png) - -## macrozheng - -专注Java技术分享,解析优质开源项目。涵盖SpringBoot、SpringCloud、Docker、K8S等实用技术,作者Github开源项目mall(50K+Star)。 - -![](https://oss.open8gu.com/macrozheng.png) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/other/operation.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/other/operation.md deleted file mode 100644 index 62661c55..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/other/operation.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 公众号合作 - -## 推荐须知 - -hippo4j 作为一款新兴动态线程池框架,开源出来的时间比较晚,目前迫切需要不同的途径进行推广。 - -如果您是公众号运营者或者开源爱好者,欢迎将 hippo4j 推荐给您的粉丝。 - -1. 您无需为 hippo4j 专门撰写文案,只需要直接导入 [推荐文章](https://mp.weixin.qq.com/s/JTTwcBEiK_MnFcPTZl3zGA) 即可。 -2. 在文章底部或内容中留下项目官网或者 GitHub 仓库链接。 -3. 文章需至少 1000+ 的阅读量。 - -作为推荐回报,hippo4j 可以为您: - -1. 在框架官方文档 [推荐公众号](/docs/user_docs/other/official-ccounts) 页面处留下您的公众号二维码。 -2. 在框架官方交流群里@全体成员推广您的公众号一次,附带介绍语。 -3. 您的公众号所有新推文章都可以将链接发送到 hippo4j 交流群中,增加阅读量。 - -如果您还有除公众号以外的其它途径可以与 hippo4j 相互推荐,欢迎 [加群沟通](/group)。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/other/question.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/other/question.md deleted file mode 100644 index 49fd4d77..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/other/question.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 问题提问 - -文档引用自:[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way) - -## 在提问之前 - -在你准备要通过电子邮件、新闻群组或者聊天室提出技术问题前,请先做到以下事情: - -1. 尝试在你准备提问的论坛的旧文章中搜索答案。 -2. 尝试上网搜索以找到答案。 -3. 尝试阅读手册以找到答案。 -4. 尝试阅读常见问题文件(FAQ)以找到答案。 -5. 尝试自己检查或试验以找到答案。 -6. 向你身边的强者朋友打听以找到答案。 -7. 如果你是程序开发者,请尝试阅读源代码以找到答案。 - -当你提出问题的时候,请先表明你已经做了上述的努力;这将有助于树立你并不是一个不劳而获且浪费别人的时间的提问者。如果你能一并表达在做了上述努力的过程中所**学到**的东西会更好,因为我们更乐于回答那些表现出能从答案中学习的人的问题。 - -## 当你提问时 - -### 慎选提问的论坛 -小心选择你要提问的场合。如果你做了下述的事情,你很可能被忽略掉或者被看作失败者: - -* 在与主题不合的论坛上贴出你的问题。 -* 在探讨进阶技术问题的论坛张贴非常初级的问题;反之亦然。 -* 在太多的不同新闻群组上重复转贴同样的问题(cross-post)。 -* 向既非熟人也没有义务解决你问题的人发送私人电邮。 - -因此,第一步是找到对的论坛。再说一次,Google 和其它搜索引擎还是你的朋友,用它们来找到与你遭遇到困难的软硬件问题最相关的网站。通常那儿都有常见问题(FAQ)、邮件列表及相关说明文件的链接。如果你的努力(包括**阅读** FAQ)都没有结果,网站上也许还有报告 Bug(Bug-reporting)的流程或链接,如果是这样,链过去看看。 - -### 使用有意义且描述明确的标题 - -在邮件列表、新闻群组或论坛中,大约 50 字以内的标题是抓住资深专家注意力的好机会。别用喋喋不休的帮帮忙、跪求、急(更别说救命啊!!!!这样让人反感的话,用这种标题会被条件反射式地忽略)来浪费这个机会。不要妄想用你的痛苦程度来打动我们,而应该是在这点空间中使用极简单扼要的描述方式来提出问题。 - -一个好标题范例是`目标 —— 差异`式的描述,许多技术支持组织就是这样做的。在`目标`部分指出是哪一个或哪一组东西有问题,在`差异`部分则描述与期望的行为不一致的地方。 - -> 蠢问题:救命啊!我的笔记本电脑不能正常显示了! - -> 聪明问题:X.org 6.8.1 的鼠标指针会变形,某牌显卡 MV1005 芯片组。 - -> 更聪明问题:X.org 6.8.1 的鼠标指针,在某牌显卡 MV1005 芯片组环境下 - 会变形。 - -### 使用清晰、正确、精准且合乎语法的语句 - -我们从经验中发现,粗心的提问者通常也会粗心地写程序与思考(我敢打包票)。回答粗心大意者的问题很不值得,我们宁愿把时间耗在别处。 - -正确的拼写、标点符号和大小写是很重要的。一般来说,如果你觉得这样做很麻烦,不想在乎这些,那我们也觉得麻烦,不想在乎你的提问。花点额外的精力斟酌一下字句,用不着太僵硬与正式 —— 事实上,黑客文化很看重能准确地使用非正式、俚语和幽默的语句。但它**必须很**准确,而且有迹象表明你是在思考和关注问题。 - -### 精确地描述问题并言之有物 - -* 仔细、清楚地描述你的问题或 Bug 的症状。 -* 描述问题发生的环境(机器配置、操作系统、应用程序、以及相关的信息),提供经销商的发行版和版本号(如:`Fedora Core 4`、`Slackware 9.1`等)。 -* 描述在提问前你是怎样去研究和理解这个问题的。 -* 描述在提问前为确定问题而采取的诊断步骤。 -* 描述最近做过什么可能相关的硬件或软件变更。 -* 尽可能地提供一个可以`重现这个问题的可控环境`的方法。 - -尽量去揣测一个黑客会怎样反问你,在你提问之前预先将黑客们可能提出的问题回答一遍。 - -以上几点中,当你报告的是你认为可能在代码中的问题时,给黑客一个可以重现你的问题的环境尤其重要。当你这么做时,你得到有效的回答的机会和速度都会大大的提升。 - -[Simon Tatham](http://www.chiark.greenend.org.uk/~sgtatham/) 写过一篇名为《[如何有效的报告 Bug](http://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html)》的出色文章。强力推荐你也读一读。 - -### 话不在多而在精 - -你需要提供精确有内容的信息。这并不是要求你简单的把成堆的出错代码或者资料完全转录到你的提问中。如果你有庞大而复杂的测试样例能重现程序挂掉的情境,尽量将它剪裁得越小越好。 - -这样做的用处至少有三点。 -第一,表现出你为简化问题付出了努力,这可以使你得到回答的机会增加; -第二,简化问题使你更有可能得到**有用**的答案; -第三,在精炼你的 bug 报告的过程中,你很可能就自己找到了解决方法或权宜之计。 - -### 别动辄声称找到 Bug - -当你在使用软件中遇到问题,除非你非常、**非常**的有根据,不要动辄声称找到了 Bug。提示:除非你能提供解决问题的源代码补丁,或者提供回归测试来表明前一版本中行为不正确,否则你都多半不够完全确信。这同样适用在网页和文件,如果你(声称)发现了文件的`Bug`,你应该能提供相应位置的修正或替代文件。 - -请记得,还有其他许多用户没遇到你发现的问题,否则你在阅读文件或搜索网页时就应该发现了(你在抱怨前[已经做了这些,是吧](#在提问之前)?)。这也意味着很有可能是你弄错了而不是软件本身有问题。 - -编写软件的人总是非常辛苦地使它尽可能完美。如果你声称找到了 Bug,也就是在质疑他们的能力,即使你是对的,也有可能会冒犯到其中某部分人。当你在标题中嚷嚷着有`Bug`时,这尤其严重。 - -提问时,即使你私下非常确信已经发现一个真正的 Bug,最好写得像是**你**做错了什么。如果真的有 Bug,你会在回复中看到这点。这样做的话,如果真有 Bug,维护者就会向你道歉,这总比你惹恼别人然后欠别人一个道歉要好一点。 - -### 低声下气不能代替你的功课 - -有些人明白他们不该粗鲁或傲慢的提问并要求得到答复,但他们选择另一个极端 —— 低声下气:`我知道我只是个可悲的新手,一个撸瑟,但...`。这既使人困扰,也没有用,尤其是伴随着与实际问题含糊不清的描述时更令人反感。 - -别用原始灵长类动物的把戏来浪费你我的时间。取而代之的是,尽可能清楚地描述背景条件和你的问题情况。这比低声下气更好地定位了你的位置。 - -有时网页论坛会设有专为新手提问的版面,如果你真的认为遇到了初学者的问题,到那去就是了,但一样别那么低声下气。 - -### 描述问题症状而非你的猜测 - -告诉黑客们你认为问题是怎样造成的并没什么帮助。(如果你的推断如此有效,还用向别人求助吗?),因此要确信你原原本本告诉了他们问题的症状,而不是你的解释和理论;让黑客们来推测和诊断。如果你认为陈述自己的猜测很重要,清楚地说明这只是你的猜测,并描述为什么它们不起作用。 - -**蠢问题** - -> 我在编译内核时接连遇到 SIG11 错误, -> 我怀疑某条飞线搭在主板的走线上了,这种情况应该怎样检查最好? - -**聪明问题** - -> 我的组装电脑是 FIC-PA2007 主机板搭载 AMD K6/233 CPU(威盛 Apollo VP2 芯片组), -> 256MB Corsair PC133 SDRAM 内存,在编译内核时,从开机 20 分钟以后就频频产生 SIG11 错误, -> 但是在头 20 分钟内从没发生过相同的问题。重新启动也没有用,但是关机一晚上就又能工作 20 分钟。 -> 所有内存都换过了,没有效果。相关部分的标准编译记录如下… - -由于以上这点似乎让许多人觉得难以配合,这里有句话可以提醒你:`所有的诊断专家都来自密苏里州。` 美国国务院的官方座右铭则是:`让我看看`(出自国会议员 Willard D. Vandiver 在 1899 年时的讲话:`我来自一个出产玉米,棉花,牛蒡和民主党人的国家,滔滔雄辩既不能说服我,也不会让我满意。我来自密苏里州,你必须让我看看。`) 针对诊断者而言,这并不是一种怀疑,而只是一种真实而有用的需求,以便让他们看到的是与你看到的原始证据尽可能一致的东西,而不是你的猜测与归纳的结论。所以,大方的展示给我们看吧! - -### 按发生时间先后列出问题症状 - -问题发生前的一系列操作,往往就是对找出问题最有帮助的线索。因此,你的说明里应该包含你的操作步骤,以及机器和软件的反应,直到问题发生。在命令行处理的情况下,提供一段操作记录(例如运行脚本工具所生成的),并引用相关的若干行(如 20 行)记录会非常有帮助。 - -如果挂掉的程序有诊断选项(如 -v 的详述开关),试着选择这些能在记录中增加调试信息的选项。记住,`多`不等于`好`。试着选取适当的调试级别以便提供有用的信息而不是让读者淹没在垃圾中。 - -如果你的说明很长(如超过四个段落),在开头简述问题,接下来再按时间顺序详述会有所帮助。这样黑客们在读你的记录时就知道该注意哪些内容了。 - -### 描述目标而不是过程 - -如果你想弄清楚如何做某事(而不是报告一个 Bug),在开头就描述你的目标,然后才陈述重现你所卡住的特定步骤。 - -经常寻求技术帮助的人在心中有个更高层次的目标,而他们在自以为能达到目标的特定道路上被卡住了,然后跑来问该怎么走,但没有意识到这条路本身就有问题。结果要费很大的劲才能搞定。 - -**蠢问题** - -> 我怎样才能从某绘图程序的颜色选择器中取得十六进制的 RGB 值? - -**聪明问题** - -> 我正试着用替换一幅图片的色码(color table)成自己选定的色码,我现在知道的唯一方法是编辑每个色码区块(table slot), -> 但却无法从某绘图程序的颜色选择器取得十六进制的 RGB 值。 - -第二种提问法比较聪明,你可能得到像是```建议采用另一个更合适的工具```的回复。 - -### 清楚明确的表达你的问题以及需求 - -漫无边际的提问是近乎无休无止的时间黑洞。最有可能给你有用答案的人通常也正是最忙的人(他们忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞相当厌恶,所以他们也倾向于厌恶那些漫无边际的提问。 - -如果你明确表述需要回答者做什么(如提供指点、发送一段代码、检查你的补丁、或是其他等等),就最有可能得到有用的答案。因为这会定出一个时间和精力的上限,便于回答者能集中精力来帮你。这么做很棒。 - -要理解专家们所处的世界,请把专业技能想像为充裕的资源,而回复的时间则是稀缺的资源。你要求他们奉献的时间越少,你越有可能从真正专业而且很忙的专家那里得到解答。 - -所以,界定一下你的问题,使专家花在辨识你的问题和回答所需要付出的时间减到最少,这技巧对你有用答案相当有帮助 —— 但这技巧通常和简化问题有所区别。因此,问`我想更好地理解 X,可否指点一下哪有好一点说明?`通常比问`你能解释一下 X 吗?`更好。如果你的代码不能运作,通常请别人看看哪里有问题,比要求别人替你改正要明智得多。 - -### 礼多人不怪,而且有时还很有帮助 - -彬彬有礼,多用`请`和`谢谢您的关注`,或`谢谢你的关照`。让大家都知道你对他们花时间免费提供帮助心存感激。 - -坦白说,这一点并没有比使用清晰、正确、精准且合乎语法和避免使用专用格式重要(也不能取而代之)。黑客们一般宁可读有点唐突但技术上鲜明的 Bug 报告,而不是那种有礼但含糊的报告。(如果这点让你不解,记住我们是按问题能教给我们什么来评价问题的价值的) - -然而,如果你有一串的问题待解决,客气一点肯定会增加你得到有用回应的机会。 - -(我们注意到,自从本指南发布后,从资深黑客那里得到的唯一严重缺陷反馈,就是对预先道谢这一条。一些黑客觉得`先谢了`意味着事后就不用再感谢任何人的暗示。我们的建议是要么先说`先谢了`,**然后**事后再对回复者表示感谢,或者换种方式表达感激,譬如用`谢谢你的关注`或`谢谢你的关照`。) - -## 不该问的问题 - -以下是几个经典蠢问题,以及黑客没回答时心中所想的: - -问题:[我能在哪找到 X 程序或 X 资源?](#q1) - -问题:[我怎样用 X 做 Y?](#q2) - -问题:[我的程序/设定/SQL 语句没有用](#q3) - -问题:[我的 Windows 电脑有问题,你能帮我吗?](#q4) - -问题:[我的程序不会动了,我认为系统工具 X 有问题](#q5) - -问题:[我在安装 Linux(或者 X )时有问题,你能帮我吗?](#q6) - -问题:[我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢?](#q7) - ---- - -> 问题:我能在哪找到 X 程序或 X 资源? - -回答:就在我找到它的地方啊,白痴 —— 搜索引擎的那一头。天哪!难道还有人不会用 [Google](https://www.google.com) 吗? - -> 问题:我怎样用 X 做 Y? - -回答:如果你想解决的是 Y ,提问时别给出可能并不恰当的方法。这种问题说明提问者不但对 X 完全无知,也对 Y 要解决的问题糊涂,还被特定形势禁锢了思维。最好忽略这种人,等他们把问题搞清楚了再说。 - -> 问题:我的{程序/设定/SQL 语句}没有用 - -回答:这不算是问题吧,我对要我问你二十个问题才找得出你真正问题的问题没兴趣 —— 我有更有意思的事要做呢。在看到这类问题的时候,我的反应通常不外如下三种 - -* 你还有什么要补充的吗? -* 真糟糕,希望你能搞定。 -* 这关我屁事? - -> 问题:我的 Windows 电脑有问题,你能帮我吗? - -回答:能啊,扔掉微软的垃圾,换个像 Linux 或 BSD 的开源操作系统吧。 - -注意:如果程序有官方版 Windows 或者与 Windows 有互动(如 Samba),你**可以**问与 Windows 相关的问题,只是别对问题是由 Windows 操作系统而不是程序本身造成的回复感到惊讶, 因为 Windows 一般来说实在太烂,这种说法通常都是对的。 - -> 问题:我的程序不会动了,我认为系统工具 X 有问题 - -回答:你完全有可能是第一个注意到被成千上万用户反复使用的系统调用与函数库文件有明显缺陷的人,更有可能的是你完全没有根据。不同凡响的说法需要不同凡响的证据,当你这样声称时,你必须有清楚而详尽的缺陷说明文件作后盾。 - -> 问题:我在安装 Linux(或者 X )时有问题,你能帮我吗? - -回答:不能,我只有亲自在你的电脑上动手才能找到毛病。还是去找你当地的 Linux 使用群组者寻求实际的指导吧(你能在[这儿](http://www.linux.org/groups/index.html)找到用户群组的清单)。 - -注意:如果安装问题与某 Linux 的发行版有关,在它的邮件列表、论坛或本地用户群组中提问也许是恰当的。此时,应描述问题的准确细节。在此之前,先用 `Linux` 和**所有**被怀疑的硬件作关键词仔细搜索。 - -> 问题:我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢? - -回答:想要这样做,说明了你是个卑鄙小人;想找个黑客帮你,说明你是个白痴! - -## 好问题与蠢问题 - -最后,我将透过举一些例子,来说明怎样聪明的提问;同一个问题的两种问法被放在一起,一种是愚蠢的,另一种才是明智的。 - -**蠢问题**: - -> 我从 foo 项目找来的源码没法编译。它怎么这么烂? - -他觉得都是别人的错,这个傲慢自大的提问者。 - -**聪明问题**: - -> foo 项目代码在 Nulix 6.2 版下无法编译通过。我读过了 FAQ,但里面没有提到跟 Nulix 有关的问题。这是我编译过程的记录,我有什么做的不对的地方吗? - -提问者已经指明了环境,也读过了 FAQ,还列出了错误,并且他没有把问题的责任推到别人头上,他的问题值得被关注。 - -**蠢问题**: - -> 我的主机板有问题了,谁来帮我? - -某黑客对这类问题的回答通常是:`好的,还要帮你拍拍背和换尿布吗?`,然后按下删除键。 - -**聪明问题**: - -> 我在 S2464 主机板上试过了 X 、 Y 和 Z ,但没什么作用,我又试了 A 、 B 和 C 。请注意当我尝试 C 时的奇怪现象。显然 florbish 正在 grommicking,但结果出人意料。通常在 Athlon MP 主机板上引起 grommicking 的原因是什么?有谁知道接下来我该做些什么测试才能找出问题? - -## 如果得不到回答 - -如果仍得不到回答,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。 - -总的来说,简单的重复张贴问题是个很糟的点子。这将被视为无意义的喧闹。有点耐心,知道你问题答案的人可能生活在不同的时区,可能正在睡觉,也有可能你的问题一开始就没有组织好。 - -你可以通过其他渠道获得帮助,这些渠道通常更适合初学者的需要。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/user_guide/_category_.json b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/user_guide/_category_.json deleted file mode 100644 index 9c505a51..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/user_guide/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "用户指南", - "position": 2, - "link": { - "type": "generated-index", - "description": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。" - } -} diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/user_guide/frame.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/user_guide/frame.md deleted file mode 100644 index 5992f735..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/user_guide/frame.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 为什么写 - -[美团线程池文章](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html "美团线程池文章") 介绍中,因为业务对线程池参数没有合理配置,触发过几起生产事故,进而引发了一系列思考。最终决定封装线程池动态参数调整,扩展线程池监控以及消息报警等功能。 - -在开源平台找了挺多动态线程池项目,从功能性以及健壮性而言,个人感觉不满足企业级应用。 - -因为对动态线程池比较感兴趣,加上想写一个有意义的项目,所以决定自己来造一个轻量级的轮子。 - -想给项目起一个简单易记的名字,类似于 Eureka、Nacos、Redis;后和朋友商量,决定命名:**Hippo4j**。 - -![](https://oss.open8gu.com/动态线程池功能架构-1.jpg) - -## 它解决了什么问题 - -线程池在业务系统应该都有使用到,帮助业务流程提升效率以及管理线程,多数场景应用于大量的异步任务处理。 - -虽然线程池提供了我们许多便利,但也并非尽善尽美,比如下面这些问题就无法很好解决。 - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 - -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 - -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 - -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 - -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 - -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 - -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -Hippo4j 很好解决了这些问题,它将业务中所有线程池统一管理,增强原生线程池系列功能。 - -## 它有什么特性 - -应用系统中线程池并不容易管理。参考美团的设计,Hippo4j 按照租户、项目、线程池的维度划分。再加上系统权限,让不同的开发、管理人员负责自己系统的线程池操作。 - -举个例子,小编在一家公司的公共组件团队,团队中负责消息、短链接网关等项目。公共组件是租户,消息或短链接就是项目。 - -Hippo4j 除去动态修改线程池,还包含实时查看线程池运行时指标、负载报警、配置日志管理等。 - -- `hippo4j-adapter`:适配对第三方框架中的线程池进行监控,如 Dubbo、RocketMQ、Hystrix 等; -- `hippo4j-auth`:用户、角色、权限等; -- `hippo4j-common`:多个模块公用代码实现; -- `hippo4j-config`:提供线程池准实时参数更新功能; -- `hippo4j-console`:对接前端控制台; -- `hippo4j-core`:核心的依赖,包括配置、核心包装类等; -- `hippo4j-discovery`:提供线程池项目实例注册、续约、下线等功能; -- `hippo4j-example` :示例工程; -- `hippo4j-message` :配置变更以及报警通知发送; -- `hippo4j-monitor` :线程池运行时监控; -- `hippo4j-server` :Server 端发布需要的模块聚合; -- `hippo4j-spring-boot`:SpringBoot Starter。 diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/user_guide/framework.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/user_guide/framework.md deleted file mode 100644 index 33e24d1c..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/user_guide/framework.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 架构设计 - -简单来说,Hippo4j 从部署的角度上分为两种角色:Server 端和 Client 端。 - -Server 端是 Hippo4j 项目打包出的 Java 进程,功能包括用户权限、线程池监控以及执行持久化的动作。 - -Client 端指的是我们 SpringBoot 应用,通过引入 Hippo4j Starter Jar 包负责与 Server 端进行交互。 - -比如拉取 Server 端线程池数据、动态更新线程池配置以及采集上报线程池运行时数据等。 - -## 基础组件 - -### 配置中心(Config) - -配置中心位于 Server 端,它的主要作用是监控 Server 端线程池配置变更,实时通知到 Client 实例执行线程池变更流程。 - -代码设计基于 Nacos 1.x 版本的 **长轮询以及异步 Servlet 机制** 实现。 - -### 注册中心(Discovery) - -负责管理 Client 端(单机或集群)注册到 Server 端的实例,包括不限于**实例注册、续约、过期剔除** 等操作,代码基于 Eureka 源码实现。 - -上面的配置中心很容易理解,动态线程池参数变更的根本。但是注册中心是用来做什么的? - -注册中心管理 Client 端注册的实例,通过这些实例可以 **实时获取线程池的运行时参数信息**。 - -目前的设计是如此,不排除后续基于 Discovery 做更多的扩展。 - -### 控制台(Console) - -对接前端项目,包括不限于以下模块管理: - -![](https://oss.open8gu.com/image-20211107122504126.png) - -## 消息通知(Notify) - -Hippo4j 内置了很多需要通知的事件,比如:线程池参数变更通知、线程池活跃度报警、拒绝策略执行报警以及阻塞队列容量报警等。 - -目前 Notify 已经接入了钉钉、企业微信和飞书,后续持续集成邮件、短信等通知渠道;并且,Notify 模块提供了消息事件的 SPI 方案,可以接受三方自定义的推送。 - -## Hippo4j-Spring-Boot-Starter - -熟悉 SpringBoot 的小伙伴对 Starter 应该不会陌生。Hippo4j 提供以 Starter Jar 包的形式嵌套在应用内,负责与 Server 端完成交互。 - -## 功能架构 - -![](https://oss.open8gu.com/image-20211105230953626.png) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/user_guide/notify.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/user_guide/notify.md deleted file mode 100644 index 7aa7e915..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/user_guide/notify.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 通知报警 - -现阶段已集成钉钉、企业微信、飞书的消息推送,后续会持续接入邮箱、短信和自定义通知渠道。 - -![](https://oss.open8gu.com/image-20220904181527453.png) - -**通知平台** - -- DING:钉钉平台; - -- LARK:飞书平台; - -- WECHAT:企业微信。 - -**通知类型** - -- CONFIG:线程池配置变更推送; - -- ALARM:线程池运行报警推送。 - -**Token** - -获取 DING、LARK、WECHAT 机器人 Token。 - -**报警间隔** - -- CONFIG 类型通知没有报警间隔; - -- ALARM 类型设置报警间隔后,某一节点下的同一线程池指定间隔只会发送一次报警通知。 - -**接收者** - -```tex -多个接收者使用英文逗号 , 分割 (注意不要有空格) -DING:填写手机号 -WECHART:填写user_id会以@的消息发给用户,填写姓名则是普通的@,如:龙台 -LARK:填写ou_开头用户唯一标识会以@的消息发给用户,填写手机号则是普通的@ -``` - - -## 钉钉平台 - -[钉钉创建群机器人](https://www.dingtalk.com/qidian/help-detail-20781541.html) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211013122816688.png) | ![](https://oss.open8gu.com/image-20211013113649068.png) | - -添加钉钉机器人后,需在机器人配置自定义关键字,才可发送成功。如下所示: - -![](https://oss.open8gu.com/image-20220530200133377.png?x-oss-process=image/resize,h_500,w_800) - -:::tip -如果使用 1.4.3 及以上版本,`警报` 替换为 `告警`。 -::: - -## 企业微信 - -[企业微信创建群机器人](https://open.work.weixin.qq.com/help2/pc/14931?person_id=1&from=homesearch) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211203213443242.png) | ![](https://oss.open8gu.com/image-20211203213512019.png) | - -## 飞书平台 - -[飞书创建群机器人](https://www.feishu.cn/hc/zh-CN/articles/360024984973) - -![](https://oss.open8gu.com/image-20220304081729347.png) - -![](https://oss.open8gu.com/image-20220304081507907.png) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/user_guide/quick-start.md b/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/user_guide/quick-start.md deleted file mode 100644 index 59c5cdd5..00000000 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/version-1.5.0/user_docs/user_guide/quick-start.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 快速开始 - -## 服务启动 - -使用 Docker 运行服务端,默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -> 如果没有 Docker,可以使用源码编译的方式,启动 [Hippo4j-Server/Hippo4j-Bootstrap](https://github.com/longtai-cn/hippo4j/tree/develop/hippo4j-server/hippo4j-bootstrap) 模块下 ServerApplication 应用类。 - -启动示例项目,[hippo4j-spring-boot-starter-example](https://github.com/opengoofy/hippo4j/tree/develop/hippo4j-example/hippo4j-spring-boot-starter-example) 模块下 ServerExampleApplication 应用类。 - -访问 Server 控制台,路径 `http://localhost:6691/index.html`,默认用户名密码:admin / 123456 - -## 配置变更 - -访问控制台动态线程池菜单下线程池实例,修改动态线程池相关参数。 - -![](https://oss.open8gu.com/image-20220813173811668.png) - -观察 Hippo4j-Example 控制台日志输出,日志输出包括不限于此信息即为成功。 - -```tex -2022-09-10 00:23:29.783 INFO 50322 --- [change.config_0] c.h.s.s.c.ServerThreadPoolDynamicRefresh : [message-consume] Dynamic thread pool change parameter. - corePoolSize: 2 => 4 - maximumPoolSize: 6 => 12 - capacity: 1024 => 2048 - keepAliveTime: 9999 => 9999 - executeTimeOut: 800 => 3000 - rejectedType: SyncPutQueuePolicy => RunsOldestTaskPolicy - allowCoreThreadTimeOut: true => true -``` - -另外,当 Client 集群部署时,可以修改某一个实例,或选择 `全部修改` 按钮,修改所有实例线程池信息。 diff --git a/docs/i18n/zh/docusaurus-theme-classic/footer.json b/docs/i18n/zh/docusaurus-theme-classic/footer.json deleted file mode 100644 index f3bd86db..00000000 --- a/docs/i18n/zh/docusaurus-theme-classic/footer.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "link.title.Docs": { - "message": "Docs", - "description": "The title of the footer links column with title=Docs in the footer" - }, - "link.title.Community": { - "message": "Community", - "description": "The title of the footer links column with title=Community in the footer" - }, - "link.title.More": { - "message": "More", - "description": "The title of the footer links column with title=More in the footer" - }, - "link.item.label.简介": { - "message": "简介", - "description": "The label of footer link with label=简介 linking to /docs/user_docs/intro" - }, - "link.item.label.加群沟通": { - "message": "加群沟通", - "description": "The label of footer link with label=加群沟通 linking to http://hippo4j.cn/group" - }, - "link.item.label.微信公众号": { - "message": "微信公众号", - "description": "The label of footer link with label=微信公众号 linking to https://mp.weixin.qq.com/s/diVHYvwiuYH9aWpZDPc27g" - }, - "link.item.label.Gitee": { - "message": "Gitee", - "description": "The label of footer link with label=Gitee linking to https://gitee.com/opengoofy/hippo4j" - }, - "link.item.label.GitHub": { - "message": "GitHub", - "description": "The label of footer link with label=GitHub linking to https://github.com/opengoofy/hippo4j" - }, - "link.item.label.公司登记": { - "message": "公司登记", - "description": "The label of footer link with label=公司登记 linking to https://github.com/opengoofy/hippo4j/issues/13" - }, - "copyright": { - "message": "Copyright © 2021-2023 马丁@版权所有 京ICP备2021038095号-2\n", - "description": "The footer copyright" - }, - "link.title.Links": { - "message": "Links", - "description": "The title of the footer links column with title=Links in the footer" - }, - "link.item.label.Intro": { - "message": "Intro", - "description": "The label of footer link with label=Intro linking to /docs/user_docs/intro" - }, - "link.item.label.Config Mode": { - "message": "Config Mode", - "description": "The label of footer link with label=Config Mode linking to /docs/user_docs/getting_started/config/hippo4j-config-start" - }, - "link.item.label.Server Mode": { - "message": "Server Mode", - "description": "The label of footer link with label=Server Mode linking to /docs/user_docs/getting_started/server/hippo4j-server-start" - }, - "link.item.label.Group": { - "message": "Group", - "description": "The label of footer link with label=Group linking to http://hippo4j.cn/group" - }, - "link.item.label.WeChat": { - "message": "WeChat", - "description": "The label of footer link with label=WeChat linking to https://mp.weixin.qq.com/s/diVHYvwiuYH9aWpZDPc27g" - }, - "link.item.label.推广合作": { - "message": "推广合作", - "description": "The label of footer link with label=推广合作 linking to http://hippo4j.cn/docs/user_docs/other/operation" - } -} diff --git a/docs/i18n/zh/docusaurus-theme-classic/navbar.json b/docs/i18n/zh/docusaurus-theme-classic/navbar.json deleted file mode 100644 index e32b94ae..00000000 --- a/docs/i18n/zh/docusaurus-theme-classic/navbar.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "title": { - "message": "", - "description": "The title in the navbar" - }, - "item.label.文档": { - "message": "文档", - "description": "Navbar item with label 文档" - }, - "item.label.社区": { - "message": "社区", - "description": "Navbar item with label 社区" - }, - "item.label.控制台样例": { - "message": "控制台样例", - "description": "Navbar item with label 控制台样例" - }, - "item.label.🥇代码实战课": { - "message": "🥇代码实战课", - "description": "Navbar item with label 🥇代码实战课" - }, - "item.label.采用公司": { - "message": "采用公司", - "description": "Navbar item with label 采用公司" - }, - "item.label.加群沟通": { - "message": "加群沟通", - "description": "Navbar item with label 加群沟通" - }, - "item.label.🚀 拿个offer": { - "message": "🚀 拿个offer", - "description": "Navbar item with label 🚀 拿个offer" - } -} diff --git a/docs/package-lock.json b/docs/package-lock.json deleted file mode 100644 index bf011a95..00000000 --- a/docs/package-lock.json +++ /dev/null @@ -1,21830 +0,0 @@ -{ - "name": "website", - "version": "0.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "website", - "version": "0.0.0", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/preset-classic": "2.1.0", - "@iconify-icons/logos": "^1.2.31", - "@iconify/react": "^4.1.0", - "@mdx-js/react": "^1.6.22", - "autoprefixer": "^10.4.14", - "clsx": "^1.1.1", - "postcss": "^8.4.23", - "prism-react-renderer": "^1.3.3", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "tailwindcss": "^3.3.2" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "2.1.0" - } - }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.8.2.tgz", - "integrity": "sha512-mTeshsyFhAqw/ebqNsQpMtbnjr+qVOSKXArEj4K0d7sqc8It1XD0gkASwecm9mF/jlOQ4Z9RNg1HbdA8JPdRwQ==", - "dependencies": { - "@algolia/autocomplete-shared": "1.8.2" - } - }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.8.2.tgz", - "integrity": "sha512-J0oTx4me6ZM9kIKPuL3lyU3aB8DEvpVvR6xWmHVROx5rOYJGQcZsdG4ozxwcOyiiu3qxMkIbzntnV1S1VWD8yA==", - "dependencies": { - "@algolia/autocomplete-shared": "1.8.2" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.8.2.tgz", - "integrity": "sha512-b6Z/X4MczChMcfhk6kfRmBzPgjoPzuS9KGR4AFsiLulLNRAAqhP+xZTKtMnZGhLuc61I20d5WqlId02AZvcO6g==" - }, - "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", - "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", - "dependencies": { - "@algolia/cache-common": "4.17.0" - } - }, - "node_modules/@algolia/cache-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", - "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==" - }, - "node_modules/@algolia/cache-in-memory": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", - "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", - "dependencies": { - "@algolia/cache-common": "4.17.0" - } - }, - "node_modules/@algolia/client-account": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", - "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", - "dependencies": { - "@algolia/client-common": "4.17.0", - "@algolia/client-search": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", - "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", - "dependencies": { - "@algolia/client-common": "4.17.0", - "@algolia/client-search": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", - "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", - "dependencies": { - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", - "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", - "dependencies": { - "@algolia/client-common": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", - "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", - "dependencies": { - "@algolia/client-common": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "node_modules/@algolia/events": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" - }, - "node_modules/@algolia/logger-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", - "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==" - }, - "node_modules/@algolia/logger-console": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", - "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", - "dependencies": { - "@algolia/logger-common": "4.17.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", - "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", - "dependencies": { - "@algolia/requester-common": "4.17.0" - } - }, - "node_modules/@algolia/requester-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", - "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==" - }, - "node_modules/@algolia/requester-node-http": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", - "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", - "dependencies": { - "@algolia/requester-common": "4.17.0" - } - }, - "node_modules/@algolia/transporter": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", - "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", - "dependencies": { - "@algolia/cache-common": "4.17.0", - "@algolia/logger-common": "4.17.0", - "@algolia/requester-common": "4.17.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.21.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", - "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", - "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helpers": "^7.21.5", - "@babel/parser": "^7.21.8", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", - "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", - "dependencies": { - "@babel/types": "^7.21.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", - "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", - "dependencies": { - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", - "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", - "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", - "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", - "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", - "dependencies": { - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", - "dependencies": { - "@babel/types": "^7.21.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", - "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", - "dependencies": { - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", - "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", - "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", - "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/template": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", - "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", - "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", - "dependencies": { - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-simple-access": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.21.3.tgz", - "integrity": "sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz", - "integrity": "sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", - "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "regenerator-transform": "^0.15.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", - "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", - "dependencies": { - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", - "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", - "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz", - "integrity": "sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==", - "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.21.5", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.21.5", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.5", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.21.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.21.5", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.5", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz", - "integrity": "sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-typescript": "^7.21.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, - "node_modules/@babel/runtime": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", - "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.5.tgz", - "integrity": "sha512-FRqFlFKNazWYykft5zvzuEl1YyTDGsIRrjV9rvxvYkUC7W/ueBng1X68Xd6uRMzAaJ0xMKn08/wem5YS1lpX8w==", - "dependencies": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", - "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docsearch/css": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.5.tgz", - "integrity": "sha512-NaXVp3I8LdmJ54fn038KHgG7HmbIzZlKS2FkVf6mKcW5bYMJovkx4947joQyZk5yubxOZ+ddHSh79y39Aevufg==" - }, - "node_modules/@docsearch/react": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.5.tgz", - "integrity": "sha512-Zuxf4z5PZ9eIQkVCNu76v1H+KAztKItNn3rLzZa7kpBS+++TgNARITnZeUS7C1DKoAhJZFr6T/H+Lvc6h/iiYg==", - "dependencies": { - "@algolia/autocomplete-core": "1.8.2", - "@algolia/autocomplete-preset-algolia": "1.8.2", - "@docsearch/css": "3.3.5", - "algoliasearch": "^4.0.0" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@docusaurus/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", - "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", - "dependencies": { - "@babel/core": "^7.18.6", - "@babel/generator": "^7.18.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.18.6", - "@babel/preset-env": "^7.18.6", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@babel/runtime": "^7.18.6", - "@babel/runtime-corejs3": "^7.18.6", - "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "@slorber/static-site-generator-webpack-plugin": "^4.0.7", - "@svgr/webpack": "^6.2.1", - "autoprefixer": "^10.4.7", - "babel-loader": "^8.2.5", - "babel-plugin-dynamic-import-node": "^2.3.3", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "clean-css": "^5.3.0", - "cli-table3": "^0.6.2", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.23.3", - "css-loader": "^6.7.1", - "css-minimizer-webpack-plugin": "^4.0.0", - "cssnano": "^5.1.12", - "del": "^6.1.1", - "detect-port": "^1.3.0", - "escape-html": "^1.0.3", - "eta": "^1.12.3", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "html-minifier-terser": "^6.1.0", - "html-tags": "^3.2.0", - "html-webpack-plugin": "^5.5.0", - "import-fresh": "^3.3.0", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.6.1", - "postcss": "^8.4.14", - "postcss-loader": "^7.0.0", - "prompts": "^2.4.2", - "react-dev-utils": "^12.0.1", - "react-helmet-async": "^1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.3", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.3", - "rtl-detect": "^1.0.4", - "semver": "^7.3.7", - "serve-handler": "^6.1.3", - "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.3", - "tslib": "^2.4.0", - "update-notifier": "^5.1.0", - "url-loader": "^4.1.1", - "wait-on": "^6.0.1", - "webpack": "^5.73.0", - "webpack-bundle-analyzer": "^4.5.0", - "webpack-dev-server": "^4.9.3", - "webpack-merge": "^5.8.0", - "webpackbar": "^5.0.2" - }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", - "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", - "dependencies": { - "cssnano-preset-advanced": "^5.3.8", - "postcss": "^8.4.14", - "postcss-sort-media-queries": "^4.2.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@docusaurus/logger": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", - "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", - "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@docusaurus/mdx-loader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", - "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", - "dependencies": { - "@babel/parser": "^7.18.8", - "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@mdx-js/mdx": "^1.6.22", - "escape-html": "^1.0.3", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "image-size": "^1.0.1", - "mdast-util-to-string": "^2.0.0", - "remark-emoji": "^2.2.0", - "stringify-object": "^3.3.0", - "tslib": "^2.4.0", - "unified": "^9.2.2", - "unist-util-visit": "^2.0.3", - "url-loader": "^4.1.1", - "webpack": "^5.73.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", - "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", - "dependencies": { - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.1.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", - "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "cheerio": "^1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^10.1.0", - "lodash": "^4.17.21", - "reading-time": "^1.5.0", - "tslib": "^2.4.0", - "unist-util-visit": "^2.0.3", - "utility-types": "^3.10.0", - "webpack": "^5.73.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", - "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "@types/react-router-config": "^5.0.6", - "combine-promises": "^1.1.0", - "fs-extra": "^10.1.0", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.4.0", - "utility-types": "^3.10.0", - "webpack": "^5.73.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", - "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "fs-extra": "^10.1.0", - "tslib": "^2.4.0", - "webpack": "^5.73.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-debug": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", - "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "fs-extra": "^10.1.0", - "react-json-view": "^1.21.3", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", - "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", - "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", - "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "fs-extra": "^10.1.0", - "sitemap": "^7.1.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/preset-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", - "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/plugin-debug": "2.1.0", - "@docusaurus/plugin-google-analytics": "2.1.0", - "@docusaurus/plugin-google-gtag": "2.1.0", - "@docusaurus/plugin-sitemap": "2.1.0", - "@docusaurus/theme-classic": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-search-algolia": "2.1.0", - "@docusaurus/types": "2.1.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/react-loadable": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", - "dependencies": { - "@types/react": "*", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/@docusaurus/theme-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", - "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "@mdx-js/react": "^1.6.22", - "clsx": "^1.2.1", - "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.42", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.4.14", - "prism-react-renderer": "^1.3.5", - "prismjs": "^1.28.0", - "react-router-dom": "^5.3.3", - "rtlcss": "^3.5.0", - "tslib": "^2.4.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/theme-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", - "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", - "dependencies": { - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^1.2.1", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^1.3.5", - "tslib": "^2.4.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", - "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", - "dependencies": { - "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "algoliasearch": "^4.13.1", - "algoliasearch-helper": "^3.10.0", - "clsx": "^1.2.1", - "eta": "^1.12.3", - "fs-extra": "^10.1.0", - "lodash": "^4.17.21", - "tslib": "^2.4.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/theme-translations": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", - "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", - "dependencies": { - "fs-extra": "^10.1.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@docusaurus/types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", - "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.6.0", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.73.0", - "webpack-merge": "^5.8.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", - "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", - "dependencies": { - "@docusaurus/logger": "2.1.0", - "@svgr/webpack": "^6.2.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "github-slugger": "^1.4.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "resolve-pathname": "^3.0.0", - "shelljs": "^0.8.5", - "tslib": "^2.4.0", - "url-loader": "^4.1.1", - "webpack": "^5.73.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } - } - }, - "node_modules/@docusaurus/utils-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", - "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", - "dependencies": { - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } - } - }, - "node_modules/@docusaurus/utils-validation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", - "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", - "dependencies": { - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", - "joi": "^17.6.0", - "js-yaml": "^4.1.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@iconify-icons/logos": { - "version": "1.2.34", - "resolved": "https://registry.npmjs.org/@iconify-icons/logos/-/logos-1.2.34.tgz", - "integrity": "sha512-WbzJemIKsEt5/fVP7lmpsaFSXV8Wg5L8BngZpqInFWc5nxSaQvtSjHBWPQOQQ7cVr8T5di6wwJWWEdCBXP6hpw==", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify/react": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@iconify/react/-/react-4.1.1.tgz", - "integrity": "sha512-jed14EjvKjee8mc0eoscGxlg7mSQRkwQG3iX3cPBCO7UlOjz0DtlvTqxqEcHUJGh+z1VJ31Yhu5B9PxfO0zbdg==", - "dependencies": { - "@iconify/types": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/cyberalien" - }, - "peerDependencies": { - "react": ">=16" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==" - }, - "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", - "dependencies": { - "@sinclair/typebox": "^0.25.16" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", - "dependencies": { - "@jest/schemas": "^29.4.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" - }, - "node_modules/@mdx-js/mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", - "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", - "dependencies": { - "@babel/core": "7.12.9", - "@babel/plugin-syntax-jsx": "7.12.1", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.22", - "babel-plugin-apply-mdx-type-prop": "1.6.22", - "babel-plugin-extract-import-names": "1.6.22", - "camelcase-css": "2.0.1", - "detab": "2.0.4", - "hast-util-raw": "6.0.1", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "10.0.1", - "remark-footnotes": "2.0.0", - "remark-mdx": "1.6.22", - "remark-parse": "8.0.3", - "remark-squeeze-paragraphs": "4.0.0", - "style-to-object": "0.3.0", - "unified": "9.2.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@mdx-js/mdx/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/react": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", - "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" - } - }, - "node_modules/@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" - }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", - "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", - "dependencies": { - "eval": "^0.1.8", - "p-map": "^4.0.0", - "webpack-sources": "^3.2.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", - "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", - "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", - "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", - "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", - "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", - "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", - "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", - "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", - "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", - "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", - "dependencies": { - "@babel/types": "^7.20.0", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", - "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", - "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "^6.0.0" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", - "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", - "dependencies": { - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "svgo": "^2.8.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/webpack": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", - "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", - "dependencies": { - "@babel/core": "^7.19.6", - "@babel/plugin-transform-react-constant-elements": "^7.18.12", - "@babel/preset-env": "^7.19.4", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@svgr/core": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "@svgr/plugin-svgo": "^6.5.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - }, - "node_modules/@types/mdast": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", - "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "node_modules/@types/node": { - "version": "20.1.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.7.tgz", - "integrity": "sha512-WCuw/o4GSwDGMoonES8rcvwsig77dGCMbZDrZr2x4ZZiNW4P/gcoZXe/0twgtobcTkmg9TuKflxYL/DuwDyJzg==" - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "node_modules/@types/parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "node_modules/@types/react": { - "version": "18.2.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz", - "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-config": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.7.tgz", - "integrity": "sha512-pFFVXUIydHlcJP6wJm7sDii5mD/bCmmAY0wQzq+M+uX7bqS95AQqHZWP1iNMKrWVQSuHIzj5qi9BvrtLX2/T4w==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "^5.1.0" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "node_modules/@types/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" - }, - "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/algoliasearch": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", - "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.17.0", - "@algolia/cache-common": "4.17.0", - "@algolia/cache-in-memory": "4.17.0", - "@algolia/client-account": "4.17.0", - "@algolia/client-analytics": "4.17.0", - "@algolia/client-common": "4.17.0", - "@algolia/client-personalization": "4.17.0", - "@algolia/client-search": "4.17.0", - "@algolia/logger-common": "4.17.0", - "@algolia/logger-console": "4.17.0", - "@algolia/requester-browser-xhr": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/requester-node-http": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "node_modules/algoliasearch-helper": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.13.0.tgz", - "integrity": "sha512-kV3c1jMQCvkARtGsSDvAwuht4PAMSsQILqPiH4WFiARoa3jXJ/r1TQoBWAjWyWF48rsNYCv7kzxgB4LTxrvvuw==", - "dependencies": { - "@algolia/events": "^4.0.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axios": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", - "dependencies": { - "follow-redirects": "^1.14.7" - } - }, - "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/babel-plugin-apply-mdx-type-prop": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", - "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", - "dependencies": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "1.6.22" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@babel/core": "^7.11.6" - } - }, - "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-extract-import-names": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", - "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", - "dependencies": { - "@babel/helper-plugin-utils": "7.10.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base16": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001487", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz", - "integrity": "sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/chalk/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/chalk/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio-select/node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio-select/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/cheerio/node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "node_modules/combine-promises": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", - "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/copy-text-to-clipboard": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz", - "integrity": "sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-js": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz", - "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", - "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", - "dependencies": { - "browserslist": "^4.21.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.2.tgz", - "integrity": "sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-fetch": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", - "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", - "dependencies": { - "node-fetch": "^2.6.11" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", - "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", - "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", - "dependencies": { - "cssnano": "^5.1.8", - "jest-worker": "^29.1.2", - "postcss": "^8.4.17", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.5.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-advanced": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", - "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", - "dependencies": { - "autoprefixer": "^10.4.12", - "cssnano-preset-default": "^5.2.14", - "postcss-discard-unused": "^5.1.0", - "postcss-merge-idents": "^5.1.1", - "postcss-reduce-idents": "^5.2.0", - "postcss-zindex": "^5.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", - "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", - "dependencies": { - "repeat-string": "^1.5.4" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" - }, - "node_modules/dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop/node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.397", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.397.tgz", - "integrity": "sha512-jwnPxhh350Q/aMatQia31KAIQdhEsYS0fFZ0BQQlN9tfvOEwShu6ZNwI4kL/xBabjcB/nTy6lSt17kNIluJZ8Q==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/emoticon": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", - "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", - "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", - "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eta": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/eta/-/eta-1.14.2.tgz", - "integrity": "sha512-wZmJAV7EFUG5W8XNXSazIdichnWEhGB1OWg4tnXWPj0CPNUcFdgorGNO6N9p6WBUgoUe4P0OziJYn1+6zxP2aQ==", - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "url": "https://github.com/eta-dev/eta?sponsor=1" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", - "dependencies": { - "@types/node": "*", - "require-like": ">= 0.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/express/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/express/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dependencies": { - "punycode": "^1.3.2" - } - }, - "node_modules/fast-url-parser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fbemitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", - "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", - "dependencies": { - "fbjs": "^3.0.0" - } - }, - "node_modules/fbjs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", - "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", - "dependencies": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" - } - }, - "node_modules/fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" - }, - "node_modules/feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "dependencies": { - "xml-js": "^1.6.11" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flux": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", - "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", - "dependencies": { - "fbemitter": "^3.0.0", - "fbjs": "^3.0.1" - }, - "peerDependencies": { - "react": "^15.0.2 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/hast-to-hyperscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", - "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", - "dependencies": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", - "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", - "dependencies": { - "@types/parse5": "^5.0.0", - "hastscript": "^6.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "vfile-location": "^3.2.0", - "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", - "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "dependencies": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/html-void-elements": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz", - "integrity": "sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA==", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/infima": { - "version": "0.2.0-alpha.42", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", - "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==", - "engines": { - "node": ">=12" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", - "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", - "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/js-yaml/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.curry": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.flow": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "dependencies": { - "unist-util-remove": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", - "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", - "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", - "dependencies": { - "fs-monkey": "^1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz", - "integrity": "sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==", - "dependencies": { - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-unused": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", - "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/postcss-loader": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.0.tgz", - "integrity": "sha512-qLAFjvR2BFNz1H930P7mj1iuWJFjGey/nVhimfOAAQ1ZyPpcClAxP8+A55Sl8mBvM+K2a9Pjgdj10KpANWrNfw==", - "dependencies": { - "cosmiconfig": "^8.1.3", - "jiti": "^1.18.2", - "klona": "^2.0.6", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - } - }, - "node_modules/postcss-merge-idents": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", - "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-idents": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", - "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-sort-media-queries": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", - "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", - "dependencies": { - "sort-css-media-queries": "2.1.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.4.16" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/postcss-zindex": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", - "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/prism-react-renderer": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", - "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", - "peerDependencies": { - "react": ">=0.14.9" - } - }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "dependencies": { - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pure-color": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-base16-styling": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", - "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", - "dependencies": { - "base16": "^1.0.0", - "lodash.curry": "^4.0.1", - "lodash.flow": "^3.3.0", - "pure-color": "^1.2.0" - } - }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-dev-utils/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/react-dev-utils/node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/react-dev-utils/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dev-utils/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/react-dev-utils/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, - "node_modules/react-fast-compare": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.1.tgz", - "integrity": "sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg==" - }, - "node_modules/react-helmet-async": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-json-view": { - "version": "1.21.3", - "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", - "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", - "dependencies": { - "flux": "^4.0.1", - "react-base16-styling": "^0.6.0", - "react-lifecycles-compat": "^3.0.4", - "react-textarea-autosize": "^8.3.2" - }, - "peerDependencies": { - "react": "^17.0.0 || ^16.3.0 || ^15.5.4", - "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" - } - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "node_modules/react-loadable": { - "name": "@docusaurus/react-loadable", - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", - "dependencies": { - "@types/react": "*", - "prop-types": "^15.6.2" - } - }, - "node_modules/react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", - "dependencies": { - "@babel/runtime": "^7.10.3" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "react-loadable": "*", - "webpack": ">=4.41.1 || 5.x" - } - }, - "node_modules/react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "dependencies": { - "@babel/runtime": "^7.1.2" - }, - "peerDependencies": { - "react": ">=15", - "react-router": ">=5" - } - }, - "node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-textarea-autosize": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz", - "integrity": "sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==", - "dependencies": { - "@babel/runtime": "^7.20.13", - "use-composed-ref": "^1.3.0", - "use-latest": "^1.2.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reading-time": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remark-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", - "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", - "dependencies": { - "emoticon": "^3.2.0", - "node-emoji": "^1.10.0", - "unist-util-visit": "^2.0.3" - } - }, - "node_modules/remark-footnotes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", - "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", - "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", - "dependencies": { - "@babel/core": "7.12.9", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-syntax-jsx": "7.12.1", - "@mdx-js/util": "1.6.22", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/remark-mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/remark-mdx/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remark-mdx/node_modules/unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "dependencies": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "dependencies": { - "mdast-squeeze-paragraphs": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", - "engines": { - "node": "*" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rtl-detect": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", - "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" - }, - "node_modules/rtlcss": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", - "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", - "dependencies": { - "find-up": "^5.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.3.11", - "strip-json-comments": "^3.1.1" - }, - "bin": { - "rtlcss": "bin/rtlcss.js" - } - }, - "node_modules/rtlcss/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" - }, - "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/send/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", - "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^1.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/sitemap": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", - "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", - "dependencies": { - "@types/node": "^17.0.5", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - }, - "bin": { - "sitemap": "dist/cli.js" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=5.6.0" - } - }, - "node_modules/sitemap/node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sort-css-media-queries": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", - "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", - "engines": { - "node": ">= 6.3.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" - }, - "node_modules/state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", - "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==" - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.17.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.4.tgz", - "integrity": "sha512-jcEKZw6UPrgugz/0Tuk/PVyLAPfMBJf5clnGueo45wTweoV8yh7Q7PEkhkJ5uuUbC7zAxEcG3tqNr1bstkQ8nw==", - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz", - "integrity": "sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", - "deprecated": "Use String.prototype.trim() instead" - }, - "node_modules/trim-trailing-lines": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.35", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", - "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "engines": { - "node": "*" - } - }, - "node_modules/unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "dependencies": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-generated": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", - "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", - "dependencies": { - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dependencies": { - "@types/unist": "^2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/update-notifier/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/update-notifier/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/use-composed-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", - "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-latest": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", - "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", - "dependencies": { - "use-isomorphic-layout-effect": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" - }, - "node_modules/utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/wait-on": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", - "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", - "dependencies": { - "axios": "^0.25.0", - "joi": "^17.6.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^7.5.4" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-namespaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/webpack": { - "version": "5.82.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz", - "integrity": "sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", - "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "opener": "^1.5.2", - "sirv": "^1.0.7", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-middleware/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", - "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpackbar": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", - "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.3", - "pretty-time": "^1.1.0", - "std-env": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "webpack": "3 || 4 || 5" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - }, - "dependencies": { - "@algolia/autocomplete-core": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.8.2.tgz", - "integrity": "sha512-mTeshsyFhAqw/ebqNsQpMtbnjr+qVOSKXArEj4K0d7sqc8It1XD0gkASwecm9mF/jlOQ4Z9RNg1HbdA8JPdRwQ==", - "requires": { - "@algolia/autocomplete-shared": "1.8.2" - } - }, - "@algolia/autocomplete-preset-algolia": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.8.2.tgz", - "integrity": "sha512-J0oTx4me6ZM9kIKPuL3lyU3aB8DEvpVvR6xWmHVROx5rOYJGQcZsdG4ozxwcOyiiu3qxMkIbzntnV1S1VWD8yA==", - "requires": { - "@algolia/autocomplete-shared": "1.8.2" - } - }, - "@algolia/autocomplete-shared": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.8.2.tgz", - "integrity": "sha512-b6Z/X4MczChMcfhk6kfRmBzPgjoPzuS9KGR4AFsiLulLNRAAqhP+xZTKtMnZGhLuc61I20d5WqlId02AZvcO6g==" - }, - "@algolia/cache-browser-local-storage": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", - "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", - "requires": { - "@algolia/cache-common": "4.17.0" - } - }, - "@algolia/cache-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", - "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==" - }, - "@algolia/cache-in-memory": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", - "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", - "requires": { - "@algolia/cache-common": "4.17.0" - } - }, - "@algolia/client-account": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", - "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", - "requires": { - "@algolia/client-common": "4.17.0", - "@algolia/client-search": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "@algolia/client-analytics": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", - "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", - "requires": { - "@algolia/client-common": "4.17.0", - "@algolia/client-search": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "@algolia/client-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", - "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", - "requires": { - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "@algolia/client-personalization": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", - "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", - "requires": { - "@algolia/client-common": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "@algolia/client-search": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", - "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", - "requires": { - "@algolia/client-common": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "@algolia/events": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" - }, - "@algolia/logger-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", - "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==" - }, - "@algolia/logger-console": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", - "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", - "requires": { - "@algolia/logger-common": "4.17.0" - } - }, - "@algolia/requester-browser-xhr": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", - "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", - "requires": { - "@algolia/requester-common": "4.17.0" - } - }, - "@algolia/requester-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", - "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==" - }, - "@algolia/requester-node-http": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", - "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", - "requires": { - "@algolia/requester-common": "4.17.0" - } - }, - "@algolia/transporter": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", - "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", - "requires": { - "@algolia/cache-common": "4.17.0", - "@algolia/logger-common": "4.17.0", - "@algolia/requester-common": "4.17.0" - } - }, - "@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" - }, - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.21.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", - "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==" - }, - "@babel/core": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", - "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helpers": "^7.21.5", - "@babel/parser": "^7.21.8", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/generator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", - "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", - "requires": { - "@babel/types": "^7.21.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", - "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", - "requires": { - "@babel/types": "^7.21.5" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", - "requires": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", - "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", - "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==" - }, - "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", - "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", - "requires": { - "@babel/types": "^7.21.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", - "requires": { - "@babel/types": "^7.21.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", - "requires": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-replace-supers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", - "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", - "requires": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", - "requires": { - "@babel/types": "^7.21.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "requires": { - "@babel/types": "^7.20.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==" - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" - }, - "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==" - }, - "@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - } - }, - "@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", - "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==" - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", - "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", - "requires": { - "@babel/helper-plugin-utils": "^7.21.5" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", - "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/template": "^7.20.7" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", - "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.21.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "requires": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", - "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", - "requires": { - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-simple-access": "^7.21.5" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.21.3.tgz", - "integrity": "sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz", - "integrity": "sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/types": "^7.21.5" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "requires": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", - "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", - "requires": { - "@babel/helper-plugin-utils": "^7.21.5", - "regenerator-transform": "^0.15.1" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", - "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", - "requires": { - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", - "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", - "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", - "requires": { - "@babel/helper-plugin-utils": "^7.21.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz", - "integrity": "sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==", - "requires": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.21.5", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.21.5", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.5", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.21.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.21.5", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.5", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" - } - }, - "@babel/preset-typescript": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz", - "integrity": "sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==", - "requires": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-typescript": "^7.21.3" - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, - "@babel/runtime": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", - "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@babel/runtime-corejs3": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.5.tgz", - "integrity": "sha512-FRqFlFKNazWYykft5zvzuEl1YyTDGsIRrjV9rvxvYkUC7W/ueBng1X68Xd6uRMzAaJ0xMKn08/wem5YS1lpX8w==", - "requires": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.11" - } - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", - "requires": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", - "requires": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" - }, - "@docsearch/css": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.5.tgz", - "integrity": "sha512-NaXVp3I8LdmJ54fn038KHgG7HmbIzZlKS2FkVf6mKcW5bYMJovkx4947joQyZk5yubxOZ+ddHSh79y39Aevufg==" - }, - "@docsearch/react": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.5.tgz", - "integrity": "sha512-Zuxf4z5PZ9eIQkVCNu76v1H+KAztKItNn3rLzZa7kpBS+++TgNARITnZeUS7C1DKoAhJZFr6T/H+Lvc6h/iiYg==", - "requires": { - "@algolia/autocomplete-core": "1.8.2", - "@algolia/autocomplete-preset-algolia": "1.8.2", - "@docsearch/css": "3.3.5", - "algoliasearch": "^4.0.0" - } - }, - "@docusaurus/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", - "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", - "requires": { - "@babel/core": "^7.18.6", - "@babel/generator": "^7.18.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.18.6", - "@babel/preset-env": "^7.18.6", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@babel/runtime": "^7.18.6", - "@babel/runtime-corejs3": "^7.18.6", - "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "@slorber/static-site-generator-webpack-plugin": "^4.0.7", - "@svgr/webpack": "^6.2.1", - "autoprefixer": "^10.4.7", - "babel-loader": "^8.2.5", - "babel-plugin-dynamic-import-node": "^2.3.3", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "clean-css": "^5.3.0", - "cli-table3": "^0.6.2", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.23.3", - "css-loader": "^6.7.1", - "css-minimizer-webpack-plugin": "^4.0.0", - "cssnano": "^5.1.12", - "del": "^6.1.1", - "detect-port": "^1.3.0", - "escape-html": "^1.0.3", - "eta": "^1.12.3", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "html-minifier-terser": "^6.1.0", - "html-tags": "^3.2.0", - "html-webpack-plugin": "^5.5.0", - "import-fresh": "^3.3.0", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.6.1", - "postcss": "^8.4.14", - "postcss-loader": "^7.0.0", - "prompts": "^2.4.2", - "react-dev-utils": "^12.0.1", - "react-helmet-async": "^1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.3", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.3", - "rtl-detect": "^1.0.4", - "semver": "^7.3.7", - "serve-handler": "^6.1.3", - "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.3", - "tslib": "^2.4.0", - "update-notifier": "^5.1.0", - "url-loader": "^4.1.1", - "wait-on": "^6.0.1", - "webpack": "^5.73.0", - "webpack-bundle-analyzer": "^4.5.0", - "webpack-dev-server": "^4.9.3", - "webpack-merge": "^5.8.0", - "webpackbar": "^5.0.2" - } - }, - "@docusaurus/cssnano-preset": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", - "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", - "requires": { - "cssnano-preset-advanced": "^5.3.8", - "postcss": "^8.4.14", - "postcss-sort-media-queries": "^4.2.1", - "tslib": "^2.4.0" - } - }, - "@docusaurus/logger": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", - "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", - "requires": { - "chalk": "^4.1.2", - "tslib": "^2.4.0" - } - }, - "@docusaurus/mdx-loader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", - "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", - "requires": { - "@babel/parser": "^7.18.8", - "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@mdx-js/mdx": "^1.6.22", - "escape-html": "^1.0.3", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "image-size": "^1.0.1", - "mdast-util-to-string": "^2.0.0", - "remark-emoji": "^2.2.0", - "stringify-object": "^3.3.0", - "tslib": "^2.4.0", - "unified": "^9.2.2", - "unist-util-visit": "^2.0.3", - "url-loader": "^4.1.1", - "webpack": "^5.73.0" - } - }, - "@docusaurus/module-type-aliases": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", - "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", - "requires": { - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.1.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" - } - }, - "@docusaurus/plugin-content-blog": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", - "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", - "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "cheerio": "^1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^10.1.0", - "lodash": "^4.17.21", - "reading-time": "^1.5.0", - "tslib": "^2.4.0", - "unist-util-visit": "^2.0.3", - "utility-types": "^3.10.0", - "webpack": "^5.73.0" - } - }, - "@docusaurus/plugin-content-docs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", - "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", - "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "@types/react-router-config": "^5.0.6", - "combine-promises": "^1.1.0", - "fs-extra": "^10.1.0", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.4.0", - "utility-types": "^3.10.0", - "webpack": "^5.73.0" - } - }, - "@docusaurus/plugin-content-pages": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", - "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", - "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "fs-extra": "^10.1.0", - "tslib": "^2.4.0", - "webpack": "^5.73.0" - } - }, - "@docusaurus/plugin-debug": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", - "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", - "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "fs-extra": "^10.1.0", - "react-json-view": "^1.21.3", - "tslib": "^2.4.0" - } - }, - "@docusaurus/plugin-google-analytics": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", - "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", - "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "tslib": "^2.4.0" - } - }, - "@docusaurus/plugin-google-gtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", - "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", - "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "tslib": "^2.4.0" - } - }, - "@docusaurus/plugin-sitemap": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", - "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", - "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "fs-extra": "^10.1.0", - "sitemap": "^7.1.1", - "tslib": "^2.4.0" - } - }, - "@docusaurus/preset-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", - "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", - "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/plugin-debug": "2.1.0", - "@docusaurus/plugin-google-analytics": "2.1.0", - "@docusaurus/plugin-google-gtag": "2.1.0", - "@docusaurus/plugin-sitemap": "2.1.0", - "@docusaurus/theme-classic": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-search-algolia": "2.1.0", - "@docusaurus/types": "2.1.0" - } - }, - "@docusaurus/react-loadable": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", - "requires": { - "@types/react": "*", - "prop-types": "^15.6.2" - } - }, - "@docusaurus/theme-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", - "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", - "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "@mdx-js/react": "^1.6.22", - "clsx": "^1.2.1", - "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.42", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.4.14", - "prism-react-renderer": "^1.3.5", - "prismjs": "^1.28.0", - "react-router-dom": "^5.3.3", - "rtlcss": "^3.5.0", - "tslib": "^2.4.0", - "utility-types": "^3.10.0" - } - }, - "@docusaurus/theme-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", - "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", - "requires": { - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^1.2.1", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^1.3.5", - "tslib": "^2.4.0", - "utility-types": "^3.10.0" - } - }, - "@docusaurus/theme-search-algolia": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", - "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", - "requires": { - "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", - "algoliasearch": "^4.13.1", - "algoliasearch-helper": "^3.10.0", - "clsx": "^1.2.1", - "eta": "^1.12.3", - "fs-extra": "^10.1.0", - "lodash": "^4.17.21", - "tslib": "^2.4.0", - "utility-types": "^3.10.0" - } - }, - "@docusaurus/theme-translations": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", - "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", - "requires": { - "fs-extra": "^10.1.0", - "tslib": "^2.4.0" - } - }, - "@docusaurus/types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", - "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", - "requires": { - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.6.0", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.73.0", - "webpack-merge": "^5.8.0" - } - }, - "@docusaurus/utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", - "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", - "requires": { - "@docusaurus/logger": "2.1.0", - "@svgr/webpack": "^6.2.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "github-slugger": "^1.4.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "resolve-pathname": "^3.0.0", - "shelljs": "^0.8.5", - "tslib": "^2.4.0", - "url-loader": "^4.1.1", - "webpack": "^5.73.0" - } - }, - "@docusaurus/utils-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", - "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", - "requires": { - "tslib": "^2.4.0" - } - }, - "@docusaurus/utils-validation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", - "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", - "requires": { - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", - "joi": "^17.6.0", - "js-yaml": "^4.1.0", - "tslib": "^2.4.0" - } - }, - "@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@iconify-icons/logos": { - "version": "1.2.34", - "resolved": "https://registry.npmjs.org/@iconify-icons/logos/-/logos-1.2.34.tgz", - "integrity": "sha512-WbzJemIKsEt5/fVP7lmpsaFSXV8Wg5L8BngZpqInFWc5nxSaQvtSjHBWPQOQQ7cVr8T5di6wwJWWEdCBXP6hpw==", - "requires": { - "@iconify/types": "*" - } - }, - "@iconify/react": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@iconify/react/-/react-4.1.1.tgz", - "integrity": "sha512-jed14EjvKjee8mc0eoscGxlg7mSQRkwQG3iX3cPBCO7UlOjz0DtlvTqxqEcHUJGh+z1VJ31Yhu5B9PxfO0zbdg==", - "requires": { - "@iconify/types": "^2.0.0" - } - }, - "@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==" - }, - "@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", - "requires": { - "@sinclair/typebox": "^0.25.16" - } - }, - "@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", - "requires": { - "@jest/schemas": "^29.4.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, - "@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - } - } - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" - }, - "@mdx-js/mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", - "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", - "requires": { - "@babel/core": "7.12.9", - "@babel/plugin-syntax-jsx": "7.12.1", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.22", - "babel-plugin-apply-mdx-type-prop": "1.6.22", - "babel-plugin-extract-import-names": "1.6.22", - "camelcase-css": "2.0.1", - "detab": "2.0.4", - "hast-util-raw": "6.0.1", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "10.0.1", - "remark-footnotes": "2.0.0", - "remark-mdx": "1.6.22", - "remark-parse": "8.0.3", - "remark-squeeze-paragraphs": "4.0.0", - "style-to-object": "0.3.0", - "unified": "9.2.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "dependencies": { - "@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - }, - "unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - } - } - }, - "@mdx-js/react": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", - "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", - "requires": {} - }, - "@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" - }, - "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", - "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", - "requires": { - "eval": "^0.1.8", - "p-map": "^4.0.0", - "webpack-sources": "^3.2.2" - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", - "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", - "requires": {} - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "requires": {} - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "requires": {} - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", - "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", - "requires": {} - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", - "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", - "requires": {} - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", - "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", - "requires": {} - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", - "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", - "requires": {} - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", - "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", - "requires": {} - }, - "@svgr/babel-preset": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", - "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" - } - }, - "@svgr/core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", - "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", - "requires": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", - "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", - "requires": { - "@babel/types": "^7.20.0", - "entities": "^4.4.0" - }, - "dependencies": { - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - } - } - }, - "@svgr/plugin-jsx": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", - "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", - "requires": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", - "svg-parser": "^2.0.4" - } - }, - "@svgr/plugin-svgo": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", - "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", - "requires": { - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "svgo": "^2.8.0" - } - }, - "@svgr/webpack": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", - "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", - "requires": { - "@babel/core": "^7.19.6", - "@babel/plugin-transform-react-constant-elements": "^7.18.12", - "@babel/preset-env": "^7.19.4", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@svgr/core": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "@svgr/plugin-svgo": "^6.5.1" - } - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" - }, - "@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", - "requires": { - "@types/unist": "*" - } - }, - "@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" - }, - "@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" - }, - "@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - }, - "@types/mdast": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", - "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", - "requires": { - "@types/unist": "*" - } - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "@types/node": { - "version": "20.1.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.7.tgz", - "integrity": "sha512-WCuw/o4GSwDGMoonES8rcvwsig77dGCMbZDrZr2x4ZZiNW4P/gcoZXe/0twgtobcTkmg9TuKflxYL/DuwDyJzg==" - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "@types/parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "@types/react": { - "version": "18.2.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz", - "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "requires": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "@types/react-router-config": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.7.tgz", - "integrity": "sha512-pFFVXUIydHlcJP6wJm7sDii5mD/bCmmAY0wQzq+M+uX7bqS95AQqHZWP1iNMKrWVQSuHIzj5qi9BvrtLX2/T4w==", - "requires": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "^5.1.0" - } - }, - "@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "requires": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "@types/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", - "requires": { - "@types/node": "*" - } - }, - "@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" - }, - "@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "requires": { - "@types/node": "*" - } - }, - "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - }, - "@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" - }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" - }, - "address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==" - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - } - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} - }, - "algoliasearch": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", - "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", - "requires": { - "@algolia/cache-browser-local-storage": "4.17.0", - "@algolia/cache-common": "4.17.0", - "@algolia/cache-in-memory": "4.17.0", - "@algolia/client-account": "4.17.0", - "@algolia/client-analytics": "4.17.0", - "@algolia/client-common": "4.17.0", - "@algolia/client-personalization": "4.17.0", - "@algolia/client-search": "4.17.0", - "@algolia/logger-common": "4.17.0", - "@algolia/logger-console": "4.17.0", - "@algolia/requester-browser-xhr": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/requester-node-http": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "algoliasearch-helper": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.13.0.tgz", - "integrity": "sha512-kV3c1jMQCvkARtGsSDvAwuht4PAMSsQILqPiH4WFiARoa3jXJ/r1TQoBWAjWyWF48rsNYCv7kzxgB4LTxrvvuw==", - "requires": { - "@algolia/events": "^4.0.1" - } - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "requires": { - "string-width": "^4.1.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", - "requires": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "axios": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", - "requires": { - "follow-redirects": "^1.14.7" - } - }, - "babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "babel-plugin-apply-mdx-type-prop": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", - "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "1.6.22" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-extract-import-names": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", - "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - } - }, - "bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base16": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "requires": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "requires": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001487", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz", - "integrity": "sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==" - }, - "ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" - }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" - }, - "cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "requires": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "dependencies": { - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - }, - "htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "requires": { - "entities": "^4.4.0" - } - } - } - }, - "cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "requires": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "dependencies": { - "css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - } - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" - }, - "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" - }, - "clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", - "requires": { - "source-map": "~0.6.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==" - }, - "cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" - }, - "collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "combine-promises": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", - "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==" - }, - "comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" - }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" - }, - "consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==" - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "copy-text-to-clipboard": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz", - "integrity": "sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==" - }, - "copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "requires": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "requires": { - "is-glob": "^4.0.3" - } - }, - "globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" - } - } - }, - "core-js": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz", - "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==" - }, - "core-js-compat": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", - "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", - "requires": { - "browserslist": "^4.21.5" - } - }, - "core-js-pure": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.2.tgz", - "integrity": "sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg==" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "cross-fetch": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", - "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", - "requires": { - "node-fetch": "^2.6.11" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - }, - "css-declaration-sorter": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", - "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", - "requires": {} - }, - "css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - } - }, - "css-minimizer-webpack-plugin": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", - "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", - "requires": { - "cssnano": "^5.1.8", - "jest-worker": "^29.1.2", - "postcss": "^8.4.17", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", - "requires": { - "@types/node": "*", - "jest-util": "^29.5.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "requires": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-advanced": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", - "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", - "requires": { - "autoprefixer": "^10.4.12", - "cssnano-preset-default": "^5.2.14", - "postcss-discard-unused": "^5.1.0", - "postcss-merge-idents": "^5.1.1", - "postcss-reduce-idents": "^5.2.0", - "postcss-zindex": "^5.1.0" - } - }, - "cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "requires": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "requires": {} - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "requires": { - "css-tree": "^1.1.2" - } - }, - "csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" - }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "requires": { - "execa": "^5.0.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" - }, - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "detab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", - "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", - "requires": { - "repeat-string": "^1.5.4" - } - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "requires": { - "address": "^1.0.1", - "debug": "4" - } - }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" - } - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" - }, - "dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - }, - "dependencies": { - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - } - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "electron-to-chromium": { - "version": "1.4.397", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.397.tgz", - "integrity": "sha512-jwnPxhh350Q/aMatQia31KAIQdhEsYS0fFZ0BQQlN9tfvOEwShu6ZNwI4kL/xBabjcB/nTy6lSt17kNIluJZ8Q==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "emoticon": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", - "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", - "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", - "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "eta": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/eta/-/eta-1.14.2.tgz", - "integrity": "sha512-wZmJAV7EFUG5W8XNXSazIdichnWEhGB1OWg4tnXWPj0CPNUcFdgorGNO6N9p6WBUgoUe4P0OziJYn1+6zxP2aQ==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", - "requires": { - "@types/node": "*", - "require-like": ">= 0.1.1" - } - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - } - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "requires": { - "punycode": "^1.3.2" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - } - } - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fbemitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", - "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", - "requires": { - "fbjs": "^3.0.0" - } - }, - "fbjs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", - "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", - "requires": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" - } - }, - "fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" - }, - "feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "requires": { - "xml-js": "^1.6.11" - } - }, - "file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - } - }, - "filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flux": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", - "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", - "requires": { - "fbemitter": "^3.0.0", - "fbjs": "^3.0.1" - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - }, - "fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - } - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "requires": { - "ini": "2.0.0" - }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" - } - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "requires": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "dependencies": { - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } - } - }, - "gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "requires": { - "duplexer": "^0.1.2" - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" - }, - "hast-to-hyperscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", - "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", - "requires": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-from-parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", - "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", - "requires": { - "@types/parse5": "^5.0.0", - "hastscript": "^6.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "vfile-location": "^3.2.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" - }, - "hast-util-raw": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", - "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", - "requires": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, - "hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "requires": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, - "hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "requires": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" - }, - "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "requires": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" - } - } - }, - "html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==" - }, - "html-void-elements": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" - }, - "html-webpack-plugin": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz", - "integrity": "sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA==", - "requires": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - } - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "dependencies": { - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" - } - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "requires": {} - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" - }, - "image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", - "requires": { - "queue": "6.0.2" - } - }, - "immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==" - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "infima": { - "version": "0.2.0-alpha.42", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", - "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" - }, - "is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" - }, - "is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - }, - "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - } - } - }, - "is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "requires": { - "has": "^1.0.3" - } - }, - "is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==" - }, - "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" - }, - "is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" - }, - "jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", - "requires": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jiti": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", - "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==" - }, - "joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "requires": { - "package-json": "^6.3.0" - } - }, - "launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", - "requires": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.curry": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "lodash.flow": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "requires": { - "tslib": "^2.0.3" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" - }, - "mdast-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "requires": { - "unist-util-remove": "^2.0.0" - } - }, - "mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-to-hast": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", - "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "memfs": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", - "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", - "requires": { - "fs-monkey": "^1.0.3" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "mini-css-extract-plugin": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz", - "integrity": "sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==", - "requires": { - "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "requires": { - "lodash": "^4.17.21" - } - }, - "node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" - }, - "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "requires": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "dependencies": { - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - }, - "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "requires": { - "entities": "^4.4.0" - } - } - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "requires": { - "isarray": "0.0.1" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" - }, - "pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" - } - } - }, - "postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "requires": {} - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "requires": {} - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "requires": {} - }, - "postcss-discard-unused": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", - "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "requires": { - "camelcase-css": "^2.0.1" - } - }, - "postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "dependencies": { - "yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==" - } - } - }, - "postcss-loader": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.0.tgz", - "integrity": "sha512-qLAFjvR2BFNz1H930P7mj1iuWJFjGey/nVhimfOAAQ1ZyPpcClAxP8+A55Sl8mBvM+K2a9Pjgdj10KpANWrNfw==", - "requires": { - "cosmiconfig": "^8.1.3", - "jiti": "^1.18.2", - "klona": "^2.0.6", - "semver": "^7.3.8" - }, - "dependencies": { - "cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", - "requires": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - } - } - } - }, - "postcss-merge-idents": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", - "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - } - }, - "postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "requires": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "requires": { - "postcss-selector-parser": "^6.0.11" - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-reduce-idents": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", - "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-sort-media-queries": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", - "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", - "requires": { - "sort-css-media-queries": "2.1.0" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "postcss-zindex": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", - "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", - "requires": {} - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" - }, - "pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "requires": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" - }, - "prism-react-renderer": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", - "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", - "requires": {} - }, - "prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "requires": { - "xtend": "^4.0.0" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "requires": { - "escape-goat": "^2.0.0" - } - }, - "pure-color": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "requires": { - "inherits": "~2.0.3" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==" - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-base16-styling": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", - "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", - "requires": { - "base16": "^1.0.0", - "lodash.curry": "^4.0.1", - "lodash.flow": "^3.3.0", - "pure-color": "^1.2.0" - } - }, - "react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "requires": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==" - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - } - } - }, - "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, - "react-fast-compare": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.1.tgz", - "integrity": "sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg==" - }, - "react-helmet-async": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", - "requires": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "react-json-view": { - "version": "1.21.3", - "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", - "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", - "requires": { - "flux": "^4.0.1", - "react-base16-styling": "^0.6.0", - "react-lifecycles-compat": "^3.0.4", - "react-textarea-autosize": "^8.3.2" - } - }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "react-loadable": { - "version": "npm:@docusaurus/react-loadable@5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", - "requires": { - "@types/react": "*", - "prop-types": "^15.6.2" - } - }, - "react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", - "requires": { - "@babel/runtime": "^7.10.3" - } - }, - "react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "requires": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - } - }, - "react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "requires": { - "@babel/runtime": "^7.1.2" - } - }, - "react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "requires": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - } - }, - "react-textarea-autosize": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz", - "integrity": "sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==", - "requires": { - "@babel/runtime": "^7.20.13", - "use-composed-ref": "^1.3.0", - "use-latest": "^1.2.1" - } - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "requires": { - "pify": "^2.3.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "reading-time": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "requires": { - "resolve": "^1.1.6" - } - }, - "recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "requires": { - "minimatch": "^3.0.5" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "requires": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "requires": { - "rc": "1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "requires": { - "rc": "^1.2.8" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" - }, - "remark-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", - "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", - "requires": { - "emoticon": "^3.2.0", - "node-emoji": "^1.10.0", - "unist-util-visit": "^2.0.3" - } - }, - "remark-footnotes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", - "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" - }, - "remark-mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", - "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", - "requires": { - "@babel/core": "7.12.9", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-syntax-jsx": "7.12.1", - "@mdx-js/util": "1.6.22", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.2.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - }, - "unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - } - } - }, - "remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "requires": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - } - }, - "remark-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "requires": { - "mdast-squeeze-paragraphs": "^4.0.0" - } - }, - "renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "rtl-detect": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", - "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" - }, - "rtlcss": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", - "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", - "requires": { - "find-up": "^5.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.3.11", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "requires": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" - }, - "selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "requires": { - "node-forge": "^1" - } - }, - "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - } - } - }, - "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", - "requires": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", - "range-parser": "1.2.0" - }, - "dependencies": { - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "requires": { - "mime-db": "~1.33.0" - } - }, - "path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" - } - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "requires": { - "kind-of": "^6.0.2" - } - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==" - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", - "requires": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^1.0.0" - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "sitemap": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", - "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", - "requires": { - "@types/node": "^17.0.5", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - }, - "dependencies": { - "@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" - } - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "sort-css-media-queries": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", - "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "std-env": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", - "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" - }, - "style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "requires": { - "inline-style-parser": "0.1.1" - } - }, - "stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "requires": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - } - }, - "sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "dependencies": { - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - } - } - }, - "tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "requires": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "requires": { - "is-glob": "^4.0.3" - } - } - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" - }, - "terser": { - "version": "5.17.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.4.tgz", - "integrity": "sha512-jcEKZw6UPrgugz/0Tuk/PVyLAPfMBJf5clnGueo45wTweoV8yh7Q7PEkhkJ5uuUbC7zAxEcG3tqNr1bstkQ8nw==", - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz", - "integrity": "sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==", - "requires": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" - }, - "trim-trailing-lines": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" - }, - "trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" - }, - "ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "ua-parser-js": { - "version": "0.7.35", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", - "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==" - }, - "unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "requires": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==" - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" - }, - "unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" - }, - "unist-util-generated": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" - }, - "unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" - }, - "unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" - }, - "unist-util-remove": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", - "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", - "requires": { - "unist-util-is": "^4.0.0" - } - }, - "unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "requires": { - "@types/unist": "^2.0.2" - } - }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - }, - "unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - } - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "requires": { - "string-width": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "requires": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "requires": { - "prepend-http": "^2.0.0" - } - }, - "use-composed-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", - "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", - "requires": {} - }, - "use-isomorphic-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "requires": {} - }, - "use-latest": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", - "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", - "requires": { - "use-isomorphic-layout-effect": "^1.1.1" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" - }, - "utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - } - }, - "vfile-location": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" - }, - "vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - }, - "wait-on": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", - "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", - "requires": { - "axios": "^0.25.0", - "joi": "^17.6.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^7.5.4" - } - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "web-namespaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "webpack": { - "version": "5.82.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz", - "integrity": "sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - } - }, - "webpack-bundle-analyzer": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", - "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", - "requires": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "opener": "^1.5.2", - "sirv": "^1.0.7", - "ws": "^7.3.1" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - } - } - }, - "webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - } - } - }, - "webpack-dev-server": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", - "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", - "requires": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - }, - "ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "requires": {} - } - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" - }, - "webpackbar": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", - "requires": { - "chalk": "^4.1.0", - "consola": "^2.15.3", - "pretty-time": "^1.1.0", - "std-env": "^3.0.1" - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "requires": { - "string-width": "^5.0.1" - } - }, - "wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "requires": {} - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" - }, - "xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "requires": { - "sax": "^1.2.4" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - }, - "zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" - } - } -} diff --git a/docs/package.json b/docs/package.json deleted file mode 100644 index 34d8fecc..00000000 --- a/docs/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "website", - "version": "0.0.0", - "private": true, - "scripts": { - "docusaurus": "docusaurus", - "start": "docusaurus start", - "build": "docusaurus build", - "swizzle": "docusaurus swizzle", - "deploy": "docusaurus deploy", - "clear": "docusaurus clear", - "serve": "docusaurus serve", - "write-translations": "docusaurus write-translations", - "write-heading-ids": "docusaurus write-heading-ids" - }, - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/preset-classic": "2.1.0", - "@mdx-js/react": "^1.6.22", - "clsx": "^1.1.1", - "prism-react-renderer": "^1.3.3", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "autoprefixer": "^10.4.14", - "tailwindcss": "^3.3.2", - "postcss": "^8.4.23", - "@iconify-icons/logos": "^1.2.31", - "@iconify/react": "^4.1.0" - - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "2.1.0" - }, - "browserslist": { - "production": [ - ">0.5%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } -} diff --git a/docs/sidebars.js b/docs/sidebars.js deleted file mode 100644 index a22fc6a3..00000000 --- a/docs/sidebars.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Creating a sidebar enables you to: - - create an ordered group of docs - - render a sidebar for each doc of that group - - provide next/previous navigation - - The sidebars can be generated from the filesystem, or explicitly defined here. - - Create as many sidebars as you want. - */ - -// @ts-check - -/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ -const sidebars = { - // By default, Docusaurus generates a sidebar from the docs folder structure - tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], - - user_docs: [ - { - type: 'autogenerated', - dirName: 'user_docs', - }, - ], - /*community: [ - { - type: 'autogenerated', - dirName: 'community', - }, - ],*/ - - sponsor: [ - { - type: 'autogenerated', - dirName: 'sponsor', - }, - ], - // But you can create a sidebar manually - /* - tutorialSidebar: [ - { - type: 'category', - label: 'Tutorial', - items: ['hello'], - }, - ], - */ -}; - -module.exports = sidebars; diff --git a/docs/sidebarsCommunity.js b/docs/sidebarsCommunity.js deleted file mode 100755 index 676888c2..00000000 --- a/docs/sidebarsCommunity.js +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -module.exports = { - community: [ - { - type: 'autogenerated', - dirName: '.', - }, - ], -}; diff --git a/docs/src/components/HomepageFeatures/index.js b/docs/src/components/HomepageFeatures/index.js deleted file mode 100644 index 1cd3ab96..00000000 --- a/docs/src/components/HomepageFeatures/index.js +++ /dev/null @@ -1,62 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import styles from './styles.module.css'; - -const FeatureList = [ - { - title: '动态变更', - Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, - description: ( - <> - 应用运行时动态变更线程池参数,包括不限于核心、最大线程、阻塞队列大小和拒绝策略等,支持应用集群下不同节点线程池配置差异化 - - ), - }, - { - title: '自定义报警', - Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, - description: ( - <> - 应用线程池运行时埋点,提供四种报警维度,线程池过载、阻塞队列容量、运行超长以及拒绝策略报警,并支持自定义时间内不重复报警 - - ), - }, - { - title: '运行监控', - Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, - description: ( - <> - 支持自定义时长线程池运行数据采集存储,同时也支持 Prometheus、InfluxDB 等采集监控,通过 - Grafana 或内置监控页面提供可视化大屏监控运行指标 - - ), - }, -]; - -function Feature({ Svg, title, description }) { - return ( -
-
- -
-
-

{title}

-

{description}

-
-
- ); -} - -export default function HomepageFeatures() { - return ( -
-
-
- {FeatureList.map((props, idx) => ( - - ))} -
-
-
- ); -} diff --git a/docs/src/components/HomepageFeatures/styles.module.css b/docs/src/components/HomepageFeatures/styles.module.css deleted file mode 100644 index b248eb2e..00000000 --- a/docs/src/components/HomepageFeatures/styles.module.css +++ /dev/null @@ -1,11 +0,0 @@ -.features { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; -} - -.featureSvg { - height: 200px; - width: 200px; -} diff --git a/docs/src/components/LandingPage/GithubInfo.jsx b/docs/src/components/LandingPage/GithubInfo.jsx deleted file mode 100644 index 98bcea4b..00000000 --- a/docs/src/components/LandingPage/GithubInfo.jsx +++ /dev/null @@ -1,71 +0,0 @@ -import React from 'react'; -import useGithubInfo from './useGithubInfo'; - -const GithubInfo = ({ owner, repo }) => { - const { favorites, language, forks, license } = useGithubInfo(owner, repo); - - return ( -

-

- -

- ); -}; - -export default GithubInfo; diff --git a/docs/src/components/LandingPage/Hero.jsx b/docs/src/components/LandingPage/Hero.jsx deleted file mode 100644 index 5d6decd8..00000000 --- a/docs/src/components/LandingPage/Hero.jsx +++ /dev/null @@ -1,82 +0,0 @@ -import React from 'react'; -import { useEffect } from 'react'; -import { Icon } from '@iconify/react'; -import useBaseUrl from '@docusaurus/useBaseUrl'; -import GithubInfo from './GithubInfo'; -import Translate, { translate } from '@docusaurus/Translate'; -import Link from '@docusaurus/Link'; -const Hero = () => { - return ( -
-
-
-
-

- Hippo4j Thread Pool -

-

- - Enhancing the Operational Assurance Capability for Business - Systems Online. - -

-
- -
-
- {/* button group */} -
- - - - - Start Learning - - - - - - - - - {' '} - - Github - - - - -
-
-
-
-

- homepage -

-
-
-
-
- ); -}; - -export default Hero; diff --git a/docs/src/components/LandingPage/Introduction.jsx b/docs/src/components/LandingPage/Introduction.jsx deleted file mode 100644 index 4ffadf2f..00000000 --- a/docs/src/components/LandingPage/Introduction.jsx +++ /dev/null @@ -1,174 +0,0 @@ -import React from 'react'; -import useBaseUrl from '@docusaurus/useBaseUrl'; -import Translate from '@docusaurus/Translate'; -const Introduction = () => { - return ( -
-
-
-
-
-
- -
-
-

- - What can Hippo4j do? - -

-

- - Provided functions such as dynamic adjustment of thread - pool, custom alerts. - -

-

- - Help improve the operational support capabilities of your - business system. - -

-
-
-
-
-
-
-
-
-
-
-
- feture-[object Object] -
-
-
-
-

- {' '} - - Dynamic Change - -

-
-

- - Application runtime dynamically changes thread pool - parameters. - {' '} -

-
-
-
-
-
-
-
-
-
- feture-[object Object] -
-
-
-
-

- {' '} - - Custom Alarm - -

-
-

- - Application thread pool runtime point, providing - four alarm dimensions. - -

-
-
-
-
-
-
-
-
-
- feture-[object Object] -
-
-
-
-

- - Operation Monitoring - -

-
-

- - Supports custom duration thread pool for data - collection and storage. - -

-
-
-
-
-
-
-
-
-
-
- ); -}; - -export default Introduction; diff --git a/docs/src/components/LandingPage/index.js b/docs/src/components/LandingPage/index.js deleted file mode 100644 index 11c9f6af..00000000 --- a/docs/src/components/LandingPage/index.js +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; -import Hero from './Hero'; -import Introduction from './Introduction'; -function LandingLayout(props) { - return ( -
- {/* */} - - - {/* */} - -
- ); -} - -export default LandingLayout; diff --git a/docs/src/components/LandingPage/useGithubInfo.jsx b/docs/src/components/LandingPage/useGithubInfo.jsx deleted file mode 100644 index 68fdf90a..00000000 --- a/docs/src/components/LandingPage/useGithubInfo.jsx +++ /dev/null @@ -1,30 +0,0 @@ -import { useState, useEffect } from "react"; - -const useGithubInfo = (owner, repo) => { - const [favorites, setFavorites] = useState(0); - const [language, setLanguage] = useState(""); - const [forks, setForks] = useState(0); - const [license, setLicense] = useState(""); - - useEffect(() => { - fetch(`https://api.github.com/repos/${owner}/${repo}`) - .then((response) => response.json()) - .then((data) => { - setFavorites(data.stargazers_count); - setLanguage(data.language); - setForks(data.forks_count); - setLicense(data.license?.name ?? ""); - }) - .catch((error) => { - console.error("Error fetching API data:", error); - }); - }, [owner, repo]); - - return { - favorites, - language, - forks, - license, - }; -}; -export default useGithubInfo; diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css deleted file mode 100644 index b41481ec..00000000 --- a/docs/src/css/custom.css +++ /dev/null @@ -1,637 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/* load tailwind css */ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap'); -@import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@700&display=swap'); -:root { - /* - See css var + hsl color palette technique: - https://blog.maximeheckel.com/posts/the-power-of-composition-with-css-variables/ - */ - --site-primary-hue-saturation: 167 68%; - --site-primary-hue-saturation-light: 167 56%; /* do we really need this extra one? */ - --site-color-favorite-background: #f6fdfd; - --site-color-tooltip: #fff; - --site-color-tooltip-background: #353738; - --site-color-svg-icon-favorite: #e9669e; - --site-color-checkbox-checked-bg: hsl(167deg 56% 73% / 25%); - --site-color-feedback-background: #fff; - --ifm-font-family-base: 'Poppins'; - /* custom */ - --docs-color-primary-tint: #2160fd29; - --ifm-breadcrumb-item-background-active: #0000000d; - --ifm-breadcrumb-color-active: #2160fd; -} - -html[data-theme='dark'] { - --site-color-feedback-background: #f0f8ff; - --site-color-favorite-background: #1d1e1e; - --site-color-checkbox-checked-bg: hsl(167deg 56% 73% / 10%); -} - -[data-theme='light'] { - --ifm-color-primary: #2160fd; - --ifm-color-primary-dark: hsl(var(--site-primary-hue-saturation) 26%); - --ifm-color-primary-darker: hsl(var(--site-primary-hue-saturation) 23%); - --ifm-color-primary-darkest: hsl(var(--site-primary-hue-saturation) 17%); - - --ifm-color-primary-light: hsl(var(--site-primary-hue-saturation-light) 39%); - --ifm-color-primary-lighter: hsl( - var(--site-primary-hue-saturation-light) 47% - ); - --ifm-color-primary-lightest: hsl( - var(--site-primary-hue-saturation-light) 58% - ); -} - -[data-theme='dark'] { - --ifm-color-primary: #1a90ff; - --ifm-color-primary-dark: hsl(var(--site-primary-hue-saturation) 41%); - --ifm-color-primary-darker: hsl(var(--site-primary-hue-saturation) 38%); - --ifm-color-primary-darkest: hsl(var(--site-primary-hue-saturation) 32%); - - --ifm-color-primary-light: hsl(var(--site-primary-hue-saturation-light) 54%); - --ifm-color-primary-lighter: hsl( - var(--site-primary-hue-saturation-light) 62% - ); - --ifm-color-primary-lightest: hsl( - var(--site-primary-hue-saturation-light) 73% - ); - --ifm-breadcrumb-item-background-active: #222222; - --ifm-breadcrumb-color-active: #1a90ff; -} - -.docusaurus-highlight-code-line { - background-color: rgb(0 0 0 / 10%); - display: block; - margin: 0 calc(-1 * var(--ifm-pre-padding)); - padding: 0 var(--ifm-pre-padding); -} - -[data-theme='dark'] .docusaurus-highlight-code-line { - background-color: rgb(66 66 66 / 30%); -} - -.header-github-link:hover { - opacity: 0.6; -} - -.header-github-link::before { - content: ''; - width: 24px; - height: 24px; - display: flex; - background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") - no-repeat; -} - -[data-theme='dark'] .header-github-link::before { - background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") - no-repeat; -} - -.footer--dark { - --ifm-footer-background-color: #2b3137; -} - -.unique-tabs .tabs__item { - line-height: 16px; - margin-right: 8px; -} - -.unique-tabs .tabs__item--active { - border: 0; - color: #fff; - border-radius: var(--ifm-global-radius); - background-color: var(--ifm-tabs-color-active); -} - -[data-theme='light'] .themedDocusaurus [fill='#FFFF50'] { - fill: greenyellow; -} - -[data-theme='dark'] .themedDocusaurus [fill='#FFFF50'] { - fill: seagreen; -} - -[data-theme='light'] .DocSearch { - --docsearch-muted-color: var(--ifm-color-emphasis-700); - --docsearch-container-background: rgb(94 100 112 / 70%); - /* Modal */ - --docsearch-modal-background: var(--ifm-color-secondary-lighter); - /* Search box */ - --docsearch-searchbox-background: var(--ifm-color-secondary); - --docsearch-searchbox-focus-background: var(--ifm-color-white); - /* Hit */ - --docsearch-hit-color: var(--ifm-font-color-base); - --docsearch-hit-active-color: var(--ifm-color-white); - --docsearch-hit-background: var(--ifm-color-white); - /* Footer */ - --docsearch-footer-background: var(--ifm-color-white); -} - -[data-theme='dark'] .DocSearch { - --docsearch-text-color: var(--ifm-font-color-base); - --docsearch-muted-color: var(--ifm-color-secondary-darkest); - --docsearch-container-background: rgb(47 55 69 / 70%); - /* Modal */ - --docsearch-modal-background: var(--ifm-background-color); - /* Search box */ - --docsearch-searchbox-background: var(--ifm-background-color); - --docsearch-searchbox-focus-background: var(--ifm-color-black); - /* Hit */ - --docsearch-hit-color: var(--ifm-font-color-base); - --docsearch-hit-active-color: var(--ifm-color-white); - --docsearch-hit-background: var(--ifm-color-emphasis-100); - /* Footer */ - --docsearch-footer-background: var(--ifm-background-surface-color); - --docsearch-key-gradient: linear-gradient( - -26.5deg, - var(--ifm-color-emphasis-200) 0%, - var(--ifm-color-emphasis-100) 100% - ); -} - -div[class^='announcementBar_'] { - --site-announcement-bar-stripe-color1: hsl( - var(--site-primary-hue-saturation) 85% - ); - --site-announcement-bar-stripe-color2: hsl( - var(--site-primary-hue-saturation) 95% - ); - background: repeating-linear-gradient( - 35deg, - var(--site-announcement-bar-stripe-color1), - var(--site-announcement-bar-stripe-color1) 20px, - var(--site-announcement-bar-stripe-color2) 10px, - var(--site-announcement-bar-stripe-color2) 40px - ); - font-weight: bold; -} - -.red > a { - color: red; -} - -.screen-reader-only { - border: 0; - clip: rect(0 0 0 0); - clip-path: polygon(0 0, 0 0, 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; - white-space: nowrap; -} - -[data-theme='light'] img[src$='#gh-dark-mode-only'], -[data-theme='dark'] img[src$='#gh-light-mode-only'] { - display: none; -} - -/* Used to test CSS insertion order */ -.test-marker-site-custom-css-unique-rule { - content: 'site-custom-css-unique-rule'; -} - -@media only screen and (max-width: 996px) { - .video-container { - position: relative; - overflow: hidden; - width: 100%; - max-width: 560px; - margin: 0 auto; - padding-top: 56.25%; - } - - .video-container iframe { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - } -} - -@media (min-width: 1440px) { - .container { - max-width: var(--ifm-container-width-xl); - } -} - -@media (max-width: 996px) { - .col { - --ifm-col-width: 100%; - flex-basis: var(--ifm-col-width); - margin-left: 0; - } - - .footer { - --ifm-footer-padding-horizontal: 0; - } - - .colorModeToggle_DEke, - .footer__link-separator, - .navbar__item, - .sidebar_re4s, - .tableOfContents_bqdL { - display: none; - } - - .footer__col { - margin-bottom: calc(var(--ifm-spacing-vertical) * 3); - } - - .footer__link-item { - display: block; - } - - .navbar > .container, - .navbar > .container-fluid { - padding: 0; - } - - .navbar__toggle { - display: inherit; - } - - .navbar__search-input { - width: 9rem; - } - - .pills--block, - .tabs--block { - flex-direction: column; - } - - .searchBox_ZlJk { - position: absolute; - right: var(--ifm-navbar-padding-horizontal); - } - - .docItemContainer_F8PC { - padding: 0 0.3rem; - } -} - -/* Custom */ -.bg-cousom { - background-position: 50% 65%; -} - -:root[data-theme='light'] { - --hero-image-url: url('../../static/img/hero/hero-removebg.png'); - --bg-background-color: #ffffff; - --bg-background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='199' viewBox='0 0 100 199'%3E%3Cg fill='%23dddddd' fill-opacity='0.4'%3E%3Cpath d='M0 199V0h1v1.99L100 199h-1.12L1 4.22V199H0zM100 2h-.12l-1-2H100v2z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E"); -} - -:root[data-theme='dark'] { - --hero-image-url: url('../../static/img/hero/hero-removebg.png'); - --bg-background-color: #1b1b1d; - --bg-background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 48 48'%3E%3Cg fill='%239C92AC' fill-opacity='0.4'%3E%3Cpath fill-rule='evenodd' d='M5 3.59L1.46.05.05 1.46 3.59 5 .05 8.54l1.41 1.41L5 6.41l3.54 3.54 1.41-1.41L6.41 5l3.54-3.54L8.54.05 5 3.59zM17 2h24v2H17V2zm0 4h24v2H17V6zM2 17h2v24H2V17zm4 0h2v24H6V17z'/%3E%3C/g%3E%3C/svg%3E"); -} - -.bg-svg { - background-color: var(--bg-background-color); - background-image: var(--bg-background-image); -} - -.hero-img { - content: var(--hero-image-url); -} - -.h-custom { - height: 65vh; -} - -.font-jakarta { - font-family: 'Plus Jakarta Sans', sans-serif; -} - -/* sidebar style */ -ul.menu__list > li > a.menu__link--active { - border-right: 1px solid var(--ifm-color-primary); -} - -nav.menu { - padding-right: 0px; - scrollbar-gutter: auto; -} - -.menu__link { - border-radius: 4px 0 0 4px; - --ifm-menu-color-background-active: var(--docs-color-primary-tint); -} - -/* other style */ -::selection { - --tw-text-opacity: 1; - background-color: rgb(var(--docs-color-primary-200, 33 96 253) / 0.8); - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -div[class^='announcementBar_'] { - font-size: 16px; - background: none; - background-color: #fafbfc; - padding: 8px 0; - display: flex; - justify-content: center; - font-weight: inherit; -} -div[class^='announcementBar_'] a { - text-decoration: underline; - color: #091e42; -} - -.introduction-container { - color: #1c1e21; -} -.three-part-container p { - margin: 0; - line-height: 2; -} - -.logo-img-container { - align-items: center; - background: #fff; - border: 1px solid #eaecef; - border-radius: 4px; - box-shadow: 0 1px 2px 0 #f8f9fa; - display: flex; - height: 80px; - justify-content: center; - margin: 5px; - min-width: 0; -} - -/* new add */ -.hero { - align-items: center; - background-color: #fff; - color: #000; - display: flex; - padding: 4rem 2rem; -} - -.heroBanner_UJJx { - overflow: hidden; - padding: 1rem 0 5rem; - position: relative; - text-align: center; -} -.my-container { - margin: 0 auto; - max-width: 1140px; -} - -.row { - display: flex; - flex-wrap: wrap; - margin: 0 calc(1rem * -1); -} - -.col[class*='col--'] { - flex: 0 0 var(--ifm-col-width); -} - -.col { - --ifm-col-width: 100%; - flex: 1 0; - margin-left: 0; - max-width: var(--ifm-col-width); -} -.col--6 { - --ifm-col-width: 50%; -} - -.col--3 { - --ifm-col-width: 25%; -} -.col--9 { - --ifm-col-width: 75%; -} - -.col, -.my-container { - padding: 0 1rem; - width: 100%; -} - -.hero__logo { - height: 150px; - max-width: 500px; - transform: translateY(40%); -} -.hero__logo, -.hero__subtitle, -.hero__title { - margin: 0 auto; - width: 100%; -} -h1, -h2, -h3 { - font-weight: 400; - line-height: 1.25; -} - -.social_VnSH { - margin-top: 30px; -} - -.buttons_pzbO { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: center; - margin: 30px 0 0; -} - -.hero__title { - background-size: 110%; - color: transparent; - height: 300px; - max-width: 400px; - font-size: 3rem; -} -.hero__subtitle { - font-size: 1.2em; - max-width: 600px; -} - -.hfeatureImage_Eu74 { - height: 100%; - padding: 60px 1rem !important; -} -.hfeatureContent_iAnb { - padding: 60px 0 60px calc(1rem + 20px) !important; -} - -.section_rXKr { - padding: 4rem 0; - width: 100%; -} -.section_rXKr h3 { - font-size: 1.7em; - font-weight: 500; - text-align: center; -} -.feature_gF_R { - margin-bottom: 0.5rem; -} - -.featureImage_FjLv { - height: 256px; -} -.featureDesc_r01v { - align-items: center; - display: flex !important; -} -.featureReverse_QJY9 { - flex-direction: row-reverse; - float: right; -} -/* github button */ -.widget { - display: inline-block; - overflow: hidden; - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, - sans-serif; - font-size: 0; - line-height: 0; - white-space: nowrap; -} -.btn, -.social-count { - position: relative; - display: inline-block; - display: inline-flex; - justify-content: center; - /* height: 14px; */ - padding: 2px 5px; - font-size: 11px; - font-weight: 600; - line-height: 14px; - vertical-align: bottom; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-repeat: repeat-x; - background-position: -1px -1px; - background-size: 110% 110%; - border: 1px solid; -} -.btn { - border-radius: 0.25em; -} -.btn:not(:last-child) { - border-radius: 0.25em 0 0 0.25em; -} -.social-count { - border-left: 0; - border-radius: 0 0.25em 0.25em 0; -} - -.octicon { - display: inline-block; - vertical-align: text-top; - fill: currentColor; - overflow: visible; -} -.btn:focus-visible, -.social-count:focus-visible { - outline: 2px solid #0969da; - outline-offset: -2px; -} -.btn { - color: #24292f; - background-color: #ebf0f4; - border-color: #ccd1d5; - border-color: rgba(31, 35, 40, 0.15); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg'%3e%3clinearGradient id='o' x2='0' y2='1'%3e%3cstop stop-color='%23f6f8fa'/%3e%3cstop offset='90%25' stop-color='%23ebf0f4'/%3e%3c/linearGradient%3e%3crect width='100%25' height='100%25' fill='url(%23o)'/%3e%3c/svg%3e"); - background-image: -moz-linear-gradient(top, #f6f8fa, #ebf0f4 90%); - background-image: linear-gradient(180deg, #f6f8fa, #ebf0f4 90%); - filter: progid:DXImageTransform.Microsoft.Gradient(startColorstr='#FFF6F8FA', endColorstr='#FFEAEFF3'); -} - -.btn:hover, -.btn:focus { - background-color: #e9ebef; - background-position: 0 -0.5em; - border-color: #cbcdd1; - border-color: rgba(31, 35, 40, 0.15); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg'%3e%3clinearGradient id='o' x2='0' y2='1'%3e%3cstop stop-color='%23f3f4f6'/%3e%3cstop offset='90%25' stop-color='%23e9ebef'/%3e%3c/linearGradient%3e%3crect width='100%25' height='100%25' fill='url(%23o)'/%3e%3c/svg%3e"); - background-image: -moz-linear-gradient(top, #f3f4f6, #e9ebef 90%); - background-image: linear-gradient(180deg, #f3f4f6, #e9ebef 90%); - filter: progid:DXImageTransform.Microsoft.Gradient(startColorstr='#FFF3F4F6', endColorstr='#FFE8EAEE'); -} - -.btn:active { - background-color: #e5e9ed; - border-color: #c7cbcf; - border-color: rgba(31, 35, 40, 0.15); - background-image: none; - filter: none; -} -.social-count { - color: #24292f; - background-color: #fff; - border-color: #dddedf; - border-color: rgba(31, 35, 40, 0.15); -} -.social-count:hover, -.social-count:focus { - color: #0969da; -} - -@media screen and (max-width: 966px) { - .heroBanner_UJJx { - padding: 2rem; - } - .col { - --ifm-col-width: 100%; - flex-basis: var(--ifm-col-width); - margin-left: 0; - } - .hero { - padding-left: 0; - padding-right: 0; - } -} - -@media screen and (max-width: 768px) { - .feature_gF_R { - margin-bottom: 0.5rem; - } - .featureImage_FjLv { - height: 96px; - margin-bottom: 1.5rem; - } -} -@media (max-width: 650px) { - .buttons_pzbO > a { - margin: 10px 5px; - } - .frameworkLogos_QXHq img { - height: 45px; - } -} -@media (min-width: 1440px) { - .my-container { - max-width: 1320px; - } -} diff --git a/docs/src/pages/group.md b/docs/src/pages/group.md deleted file mode 100644 index cbc68711..00000000 --- a/docs/src/pages/group.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -sidebar_position: 1 -title: 加群沟通 ---- - -## 关注公众号 - -如果大家想要实时关注 Hippo4j 更新的文章以及分享的干货的话,可以关注我的公众号。 - -![](https://oss.open8gu.com/image-20230317191041262-mini.png) - -## 加群沟通 - -使用过程中有任何问题,或者对项目有什么建议,关注公众号回复:加群,和 1000+ 志同道合的朋友交流讨论。 - -![](https://oss.open8gu.com/image-20230411000121790.png) diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js deleted file mode 100644 index 131a8de2..00000000 --- a/docs/src/pages/index.js +++ /dev/null @@ -1,60 +0,0 @@ -import React from 'react'; -import { useEffect } from 'react'; -import clsx from 'clsx'; -import Link from '@docusaurus/Link'; -// import Translate from "@docusaurus/Translate"; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import Layout from '@theme/Layout'; -// import HomepageFeatures from "@site/src/components/HomepageFeatures"; -import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment'; - -import LandingLayout from '@site/src/components/LandingPage'; -import Head from '@docusaurus/Head'; -import styles from './index.module.css'; - -if (ExecutionEnvironment.canUseDOM) { - var _hmt = _hmt || []; - (function () { - var hm = document.createElement('script'); - hm.src = 'https://hm.baidu.com/hm.js?473eaadc06f3d63771f303df1fc29b58'; - var s = document.getElementsByTagName('script')[0]; - s.parentNode.insertBefore(hm, s); - })(); -} - -function HomepageHeader() { - const { siteConfig } = useDocusaurusContext(); - return ( -
-
-

{siteConfig.title}

-

{siteConfig.tagline}

-
- - 快速开始 - 5min ⏱️ - -
-
-
- ); -} - -export default function Home() { - const { siteConfig } = useDocusaurusContext(); - - return ( - - {/* */} -
- {/* */} - -
-
- ); -} diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css deleted file mode 100644 index 9f71a5da..00000000 --- a/docs/src/pages/index.module.css +++ /dev/null @@ -1,23 +0,0 @@ -/** - * CSS files with the .module.css suffix will be treated as CSS modules - * and scoped locally. - */ - -.heroBanner { - padding: 4rem 0; - text-align: center; - position: relative; - overflow: hidden; -} - -@media screen and (max-width: 996px) { - .heroBanner { - padding: 2rem; - } -} - -.buttons { - display: flex; - align-items: center; - justify-content: center; -} diff --git a/docs/src/pages/markdown-page.md b/docs/src/pages/markdown-page.md deleted file mode 100644 index 9756c5b6..00000000 --- a/docs/src/pages/markdown-page.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Markdown page example ---- - -# Markdown page example - -You don't need React to write simple standalone pages. diff --git a/docs/src/pages/old_users.md b/docs/src/pages/old_users.md deleted file mode 100644 index 18a765f1..00000000 --- a/docs/src/pages/old_users.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -sidebar_position: 1 -title: 采用公司 ---- - -## 谁在使用 Hippo4j - -共计 46+ 家公司生产接入 Hippo4j,按照公司登记时间排序。 - -- [身边云](https://serviceshare.com) -- [思派健康科技](https://www.medbanks.cn) -- [北京智合联创科技有限公司](http://www.zhlc.com.cn) -- [神州数码(北京)](http://www.digitalchina.com) -- [PayerMax](https://www.payermax.com/) -- [轻松到家](http://www.uyess.com/index.html) -- [某商业银行股份有限公司](https://github.com/opengoofy/hippo4j/issues/13) -- [某国际物流信息股份有限公司](https://github.com/opengoofy/hippo4j/issues/13) -- [萨科(深圳)科技有限公司](https://www.lbdj.com/) -- [广东天枢新能源科技有限公司](https://gd-tianshu.com/) -- [FitTime](http://fittime.com/) -- [百强国际物流](https://github.com/opengoofy/hippo4j/issues/13) -- [海南某深圳分公司](https://github.com/opengoofy/hippo4j/issues/13) -- [众合云科(51社保)](https://home.101hr.com/) -- [好货云店](https://pc.haohuoyundian.com/) -- [斗象科技](https://www.tophant.com/) -- [深圳航天信息有限公司](http://sz.aisino.com/) -- [新东方教育科技集团](https://www.xdf.cn/) -- [远眺网络科技有限公司](https://www.yuantiaokj.com/) -- [浙江吉利控股集团有限公司](https://www.geely.com/) -- [三立人(深圳)科技有限公司-焦内](https://www.bananain.com/) -- [上海天猫好房添玑网络服务有限公司](http://www.eju.com/) -- [郑州力通水务](http://www.zzltsw.com/) -- [北京自如信息科技有限公司](https://www.ziroom.com/) -- [北京易车信息科技有限公司](https://www.yiche.com/) -- [中新软件(上海)有限公司](http://www.5000m.com) -- [深圳市上马网络技术有限公司](https://www.shangmanet.com) -- [兰亭集势(成都)科技有限公司](https://www.lightinthebox.com/) -- [杭州数理大数据有限公司](https://www.data4truth.com/#/) -- [九四智能](https://94ai.com) -- [新华智云科技有限公司](https://www.xinhuazhiyun.com) -- [银丰新融](https://www.ist.com.cn) -- [深圳市帮客帮科技有限公司](https://www.bangkebang.com) -- [重庆威爱云科技有限公司](https://51vive.com) -- [网易有道信息技术(北京)有限公司](https://www.youdao.com) -- [神州数码(西安)](https://www.digitalchina.com) -- [广联达科技股份有限公司](https://www.glodon.com) -- [天健联创控股集团有限公司](https://www.tjlc.com.cn) -- [知乎](https://www.zhihu.com/) -- [广东谷通科技有限公司](https://www.duofriend.com) -- [成都全域智旅科技有限公司](http://qyzl.com) -- [深圳市华云中盛科技股份有限公司](http://www.hua-cloud.cn) -- [智慧芽信息科技(苏州)有限公司](https://www.zhihuiya.com) -- [滴滴出行](https://www.didiglobal.com) -- [杭州源诚科技有限公司](http://www.yckjdata.com) -- [汉克时代](https://www.hunktimes.com/) - -## 登记 - -欢迎采用了 Hippo4j 的公司在此登记,非常感谢大家对 Hippo4j 的关注和支持,这是我们前进最大的动力。 - -请按公司名 + 首页的格式在 [此处](https://github.com/opengoofy/hippo4j/issues/13) 登记。 diff --git a/docs/src/pages/users.js b/docs/src/pages/users.js deleted file mode 100644 index c0bdebc4..00000000 --- a/docs/src/pages/users.js +++ /dev/null @@ -1,89 +0,0 @@ -import React from "react"; -import Layout from "@theme/Layout"; -import companyData from "@site/static/json/company_logo.json"; -import useBaseUrl from "@docusaurus/useBaseUrl"; -import Translate from "@docusaurus/Translate"; -function CompanyCards({ companies }) { - return ( -
- {/* Filter out those without a logo. */} - {companies - .filter((comapny) => comapny.logo.length > 0) - .map((company) => ( -
window.open(company.url)} - className="rounded-lg overflow-hidden transform cursor-pointer transition-all duration-500 hover:scale-110" - // style={{ border: "1px solid #E5E7EB" }} - > -
- {`${company.name}`} -
-
- ))} -
- ); -} -export default function OurUsers() { - return ( - -
- {/* text description*/} -
-
-

- - Who is using Hippo4j? - -

-
-
-
-

- - Thank you very much for your attention and support to Hippo4j. - This is our greatest motivation to move forward. - {" "} -

-

- - Are you using Hippo4j? - {" "} - - - Click to register - - -

-
-
- {/* company logo display */} - -
-
- ); -} diff --git a/docs/static/.nojekyll b/docs/static/.nojekyll deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/static/img/company_logos/5000m.jpg b/docs/static/img/company_logos/5000m.jpg deleted file mode 100644 index 7f22d880..00000000 Binary files a/docs/static/img/company_logos/5000m.jpg and /dev/null differ diff --git a/docs/static/img/company_logos/51shebao.png b/docs/static/img/company_logos/51shebao.png deleted file mode 100644 index 99dfee52..00000000 Binary files a/docs/static/img/company_logos/51shebao.png and /dev/null differ diff --git a/docs/static/img/company_logos/94ai.png b/docs/static/img/company_logos/94ai.png deleted file mode 100644 index c5de8d94..00000000 Binary files a/docs/static/img/company_logos/94ai.png and /dev/null differ diff --git a/docs/static/img/company_logos/aisino.png b/docs/static/img/company_logos/aisino.png deleted file mode 100644 index f9256488..00000000 Binary files a/docs/static/img/company_logos/aisino.png and /dev/null differ diff --git a/docs/static/img/company_logos/bananain.png b/docs/static/img/company_logos/bananain.png deleted file mode 100644 index 9644a076..00000000 Binary files a/docs/static/img/company_logos/bananain.png and /dev/null differ diff --git a/docs/static/img/company_logos/bangkebang.jpg b/docs/static/img/company_logos/bangkebang.jpg deleted file mode 100644 index 699b6d81..00000000 Binary files a/docs/static/img/company_logos/bangkebang.jpg and /dev/null differ diff --git a/docs/static/img/company_logos/data4truth.jpg b/docs/static/img/company_logos/data4truth.jpg deleted file mode 100644 index af970b78..00000000 Binary files a/docs/static/img/company_logos/data4truth.jpg and /dev/null differ diff --git a/docs/static/img/company_logos/didiglobal.svg b/docs/static/img/company_logos/didiglobal.svg deleted file mode 100644 index 4e77b591..00000000 --- a/docs/static/img/company_logos/didiglobal.svg +++ /dev/null @@ -1,43 +0,0 @@ - - -Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/static/img/company_logos/digitalchina.png b/docs/static/img/company_logos/digitalchina.png deleted file mode 100644 index 77f4a497..00000000 Binary files a/docs/static/img/company_logos/digitalchina.png and /dev/null differ diff --git a/docs/static/img/company_logos/duofriend.png b/docs/static/img/company_logos/duofriend.png deleted file mode 100644 index fea60c3f..00000000 Binary files a/docs/static/img/company_logos/duofriend.png and /dev/null differ diff --git a/docs/static/img/company_logos/eju.png b/docs/static/img/company_logos/eju.png deleted file mode 100644 index 514d7353..00000000 Binary files a/docs/static/img/company_logos/eju.png and /dev/null differ diff --git a/docs/static/img/company_logos/fittime.png b/docs/static/img/company_logos/fittime.png deleted file mode 100644 index 4c19cf98..00000000 Binary files a/docs/static/img/company_logos/fittime.png and /dev/null differ diff --git a/docs/static/img/company_logos/geely.jpg b/docs/static/img/company_logos/geely.jpg deleted file mode 100644 index ca5ce4ee..00000000 Binary files a/docs/static/img/company_logos/geely.jpg and /dev/null differ diff --git a/docs/static/img/company_logos/glodon.jpg b/docs/static/img/company_logos/glodon.jpg deleted file mode 100644 index b9a7deaa..00000000 Binary files a/docs/static/img/company_logos/glodon.jpg and /dev/null differ diff --git a/docs/static/img/company_logos/haohuoyundian.png b/docs/static/img/company_logos/haohuoyundian.png deleted file mode 100644 index b2385b4a..00000000 Binary files a/docs/static/img/company_logos/haohuoyundian.png and /dev/null differ diff --git a/docs/static/img/company_logos/hua-cloud.jpg b/docs/static/img/company_logos/hua-cloud.jpg deleted file mode 100644 index 0bb358b9..00000000 Binary files a/docs/static/img/company_logos/hua-cloud.jpg and /dev/null differ diff --git a/docs/static/img/company_logos/ist.png b/docs/static/img/company_logos/ist.png deleted file mode 100644 index 53426d73..00000000 Binary files a/docs/static/img/company_logos/ist.png and /dev/null differ diff --git a/docs/static/img/company_logos/lbdj.svg b/docs/static/img/company_logos/lbdj.svg deleted file mode 100644 index e4c5c141..00000000 --- a/docs/static/img/company_logos/lbdj.svg +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/static/img/company_logos/lightinthebox.avif b/docs/static/img/company_logos/lightinthebox.avif deleted file mode 100644 index 855e3212..00000000 Binary files a/docs/static/img/company_logos/lightinthebox.avif and /dev/null differ diff --git a/docs/static/img/company_logos/medbanks.png b/docs/static/img/company_logos/medbanks.png deleted file mode 100644 index b62b7564..00000000 Binary files a/docs/static/img/company_logos/medbanks.png and /dev/null differ diff --git a/docs/static/img/company_logos/payermax.png b/docs/static/img/company_logos/payermax.png deleted file mode 100644 index bc5d6b8f..00000000 Binary files a/docs/static/img/company_logos/payermax.png and /dev/null differ diff --git a/docs/static/img/company_logos/qyzl.jpg b/docs/static/img/company_logos/qyzl.jpg deleted file mode 100644 index 109d1aed..00000000 Binary files a/docs/static/img/company_logos/qyzl.jpg and /dev/null differ diff --git a/docs/static/img/company_logos/serviceshare.png b/docs/static/img/company_logos/serviceshare.png deleted file mode 100644 index 91400261..00000000 Binary files a/docs/static/img/company_logos/serviceshare.png and /dev/null differ diff --git a/docs/static/img/company_logos/shangmanet.png b/docs/static/img/company_logos/shangmanet.png deleted file mode 100644 index 4b9fd07f..00000000 Binary files a/docs/static/img/company_logos/shangmanet.png and /dev/null differ diff --git a/docs/static/img/company_logos/tianshu.png b/docs/static/img/company_logos/tianshu.png deleted file mode 100644 index 87765e7b..00000000 Binary files a/docs/static/img/company_logos/tianshu.png and /dev/null differ diff --git a/docs/static/img/company_logos/tjlc.png b/docs/static/img/company_logos/tjlc.png deleted file mode 100644 index 3270752c..00000000 Binary files a/docs/static/img/company_logos/tjlc.png and /dev/null differ diff --git a/docs/static/img/company_logos/tophant.png b/docs/static/img/company_logos/tophant.png deleted file mode 100644 index 570adcd9..00000000 Binary files a/docs/static/img/company_logos/tophant.png and /dev/null differ diff --git a/docs/static/img/company_logos/uyess.jpg b/docs/static/img/company_logos/uyess.jpg deleted file mode 100644 index 63f6c575..00000000 Binary files a/docs/static/img/company_logos/uyess.jpg and /dev/null differ diff --git a/docs/static/img/company_logos/xdf.png b/docs/static/img/company_logos/xdf.png deleted file mode 100644 index 52bff0ea..00000000 Binary files a/docs/static/img/company_logos/xdf.png and /dev/null differ diff --git a/docs/static/img/company_logos/xinhuazhiyun.svg b/docs/static/img/company_logos/xinhuazhiyun.svg deleted file mode 100644 index 35563aa7..00000000 --- a/docs/static/img/company_logos/xinhuazhiyun.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/static/img/company_logos/yckjdata.png b/docs/static/img/company_logos/yckjdata.png deleted file mode 100644 index 278c349d..00000000 Binary files a/docs/static/img/company_logos/yckjdata.png and /dev/null differ diff --git a/docs/static/img/company_logos/yiche.png b/docs/static/img/company_logos/yiche.png deleted file mode 100644 index ee8f903f..00000000 Binary files a/docs/static/img/company_logos/yiche.png and /dev/null differ diff --git a/docs/static/img/company_logos/youdao.png b/docs/static/img/company_logos/youdao.png deleted file mode 100644 index b41d98fb..00000000 Binary files a/docs/static/img/company_logos/youdao.png and /dev/null differ diff --git a/docs/static/img/company_logos/yuantiaokj.png b/docs/static/img/company_logos/yuantiaokj.png deleted file mode 100644 index 83ca9e60..00000000 Binary files a/docs/static/img/company_logos/yuantiaokj.png and /dev/null differ diff --git a/docs/static/img/company_logos/zhihu.png b/docs/static/img/company_logos/zhihu.png deleted file mode 100644 index f9169792..00000000 Binary files a/docs/static/img/company_logos/zhihu.png and /dev/null differ diff --git a/docs/static/img/company_logos/zhihuiya.png b/docs/static/img/company_logos/zhihuiya.png deleted file mode 100644 index 5e0421e1..00000000 Binary files a/docs/static/img/company_logos/zhihuiya.png and /dev/null differ diff --git a/docs/static/img/company_logos/zhlc.png b/docs/static/img/company_logos/zhlc.png deleted file mode 100644 index 159f4231..00000000 Binary files a/docs/static/img/company_logos/zhlc.png and /dev/null differ diff --git a/docs/static/img/company_logos/ziroom.png b/docs/static/img/company_logos/ziroom.png deleted file mode 100644 index e3b625d4..00000000 Binary files a/docs/static/img/company_logos/ziroom.png and /dev/null differ diff --git a/docs/static/img/company_logos/zzltsw.jpg b/docs/static/img/company_logos/zzltsw.jpg deleted file mode 100644 index 35eec51e..00000000 Binary files a/docs/static/img/company_logos/zzltsw.jpg and /dev/null differ diff --git a/docs/static/img/docusaurus.png b/docs/static/img/docusaurus.png deleted file mode 100644 index f458149e..00000000 Binary files a/docs/static/img/docusaurus.png and /dev/null differ diff --git a/docs/static/img/favicon.ico b/docs/static/img/favicon.ico deleted file mode 100644 index c01d54bc..00000000 Binary files a/docs/static/img/favicon.ico and /dev/null differ diff --git a/docs/static/img/favicon.png b/docs/static/img/favicon.png deleted file mode 100644 index 3fd750f5..00000000 Binary files a/docs/static/img/favicon.png and /dev/null differ diff --git a/docs/static/img/hero.svg b/docs/static/img/hero.svg deleted file mode 100644 index 6810761a..00000000 --- a/docs/static/img/hero.svg +++ /dev/null @@ -1,1362 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/static/img/hero/bg.jpg b/docs/static/img/hero/bg.jpg deleted file mode 100644 index d091d3ff..00000000 Binary files a/docs/static/img/hero/bg.jpg and /dev/null differ diff --git a/docs/static/img/hero/bg2.jpg b/docs/static/img/hero/bg2.jpg deleted file mode 100644 index 00fff65e..00000000 Binary files a/docs/static/img/hero/bg2.jpg and /dev/null differ diff --git a/docs/static/img/hero/hero-removebg.png b/docs/static/img/hero/hero-removebg.png deleted file mode 100644 index d402847d..00000000 Binary files a/docs/static/img/hero/hero-removebg.png and /dev/null differ diff --git a/docs/static/img/hero/hero.jpg b/docs/static/img/hero/hero.jpg deleted file mode 100644 index 84fabc9b..00000000 Binary files a/docs/static/img/hero/hero.jpg and /dev/null differ diff --git a/docs/static/img/hippo4j.png b/docs/static/img/hippo4j.png deleted file mode 100644 index 66ab4b25..00000000 Binary files a/docs/static/img/hippo4j.png and /dev/null differ diff --git a/docs/static/img/hippo4j_favicon.ico b/docs/static/img/hippo4j_favicon.ico deleted file mode 100644 index 264e6fc6..00000000 Binary files a/docs/static/img/hippo4j_favicon.ico and /dev/null differ diff --git a/docs/static/img/introduction/p1.svg b/docs/static/img/introduction/p1.svg deleted file mode 100644 index b8036b71..00000000 --- a/docs/static/img/introduction/p1.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/static/img/introduction/p11.svg b/docs/static/img/introduction/p11.svg deleted file mode 100644 index 5286c350..00000000 --- a/docs/static/img/introduction/p11.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/static/img/introduction/p2.svg b/docs/static/img/introduction/p2.svg deleted file mode 100644 index f28d4722..00000000 --- a/docs/static/img/introduction/p2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/static/img/introduction/p22.svg b/docs/static/img/introduction/p22.svg deleted file mode 100644 index 9a82acb0..00000000 --- a/docs/static/img/introduction/p22.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/static/img/introduction/p3.svg b/docs/static/img/introduction/p3.svg deleted file mode 100644 index d7078a32..00000000 --- a/docs/static/img/introduction/p3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/static/img/introduction/p33.svg b/docs/static/img/introduction/p33.svg deleted file mode 100644 index cb7e6e12..00000000 --- a/docs/static/img/introduction/p33.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/static/img/introduction/t.jpg b/docs/static/img/introduction/t.jpg deleted file mode 100644 index 1f4b862c..00000000 Binary files a/docs/static/img/introduction/t.jpg and /dev/null differ diff --git a/docs/static/img/introduction/t2.svg b/docs/static/img/introduction/t2.svg deleted file mode 100644 index 6d9f7370..00000000 --- a/docs/static/img/introduction/t2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/static/img/logo.svg b/docs/static/img/logo.svg deleted file mode 100644 index 9db6d0d0..00000000 --- a/docs/static/img/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/static/img/undraw_docusaurus_mountain.svg b/docs/static/img/undraw_docusaurus_mountain.svg deleted file mode 100644 index af961c49..00000000 --- a/docs/static/img/undraw_docusaurus_mountain.svg +++ /dev/null @@ -1,171 +0,0 @@ - - Easy to Use - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/static/img/undraw_docusaurus_react.svg b/docs/static/img/undraw_docusaurus_react.svg deleted file mode 100644 index 94b5cf08..00000000 --- a/docs/static/img/undraw_docusaurus_react.svg +++ /dev/null @@ -1,170 +0,0 @@ - - Powered by React - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/static/img/undraw_docusaurus_tree.svg b/docs/static/img/undraw_docusaurus_tree.svg deleted file mode 100644 index d9161d33..00000000 --- a/docs/static/img/undraw_docusaurus_tree.svg +++ /dev/null @@ -1,40 +0,0 @@ - - Focus on What Matters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/static/json/company_logo.json b/docs/static/json/company_logo.json deleted file mode 100644 index 2996a37a..00000000 --- a/docs/static/json/company_logo.json +++ /dev/null @@ -1,223 +0,0 @@ -[ - { - "name": "身边云", - "logo": "/img/company_logos/serviceshare.png", - "url": "https://serviceshare.com" - }, - { - "name": "思派健康科技", - "logo": "/img/company_logos/medbanks.png", - "url": "https://www.medbanks.cn" - }, - { - "name": "北京智合联创科技有限公司", - "logo": "/img/company_logos/zhlc.png", - "url": "http://www.zhlc.com.cn" - }, - { - "name": "神州数码(北京)", - "logo": "/img/company_logos/digitalchina.png", - "url": "http://www.digitalchina.com" - }, - { - "name": "PayerMax", - "logo": "/img/company_logos/payermax.png", - "url": "https://www.payermax.com/" - }, - { - "name": "轻松到家", - "logo": "/img/company_logos/uyess.jpg", - "url": "http://www.uyess.com/index.html" - }, - { - "name": "某商业银行股份有限公司", - "logo": "", - "url": "https://github.com/opengoofy/hippo4j/issues/13" - }, - { - "name": "某国际物流信息股份有限公司", - "logo": "", - "url": "https://github.com/opengoofy/hippo4j/issues/13" - }, - { - "name": "萨科(深圳)科技有限公司", - "logo": "/img/company_logos/lbdj.svg", - "url": "https://www.lbdj.com/" - }, - { - "name": "广东天枢新能源科技有限公司", - "logo": "/img/company_logos/tianshu.png", - "url": "https://gd-tianshu.com/" - }, - { - "name": "FitTime", - "logo": "/img/company_logos/fittime.png", - "url": "http://fittime.com/" - }, - { - "name": "百强国际物流", - "logo": "", - "url": "https://github.com/opengoofy/hippo4j/issues/13" - }, - { - "name": "海南某深圳分公司", - "logo": "", - "url": "https://github.com/opengoofy/hippo4j/issues/13" - }, - { - "name": "众合云科(51社保)", - "logo": "/img/company_logos/51shebao.png", - "url": "https://www.51shebao.com/?baidupz&guanfang/" - }, - { - "name": "好货云店", - "logo": "/img/company_logos/haohuoyundian.png", - "url": "https://pc.haohuoyundian.com/" - }, - { - "name": "斗象科技", - "logo": "/img/company_logos/tophant.png", - "url": "https://www.tophant.com/" - }, - { - "name": "深圳航天信息有限公司", - "logo": "/img/company_logos/aisino.png", - "url": "http://sz.aisino.com/" - }, - { - "name": "新东方教育科技集团", - "logo": "/img/company_logos/xdf.png", - "url": "https://www.xdf.cn/" - }, - { - "name": "远眺网络科技有限公司", - "logo": "/img/company_logos/yuantiaokj.png", - "url": "https://www.yuantiaokj.com/" - }, - { - "name": "浙江吉利控股集团有限公司", - "logo": "/img/company_logos/geely.jpg", - "url": "https://www.geely.com/" - }, - { - "name": "三立人(深圳)科技有限公司-焦内", - "logo": "/img/company_logos/bananain.png", - "url": "https://www.bananain.com/" - }, - { - "name": "上海天猫好房添玑网络服务有限公司", - "logo": "/img/company_logos/eju.png", - "url": "http://www.eju.com/" - }, - { - "name": "郑州力通水务", - "logo": "/img/company_logos/zzltsw.jpg", - "url": "http://www.zzltsw.com/" - }, - { - "name": "北京自如信息科技有限公司", - "logo": "/img/company_logos/ziroom.png", - "url": "https://www.ziroom.com/" - }, - { - "name": "北京易车信息科技有限公司", - "logo": "/img/company_logos/yiche.png", - "url": "https://www.yiche.com/" - }, - { - "name": "中新软件(上海)有限公司", - "logo": "/img/company_logos/5000m.jpg", - "url": "http://www.5000m.com" - }, - { - "name": "深圳市上马网络技术有限公司", - "logo": "/img/company_logos/shangmanet.png", - "url": "https://www.shangmanet.com" - }, - { - "name": "兰亭集势(成都)科技有限公司", - "logo": "/img/company_logos/lightinthebox.avif", - "url": "https://www.lightinthebox.com/" - }, - { - "name": "杭州数理大数据有限公司", - "logo": "/img/company_logos/data4truth.jpg", - "url": "https://www.data4truth.com/#/" - }, - { - "name": "九四智能", - "logo": "/img/company_logos/94ai.png", - "url": "https://94ai.com" - }, - { - "name": "新华智云科技有限公司", - "logo": "/img/company_logos/xinhuazhiyun.svg", - "url": "https://www.xinhuazhiyun.com" - }, - { - "name": "银丰新融", - "logo": "/img/company_logos/ist.png", - "url": "https://www.ist.com.cn" - }, - { - "name": "深圳市帮客帮科技有限公司", - "logo": "/img/company_logos/bangkebang.jpg", - "url": "https://www.bangkebang.com" - }, - { - "name": "重庆威爱云科技有限公司", - "logo": "", - "url": "https://51vive.com" - }, - { - "name": "网易有道信息技术(北京)有限公司", - "logo": "/img/company_logos/youdao.png", - "url": "https://www.youdao.com" - }, - - { - "name": "广联达科技股份有限公司", - "logo": "/img/company_logos/glodon.jpg", - "url": "https://www.glodon.com" - }, - { - "name": "天健联创控股集团有限公司", - "logo": "/img/company_logos/tjlc.png", - "url": "https://www.tjlc.com.cn" - }, - { - "name": "知乎", - "logo": "/img/company_logos/zhihu.png", - "url": "https://www.zhihu.com/" - }, - { - "name": "广东谷通科技有限公司", - "logo": "/img/company_logos/duofriend.png", - "url": "https://www.duofriend.com" - }, - { - "name": "成都全域智旅科技有限公司", - "logo": "/img/company_logos/qyzl.jpg", - "url": "http://qyzl.com" - }, - { - "name": "深圳市华云中盛科技股份有限公司", - "logo": "/img/company_logos/hua-cloud.jpg", - "url": "http://www.hua-cloud.cn" - }, - { - "name": "智慧芽信息科技(苏州)有限公司", - "logo": "/img/company_logos/zhihuiya.png", - "url": "https://www.zhihuiya.com" - }, - { - "name": "滴滴出行", - "logo": "/img/company_logos/didiglobal.svg", - "url": "https://www.didiglobal.com" - }, - { - "name": "杭州源诚科技有限公司", - "logo": "/img/company_logos/yckjdata.png", - "url": "http://www.yckjdata.com" - } -] diff --git a/docs/tailwind.config.js b/docs/tailwind.config.js deleted file mode 100644 index d46bfc78..00000000 --- a/docs/tailwind.config.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - content: ["./src/**/*.{js,jsx,ts,tsx}"], - theme: { - extend: {}, - }, - plugins: [], - corePlugins: { preflight: false }, - // set dark mode. example

Hello, World!

- darkMode: ["class", '[data-theme="dark"]'], -}; diff --git a/docs/versioned_docs/version-1.4.2/user_docs/dev_manual/_category_.json b/docs/versioned_docs/version-1.4.2/user_docs/dev_manual/_category_.json deleted file mode 100644 index 9117307f..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/dev_manual/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "开发者手册", - "position": 5, - "link": { - "type": "generated-index", - "description": "Hippo4j 留给使用者能够扩展的知识点。" - } -} diff --git a/docs/versioned_docs/version-1.4.2/user_docs/dev_manual/rejected-policy-custom.md b/docs/versioned_docs/version-1.4.2/user_docs/dev_manual/rejected-policy-custom.md deleted file mode 100644 index e0405061..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/dev_manual/rejected-policy-custom.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 拒绝策略自定义 - -Hippo4j 通过 SPI 的方式对拒绝策略进行扩展,可以让用户在 Hippo4j 中完成自定义拒绝策略实现。 - -## Hippo4j Server 拒绝策略扩展 - -自定义拒绝策略,实现 `CustomRejectedExecutionHandler` 接口,示例如下: - -```java -public class ErrorLogRejectedExecutionHandler implements CustomRejectedExecutionHandler { - - @Override - public Integer getType() { - return 12; - } - - @Override - public RejectedExecutionHandler generateRejected() { - return new CustomErrorLogRejectedExecutionHandler(); - } - - public static class CustomErrorLogRejectedExecutionHandler implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - Logger logger = LoggerFactory.getLogger(this.getClass()); - logger.error("线程池抛出拒绝策略"); - } - } -} -``` - -创建 `src/main/resources/META-INF/services` 目录,创建 SPI 自定义拒绝策略文件 `cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler`。 - -`cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler` 文件内仅放一行自定义拒绝策略全限定名即可,示例: - -```text -cn.hippo4j.example.core.handler.ErrorLogRejectedExecutionHandler -``` - -创建、修改线程池页面选择 `CustomRejectedPolicy(自定义 SPI 策略)`。 - -![](https://oss.open8gu.com/image-20220813173907814.png) - -拒绝策略触发时,完成上述代码效果,仅打印异常日志提示。 - -```text -2022-08-01 21:27:49.515 ERROR 48928 --- [ateHandler.test] r$CustomErrorLogRejectedExecutionHandler : 线程池抛出拒绝策略 -``` - -:::note -具体参考 `hippo4j-example/hippo4j-spring-boot-starter-example` 模块。 -::: diff --git a/docs/versioned_docs/version-1.4.2/user_docs/dev_manual/rejected-policy-info.md b/docs/versioned_docs/version-1.4.2/user_docs/dev_manual/rejected-policy-info.md deleted file mode 100644 index d5c68138..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/dev_manual/rejected-policy-info.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 内置拒绝策略 - -内置两种拒绝策略说明: - -**RunsOldestTaskPolicy**:添加新任务并由主线程运行最早的任务。 - -```java -public class RunsOldestTaskPolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - BlockingQueue workQueue = executor.getQueue(); - Runnable firstWork = workQueue.poll(); - boolean newTaskAdd = workQueue.offer(r); - if (firstWork != null) { - firstWork.run(); - } - if (!newTaskAdd) { - executor.execute(r); - } - } -} -``` - -**SyncPutQueuePolicy**:主线程把拒绝任务以阻塞的方式添加到队列。 - -```java -@Slf4j -public class SyncPutQueuePolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - try { - executor.getQueue().put(r); - } catch (InterruptedException e) { - log.error("Adding Queue task to thread pool failed.", e); - } - } -} -``` \ No newline at end of file diff --git a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/_category_.json b/docs/versioned_docs/version-1.4.2/user_docs/getting_started/_category_.json deleted file mode 100644 index 72b1e151..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "快速开始", - "position": 3, - "link": { - "type": "generated-index" - } -} diff --git a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/_category_.json b/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/_category_.json deleted file mode 100644 index 78b3d9c4..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "依赖配置中心", - "position": 2, - "collapsed": true -} diff --git a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-default.md b/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-default.md deleted file mode 100644 index 9c9e0fc9..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-default.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 参数默认配置 - -曾有多名小伙伴反馈说,项目中线程池一多,配置文件中配置就显得很臃肿。为此 hippo4j-config 开发出了动态线程池默认配置。 - -```yaml -spring: - dynamic: - thread-pool: - default-executor: - core-pool-size: 4 - maximum-pool-size: 6 - blocking-queue: ResizableCapacityLinkedBlockingQueue - queue-capacity: 1024 - execute-time-out: 1000 - keep-alive-time: 9999 - rejected-handler: AbortPolicy - active-alarm: 90 - capacity-alarm: 85 - alarm: true - allow-core-thread-time-out: true - notify: - interval: 5 - receives: chen.ma - executors: - - thread-pool-id: message-produce - - thread-pool-id: message-consume - core-pool-size: 80 - maximum-pool-size: 100 - execute-time-out: 1000 - notify: - interval: 6 - receives: chen.ma -``` - -`spring.dynamic.thread-pool.executors` 层级下,仅需要配置 `thread-pool-id`,其余配置从 `spring.dynamic.thread-pool.default-executor` 读取。 - -如果 `spring.dynamic.thread-pool.executors` 下配置和 `spring.dynamic.thread-pool.default-executor` 冲突,以前者为主。 - -通过该自定义配置方式,可减少大量重复线程池参数配置项,提高核心配置简洁度。 - -提示:`spring.dynamic.thread-pool.default-executor` 层级下参数,不提供动态刷新功能。 diff --git a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-monitor.md b/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-monitor.md deleted file mode 100644 index e4aade51..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-monitor.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 线程池监控 - -## 线程池监控配置 - -监控前置条件:需要先完成 hippo4j-config 的 [接入工作](/docs/user_docs/getting_started/config/hippo4j-config-start)。 - -接下来引入 SpringBoot Actuator。Spring 2.x 一般都有版本指定,所以这里不用写版本号。 - -```xml - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - -``` - -添加动态线程池监控相关配置: - -```yaml -management: - metrics: - export: - prometheus: - enabled: true - server: - port: 29999 # 可选配置,如果不配置该 port,直接使用 ${server.port} - endpoints: - web: - exposure: - include: '*' # 测试使用,开启了所有端点,生产环境不建议 * -spring: - dynamic: - thread-pool: - collect-type: micrometer -``` - -项目启动,访问 `http://localhost:29999/actuator/prometheus` 出现 `dynamic_thread_pool_` 前缀的指标,即为成功。 - -![](https://oss.open8gu.com/image-20220912220401016.png) - -## 配置 Prometheus - -通过 Docker 启动 Prometheus 服务。 - -```shell -docker run -d -p 9090:9090 --name prometheus prom/prometheus -``` - -添加 Prometheus 抽取数据任务。 - -```shell -# 进入 prometheus 容器内部 -docker exec -it prometheus /bin/sh -# 编辑 prometheus 配置文件 -vi /etc/prometheus/prometheus.yml -``` - -scrape_configs 节点下新添加一个 job,如果 Prometheus 是 Docker 方式部署,`{scrape_configs.static_configs.targets}` 需要写本机的 IP。 - -```yaml -scrape_configs: - - job_name: 'dynamic-thread-pool-job' - scrape_interval: 5s - metrics_path: '/actuator/prometheus' - static_configs: - - targets: [ '127.0.0.1:29999' ] -``` - -配置成功后 `exit` 退出容器,并进行 Prometheus 容器重启 `docker restart prometheus`。 - -访问 Prometheus 控制台 `http://localhost:9090/graph` 路径,能够展示相关指标即为配置成功。 - -![](https://oss.open8gu.com/image-20220912221237597.png) - -## 配置 Grafana - -```shell -docker run -d -p 3000:3000 --name=grafana grafana/grafana -``` - -访问 Grafana 地址,[http://localhost:3000](http://localhost:3000) 用户名密码:`admin` - -Grafana 访问 `http://localhost:3000/datasources` 导入 Prometheus 数据源。 - -![](https://oss.open8gu.com/image-20220912221646866.png) - -> 如果 Prometheus 为 Docker 方式部署,HTTP URL 需要为本地 IP,比如:http://192.168.1.5:9090 - -关注公众号 `龙台的技术笔记`,回复:`监控`,获取 Hippo4j Grafana DashBoard JSON 配置。 - -| 公众号 | 回复关键词 | -|:------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------:| -| ![](https://oss.open8gu.com/43_65f6020ed111b6bb3808ec338576bd6b.png?x-oss-process=image/resize,h_300,w_400) | ![](https://oss.open8gu.com/image-20220327171957444.png?x-oss-process=image/resize,h_300,w_400) | - -获取到 JSON 文件后,通过 `http://localhost:3000/dashboard/import` 将 JSON 文件导入至 Grafana DashBoard。 - -![](https://oss.open8gu.com/image-20220912225627272.png) - -下拉框内动态选择创建好的 Prometheus 数据源,并点击 `Import`。 - -![](https://oss.open8gu.com/image-20220912225700200.png) - -即可使用炫酷的 Hippo4j 动态线程池监控 DashBoard。大家伙儿也可以根据个人喜好进行定制 DashBoard,如果觉得有优化点,欢迎和我联系贡献。 - -![](https://oss.open8gu.com/image-20220912225813972.png) - -如果项目客户端启动多个示例,动态线程池监控效果图如下: - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) diff --git a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-more.md b/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-more.md deleted file mode 100644 index 2511b4f3..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-more.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 个性化配置 - -以下所述特性自 hippo4j-config v1.4.2 及以上版本提供,由 hippo4j 核心开发者 [@pizihao](https://github.com/pizihao) 完成相应功能开发。 - -## 需求背景 - -**1)容器及三方框架线程池自定义启用** - -最初设计容器线程池和三方框架线程池的动态变更是和启动无关的。也就是说,启动时不会根据配置文件中相关参数去修改两者对应的线程池配置。 - -这么设计的初衷是因为,不想让 hippo4j 过多的去介入框架原有的功能。因为容器和三方框架都支持线程池参数的自定义。 - -也就造成,可能你在配置中心配置了对应的容器和三方框架线程池参数,启动时是无效的。但当修改配置文件任一配置,容器和三方框架线程池配置将生效。 - -为了更好的用户体验,决定加入启用标识来控制:是否在项目初始化启动时,对容器和三方框架线程池参数进行修改。 - -**2)客户端集群个性化配置** - -大家都知道,hippo4j-config 是依赖配置中心做线程池配置动态变更。这种模式有一种缺点:改动配置文件后,所有客户端都会变更。 - -有些小伙伴希望 hippo4j-config 能够像 hippo4j-server 一样,能够针对单独的客户端进行配置变更。 - -## 容器及三方框架线程池自定义启用 - -容器及三方框架线程池添加启用配置,为了保持统一,动态线程池配置中也有该参数配置。配置项默认开启。 - -```yaml -spring: - dynamic: - thread-pool: - tomcat: - enable: true - executors: - - thread-pool-id: message-consume - enable: false - adapter-executors: - - threadPoolKey: 'input' - enable: true -``` - -## 客户端集群个性化配置 - -分别在动态线程池、容器线程池以及三方框架线程池配置下增加 `nodes` 配置节点,通过该配置可匹配需要变更的节点。 - -```yaml -spring: - dynamic: - thread-pool: - tomcat: - nodes: 192.168.1.5:*,192.168.1.6:8080 - executors: - - thread-pool-id: message-consume - nodes: 192.168.1.5:* - adapter-executors: - - threadPoolKey: 'input' - nodes: 192.168.1.5:* -``` - -来一段代码方法中的注释,大家就基本明白如何使用了。 - -```java -/** - * Matching nodes
- * nodes is ip + port.Get 'nodes' in the new Properties,Compare this with the ip + port of Application.
- * support prefix pattern matching. e.g:
- *
    - *
  • 192.168.1.5:* -- Matches all ports of 192.168.1.5
  • - *
  • 192.168.1.*:2009 -- Matches 2009 port of 192.168.1.*
  • - *
  • * -- all
  • - *
  • empty -- all
  • - *
- * The format of ip + port is ip : port. - */ -``` - -`nodes` 可与 `enable` 同时使用。如此,基于配置中心的动态线程池实现方式,将能够更方便的支持个性化需求。 diff --git a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md b/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md deleted file mode 100644 index 693dd341..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 适配SpringBoot1x - -目前已支持 Nacos、Apollo 配置中心适配 SpringBoot 1.5.x 版本。 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-1x-starter - 1.4.2 - -``` - -Nacos SpringBoot 配置如下: - -```yaml -spring: - cloud: - nacos: - config: - ext-config: - - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP - refresh: true - server-addr: 127.0.0.1:8848 - dynamic: - thread-pool: - config-file-type: yml - nacos: - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP -``` - -Apollo SpringBoot 配置如下: - -```yaml -apollo: - autoUpdateInjectedSpringProperties: true - bootstrap: - eagerLoad: - enabled: true - enabled: true - namespaces: application - meta: http://127.0.0.1:8080 -app: - id: dynamic-threadpool-example -spring: - dynamic: - thread-pool: - apollo: - namespace: application -``` - -动态线程池通用配置如下: - -```yaml -management: - context-path: /actuator - security: - enabled: false -server: - port: 8091 - servlet: - context-path: /example -spring: - application: - name: dynamic-threadpool-example - dynamic: - thread-pool: - banner: true - check-state-interval: 5 - collect-type: micrometer - config-file-type: properties - enable: true - executors: - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-consume - thread-pool-id: message-consume - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-produce - thread-pool-id: message-produce - notify-platforms: - - platform: WECHAT - token: ac0426a5-c712-474c-9bff-72b8b8f5caff - profiles: - active: dev -``` - -具体 Demo 运行请参考以下示例模块,已验证对应线程池动态变更、报警以及运行时监控功能。 - -- `/hippo4j-config-nacos-spring-boot-1x-starter-example` -- `hippo4j-example/hippo4j-config-apollo-spring-boot-1x-starter-example` diff --git a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-start.md b/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-start.md deleted file mode 100644 index 33f658c2..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/config/hippo4j-config-start.md +++ /dev/null @@ -1,193 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 接入流程 - -Nacos、Apollo、Zookeeper、ETCD、Polaris 配置中心任选其一。 - -## hippo4j 配置 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-starter - 1.4.2 - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -server: - port: 8090 - servlet: - context-path: /example - -spring: - profiles: - active: dev - - dynamic: - thread-pool: - # 是否开启动态线程池 - enable: true - # 是否打印 banner - banner: true - # 是否开启线程池数据采集,对接 Micrometer、ES、Log 等 - collect: true - # 检查线程池状态,是否达到报警条件,单位毫秒 - check-state-interval: 3000 - # 通知报警平台,请替换为自己创建的群机器人 - notify-platforms: - - platform: 'WECHAT' - token: xxx - - platform: 'DING' - token: xxx - secret: xxx # 加签专属 - - platform: 'LARK' - token: xxx - # Nacos、Apollo、Zookeeper、ETCD、Polaris 任选其一 - nacos: - data-id: xxx - group: xxx - apollo: - namespace: xxxx - # 配置中心文件格式 - config-file-type: yml - # tomcat、undertow、jetty 三种容器线程池,任选其一 - undertow: - core-pool-size: 100 - maximum-pool-size: 200 - keep-alive-time: 1000 - # 全局通知配置-是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位秒 - alarm-interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - # 动态线程池列表 - executors: - - thread-pool-id: 'message-consume' - # 核心线程数 - core-pool-size: 1 - # 最大线程数 - maximum-pool-size: 1 - # 阻塞队列名称,参考 BlockingQueueTypeEnum,支持 SPI - blocking-queue: 'LinkedBlockingQueue' - # 阻塞队列大小 - queue-capacity: 1 - # 执行超时时间,超过此时间发起报警,单位毫秒 - execute-time-out: 1000 - # 拒绝策略名称,参考 RejectedPolicyTypeEnum,支持 SPI - rejected-handler: 'AbortPolicy' - # 线程存活时间,单位秒 - keep-alive-time: 1024 - # 是否允许核心线程超时 - allow-core-thread-time-out: true - # 线程工厂名称前缀 - thread-name-prefix: 'message-consume' - # 是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 通知配置,线程池中通知配置如果存在,则会覆盖全局通知配置 - notify: - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位分钟 - interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - - thread-pool-id: 'message-produce' - core-pool-size: 1 - maximum-pool-size: 1 - queue-capacity: 1 - execute-time-out: 1000 - blocking-queue: 'LinkedBlockingQueue' - rejected-handler: 'AbortPolicy' - keep-alive-time: 1024 - allow-core-thread-time-out: true - thread-name-prefix: 'message-consume' - alarm: true - active-alarm: 80 - capacity-alarm: 80 - notify: - interval: 8 - receives: xxx -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从配置中心拉取。 - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` diff --git a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/difference.md b/docs/versioned_docs/version-1.4.2/user_docs/getting_started/difference.md deleted file mode 100644 index eddaa550..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/difference.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 运行模式介绍 - -1.1.0 版本发布后,Hippo4j 分为两种使用模式:轻量级依赖配置中心以及无中间件依赖版本。 - -![](https://oss.open8gu.com/image-20220319154626314.png) - -### hippo4j-config - -**轻量级动态线程池管理**,依赖 Nacos、Apollo、Zookeeper、ETCD、Polaris 等三方配置中心(任选其一)完成线程池参数动态变更,支持运行时报警、监控等功能。 - -> 监控功能配置详见:[线程池监控](/docs/user_docs/getting_started/config/hippo4j-config-monitor) - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) - -### hippo4j-server - -**部署 hippo4j-server 服务**,通过可视化 Web 界面完成线程池的创建、变更以及查看,不依赖三方中间件。 - -相比较 hippo4j-config,功能会更强大,但同时也引入了一定的复杂性。需要部署一个 Java 服务,以及依赖 MySQL 数据库。 - -![](https://oss.open8gu.com/1644032018254-min.gif) - -### 使用总结 - -| | hippo4j-config | hippo4j-server | -| ---- | ---------------------------------------------------- | ------------------------------------------------------------ | -| 依赖 | Nacos、Apollo、Zookeeper、ETCD、Polaris 配置中心(任选其一) | 部署 Hippo4j Server(内部无依赖中间件) | -| 使用 | 配置中心补充线程池相关参数 | Hippo4j Server Web 控制台添加线程池记录 | -| 功能 | 包含基础功能:参数动态化、运行时监控、报警等 | 基础功能之外扩展控制台界面、线程池堆栈查看、线程池运行信息实时查看、历史运行信息查看、线程池配置集群个性化等 | - -使用建议:根据公司情况选择,如果基本功能可以满足使用,选择 hippo4j-config 使用即可;如果希望更多的功能,可以选择 hippo4j-server。 - -**两者在进行替换的时候,无需修改业务代码**。 diff --git a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/hippo4j-adapter.md b/docs/versioned_docs/version-1.4.2/user_docs/getting_started/hippo4j-adapter.md deleted file mode 100644 index 6fac0e9d..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/hippo4j-adapter.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 三方框架线程池适配 - -Hippo4j 目前已支持的三方框架线程池列表: - -- Dubbo -- Hystrix -- RabbitMQ -- RocketMQ -- AlibabaDubbo -- RocketMQSpringCloudStream -- RabbitMQSpringCloudStream - -引入 Hippo4j Server 或 Core 的 Maven Jar 坐标后,还需要引入对应的框架适配 Jar: - -```xml - - cn.hippo4j - - hippo4j-spring-boot-starter-adapter-dubbo - - hippo4j-spring-boot-starter-adapter-alibaba-dubbo - - hippo4j-spring-boot-starter-adapter-hystrix - - hippo4j-spring-boot-starter-adapter-rabbitmq - - hippo4j-spring-boot-starter-adapter-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq - 1.4.2 - -``` - -如果想省事,仅需引入一个全量包,框架底层会根据条件判断加载具体线程池适配器。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-adapter-all - 1.4.2 - -``` - -## Hippo4j Server - -Hippo4j Server 仅需要引入上述 Jar 包,即可在 Hippo4j Server 的控制台进行查看及修改三方框架线程池。 - -![](https://oss.open8gu.com/image-20220531194810047.png) - -## Hippo4j Config - -Hippo4j Config 除了依赖上述适配 Jar 包外,还需要在配置中心添加以下配置项。 - -```yaml -spring: - dynamic: - thread-pool: - # 省略其它配置 - adapter-executors: - # threadPoolKey 代表线程池标识 - - threadPoolKey: 'input' - # mark 为三方线程池框架类型,参见文初已支持框架集合 - mark: 'RocketMQSpringCloudStream' - corePoolSize: 10 - maximumPoolSize: 10 -``` diff --git a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/img/docsVersionDropdown.png b/docs/versioned_docs/version-1.4.2/user_docs/getting_started/img/docsVersionDropdown.png deleted file mode 100644 index 97e41646..00000000 Binary files a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/img/docsVersionDropdown.png and /dev/null differ diff --git a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/img/grafana-monitor.jpg b/docs/versioned_docs/version-1.4.2/user_docs/getting_started/img/grafana-monitor.jpg deleted file mode 100644 index 336bd980..00000000 Binary files a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/img/grafana-monitor.jpg and /dev/null differ diff --git a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/img/localeDropdown.png b/docs/versioned_docs/version-1.4.2/user_docs/getting_started/img/localeDropdown.png deleted file mode 100644 index e257edc1..00000000 Binary files a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/img/localeDropdown.png and /dev/null differ diff --git a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/server/_category_.json b/docs/versioned_docs/version-1.4.2/user_docs/getting_started/server/_category_.json deleted file mode 100644 index 4063c17f..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/server/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "无中间件依赖", - "position": 3, - "collapsed": true -} diff --git a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/server/hippo4j-server-config.md b/docs/versioned_docs/version-1.4.2/user_docs/getting_started/server/hippo4j-server-config.md deleted file mode 100644 index 24bf9a13..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/server/hippo4j-server-config.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 服务端配置 - -`hippo4j.core.clean-history-data-enable` - -是否开启线程池历史数据清洗,默认开启。 - -`hippo4j.core.clean-history-data-period` - -线程池历史数据保留时间,默认值:30,单位分钟。 - -服务端会保留这个配置时间的数据,超过这个时间则会被清理。比如按照默认值 30 分钟来说,12:00 收集到的数据,12:30 就会被清理删除。 - -`hippo4j.core.monitor.report-type` - -客户端监控上报服务端类型,可选值:http、netty,默认 http。服务端开启 netty 配置后,需要在客户端对应开启才可生效。用来应对大量动态线程池监控场景。 diff --git a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/server/hippo4j-server-start.md b/docs/versioned_docs/version-1.4.2/user_docs/getting_started/server/hippo4j-server-start.md deleted file mode 100644 index a04aca3d..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/getting_started/server/hippo4j-server-start.md +++ /dev/null @@ -1,127 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 接入流程 - -部署服务端,参考 [部署手册](/docs/user_docs/ops/hippo4j-server-deploy)。 - -服务端创建 [租户、项目](/community/faq#租户和项目在-hippo4j-中是什么意思) 和线程池记录。 - -需要注意,项目 ID 需要与配置文件 `{application.name}` 保持一致。 - -:::note -租户、项目、线程池 ID 如果由多个词组成,建议以 - 进行分割。比如:message-center。 -::: - -## Hippo4j 配置 - -SpringBoot Pom 引入 Hippo4j Starter Jar。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter - 1.4.2 - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -spring: - profiles: - active: dev - application: - # 服务端创建的项目 id 需要与 application.name 保持一致 - name: dynamic-threadpool-example - dynamic: - thread-pool: - # 服务端地址 - server-addr: http://localhost:6691 - # 用户名 - username: admin - # 密码 - password: 123456 - # 租户 id, 对应 tenant 表 - namespace: prescription - # 项目 id, 对应 item 表 - item-id: ${spring.application.name} -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从 hippo4j-server 服务拉取。 - -:::note -创建线程池时建议填充实际的参数。如果在连接 Hippo4j Server 端失败时,会使用填充配置创建线程池。 -::: - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` - diff --git a/docs/versioned_docs/version-1.4.2/user_docs/intro.md b/docs/versioned_docs/version-1.4.2/user_docs/intro.md deleted file mode 100644 index 3562d0fa..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/intro.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 简介 - -## 线程池痛点 - -线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。 - -在高并发以及大批量的任务处理场景,线程池的使用是必不可少的。 - -如果有在项目中实际使用线程池,相信你可能会遇到以下痛点: - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -## 什么是 Hippo4j - -Hippo4j 通过对 JDK 线程池增强,以及扩展三方框架底层线程池等功能,为业务系统提高线上运行保障能力。 - -提供以下功能支持: - -- 全局管控 - 管理应用线程池实例。 - -- 动态变更 - 应用运行时动态变更线程池参数,包括不限于:核心、最大线程数、阻塞队列容量、拒绝策略等。 -- 通知报警 - 内置四种报警通知策略,线程池活跃度、容量水位、拒绝策略以及任务执行时间超长。 -- 运行监控 - 实时查看线程池运行时数据,最近半小时线程池运行数据图表展示。 -- 功能扩展 - 支持线程池任务传递上下文;项目关闭时,支持等待线程池在指定时间内完成任务。 -- 多种模式 - 内置两种使用模式:[依赖配置中心](https://hippo4j.cn/docs/user_docs/getting_started/config/hippo4j-config-start) 和 [无中间件依赖](https://hippo4j.cn/docs/user_docs/getting_started/server/hippo4j-server-start)。 -- 容器管理 - Tomcat、Jetty、Undertow 容器线程池运行时查看和线程数变更。 -- 框架适配 - Dubbo、Hystrix、RabbitMQ、RocketMQ 等消费线程池运行时数据查看和线程数变更。 - -## 快速开始 - -对于本地演示目的,请参阅 [Quick start](https://hippo4j.cn/docs/user_docs/user_guide/quick-start) - -演示环境: [http://console.hippo4j.cn/index.html](http://console.hippo4j.cn/index.html) - -## 接入登记 - -更多接入的公司,欢迎在 [登记地址](https://github.com/opengoofy/hippo4j/issues/13) 登记,登记仅仅为了产品推广。 - -## 联系我 - -开源不易,右上角点个 Star 鼓励一下吧! - -如果大家想要实时关注 Hippo4j 更新的文章以及分享的干货的话,可以关注我的公众号。 - -使用过程中有任何问题,或者对项目有什么建议,关注公众号回复:加群,和 1000+ 志同道合的朋友交流讨论。 - -![](https://oss.open8gu.com/image-20230317191041262-mini.png) - -## 友情链接 - -- [[ LiteFlow ]](https://liteflow.yomahub.com/):轻量,快速,稳定可编排的组件式规则引擎。 - -- [[ Sa-Token ]](https://github.com/dromara/sa-token):一个轻量级 java 权限认证框架,让鉴权变得简单、优雅! -- [[ HertzBeat ]](https://github.com/dromara/hertzbeat):易用友好的云监控系统, 无需 Agent, 强大自定义监控能力。 -- [[ JavaGuide ]](https://github.com/Snailclimb/JavaGuide):一份涵盖大部分 Java 程序员所需要掌握的核心知识。 -- [[ toBeBetterJavaer ]](https://github.com/itwanger/toBeBetterJavaer):一份通俗易懂、风趣幽默的 Java 学习指南。 - -## 贡献者 - -感谢所有为项目作出贡献的开发者。如果有意贡献,参考 [good first issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)。 diff --git a/docs/versioned_docs/version-1.4.2/user_docs/ops/_category_.json b/docs/versioned_docs/version-1.4.2/user_docs/ops/_category_.json deleted file mode 100644 index d5b7d1e8..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/ops/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "运维指南", - "position": 4, - "link": { - "type": "generated-index" - } -} diff --git a/docs/versioned_docs/version-1.4.2/user_docs/ops/hippo4j-server-deploy.md b/docs/versioned_docs/version-1.4.2/user_docs/ops/hippo4j-server-deploy.md deleted file mode 100644 index ffbc2306..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/ops/hippo4j-server-deploy.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 源码包部署 - -[RELEASE](https://github.com/opengoofy/hippo4j/releases) 页面下载对应版本并进行解压。 - -## 初始化 - -修改数据库相关信息。 - -```txt -/conf/application.properties -``` - -如果是新运行 Hippo4j,数据库执行下述 SQL 脚本即可。 - -```txt -/conf/hippo4j_manager.sql -``` - -如果是对已运行 Hippo4j 升级,请查看 `/conf/sql-upgrade` 目录下,是否有目标版本对应的升级脚本。 - -## 直接运行 - -Mac Linux 启动执行。 - -```txt -sh ./bin/startup.sh -``` - -Windows 启动执行。 - -```txt -bin/startup.cmd -``` - -## 访问控制台 - -启动成功后,访问链接。用户名密码:admin 123456 - -```txt -localhost:6691/index.html -``` diff --git a/docs/versioned_docs/version-1.4.2/user_docs/ops/server-docker.md b/docs/versioned_docs/version-1.4.2/user_docs/ops/server-docker.md deleted file mode 100644 index 826bb99f..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/ops/server-docker.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Docker部署 - -## 镜像启动 - -Docker 镜像默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -或者,底层存储数据库切换为 MySQL。`DATASOURCE_HOST` 需要切换为本地 IP,不能使用 `127.0.0.1` 或 `localhost`。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server \ --e DATASOURCE_MODE=mysql \ --e DATASOURCE_HOST=xxx.xxx.xxx.xxx \ --e DATASOURCE_PORT=3306 \ --e DATASOURCE_DB=hippo4j_manager \ --e DATASOURCE_USERNAME=root \ --e DATASOURCE_PASSWORD=root \ -hippo4j/hippo4j-server -``` - -访问 Server 控制台,路径 `http://localhost:6691/index.html` ,默认用户名密码:admin / 123456 - -## 镜像构建 - -如果想要自定义镜像,可以通过以下命令快速构建 Hippo4j Server: - -方式一: - -```shell -# 进入到 hippo4j-server/hippo4j-bootstrap 工程路径下 -mvn clean package -Dskip.spotless.apply=true -# 默认打包是打包的 tag 是 latest -docker build -t hippo4j/hippo4j-server ../hippo4j-bootstrap -``` - -方式二: - -通过 `maven docker plugin` - -```shell -# 进入到 hippo4j-server 工程路径下 -mvn clean package -DskipTests -Dskip.spotless.apply=true docker:build -``` diff --git a/docs/versioned_docs/version-1.4.2/user_docs/other/_category_.json b/docs/versioned_docs/version-1.4.2/user_docs/other/_category_.json deleted file mode 100644 index a74d7432..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/other/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "其它", - "position": 6, - "link": { - "type": "generated-index" - } -} diff --git a/docs/versioned_docs/version-1.4.2/user_docs/other/official-ccounts.md b/docs/versioned_docs/version-1.4.2/user_docs/other/official-ccounts.md deleted file mode 100644 index 63e07ea7..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/other/official-ccounts.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 推荐公众号 - -## JavaGuide - -专注Java后端学习和大厂面试的公众号! - -![](https://oss.open8gu.com/JavaGuide.png) - -## HelloGitHub - -HelloGitHub,专注于开源社区技术和知识内容分享。 - -![](https://oss.open8gu.com/HelloGitHub.png) - -## macrozheng - -专注Java技术分享,解析优质开源项目。涵盖SpringBoot、SpringCloud、Docker、K8S等实用技术,作者Github开源项目mall(50K+Star)。 - -![](https://oss.open8gu.com/macrozheng.png) diff --git a/docs/versioned_docs/version-1.4.2/user_docs/other/operation.md b/docs/versioned_docs/version-1.4.2/user_docs/other/operation.md deleted file mode 100644 index 62661c55..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/other/operation.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 公众号合作 - -## 推荐须知 - -hippo4j 作为一款新兴动态线程池框架,开源出来的时间比较晚,目前迫切需要不同的途径进行推广。 - -如果您是公众号运营者或者开源爱好者,欢迎将 hippo4j 推荐给您的粉丝。 - -1. 您无需为 hippo4j 专门撰写文案,只需要直接导入 [推荐文章](https://mp.weixin.qq.com/s/JTTwcBEiK_MnFcPTZl3zGA) 即可。 -2. 在文章底部或内容中留下项目官网或者 GitHub 仓库链接。 -3. 文章需至少 1000+ 的阅读量。 - -作为推荐回报,hippo4j 可以为您: - -1. 在框架官方文档 [推荐公众号](/docs/user_docs/other/official-ccounts) 页面处留下您的公众号二维码。 -2. 在框架官方交流群里@全体成员推广您的公众号一次,附带介绍语。 -3. 您的公众号所有新推文章都可以将链接发送到 hippo4j 交流群中,增加阅读量。 - -如果您还有除公众号以外的其它途径可以与 hippo4j 相互推荐,欢迎 [加群沟通](/group)。 diff --git a/docs/versioned_docs/version-1.4.2/user_docs/other/question.md b/docs/versioned_docs/version-1.4.2/user_docs/other/question.md deleted file mode 100644 index 49fd4d77..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/other/question.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 问题提问 - -文档引用自:[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way) - -## 在提问之前 - -在你准备要通过电子邮件、新闻群组或者聊天室提出技术问题前,请先做到以下事情: - -1. 尝试在你准备提问的论坛的旧文章中搜索答案。 -2. 尝试上网搜索以找到答案。 -3. 尝试阅读手册以找到答案。 -4. 尝试阅读常见问题文件(FAQ)以找到答案。 -5. 尝试自己检查或试验以找到答案。 -6. 向你身边的强者朋友打听以找到答案。 -7. 如果你是程序开发者,请尝试阅读源代码以找到答案。 - -当你提出问题的时候,请先表明你已经做了上述的努力;这将有助于树立你并不是一个不劳而获且浪费别人的时间的提问者。如果你能一并表达在做了上述努力的过程中所**学到**的东西会更好,因为我们更乐于回答那些表现出能从答案中学习的人的问题。 - -## 当你提问时 - -### 慎选提问的论坛 -小心选择你要提问的场合。如果你做了下述的事情,你很可能被忽略掉或者被看作失败者: - -* 在与主题不合的论坛上贴出你的问题。 -* 在探讨进阶技术问题的论坛张贴非常初级的问题;反之亦然。 -* 在太多的不同新闻群组上重复转贴同样的问题(cross-post)。 -* 向既非熟人也没有义务解决你问题的人发送私人电邮。 - -因此,第一步是找到对的论坛。再说一次,Google 和其它搜索引擎还是你的朋友,用它们来找到与你遭遇到困难的软硬件问题最相关的网站。通常那儿都有常见问题(FAQ)、邮件列表及相关说明文件的链接。如果你的努力(包括**阅读** FAQ)都没有结果,网站上也许还有报告 Bug(Bug-reporting)的流程或链接,如果是这样,链过去看看。 - -### 使用有意义且描述明确的标题 - -在邮件列表、新闻群组或论坛中,大约 50 字以内的标题是抓住资深专家注意力的好机会。别用喋喋不休的帮帮忙、跪求、急(更别说救命啊!!!!这样让人反感的话,用这种标题会被条件反射式地忽略)来浪费这个机会。不要妄想用你的痛苦程度来打动我们,而应该是在这点空间中使用极简单扼要的描述方式来提出问题。 - -一个好标题范例是`目标 —— 差异`式的描述,许多技术支持组织就是这样做的。在`目标`部分指出是哪一个或哪一组东西有问题,在`差异`部分则描述与期望的行为不一致的地方。 - -> 蠢问题:救命啊!我的笔记本电脑不能正常显示了! - -> 聪明问题:X.org 6.8.1 的鼠标指针会变形,某牌显卡 MV1005 芯片组。 - -> 更聪明问题:X.org 6.8.1 的鼠标指针,在某牌显卡 MV1005 芯片组环境下 - 会变形。 - -### 使用清晰、正确、精准且合乎语法的语句 - -我们从经验中发现,粗心的提问者通常也会粗心地写程序与思考(我敢打包票)。回答粗心大意者的问题很不值得,我们宁愿把时间耗在别处。 - -正确的拼写、标点符号和大小写是很重要的。一般来说,如果你觉得这样做很麻烦,不想在乎这些,那我们也觉得麻烦,不想在乎你的提问。花点额外的精力斟酌一下字句,用不着太僵硬与正式 —— 事实上,黑客文化很看重能准确地使用非正式、俚语和幽默的语句。但它**必须很**准确,而且有迹象表明你是在思考和关注问题。 - -### 精确地描述问题并言之有物 - -* 仔细、清楚地描述你的问题或 Bug 的症状。 -* 描述问题发生的环境(机器配置、操作系统、应用程序、以及相关的信息),提供经销商的发行版和版本号(如:`Fedora Core 4`、`Slackware 9.1`等)。 -* 描述在提问前你是怎样去研究和理解这个问题的。 -* 描述在提问前为确定问题而采取的诊断步骤。 -* 描述最近做过什么可能相关的硬件或软件变更。 -* 尽可能地提供一个可以`重现这个问题的可控环境`的方法。 - -尽量去揣测一个黑客会怎样反问你,在你提问之前预先将黑客们可能提出的问题回答一遍。 - -以上几点中,当你报告的是你认为可能在代码中的问题时,给黑客一个可以重现你的问题的环境尤其重要。当你这么做时,你得到有效的回答的机会和速度都会大大的提升。 - -[Simon Tatham](http://www.chiark.greenend.org.uk/~sgtatham/) 写过一篇名为《[如何有效的报告 Bug](http://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html)》的出色文章。强力推荐你也读一读。 - -### 话不在多而在精 - -你需要提供精确有内容的信息。这并不是要求你简单的把成堆的出错代码或者资料完全转录到你的提问中。如果你有庞大而复杂的测试样例能重现程序挂掉的情境,尽量将它剪裁得越小越好。 - -这样做的用处至少有三点。 -第一,表现出你为简化问题付出了努力,这可以使你得到回答的机会增加; -第二,简化问题使你更有可能得到**有用**的答案; -第三,在精炼你的 bug 报告的过程中,你很可能就自己找到了解决方法或权宜之计。 - -### 别动辄声称找到 Bug - -当你在使用软件中遇到问题,除非你非常、**非常**的有根据,不要动辄声称找到了 Bug。提示:除非你能提供解决问题的源代码补丁,或者提供回归测试来表明前一版本中行为不正确,否则你都多半不够完全确信。这同样适用在网页和文件,如果你(声称)发现了文件的`Bug`,你应该能提供相应位置的修正或替代文件。 - -请记得,还有其他许多用户没遇到你发现的问题,否则你在阅读文件或搜索网页时就应该发现了(你在抱怨前[已经做了这些,是吧](#在提问之前)?)。这也意味着很有可能是你弄错了而不是软件本身有问题。 - -编写软件的人总是非常辛苦地使它尽可能完美。如果你声称找到了 Bug,也就是在质疑他们的能力,即使你是对的,也有可能会冒犯到其中某部分人。当你在标题中嚷嚷着有`Bug`时,这尤其严重。 - -提问时,即使你私下非常确信已经发现一个真正的 Bug,最好写得像是**你**做错了什么。如果真的有 Bug,你会在回复中看到这点。这样做的话,如果真有 Bug,维护者就会向你道歉,这总比你惹恼别人然后欠别人一个道歉要好一点。 - -### 低声下气不能代替你的功课 - -有些人明白他们不该粗鲁或傲慢的提问并要求得到答复,但他们选择另一个极端 —— 低声下气:`我知道我只是个可悲的新手,一个撸瑟,但...`。这既使人困扰,也没有用,尤其是伴随着与实际问题含糊不清的描述时更令人反感。 - -别用原始灵长类动物的把戏来浪费你我的时间。取而代之的是,尽可能清楚地描述背景条件和你的问题情况。这比低声下气更好地定位了你的位置。 - -有时网页论坛会设有专为新手提问的版面,如果你真的认为遇到了初学者的问题,到那去就是了,但一样别那么低声下气。 - -### 描述问题症状而非你的猜测 - -告诉黑客们你认为问题是怎样造成的并没什么帮助。(如果你的推断如此有效,还用向别人求助吗?),因此要确信你原原本本告诉了他们问题的症状,而不是你的解释和理论;让黑客们来推测和诊断。如果你认为陈述自己的猜测很重要,清楚地说明这只是你的猜测,并描述为什么它们不起作用。 - -**蠢问题** - -> 我在编译内核时接连遇到 SIG11 错误, -> 我怀疑某条飞线搭在主板的走线上了,这种情况应该怎样检查最好? - -**聪明问题** - -> 我的组装电脑是 FIC-PA2007 主机板搭载 AMD K6/233 CPU(威盛 Apollo VP2 芯片组), -> 256MB Corsair PC133 SDRAM 内存,在编译内核时,从开机 20 分钟以后就频频产生 SIG11 错误, -> 但是在头 20 分钟内从没发生过相同的问题。重新启动也没有用,但是关机一晚上就又能工作 20 分钟。 -> 所有内存都换过了,没有效果。相关部分的标准编译记录如下… - -由于以上这点似乎让许多人觉得难以配合,这里有句话可以提醒你:`所有的诊断专家都来自密苏里州。` 美国国务院的官方座右铭则是:`让我看看`(出自国会议员 Willard D. Vandiver 在 1899 年时的讲话:`我来自一个出产玉米,棉花,牛蒡和民主党人的国家,滔滔雄辩既不能说服我,也不会让我满意。我来自密苏里州,你必须让我看看。`) 针对诊断者而言,这并不是一种怀疑,而只是一种真实而有用的需求,以便让他们看到的是与你看到的原始证据尽可能一致的东西,而不是你的猜测与归纳的结论。所以,大方的展示给我们看吧! - -### 按发生时间先后列出问题症状 - -问题发生前的一系列操作,往往就是对找出问题最有帮助的线索。因此,你的说明里应该包含你的操作步骤,以及机器和软件的反应,直到问题发生。在命令行处理的情况下,提供一段操作记录(例如运行脚本工具所生成的),并引用相关的若干行(如 20 行)记录会非常有帮助。 - -如果挂掉的程序有诊断选项(如 -v 的详述开关),试着选择这些能在记录中增加调试信息的选项。记住,`多`不等于`好`。试着选取适当的调试级别以便提供有用的信息而不是让读者淹没在垃圾中。 - -如果你的说明很长(如超过四个段落),在开头简述问题,接下来再按时间顺序详述会有所帮助。这样黑客们在读你的记录时就知道该注意哪些内容了。 - -### 描述目标而不是过程 - -如果你想弄清楚如何做某事(而不是报告一个 Bug),在开头就描述你的目标,然后才陈述重现你所卡住的特定步骤。 - -经常寻求技术帮助的人在心中有个更高层次的目标,而他们在自以为能达到目标的特定道路上被卡住了,然后跑来问该怎么走,但没有意识到这条路本身就有问题。结果要费很大的劲才能搞定。 - -**蠢问题** - -> 我怎样才能从某绘图程序的颜色选择器中取得十六进制的 RGB 值? - -**聪明问题** - -> 我正试着用替换一幅图片的色码(color table)成自己选定的色码,我现在知道的唯一方法是编辑每个色码区块(table slot), -> 但却无法从某绘图程序的颜色选择器取得十六进制的 RGB 值。 - -第二种提问法比较聪明,你可能得到像是```建议采用另一个更合适的工具```的回复。 - -### 清楚明确的表达你的问题以及需求 - -漫无边际的提问是近乎无休无止的时间黑洞。最有可能给你有用答案的人通常也正是最忙的人(他们忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞相当厌恶,所以他们也倾向于厌恶那些漫无边际的提问。 - -如果你明确表述需要回答者做什么(如提供指点、发送一段代码、检查你的补丁、或是其他等等),就最有可能得到有用的答案。因为这会定出一个时间和精力的上限,便于回答者能集中精力来帮你。这么做很棒。 - -要理解专家们所处的世界,请把专业技能想像为充裕的资源,而回复的时间则是稀缺的资源。你要求他们奉献的时间越少,你越有可能从真正专业而且很忙的专家那里得到解答。 - -所以,界定一下你的问题,使专家花在辨识你的问题和回答所需要付出的时间减到最少,这技巧对你有用答案相当有帮助 —— 但这技巧通常和简化问题有所区别。因此,问`我想更好地理解 X,可否指点一下哪有好一点说明?`通常比问`你能解释一下 X 吗?`更好。如果你的代码不能运作,通常请别人看看哪里有问题,比要求别人替你改正要明智得多。 - -### 礼多人不怪,而且有时还很有帮助 - -彬彬有礼,多用`请`和`谢谢您的关注`,或`谢谢你的关照`。让大家都知道你对他们花时间免费提供帮助心存感激。 - -坦白说,这一点并没有比使用清晰、正确、精准且合乎语法和避免使用专用格式重要(也不能取而代之)。黑客们一般宁可读有点唐突但技术上鲜明的 Bug 报告,而不是那种有礼但含糊的报告。(如果这点让你不解,记住我们是按问题能教给我们什么来评价问题的价值的) - -然而,如果你有一串的问题待解决,客气一点肯定会增加你得到有用回应的机会。 - -(我们注意到,自从本指南发布后,从资深黑客那里得到的唯一严重缺陷反馈,就是对预先道谢这一条。一些黑客觉得`先谢了`意味着事后就不用再感谢任何人的暗示。我们的建议是要么先说`先谢了`,**然后**事后再对回复者表示感谢,或者换种方式表达感激,譬如用`谢谢你的关注`或`谢谢你的关照`。) - -## 不该问的问题 - -以下是几个经典蠢问题,以及黑客没回答时心中所想的: - -问题:[我能在哪找到 X 程序或 X 资源?](#q1) - -问题:[我怎样用 X 做 Y?](#q2) - -问题:[我的程序/设定/SQL 语句没有用](#q3) - -问题:[我的 Windows 电脑有问题,你能帮我吗?](#q4) - -问题:[我的程序不会动了,我认为系统工具 X 有问题](#q5) - -问题:[我在安装 Linux(或者 X )时有问题,你能帮我吗?](#q6) - -问题:[我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢?](#q7) - ---- - -> 问题:我能在哪找到 X 程序或 X 资源? - -回答:就在我找到它的地方啊,白痴 —— 搜索引擎的那一头。天哪!难道还有人不会用 [Google](https://www.google.com) 吗? - -> 问题:我怎样用 X 做 Y? - -回答:如果你想解决的是 Y ,提问时别给出可能并不恰当的方法。这种问题说明提问者不但对 X 完全无知,也对 Y 要解决的问题糊涂,还被特定形势禁锢了思维。最好忽略这种人,等他们把问题搞清楚了再说。 - -> 问题:我的{程序/设定/SQL 语句}没有用 - -回答:这不算是问题吧,我对要我问你二十个问题才找得出你真正问题的问题没兴趣 —— 我有更有意思的事要做呢。在看到这类问题的时候,我的反应通常不外如下三种 - -* 你还有什么要补充的吗? -* 真糟糕,希望你能搞定。 -* 这关我屁事? - -> 问题:我的 Windows 电脑有问题,你能帮我吗? - -回答:能啊,扔掉微软的垃圾,换个像 Linux 或 BSD 的开源操作系统吧。 - -注意:如果程序有官方版 Windows 或者与 Windows 有互动(如 Samba),你**可以**问与 Windows 相关的问题,只是别对问题是由 Windows 操作系统而不是程序本身造成的回复感到惊讶, 因为 Windows 一般来说实在太烂,这种说法通常都是对的。 - -> 问题:我的程序不会动了,我认为系统工具 X 有问题 - -回答:你完全有可能是第一个注意到被成千上万用户反复使用的系统调用与函数库文件有明显缺陷的人,更有可能的是你完全没有根据。不同凡响的说法需要不同凡响的证据,当你这样声称时,你必须有清楚而详尽的缺陷说明文件作后盾。 - -> 问题:我在安装 Linux(或者 X )时有问题,你能帮我吗? - -回答:不能,我只有亲自在你的电脑上动手才能找到毛病。还是去找你当地的 Linux 使用群组者寻求实际的指导吧(你能在[这儿](http://www.linux.org/groups/index.html)找到用户群组的清单)。 - -注意:如果安装问题与某 Linux 的发行版有关,在它的邮件列表、论坛或本地用户群组中提问也许是恰当的。此时,应描述问题的准确细节。在此之前,先用 `Linux` 和**所有**被怀疑的硬件作关键词仔细搜索。 - -> 问题:我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢? - -回答:想要这样做,说明了你是个卑鄙小人;想找个黑客帮你,说明你是个白痴! - -## 好问题与蠢问题 - -最后,我将透过举一些例子,来说明怎样聪明的提问;同一个问题的两种问法被放在一起,一种是愚蠢的,另一种才是明智的。 - -**蠢问题**: - -> 我从 foo 项目找来的源码没法编译。它怎么这么烂? - -他觉得都是别人的错,这个傲慢自大的提问者。 - -**聪明问题**: - -> foo 项目代码在 Nulix 6.2 版下无法编译通过。我读过了 FAQ,但里面没有提到跟 Nulix 有关的问题。这是我编译过程的记录,我有什么做的不对的地方吗? - -提问者已经指明了环境,也读过了 FAQ,还列出了错误,并且他没有把问题的责任推到别人头上,他的问题值得被关注。 - -**蠢问题**: - -> 我的主机板有问题了,谁来帮我? - -某黑客对这类问题的回答通常是:`好的,还要帮你拍拍背和换尿布吗?`,然后按下删除键。 - -**聪明问题**: - -> 我在 S2464 主机板上试过了 X 、 Y 和 Z ,但没什么作用,我又试了 A 、 B 和 C 。请注意当我尝试 C 时的奇怪现象。显然 florbish 正在 grommicking,但结果出人意料。通常在 Athlon MP 主机板上引起 grommicking 的原因是什么?有谁知道接下来我该做些什么测试才能找出问题? - -## 如果得不到回答 - -如果仍得不到回答,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。 - -总的来说,简单的重复张贴问题是个很糟的点子。这将被视为无意义的喧闹。有点耐心,知道你问题答案的人可能生活在不同的时区,可能正在睡觉,也有可能你的问题一开始就没有组织好。 - -你可以通过其他渠道获得帮助,这些渠道通常更适合初学者的需要。 diff --git a/docs/versioned_docs/version-1.4.2/user_docs/user_guide/_category_.json b/docs/versioned_docs/version-1.4.2/user_docs/user_guide/_category_.json deleted file mode 100644 index 9c505a51..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/user_guide/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "用户指南", - "position": 2, - "link": { - "type": "generated-index", - "description": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。" - } -} diff --git a/docs/versioned_docs/version-1.4.2/user_docs/user_guide/frame.md b/docs/versioned_docs/version-1.4.2/user_docs/user_guide/frame.md deleted file mode 100644 index 5992f735..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/user_guide/frame.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 为什么写 - -[美团线程池文章](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html "美团线程池文章") 介绍中,因为业务对线程池参数没有合理配置,触发过几起生产事故,进而引发了一系列思考。最终决定封装线程池动态参数调整,扩展线程池监控以及消息报警等功能。 - -在开源平台找了挺多动态线程池项目,从功能性以及健壮性而言,个人感觉不满足企业级应用。 - -因为对动态线程池比较感兴趣,加上想写一个有意义的项目,所以决定自己来造一个轻量级的轮子。 - -想给项目起一个简单易记的名字,类似于 Eureka、Nacos、Redis;后和朋友商量,决定命名:**Hippo4j**。 - -![](https://oss.open8gu.com/动态线程池功能架构-1.jpg) - -## 它解决了什么问题 - -线程池在业务系统应该都有使用到,帮助业务流程提升效率以及管理线程,多数场景应用于大量的异步任务处理。 - -虽然线程池提供了我们许多便利,但也并非尽善尽美,比如下面这些问题就无法很好解决。 - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 - -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 - -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 - -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 - -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 - -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 - -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -Hippo4j 很好解决了这些问题,它将业务中所有线程池统一管理,增强原生线程池系列功能。 - -## 它有什么特性 - -应用系统中线程池并不容易管理。参考美团的设计,Hippo4j 按照租户、项目、线程池的维度划分。再加上系统权限,让不同的开发、管理人员负责自己系统的线程池操作。 - -举个例子,小编在一家公司的公共组件团队,团队中负责消息、短链接网关等项目。公共组件是租户,消息或短链接就是项目。 - -Hippo4j 除去动态修改线程池,还包含实时查看线程池运行时指标、负载报警、配置日志管理等。 - -- `hippo4j-adapter`:适配对第三方框架中的线程池进行监控,如 Dubbo、RocketMQ、Hystrix 等; -- `hippo4j-auth`:用户、角色、权限等; -- `hippo4j-common`:多个模块公用代码实现; -- `hippo4j-config`:提供线程池准实时参数更新功能; -- `hippo4j-console`:对接前端控制台; -- `hippo4j-core`:核心的依赖,包括配置、核心包装类等; -- `hippo4j-discovery`:提供线程池项目实例注册、续约、下线等功能; -- `hippo4j-example` :示例工程; -- `hippo4j-message` :配置变更以及报警通知发送; -- `hippo4j-monitor` :线程池运行时监控; -- `hippo4j-server` :Server 端发布需要的模块聚合; -- `hippo4j-spring-boot`:SpringBoot Starter。 diff --git a/docs/versioned_docs/version-1.4.2/user_docs/user_guide/framework.md b/docs/versioned_docs/version-1.4.2/user_docs/user_guide/framework.md deleted file mode 100644 index 33e24d1c..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/user_guide/framework.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 架构设计 - -简单来说,Hippo4j 从部署的角度上分为两种角色:Server 端和 Client 端。 - -Server 端是 Hippo4j 项目打包出的 Java 进程,功能包括用户权限、线程池监控以及执行持久化的动作。 - -Client 端指的是我们 SpringBoot 应用,通过引入 Hippo4j Starter Jar 包负责与 Server 端进行交互。 - -比如拉取 Server 端线程池数据、动态更新线程池配置以及采集上报线程池运行时数据等。 - -## 基础组件 - -### 配置中心(Config) - -配置中心位于 Server 端,它的主要作用是监控 Server 端线程池配置变更,实时通知到 Client 实例执行线程池变更流程。 - -代码设计基于 Nacos 1.x 版本的 **长轮询以及异步 Servlet 机制** 实现。 - -### 注册中心(Discovery) - -负责管理 Client 端(单机或集群)注册到 Server 端的实例,包括不限于**实例注册、续约、过期剔除** 等操作,代码基于 Eureka 源码实现。 - -上面的配置中心很容易理解,动态线程池参数变更的根本。但是注册中心是用来做什么的? - -注册中心管理 Client 端注册的实例,通过这些实例可以 **实时获取线程池的运行时参数信息**。 - -目前的设计是如此,不排除后续基于 Discovery 做更多的扩展。 - -### 控制台(Console) - -对接前端项目,包括不限于以下模块管理: - -![](https://oss.open8gu.com/image-20211107122504126.png) - -## 消息通知(Notify) - -Hippo4j 内置了很多需要通知的事件,比如:线程池参数变更通知、线程池活跃度报警、拒绝策略执行报警以及阻塞队列容量报警等。 - -目前 Notify 已经接入了钉钉、企业微信和飞书,后续持续集成邮件、短信等通知渠道;并且,Notify 模块提供了消息事件的 SPI 方案,可以接受三方自定义的推送。 - -## Hippo4j-Spring-Boot-Starter - -熟悉 SpringBoot 的小伙伴对 Starter 应该不会陌生。Hippo4j 提供以 Starter Jar 包的形式嵌套在应用内,负责与 Server 端完成交互。 - -## 功能架构 - -![](https://oss.open8gu.com/image-20211105230953626.png) diff --git a/docs/versioned_docs/version-1.4.2/user_docs/user_guide/notify.md b/docs/versioned_docs/version-1.4.2/user_docs/user_guide/notify.md deleted file mode 100644 index 1be09e37..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/user_guide/notify.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 通知报警 - -现阶段已集成钉钉、企业微信、飞书的消息推送,后续会持续接入邮箱、短信和自定义通知渠道。 - -![](https://oss.open8gu.com/image-20220904181527453.png) - -**通知平台** - -- DING:钉钉平台; - -- LARK:飞书平台; - -- WECHAT:企业微信。 - -**通知类型** - -- CONFIG:线程池配置变更推送; - -- ALARM:线程池运行报警推送。 - -**Token** - -获取 DING、LARK、WECHAT 机器人 Token。 - -**报警间隔** - -- CONFIG 类型通知没有报警间隔; - -- ALARM 类型设置报警间隔后,某一节点下的同一线程池指定间隔只会发送一次报警通知。 - -**接收者** - -```tex -多个接收者使用英文逗号 , 分割 (注意不要有空格) -DING:填写手机号 -WECHART:填写user_id会以@的消息发给用户,填写姓名则是普通的@,如:龙台 -LARK:填写ou_开头用户唯一标识会以@的消息发给用户,填写手机号则是普通的@ -``` - - -## 钉钉平台 - -[钉钉创建群机器人](https://www.dingtalk.com/qidian/help-detail-20781541.html) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211013122816688.png) | ![](https://oss.open8gu.com/image-20211013113649068.png) | - -添加钉钉机器人后,需在机器人配置自定义关键字,才可发送成功。如下所示: - -![](https://oss.open8gu.com/image-20220530200133377.png?x-oss-process=image/resize,h_500,w_800) - -## 企业微信 - -[企业微信创建群机器人](https://open.work.weixin.qq.com/help2/pc/14931?person_id=1&from=homesearch) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211203213443242.png) | ![](https://oss.open8gu.com/image-20211203213512019.png) | - -## 飞书平台 - -[飞书创建群机器人](https://www.feishu.cn/hc/zh-CN/articles/360024984973) - -![](https://oss.open8gu.com/image-20220304081729347.png) - -![](https://oss.open8gu.com/image-20220304081507907.png) diff --git a/docs/versioned_docs/version-1.4.2/user_docs/user_guide/quick-start.md b/docs/versioned_docs/version-1.4.2/user_docs/user_guide/quick-start.md deleted file mode 100644 index 59c5cdd5..00000000 --- a/docs/versioned_docs/version-1.4.2/user_docs/user_guide/quick-start.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 快速开始 - -## 服务启动 - -使用 Docker 运行服务端,默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -> 如果没有 Docker,可以使用源码编译的方式,启动 [Hippo4j-Server/Hippo4j-Bootstrap](https://github.com/longtai-cn/hippo4j/tree/develop/hippo4j-server/hippo4j-bootstrap) 模块下 ServerApplication 应用类。 - -启动示例项目,[hippo4j-spring-boot-starter-example](https://github.com/opengoofy/hippo4j/tree/develop/hippo4j-example/hippo4j-spring-boot-starter-example) 模块下 ServerExampleApplication 应用类。 - -访问 Server 控制台,路径 `http://localhost:6691/index.html`,默认用户名密码:admin / 123456 - -## 配置变更 - -访问控制台动态线程池菜单下线程池实例,修改动态线程池相关参数。 - -![](https://oss.open8gu.com/image-20220813173811668.png) - -观察 Hippo4j-Example 控制台日志输出,日志输出包括不限于此信息即为成功。 - -```tex -2022-09-10 00:23:29.783 INFO 50322 --- [change.config_0] c.h.s.s.c.ServerThreadPoolDynamicRefresh : [message-consume] Dynamic thread pool change parameter. - corePoolSize: 2 => 4 - maximumPoolSize: 6 => 12 - capacity: 1024 => 2048 - keepAliveTime: 9999 => 9999 - executeTimeOut: 800 => 3000 - rejectedType: SyncPutQueuePolicy => RunsOldestTaskPolicy - allowCoreThreadTimeOut: true => true -``` - -另外,当 Client 集群部署时,可以修改某一个实例,或选择 `全部修改` 按钮,修改所有实例线程池信息。 diff --git a/docs/versioned_docs/version-1.4.3/user_docs/dev_manual/_category_.json b/docs/versioned_docs/version-1.4.3/user_docs/dev_manual/_category_.json deleted file mode 100644 index 9117307f..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/dev_manual/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "开发者手册", - "position": 5, - "link": { - "type": "generated-index", - "description": "Hippo4j 留给使用者能够扩展的知识点。" - } -} diff --git a/docs/versioned_docs/version-1.4.3/user_docs/dev_manual/rejected-policy-custom.md b/docs/versioned_docs/version-1.4.3/user_docs/dev_manual/rejected-policy-custom.md deleted file mode 100644 index e0405061..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/dev_manual/rejected-policy-custom.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 拒绝策略自定义 - -Hippo4j 通过 SPI 的方式对拒绝策略进行扩展,可以让用户在 Hippo4j 中完成自定义拒绝策略实现。 - -## Hippo4j Server 拒绝策略扩展 - -自定义拒绝策略,实现 `CustomRejectedExecutionHandler` 接口,示例如下: - -```java -public class ErrorLogRejectedExecutionHandler implements CustomRejectedExecutionHandler { - - @Override - public Integer getType() { - return 12; - } - - @Override - public RejectedExecutionHandler generateRejected() { - return new CustomErrorLogRejectedExecutionHandler(); - } - - public static class CustomErrorLogRejectedExecutionHandler implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - Logger logger = LoggerFactory.getLogger(this.getClass()); - logger.error("线程池抛出拒绝策略"); - } - } -} -``` - -创建 `src/main/resources/META-INF/services` 目录,创建 SPI 自定义拒绝策略文件 `cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler`。 - -`cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler` 文件内仅放一行自定义拒绝策略全限定名即可,示例: - -```text -cn.hippo4j.example.core.handler.ErrorLogRejectedExecutionHandler -``` - -创建、修改线程池页面选择 `CustomRejectedPolicy(自定义 SPI 策略)`。 - -![](https://oss.open8gu.com/image-20220813173907814.png) - -拒绝策略触发时,完成上述代码效果,仅打印异常日志提示。 - -```text -2022-08-01 21:27:49.515 ERROR 48928 --- [ateHandler.test] r$CustomErrorLogRejectedExecutionHandler : 线程池抛出拒绝策略 -``` - -:::note -具体参考 `hippo4j-example/hippo4j-spring-boot-starter-example` 模块。 -::: diff --git a/docs/versioned_docs/version-1.4.3/user_docs/dev_manual/rejected-policy-info.md b/docs/versioned_docs/version-1.4.3/user_docs/dev_manual/rejected-policy-info.md deleted file mode 100644 index d5c68138..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/dev_manual/rejected-policy-info.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 内置拒绝策略 - -内置两种拒绝策略说明: - -**RunsOldestTaskPolicy**:添加新任务并由主线程运行最早的任务。 - -```java -public class RunsOldestTaskPolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - BlockingQueue workQueue = executor.getQueue(); - Runnable firstWork = workQueue.poll(); - boolean newTaskAdd = workQueue.offer(r); - if (firstWork != null) { - firstWork.run(); - } - if (!newTaskAdd) { - executor.execute(r); - } - } -} -``` - -**SyncPutQueuePolicy**:主线程把拒绝任务以阻塞的方式添加到队列。 - -```java -@Slf4j -public class SyncPutQueuePolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - try { - executor.getQueue().put(r); - } catch (InterruptedException e) { - log.error("Adding Queue task to thread pool failed.", e); - } - } -} -``` \ No newline at end of file diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/_category_.json b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/_category_.json deleted file mode 100644 index 72b1e151..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "快速开始", - "position": 3, - "link": { - "type": "generated-index" - } -} diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/_category_.json b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/_category_.json deleted file mode 100644 index 78b3d9c4..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "依赖配置中心", - "position": 2, - "collapsed": true -} diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-default.md b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-default.md deleted file mode 100644 index 9c9e0fc9..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-default.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 参数默认配置 - -曾有多名小伙伴反馈说,项目中线程池一多,配置文件中配置就显得很臃肿。为此 hippo4j-config 开发出了动态线程池默认配置。 - -```yaml -spring: - dynamic: - thread-pool: - default-executor: - core-pool-size: 4 - maximum-pool-size: 6 - blocking-queue: ResizableCapacityLinkedBlockingQueue - queue-capacity: 1024 - execute-time-out: 1000 - keep-alive-time: 9999 - rejected-handler: AbortPolicy - active-alarm: 90 - capacity-alarm: 85 - alarm: true - allow-core-thread-time-out: true - notify: - interval: 5 - receives: chen.ma - executors: - - thread-pool-id: message-produce - - thread-pool-id: message-consume - core-pool-size: 80 - maximum-pool-size: 100 - execute-time-out: 1000 - notify: - interval: 6 - receives: chen.ma -``` - -`spring.dynamic.thread-pool.executors` 层级下,仅需要配置 `thread-pool-id`,其余配置从 `spring.dynamic.thread-pool.default-executor` 读取。 - -如果 `spring.dynamic.thread-pool.executors` 下配置和 `spring.dynamic.thread-pool.default-executor` 冲突,以前者为主。 - -通过该自定义配置方式,可减少大量重复线程池参数配置项,提高核心配置简洁度。 - -提示:`spring.dynamic.thread-pool.default-executor` 层级下参数,不提供动态刷新功能。 diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-monitor.md b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-monitor.md deleted file mode 100644 index 17d665e6..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-monitor.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 线程池监控 - -## 线程池监控配置 - -监控前置条件:需要先完成 hippo4j-config 的 [接入工作](/docs/user_docs/getting_started/config/hippo4j-config-start)。 - -接下来引入 SpringBoot Actuator。Spring 2.x 一般都有版本指定,所以这里不用写版本号。 - -```xml - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - -``` - -添加动态线程池监控相关配置: - -```yaml -management: - metrics: - export: - prometheus: - enabled: true - server: - port: 29999 # 可选配置,如果不配置该 port,直接使用 ${server.port} - endpoints: - web: - exposure: - include: '*' # 测试使用,开启了所有端点,生产环境不建议 * -spring: - dynamic: - thread-pool: - monitor: - enable: true # 是否开启采集线程池运行时数据 - collect-interval: 5000 # 采集线程池运行数据频率 - collect-types: micrometer # 采集线程池运行数据的类型。eg:log、micrometer。多个可以同时使用,默认 micrometer - initial-delay: 10000 # 项目启动后延迟多久进行采集 - thread-pool-types: dynamic # 采集线程池的类型。eg:dynamic、web、adapter。可任意配置,默认 dynamic -``` - -项目启动,访问 `http://localhost:29999/actuator/prometheus` 出现 `dynamic_thread_pool_` 前缀的指标,即为成功。 - -![](https://oss.open8gu.com/image-20220912220401016.png) - -## 配置 Prometheus - -通过 Docker 启动 Prometheus 服务。 - -```shell -docker run -d -p 9090:9090 --name prometheus prom/prometheus -``` - -添加 Prometheus 抽取数据任务。 - -```shell -# 进入 prometheus 容器内部 -docker exec -it prometheus /bin/sh -# 编辑 prometheus 配置文件 -vi /etc/prometheus/prometheus.yml -``` - -scrape_configs 节点下新添加一个 job,如果 Prometheus 是 Docker 方式部署,`{scrape_configs.static_configs.targets}` 需要写本机的 IP。 - -```yaml -scrape_configs: - - job_name: 'dynamic-thread-pool-job' - scrape_interval: 5s - metrics_path: '/actuator/prometheus' - static_configs: - - targets: [ '127.0.0.1:29999' ] -``` - -配置成功后 `exit` 退出容器,并进行 Prometheus 容器重启 `docker restart prometheus`。 - -访问 Prometheus 控制台 `http://localhost:9090/graph` 路径,能够展示相关指标即为配置成功。 - -![](https://oss.open8gu.com/image-20220912221237597.png) - -## 配置 Grafana - -```shell -docker run -d -p 3000:3000 --name=grafana grafana/grafana -``` - -访问 Grafana 地址,[http://localhost:3000](http://localhost:3000) 用户名密码:`admin` - -Grafana 访问 `http://localhost:3000/datasources` 导入 Prometheus 数据源。 - -![](https://oss.open8gu.com/image-20220912221646866.png) - -> 如果 Prometheus 为 Docker 方式部署,HTTP URL 需要为本地 IP,比如:http://192.168.1.5:9090 - -关注公众号 `龙台的技术笔记`,回复:`监控`,获取 Hippo4j Grafana DashBoard JSON 配置。 - -| 公众号 | 回复关键词 | -|:------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------:| -| ![](https://oss.open8gu.com/43_65f6020ed111b6bb3808ec338576bd6b.png?x-oss-process=image/resize,h_300,w_400) | ![](https://oss.open8gu.com/image-20220327171957444.png?x-oss-process=image/resize,h_300,w_400) | - -获取到 JSON 文件后,通过 `http://localhost:3000/dashboard/import` 将 JSON 文件导入至 Grafana DashBoard。 - -![](https://oss.open8gu.com/image-20220912225627272.png) - -下拉框内动态选择创建好的 Prometheus 数据源,并点击 `Import`。 - -![](https://oss.open8gu.com/image-20220912225700200.png) - -即可使用炫酷的 Hippo4j 动态线程池监控 DashBoard。大家伙儿也可以根据个人喜好进行定制 DashBoard,如果觉得有优化点,欢迎和我联系贡献。 - -![](https://oss.open8gu.com/image-20220912225813972.png) - -如果项目客户端启动多个示例,动态线程池监控效果图如下: - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-more.md b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-more.md deleted file mode 100644 index 2511b4f3..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-more.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 个性化配置 - -以下所述特性自 hippo4j-config v1.4.2 及以上版本提供,由 hippo4j 核心开发者 [@pizihao](https://github.com/pizihao) 完成相应功能开发。 - -## 需求背景 - -**1)容器及三方框架线程池自定义启用** - -最初设计容器线程池和三方框架线程池的动态变更是和启动无关的。也就是说,启动时不会根据配置文件中相关参数去修改两者对应的线程池配置。 - -这么设计的初衷是因为,不想让 hippo4j 过多的去介入框架原有的功能。因为容器和三方框架都支持线程池参数的自定义。 - -也就造成,可能你在配置中心配置了对应的容器和三方框架线程池参数,启动时是无效的。但当修改配置文件任一配置,容器和三方框架线程池配置将生效。 - -为了更好的用户体验,决定加入启用标识来控制:是否在项目初始化启动时,对容器和三方框架线程池参数进行修改。 - -**2)客户端集群个性化配置** - -大家都知道,hippo4j-config 是依赖配置中心做线程池配置动态变更。这种模式有一种缺点:改动配置文件后,所有客户端都会变更。 - -有些小伙伴希望 hippo4j-config 能够像 hippo4j-server 一样,能够针对单独的客户端进行配置变更。 - -## 容器及三方框架线程池自定义启用 - -容器及三方框架线程池添加启用配置,为了保持统一,动态线程池配置中也有该参数配置。配置项默认开启。 - -```yaml -spring: - dynamic: - thread-pool: - tomcat: - enable: true - executors: - - thread-pool-id: message-consume - enable: false - adapter-executors: - - threadPoolKey: 'input' - enable: true -``` - -## 客户端集群个性化配置 - -分别在动态线程池、容器线程池以及三方框架线程池配置下增加 `nodes` 配置节点,通过该配置可匹配需要变更的节点。 - -```yaml -spring: - dynamic: - thread-pool: - tomcat: - nodes: 192.168.1.5:*,192.168.1.6:8080 - executors: - - thread-pool-id: message-consume - nodes: 192.168.1.5:* - adapter-executors: - - threadPoolKey: 'input' - nodes: 192.168.1.5:* -``` - -来一段代码方法中的注释,大家就基本明白如何使用了。 - -```java -/** - * Matching nodes
- * nodes is ip + port.Get 'nodes' in the new Properties,Compare this with the ip + port of Application.
- * support prefix pattern matching. e.g:
- *
    - *
  • 192.168.1.5:* -- Matches all ports of 192.168.1.5
  • - *
  • 192.168.1.*:2009 -- Matches 2009 port of 192.168.1.*
  • - *
  • * -- all
  • - *
  • empty -- all
  • - *
- * The format of ip + port is ip : port. - */ -``` - -`nodes` 可与 `enable` 同时使用。如此,基于配置中心的动态线程池实现方式,将能够更方便的支持个性化需求。 diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md deleted file mode 100644 index 709e882a..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 适配SpringBoot1x - -目前已支持 Nacos、Apollo 配置中心适配 SpringBoot 1.5.x 版本。 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-1x-starter - 1.4.3-upgrade - -``` - -Nacos SpringBoot 配置如下: - -```yaml -spring: - cloud: - nacos: - config: - ext-config: - - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP - refresh: true - server-addr: 127.0.0.1:8848 - dynamic: - thread-pool: - config-file-type: yml - nacos: - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP -``` - -Apollo SpringBoot 配置如下: - -```yaml -apollo: - autoUpdateInjectedSpringProperties: true - bootstrap: - eagerLoad: - enabled: true - enabled: true - namespaces: application - meta: http://127.0.0.1:8080 -app: - id: dynamic-threadpool-example -spring: - dynamic: - thread-pool: - apollo: - namespace: application -``` - -动态线程池通用配置如下: - -```yaml -management: - context-path: /actuator - security: - enabled: false -server: - port: 8091 - servlet: - context-path: /example -spring: - application: - name: dynamic-threadpool-example - dynamic: - thread-pool: - banner: true - check-state-interval: 5 - collect-type: micrometer - config-file-type: properties - enable: true - executors: - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-consume - thread-pool-id: message-consume - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-produce - thread-pool-id: message-produce - notify-platforms: - - platform: WECHAT - token: ac0426a5-c712-474c-9bff-72b8b8f5caff - profiles: - active: dev -``` - -具体 Demo 运行请参考以下示例模块,已验证对应线程池动态变更、报警以及运行时监控功能。 - -- `/hippo4j-config-nacos-spring-boot-1x-starter-example` -- `hippo4j-example/hippo4j-config-apollo-spring-boot-1x-starter-example` diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-start.md b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-start.md deleted file mode 100644 index 51907ae7..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/config/hippo4j-config-start.md +++ /dev/null @@ -1,193 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 接入流程 - -Nacos、Apollo、Zookeeper、ETCD、Polaris 配置中心任选其一。 - -## hippo4j 配置 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-starter - 1.4.3-upgrade - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -server: - port: 8090 - servlet: - context-path: /example - -spring: - profiles: - active: dev - - dynamic: - thread-pool: - # 是否开启动态线程池 - enable: true - # 是否打印 banner - banner: true - # 是否开启线程池数据采集,对接 Micrometer、ES、Log 等 - collect: true - # 检查线程池状态,是否达到报警条件,单位毫秒 - check-state-interval: 3000 - # 通知报警平台,请替换为自己创建的群机器人 - notify-platforms: - - platform: 'WECHAT' - token: xxx - - platform: 'DING' - token: xxx - secret: xxx # 加签专属 - - platform: 'LARK' - token: xxx - # Nacos、Apollo、Zookeeper、ETCD、Polaris 任选其一 - nacos: - data-id: xxx - group: xxx - apollo: - namespace: xxxx - # 配置中心文件格式 - config-file-type: yml - # tomcat、undertow、jetty 三种容器线程池,任选其一 - undertow: - core-pool-size: 100 - maximum-pool-size: 200 - keep-alive-time: 1000 - # 全局通知配置-是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位秒 - alarm-interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - # 动态线程池列表 - executors: - - thread-pool-id: 'message-consume' - # 核心线程数 - core-pool-size: 1 - # 最大线程数 - maximum-pool-size: 1 - # 阻塞队列名称,参考 BlockingQueueTypeEnum,支持 SPI - blocking-queue: 'LinkedBlockingQueue' - # 阻塞队列大小 - queue-capacity: 1 - # 执行超时时间,超过此时间发起报警,单位毫秒 - execute-time-out: 1000 - # 拒绝策略名称,参考 RejectedPolicyTypeEnum,支持 SPI - rejected-handler: 'AbortPolicy' - # 线程存活时间,单位秒 - keep-alive-time: 1024 - # 是否允许核心线程超时 - allow-core-thread-time-out: true - # 线程工厂名称前缀 - thread-name-prefix: 'message-consume' - # 是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 通知配置,线程池中通知配置如果存在,则会覆盖全局通知配置 - notify: - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位分钟 - interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - - thread-pool-id: 'message-produce' - core-pool-size: 1 - maximum-pool-size: 1 - queue-capacity: 1 - execute-time-out: 1000 - blocking-queue: 'LinkedBlockingQueue' - rejected-handler: 'AbortPolicy' - keep-alive-time: 1024 - allow-core-thread-time-out: true - thread-name-prefix: 'message-consume' - alarm: true - active-alarm: 80 - capacity-alarm: 80 - notify: - interval: 8 - receives: xxx -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从配置中心拉取。 - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/difference.md b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/difference.md deleted file mode 100644 index eddaa550..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/difference.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 运行模式介绍 - -1.1.0 版本发布后,Hippo4j 分为两种使用模式:轻量级依赖配置中心以及无中间件依赖版本。 - -![](https://oss.open8gu.com/image-20220319154626314.png) - -### hippo4j-config - -**轻量级动态线程池管理**,依赖 Nacos、Apollo、Zookeeper、ETCD、Polaris 等三方配置中心(任选其一)完成线程池参数动态变更,支持运行时报警、监控等功能。 - -> 监控功能配置详见:[线程池监控](/docs/user_docs/getting_started/config/hippo4j-config-monitor) - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) - -### hippo4j-server - -**部署 hippo4j-server 服务**,通过可视化 Web 界面完成线程池的创建、变更以及查看,不依赖三方中间件。 - -相比较 hippo4j-config,功能会更强大,但同时也引入了一定的复杂性。需要部署一个 Java 服务,以及依赖 MySQL 数据库。 - -![](https://oss.open8gu.com/1644032018254-min.gif) - -### 使用总结 - -| | hippo4j-config | hippo4j-server | -| ---- | ---------------------------------------------------- | ------------------------------------------------------------ | -| 依赖 | Nacos、Apollo、Zookeeper、ETCD、Polaris 配置中心(任选其一) | 部署 Hippo4j Server(内部无依赖中间件) | -| 使用 | 配置中心补充线程池相关参数 | Hippo4j Server Web 控制台添加线程池记录 | -| 功能 | 包含基础功能:参数动态化、运行时监控、报警等 | 基础功能之外扩展控制台界面、线程池堆栈查看、线程池运行信息实时查看、历史运行信息查看、线程池配置集群个性化等 | - -使用建议:根据公司情况选择,如果基本功能可以满足使用,选择 hippo4j-config 使用即可;如果希望更多的功能,可以选择 hippo4j-server。 - -**两者在进行替换的时候,无需修改业务代码**。 diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/hippo4j-adapter.md b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/hippo4j-adapter.md deleted file mode 100644 index 50599d06..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/hippo4j-adapter.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 三方框架线程池适配 - -Hippo4j 目前已支持的三方框架线程池列表: - -- Dubbo -- Hystrix -- RabbitMQ -- RocketMQ -- AlibabaDubbo -- RocketMQSpringCloudStream -- RabbitMQSpringCloudStream - -引入 Hippo4j Server 或 Core 的 Maven Jar 坐标后,还需要引入对应的框架适配 Jar: - -```xml - - cn.hippo4j - - hippo4j-spring-boot-starter-adapter-dubbo - - hippo4j-spring-boot-starter-adapter-alibaba-dubbo - - hippo4j-spring-boot-starter-adapter-hystrix - - hippo4j-spring-boot-starter-adapter-rabbitmq - - hippo4j-spring-boot-starter-adapter-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq - 1.4.3-upgrade - -``` - -如果想省事,仅需引入一个全量包,框架底层会根据条件判断加载具体线程池适配器。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-adapter-all - 1.4.3-upgrade - -``` - -## Hippo4j Server - -Hippo4j Server 仅需要引入上述 Jar 包,即可在 Hippo4j Server 的控制台进行查看及修改三方框架线程池。 - -![](https://oss.open8gu.com/image-20220531194810047.png) - -## Hippo4j Config - -Hippo4j Config 除了依赖上述适配 Jar 包外,还需要在配置中心添加以下配置项。 - -```yaml -spring: - dynamic: - thread-pool: - # 省略其它配置 - adapter-executors: - # threadPoolKey 代表线程池标识 - - threadPoolKey: 'input' - # mark 为三方线程池框架类型,参见文初已支持框架集合 - mark: 'RocketMQSpringCloudStream' - corePoolSize: 10 - maximumPoolSize: 10 -``` diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/img/docsVersionDropdown.png b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/img/docsVersionDropdown.png deleted file mode 100644 index 97e41646..00000000 Binary files a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/img/docsVersionDropdown.png and /dev/null differ diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/img/grafana-monitor.jpg b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/img/grafana-monitor.jpg deleted file mode 100644 index 336bd980..00000000 Binary files a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/img/grafana-monitor.jpg and /dev/null differ diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/img/localeDropdown.png b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/img/localeDropdown.png deleted file mode 100644 index e257edc1..00000000 Binary files a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/img/localeDropdown.png and /dev/null differ diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/server/_category_.json b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/server/_category_.json deleted file mode 100644 index 4063c17f..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/server/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "无中间件依赖", - "position": 3, - "collapsed": true -} diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-config.md b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-config.md deleted file mode 100644 index e1ef853f..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-config.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 服务端配置 - -`hippo4j.core.clean-history-data-enable` - -是否开启线程池历史数据清洗,默认开启。 - -`hippo4j.core.clean-history-data-period` - -线程池历史数据保留时间,默认值:30,单位分钟。 - -服务端会保留这个配置时间的数据,超过这个时间则会被清理。比如按照默认值 30 分钟来说,12:00 收集到的数据,12:30 就会被清理删除。 - -`hippo4j.core.monitor.report-type` - -客户端监控上报服务端类型,可选值:http、netty,默认 http。服务端开启 netty 配置后,需要在客户端对应开启才可生效。用来应对大量动态线程池监控场景。 diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-monitor.md b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-monitor.md deleted file mode 100644 index 6e0592fa..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-monitor.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 线程池监控 - -Server 模式默认内置线程池运行时采集和监控功能,如果想要使用 Prometheus + Grafana 的方式可以查看以下内容。 - -## 线程池监控配置 - -接下来引入 SpringBoot Actuator。Spring 2.x 一般都有版本指定,所以这里不用写版本号。 - -```xml - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - -``` - -添加动态线程池监控相关配置: - -```yaml -management: - metrics: - export: - prometheus: - enabled: true - server: - port: 29999 # 可选配置,如果不配置该 port,直接使用 ${server.port} - endpoints: - web: - exposure: - include: '*' # 测试使用,开启了所有端点,生产环境不建议 * -spring: - dynamic: - thread-pool: - monitor: - enable: true # 是否开启采集线程池运行时数据 - collect-interval: 5000 # 采集线程池运行数据频率 - collect-types: server,micrometer # 采集线程池运行数据的类型。eg:server、micrometer。多个可以同时使用,默认 server - initial-delay: 10000 # 项目启动后延迟多久进行采集 - thread-pool-types: dynamic # 采集线程池的类型。eg:dynamic、web、adapter。可任意配置,默认 dynamic -``` - -如果使用 `micrometer` 类型的监控指标,需要添加以下依赖。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-monitor-micrometer - 1.4.3-upgrade - -``` - -项目启动,访问 `http://localhost:29999/actuator/prometheus` 出现 `dynamic_thread_pool_` 前缀的指标,即为成功。 - -![](https://oss.open8gu.com/image-20220912220401016.png) - -## 配置 Prometheus - -通过 Docker 启动 Prometheus 服务。 - -```shell -docker run -d -p 9090:9090 --name prometheus prom/prometheus -``` - -添加 Prometheus 抽取数据任务。 - -```shell -# 进入 prometheus 容器内部 -docker exec -it prometheus /bin/sh -# 编辑 prometheus 配置文件 -vi /etc/prometheus/prometheus.yml -``` - -scrape_configs 节点下新添加一个 job,如果 Prometheus 是 Docker 方式部署,`{scrape_configs.static_configs.targets}` 需要写本机的 IP。 - -```yaml -scrape_configs: - - job_name: 'dynamic-thread-pool-job' - scrape_interval: 5s - metrics_path: '/actuator/prometheus' - static_configs: - - targets: [ '127.0.0.1:29999' ] -``` - -配置成功后 `exit` 退出容器,并进行 Prometheus 容器重启 `docker restart prometheus`。 - -访问 Prometheus 控制台 `http://localhost:9090/graph` 路径,能够展示相关指标即为配置成功。 - -![](https://oss.open8gu.com/image-20220912221237597.png) - -## 配置 Grafana - -```shell -docker run -d -p 3000:3000 --name=grafana grafana/grafana -``` - -访问 Grafana 地址,[http://localhost:3000](http://localhost:3000) 用户名密码:`admin` - -Grafana 访问 `http://localhost:3000/datasources` 导入 Prometheus 数据源。 - -![](https://oss.open8gu.com/image-20220912221646866.png) - -> 如果 Prometheus 为 Docker 方式部署,HTTP URL 需要为本地 IP,比如:http://192.168.1.5:9090 - -关注公众号 `龙台的技术笔记`,回复:`监控`,获取 Hippo4j Grafana DashBoard JSON 配置。 - -| 公众号 | 回复关键词 | -|:------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------:| -| ![](https://oss.open8gu.com/43_65f6020ed111b6bb3808ec338576bd6b.png?x-oss-process=image/resize,h_300,w_400) | ![](https://oss.open8gu.com/image-20220327171957444.png?x-oss-process=image/resize,h_300,w_400) | - -获取到 JSON 文件后,通过 `http://localhost:3000/dashboard/import` 将 JSON 文件导入至 Grafana DashBoard。 - -![](https://oss.open8gu.com/image-20220912225627272.png) - -下拉框内动态选择创建好的 Prometheus 数据源,并点击 `Import`。 - -![](https://oss.open8gu.com/image-20220912225700200.png) - -即可使用炫酷的 Hippo4j 动态线程池监控 DashBoard。大家伙儿也可以根据个人喜好进行定制 DashBoard,如果觉得有优化点,欢迎和我联系贡献。 - -![](https://oss.open8gu.com/image-20220912225813972.png) - -如果项目客户端启动多个示例,动态线程池监控效果图如下: - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) diff --git a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-start.md b/docs/versioned_docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-start.md deleted file mode 100644 index ad702ca5..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/getting_started/server/hippo4j-server-start.md +++ /dev/null @@ -1,127 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 接入流程 - -部署服务端,参考 [部署手册](/docs/user_docs/ops/hippo4j-server-deploy)。 - -服务端创建 [租户、项目](/community/faq#租户和项目在-hippo4j-中是什么意思) 和线程池记录。 - -需要注意,项目 ID 需要与配置文件 `{application.name}` 保持一致。 - -:::note -租户、项目、线程池 ID 如果由多个词组成,建议以 - 进行分割。比如:message-center。 -::: - -## Hippo4j 配置 - -SpringBoot Pom 引入 Hippo4j Starter Jar。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter - 1.4.3-upgrade - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -spring: - profiles: - active: dev - application: - # 服务端创建的项目 id 需要与 application.name 保持一致 - name: dynamic-threadpool-example - dynamic: - thread-pool: - # 服务端地址 - server-addr: http://localhost:6691 - # 用户名 - username: admin - # 密码 - password: 123456 - # 租户 id, 对应 tenant 表 - namespace: prescription - # 项目 id, 对应 item 表 - item-id: ${spring.application.name} -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从 hippo4j-server 服务拉取。 - -:::note -创建线程池时建议填充实际的参数。如果在连接 Hippo4j Server 端失败时,会使用填充配置创建线程池。 -::: - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` - diff --git a/docs/versioned_docs/version-1.4.3/user_docs/intro.md b/docs/versioned_docs/version-1.4.3/user_docs/intro.md deleted file mode 100644 index af470274..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/intro.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 简介 - -## 线程池痛点 - -线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。在高并发以及大批量的任务处理场景,线程池的使用是必不可少的。 - -如果有在项目中实际使用线程池,相信你可能会遇到以下痛点: - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -## 什么是 Hippo4j - -Hippo4j 通过对 JDK 线程池增强,以及扩展三方框架底层线程池等功能,为业务系统提高线上运行保障能力。 - -提供以下功能支持: - -- 全局管控 - 管理应用线程池实例。 - -- 动态变更 - 应用运行时动态变更线程池参数,包括不限于:核心、最大线程数、阻塞队列容量、拒绝策略等。 -- 通知报警 - 内置四种报警通知策略,线程池活跃度、容量水位、拒绝策略以及任务执行时间超长。 -- 运行监控 - 实时查看线程池运行时数据,最近半小时线程池运行数据图表展示。 -- 功能扩展 - 支持线程池任务传递上下文;项目关闭时,支持等待线程池在指定时间内完成任务。 -- 多种模式 - 内置两种使用模式:[依赖配置中心](https://hippo4j.cn/docs/user_docs/getting_started/config/hippo4j-config-start) 和 [无中间件依赖](https://hippo4j.cn/docs/user_docs/getting_started/server/hippo4j-server-start)。 -- 容器管理 - Tomcat、Jetty、Undertow 容器线程池运行时查看和线程数变更。 -- 框架适配 - Dubbo、Hystrix、RabbitMQ、RocketMQ 等消费线程池运行时数据查看和线程数变更。 - -## 快速开始 - -对于本地演示目的,请参阅 [Quick start](https://hippo4j.cn/docs/user_docs/user_guide/quick-start) - -演示环境: [http://console.hippo4j.cn/index.html](http://console.hippo4j.cn/index.html) - -## 接入登记 - -更多接入的公司,欢迎在 [登记地址](https://github.com/opengoofy/hippo4j/issues/13) 登记,登记仅仅为了产品推广。 - -## 联系我 - -开源不易,右上角点个 Star 鼓励一下吧! - -如果大家想要实时关注 Hippo4j 更新的文章以及分享的干货的话,可以关注我的公众号。 - -使用过程中有任何问题,或者对项目有什么建议,关注公众号回复:加群,和 1000+ 志同道合的朋友交流讨论。 - -![](https://oss.open8gu.com/image-20230317191041262-mini.png) - -## 友情链接 - -- [[ LiteFlow ]](https://liteflow.yomahub.com/):轻量,快速,稳定可编排的组件式规则引擎。 - -- [[ Sa-Token ]](https://github.com/dromara/sa-token):一个轻量级 java 权限认证框架,让鉴权变得简单、优雅! -- [[ HertzBeat ]](https://github.com/dromara/hertzbeat):易用友好的云监控系统, 无需 Agent, 强大自定义监控能力。 -- [[ JavaGuide ]](https://github.com/Snailclimb/JavaGuide):一份涵盖大部分 Java 程序员所需要掌握的核心知识。 -- [[ toBeBetterJavaer ]](https://github.com/itwanger/toBeBetterJavaer):一份通俗易懂、风趣幽默的 Java 学习指南。 - -## 贡献者 - -感谢所有为项目作出贡献的开发者。如果有意贡献,参考 [good first issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)。 diff --git a/docs/versioned_docs/version-1.4.3/user_docs/ops/_category_.json b/docs/versioned_docs/version-1.4.3/user_docs/ops/_category_.json deleted file mode 100644 index d5b7d1e8..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/ops/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "运维指南", - "position": 4, - "link": { - "type": "generated-index" - } -} diff --git a/docs/versioned_docs/version-1.4.3/user_docs/ops/hippo4j-server-deploy.md b/docs/versioned_docs/version-1.4.3/user_docs/ops/hippo4j-server-deploy.md deleted file mode 100644 index ffbc2306..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/ops/hippo4j-server-deploy.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 源码包部署 - -[RELEASE](https://github.com/opengoofy/hippo4j/releases) 页面下载对应版本并进行解压。 - -## 初始化 - -修改数据库相关信息。 - -```txt -/conf/application.properties -``` - -如果是新运行 Hippo4j,数据库执行下述 SQL 脚本即可。 - -```txt -/conf/hippo4j_manager.sql -``` - -如果是对已运行 Hippo4j 升级,请查看 `/conf/sql-upgrade` 目录下,是否有目标版本对应的升级脚本。 - -## 直接运行 - -Mac Linux 启动执行。 - -```txt -sh ./bin/startup.sh -``` - -Windows 启动执行。 - -```txt -bin/startup.cmd -``` - -## 访问控制台 - -启动成功后,访问链接。用户名密码:admin 123456 - -```txt -localhost:6691/index.html -``` diff --git a/docs/versioned_docs/version-1.4.3/user_docs/ops/server-docker.md b/docs/versioned_docs/version-1.4.3/user_docs/ops/server-docker.md deleted file mode 100644 index 826bb99f..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/ops/server-docker.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Docker部署 - -## 镜像启动 - -Docker 镜像默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -或者,底层存储数据库切换为 MySQL。`DATASOURCE_HOST` 需要切换为本地 IP,不能使用 `127.0.0.1` 或 `localhost`。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server \ --e DATASOURCE_MODE=mysql \ --e DATASOURCE_HOST=xxx.xxx.xxx.xxx \ --e DATASOURCE_PORT=3306 \ --e DATASOURCE_DB=hippo4j_manager \ --e DATASOURCE_USERNAME=root \ --e DATASOURCE_PASSWORD=root \ -hippo4j/hippo4j-server -``` - -访问 Server 控制台,路径 `http://localhost:6691/index.html` ,默认用户名密码:admin / 123456 - -## 镜像构建 - -如果想要自定义镜像,可以通过以下命令快速构建 Hippo4j Server: - -方式一: - -```shell -# 进入到 hippo4j-server/hippo4j-bootstrap 工程路径下 -mvn clean package -Dskip.spotless.apply=true -# 默认打包是打包的 tag 是 latest -docker build -t hippo4j/hippo4j-server ../hippo4j-bootstrap -``` - -方式二: - -通过 `maven docker plugin` - -```shell -# 进入到 hippo4j-server 工程路径下 -mvn clean package -DskipTests -Dskip.spotless.apply=true docker:build -``` diff --git a/docs/versioned_docs/version-1.4.3/user_docs/other/_category_.json b/docs/versioned_docs/version-1.4.3/user_docs/other/_category_.json deleted file mode 100644 index a74d7432..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/other/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "其它", - "position": 6, - "link": { - "type": "generated-index" - } -} diff --git a/docs/versioned_docs/version-1.4.3/user_docs/other/official-ccounts.md b/docs/versioned_docs/version-1.4.3/user_docs/other/official-ccounts.md deleted file mode 100644 index 63e07ea7..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/other/official-ccounts.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 推荐公众号 - -## JavaGuide - -专注Java后端学习和大厂面试的公众号! - -![](https://oss.open8gu.com/JavaGuide.png) - -## HelloGitHub - -HelloGitHub,专注于开源社区技术和知识内容分享。 - -![](https://oss.open8gu.com/HelloGitHub.png) - -## macrozheng - -专注Java技术分享,解析优质开源项目。涵盖SpringBoot、SpringCloud、Docker、K8S等实用技术,作者Github开源项目mall(50K+Star)。 - -![](https://oss.open8gu.com/macrozheng.png) diff --git a/docs/versioned_docs/version-1.4.3/user_docs/other/operation.md b/docs/versioned_docs/version-1.4.3/user_docs/other/operation.md deleted file mode 100644 index 62661c55..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/other/operation.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 公众号合作 - -## 推荐须知 - -hippo4j 作为一款新兴动态线程池框架,开源出来的时间比较晚,目前迫切需要不同的途径进行推广。 - -如果您是公众号运营者或者开源爱好者,欢迎将 hippo4j 推荐给您的粉丝。 - -1. 您无需为 hippo4j 专门撰写文案,只需要直接导入 [推荐文章](https://mp.weixin.qq.com/s/JTTwcBEiK_MnFcPTZl3zGA) 即可。 -2. 在文章底部或内容中留下项目官网或者 GitHub 仓库链接。 -3. 文章需至少 1000+ 的阅读量。 - -作为推荐回报,hippo4j 可以为您: - -1. 在框架官方文档 [推荐公众号](/docs/user_docs/other/official-ccounts) 页面处留下您的公众号二维码。 -2. 在框架官方交流群里@全体成员推广您的公众号一次,附带介绍语。 -3. 您的公众号所有新推文章都可以将链接发送到 hippo4j 交流群中,增加阅读量。 - -如果您还有除公众号以外的其它途径可以与 hippo4j 相互推荐,欢迎 [加群沟通](/group)。 diff --git a/docs/versioned_docs/version-1.4.3/user_docs/other/question.md b/docs/versioned_docs/version-1.4.3/user_docs/other/question.md deleted file mode 100644 index 49fd4d77..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/other/question.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 问题提问 - -文档引用自:[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way) - -## 在提问之前 - -在你准备要通过电子邮件、新闻群组或者聊天室提出技术问题前,请先做到以下事情: - -1. 尝试在你准备提问的论坛的旧文章中搜索答案。 -2. 尝试上网搜索以找到答案。 -3. 尝试阅读手册以找到答案。 -4. 尝试阅读常见问题文件(FAQ)以找到答案。 -5. 尝试自己检查或试验以找到答案。 -6. 向你身边的强者朋友打听以找到答案。 -7. 如果你是程序开发者,请尝试阅读源代码以找到答案。 - -当你提出问题的时候,请先表明你已经做了上述的努力;这将有助于树立你并不是一个不劳而获且浪费别人的时间的提问者。如果你能一并表达在做了上述努力的过程中所**学到**的东西会更好,因为我们更乐于回答那些表现出能从答案中学习的人的问题。 - -## 当你提问时 - -### 慎选提问的论坛 -小心选择你要提问的场合。如果你做了下述的事情,你很可能被忽略掉或者被看作失败者: - -* 在与主题不合的论坛上贴出你的问题。 -* 在探讨进阶技术问题的论坛张贴非常初级的问题;反之亦然。 -* 在太多的不同新闻群组上重复转贴同样的问题(cross-post)。 -* 向既非熟人也没有义务解决你问题的人发送私人电邮。 - -因此,第一步是找到对的论坛。再说一次,Google 和其它搜索引擎还是你的朋友,用它们来找到与你遭遇到困难的软硬件问题最相关的网站。通常那儿都有常见问题(FAQ)、邮件列表及相关说明文件的链接。如果你的努力(包括**阅读** FAQ)都没有结果,网站上也许还有报告 Bug(Bug-reporting)的流程或链接,如果是这样,链过去看看。 - -### 使用有意义且描述明确的标题 - -在邮件列表、新闻群组或论坛中,大约 50 字以内的标题是抓住资深专家注意力的好机会。别用喋喋不休的帮帮忙、跪求、急(更别说救命啊!!!!这样让人反感的话,用这种标题会被条件反射式地忽略)来浪费这个机会。不要妄想用你的痛苦程度来打动我们,而应该是在这点空间中使用极简单扼要的描述方式来提出问题。 - -一个好标题范例是`目标 —— 差异`式的描述,许多技术支持组织就是这样做的。在`目标`部分指出是哪一个或哪一组东西有问题,在`差异`部分则描述与期望的行为不一致的地方。 - -> 蠢问题:救命啊!我的笔记本电脑不能正常显示了! - -> 聪明问题:X.org 6.8.1 的鼠标指针会变形,某牌显卡 MV1005 芯片组。 - -> 更聪明问题:X.org 6.8.1 的鼠标指针,在某牌显卡 MV1005 芯片组环境下 - 会变形。 - -### 使用清晰、正确、精准且合乎语法的语句 - -我们从经验中发现,粗心的提问者通常也会粗心地写程序与思考(我敢打包票)。回答粗心大意者的问题很不值得,我们宁愿把时间耗在别处。 - -正确的拼写、标点符号和大小写是很重要的。一般来说,如果你觉得这样做很麻烦,不想在乎这些,那我们也觉得麻烦,不想在乎你的提问。花点额外的精力斟酌一下字句,用不着太僵硬与正式 —— 事实上,黑客文化很看重能准确地使用非正式、俚语和幽默的语句。但它**必须很**准确,而且有迹象表明你是在思考和关注问题。 - -### 精确地描述问题并言之有物 - -* 仔细、清楚地描述你的问题或 Bug 的症状。 -* 描述问题发生的环境(机器配置、操作系统、应用程序、以及相关的信息),提供经销商的发行版和版本号(如:`Fedora Core 4`、`Slackware 9.1`等)。 -* 描述在提问前你是怎样去研究和理解这个问题的。 -* 描述在提问前为确定问题而采取的诊断步骤。 -* 描述最近做过什么可能相关的硬件或软件变更。 -* 尽可能地提供一个可以`重现这个问题的可控环境`的方法。 - -尽量去揣测一个黑客会怎样反问你,在你提问之前预先将黑客们可能提出的问题回答一遍。 - -以上几点中,当你报告的是你认为可能在代码中的问题时,给黑客一个可以重现你的问题的环境尤其重要。当你这么做时,你得到有效的回答的机会和速度都会大大的提升。 - -[Simon Tatham](http://www.chiark.greenend.org.uk/~sgtatham/) 写过一篇名为《[如何有效的报告 Bug](http://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html)》的出色文章。强力推荐你也读一读。 - -### 话不在多而在精 - -你需要提供精确有内容的信息。这并不是要求你简单的把成堆的出错代码或者资料完全转录到你的提问中。如果你有庞大而复杂的测试样例能重现程序挂掉的情境,尽量将它剪裁得越小越好。 - -这样做的用处至少有三点。 -第一,表现出你为简化问题付出了努力,这可以使你得到回答的机会增加; -第二,简化问题使你更有可能得到**有用**的答案; -第三,在精炼你的 bug 报告的过程中,你很可能就自己找到了解决方法或权宜之计。 - -### 别动辄声称找到 Bug - -当你在使用软件中遇到问题,除非你非常、**非常**的有根据,不要动辄声称找到了 Bug。提示:除非你能提供解决问题的源代码补丁,或者提供回归测试来表明前一版本中行为不正确,否则你都多半不够完全确信。这同样适用在网页和文件,如果你(声称)发现了文件的`Bug`,你应该能提供相应位置的修正或替代文件。 - -请记得,还有其他许多用户没遇到你发现的问题,否则你在阅读文件或搜索网页时就应该发现了(你在抱怨前[已经做了这些,是吧](#在提问之前)?)。这也意味着很有可能是你弄错了而不是软件本身有问题。 - -编写软件的人总是非常辛苦地使它尽可能完美。如果你声称找到了 Bug,也就是在质疑他们的能力,即使你是对的,也有可能会冒犯到其中某部分人。当你在标题中嚷嚷着有`Bug`时,这尤其严重。 - -提问时,即使你私下非常确信已经发现一个真正的 Bug,最好写得像是**你**做错了什么。如果真的有 Bug,你会在回复中看到这点。这样做的话,如果真有 Bug,维护者就会向你道歉,这总比你惹恼别人然后欠别人一个道歉要好一点。 - -### 低声下气不能代替你的功课 - -有些人明白他们不该粗鲁或傲慢的提问并要求得到答复,但他们选择另一个极端 —— 低声下气:`我知道我只是个可悲的新手,一个撸瑟,但...`。这既使人困扰,也没有用,尤其是伴随着与实际问题含糊不清的描述时更令人反感。 - -别用原始灵长类动物的把戏来浪费你我的时间。取而代之的是,尽可能清楚地描述背景条件和你的问题情况。这比低声下气更好地定位了你的位置。 - -有时网页论坛会设有专为新手提问的版面,如果你真的认为遇到了初学者的问题,到那去就是了,但一样别那么低声下气。 - -### 描述问题症状而非你的猜测 - -告诉黑客们你认为问题是怎样造成的并没什么帮助。(如果你的推断如此有效,还用向别人求助吗?),因此要确信你原原本本告诉了他们问题的症状,而不是你的解释和理论;让黑客们来推测和诊断。如果你认为陈述自己的猜测很重要,清楚地说明这只是你的猜测,并描述为什么它们不起作用。 - -**蠢问题** - -> 我在编译内核时接连遇到 SIG11 错误, -> 我怀疑某条飞线搭在主板的走线上了,这种情况应该怎样检查最好? - -**聪明问题** - -> 我的组装电脑是 FIC-PA2007 主机板搭载 AMD K6/233 CPU(威盛 Apollo VP2 芯片组), -> 256MB Corsair PC133 SDRAM 内存,在编译内核时,从开机 20 分钟以后就频频产生 SIG11 错误, -> 但是在头 20 分钟内从没发生过相同的问题。重新启动也没有用,但是关机一晚上就又能工作 20 分钟。 -> 所有内存都换过了,没有效果。相关部分的标准编译记录如下… - -由于以上这点似乎让许多人觉得难以配合,这里有句话可以提醒你:`所有的诊断专家都来自密苏里州。` 美国国务院的官方座右铭则是:`让我看看`(出自国会议员 Willard D. Vandiver 在 1899 年时的讲话:`我来自一个出产玉米,棉花,牛蒡和民主党人的国家,滔滔雄辩既不能说服我,也不会让我满意。我来自密苏里州,你必须让我看看。`) 针对诊断者而言,这并不是一种怀疑,而只是一种真实而有用的需求,以便让他们看到的是与你看到的原始证据尽可能一致的东西,而不是你的猜测与归纳的结论。所以,大方的展示给我们看吧! - -### 按发生时间先后列出问题症状 - -问题发生前的一系列操作,往往就是对找出问题最有帮助的线索。因此,你的说明里应该包含你的操作步骤,以及机器和软件的反应,直到问题发生。在命令行处理的情况下,提供一段操作记录(例如运行脚本工具所生成的),并引用相关的若干行(如 20 行)记录会非常有帮助。 - -如果挂掉的程序有诊断选项(如 -v 的详述开关),试着选择这些能在记录中增加调试信息的选项。记住,`多`不等于`好`。试着选取适当的调试级别以便提供有用的信息而不是让读者淹没在垃圾中。 - -如果你的说明很长(如超过四个段落),在开头简述问题,接下来再按时间顺序详述会有所帮助。这样黑客们在读你的记录时就知道该注意哪些内容了。 - -### 描述目标而不是过程 - -如果你想弄清楚如何做某事(而不是报告一个 Bug),在开头就描述你的目标,然后才陈述重现你所卡住的特定步骤。 - -经常寻求技术帮助的人在心中有个更高层次的目标,而他们在自以为能达到目标的特定道路上被卡住了,然后跑来问该怎么走,但没有意识到这条路本身就有问题。结果要费很大的劲才能搞定。 - -**蠢问题** - -> 我怎样才能从某绘图程序的颜色选择器中取得十六进制的 RGB 值? - -**聪明问题** - -> 我正试着用替换一幅图片的色码(color table)成自己选定的色码,我现在知道的唯一方法是编辑每个色码区块(table slot), -> 但却无法从某绘图程序的颜色选择器取得十六进制的 RGB 值。 - -第二种提问法比较聪明,你可能得到像是```建议采用另一个更合适的工具```的回复。 - -### 清楚明确的表达你的问题以及需求 - -漫无边际的提问是近乎无休无止的时间黑洞。最有可能给你有用答案的人通常也正是最忙的人(他们忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞相当厌恶,所以他们也倾向于厌恶那些漫无边际的提问。 - -如果你明确表述需要回答者做什么(如提供指点、发送一段代码、检查你的补丁、或是其他等等),就最有可能得到有用的答案。因为这会定出一个时间和精力的上限,便于回答者能集中精力来帮你。这么做很棒。 - -要理解专家们所处的世界,请把专业技能想像为充裕的资源,而回复的时间则是稀缺的资源。你要求他们奉献的时间越少,你越有可能从真正专业而且很忙的专家那里得到解答。 - -所以,界定一下你的问题,使专家花在辨识你的问题和回答所需要付出的时间减到最少,这技巧对你有用答案相当有帮助 —— 但这技巧通常和简化问题有所区别。因此,问`我想更好地理解 X,可否指点一下哪有好一点说明?`通常比问`你能解释一下 X 吗?`更好。如果你的代码不能运作,通常请别人看看哪里有问题,比要求别人替你改正要明智得多。 - -### 礼多人不怪,而且有时还很有帮助 - -彬彬有礼,多用`请`和`谢谢您的关注`,或`谢谢你的关照`。让大家都知道你对他们花时间免费提供帮助心存感激。 - -坦白说,这一点并没有比使用清晰、正确、精准且合乎语法和避免使用专用格式重要(也不能取而代之)。黑客们一般宁可读有点唐突但技术上鲜明的 Bug 报告,而不是那种有礼但含糊的报告。(如果这点让你不解,记住我们是按问题能教给我们什么来评价问题的价值的) - -然而,如果你有一串的问题待解决,客气一点肯定会增加你得到有用回应的机会。 - -(我们注意到,自从本指南发布后,从资深黑客那里得到的唯一严重缺陷反馈,就是对预先道谢这一条。一些黑客觉得`先谢了`意味着事后就不用再感谢任何人的暗示。我们的建议是要么先说`先谢了`,**然后**事后再对回复者表示感谢,或者换种方式表达感激,譬如用`谢谢你的关注`或`谢谢你的关照`。) - -## 不该问的问题 - -以下是几个经典蠢问题,以及黑客没回答时心中所想的: - -问题:[我能在哪找到 X 程序或 X 资源?](#q1) - -问题:[我怎样用 X 做 Y?](#q2) - -问题:[我的程序/设定/SQL 语句没有用](#q3) - -问题:[我的 Windows 电脑有问题,你能帮我吗?](#q4) - -问题:[我的程序不会动了,我认为系统工具 X 有问题](#q5) - -问题:[我在安装 Linux(或者 X )时有问题,你能帮我吗?](#q6) - -问题:[我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢?](#q7) - ---- - -> 问题:我能在哪找到 X 程序或 X 资源? - -回答:就在我找到它的地方啊,白痴 —— 搜索引擎的那一头。天哪!难道还有人不会用 [Google](https://www.google.com) 吗? - -> 问题:我怎样用 X 做 Y? - -回答:如果你想解决的是 Y ,提问时别给出可能并不恰当的方法。这种问题说明提问者不但对 X 完全无知,也对 Y 要解决的问题糊涂,还被特定形势禁锢了思维。最好忽略这种人,等他们把问题搞清楚了再说。 - -> 问题:我的{程序/设定/SQL 语句}没有用 - -回答:这不算是问题吧,我对要我问你二十个问题才找得出你真正问题的问题没兴趣 —— 我有更有意思的事要做呢。在看到这类问题的时候,我的反应通常不外如下三种 - -* 你还有什么要补充的吗? -* 真糟糕,希望你能搞定。 -* 这关我屁事? - -> 问题:我的 Windows 电脑有问题,你能帮我吗? - -回答:能啊,扔掉微软的垃圾,换个像 Linux 或 BSD 的开源操作系统吧。 - -注意:如果程序有官方版 Windows 或者与 Windows 有互动(如 Samba),你**可以**问与 Windows 相关的问题,只是别对问题是由 Windows 操作系统而不是程序本身造成的回复感到惊讶, 因为 Windows 一般来说实在太烂,这种说法通常都是对的。 - -> 问题:我的程序不会动了,我认为系统工具 X 有问题 - -回答:你完全有可能是第一个注意到被成千上万用户反复使用的系统调用与函数库文件有明显缺陷的人,更有可能的是你完全没有根据。不同凡响的说法需要不同凡响的证据,当你这样声称时,你必须有清楚而详尽的缺陷说明文件作后盾。 - -> 问题:我在安装 Linux(或者 X )时有问题,你能帮我吗? - -回答:不能,我只有亲自在你的电脑上动手才能找到毛病。还是去找你当地的 Linux 使用群组者寻求实际的指导吧(你能在[这儿](http://www.linux.org/groups/index.html)找到用户群组的清单)。 - -注意:如果安装问题与某 Linux 的发行版有关,在它的邮件列表、论坛或本地用户群组中提问也许是恰当的。此时,应描述问题的准确细节。在此之前,先用 `Linux` 和**所有**被怀疑的硬件作关键词仔细搜索。 - -> 问题:我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢? - -回答:想要这样做,说明了你是个卑鄙小人;想找个黑客帮你,说明你是个白痴! - -## 好问题与蠢问题 - -最后,我将透过举一些例子,来说明怎样聪明的提问;同一个问题的两种问法被放在一起,一种是愚蠢的,另一种才是明智的。 - -**蠢问题**: - -> 我从 foo 项目找来的源码没法编译。它怎么这么烂? - -他觉得都是别人的错,这个傲慢自大的提问者。 - -**聪明问题**: - -> foo 项目代码在 Nulix 6.2 版下无法编译通过。我读过了 FAQ,但里面没有提到跟 Nulix 有关的问题。这是我编译过程的记录,我有什么做的不对的地方吗? - -提问者已经指明了环境,也读过了 FAQ,还列出了错误,并且他没有把问题的责任推到别人头上,他的问题值得被关注。 - -**蠢问题**: - -> 我的主机板有问题了,谁来帮我? - -某黑客对这类问题的回答通常是:`好的,还要帮你拍拍背和换尿布吗?`,然后按下删除键。 - -**聪明问题**: - -> 我在 S2464 主机板上试过了 X 、 Y 和 Z ,但没什么作用,我又试了 A 、 B 和 C 。请注意当我尝试 C 时的奇怪现象。显然 florbish 正在 grommicking,但结果出人意料。通常在 Athlon MP 主机板上引起 grommicking 的原因是什么?有谁知道接下来我该做些什么测试才能找出问题? - -## 如果得不到回答 - -如果仍得不到回答,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。 - -总的来说,简单的重复张贴问题是个很糟的点子。这将被视为无意义的喧闹。有点耐心,知道你问题答案的人可能生活在不同的时区,可能正在睡觉,也有可能你的问题一开始就没有组织好。 - -你可以通过其他渠道获得帮助,这些渠道通常更适合初学者的需要。 diff --git a/docs/versioned_docs/version-1.4.3/user_docs/user_guide/_category_.json b/docs/versioned_docs/version-1.4.3/user_docs/user_guide/_category_.json deleted file mode 100644 index 9c505a51..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/user_guide/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "用户指南", - "position": 2, - "link": { - "type": "generated-index", - "description": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。" - } -} diff --git a/docs/versioned_docs/version-1.4.3/user_docs/user_guide/frame.md b/docs/versioned_docs/version-1.4.3/user_docs/user_guide/frame.md deleted file mode 100644 index 5992f735..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/user_guide/frame.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 为什么写 - -[美团线程池文章](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html "美团线程池文章") 介绍中,因为业务对线程池参数没有合理配置,触发过几起生产事故,进而引发了一系列思考。最终决定封装线程池动态参数调整,扩展线程池监控以及消息报警等功能。 - -在开源平台找了挺多动态线程池项目,从功能性以及健壮性而言,个人感觉不满足企业级应用。 - -因为对动态线程池比较感兴趣,加上想写一个有意义的项目,所以决定自己来造一个轻量级的轮子。 - -想给项目起一个简单易记的名字,类似于 Eureka、Nacos、Redis;后和朋友商量,决定命名:**Hippo4j**。 - -![](https://oss.open8gu.com/动态线程池功能架构-1.jpg) - -## 它解决了什么问题 - -线程池在业务系统应该都有使用到,帮助业务流程提升效率以及管理线程,多数场景应用于大量的异步任务处理。 - -虽然线程池提供了我们许多便利,但也并非尽善尽美,比如下面这些问题就无法很好解决。 - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 - -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 - -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 - -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 - -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 - -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 - -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -Hippo4j 很好解决了这些问题,它将业务中所有线程池统一管理,增强原生线程池系列功能。 - -## 它有什么特性 - -应用系统中线程池并不容易管理。参考美团的设计,Hippo4j 按照租户、项目、线程池的维度划分。再加上系统权限,让不同的开发、管理人员负责自己系统的线程池操作。 - -举个例子,小编在一家公司的公共组件团队,团队中负责消息、短链接网关等项目。公共组件是租户,消息或短链接就是项目。 - -Hippo4j 除去动态修改线程池,还包含实时查看线程池运行时指标、负载报警、配置日志管理等。 - -- `hippo4j-adapter`:适配对第三方框架中的线程池进行监控,如 Dubbo、RocketMQ、Hystrix 等; -- `hippo4j-auth`:用户、角色、权限等; -- `hippo4j-common`:多个模块公用代码实现; -- `hippo4j-config`:提供线程池准实时参数更新功能; -- `hippo4j-console`:对接前端控制台; -- `hippo4j-core`:核心的依赖,包括配置、核心包装类等; -- `hippo4j-discovery`:提供线程池项目实例注册、续约、下线等功能; -- `hippo4j-example` :示例工程; -- `hippo4j-message` :配置变更以及报警通知发送; -- `hippo4j-monitor` :线程池运行时监控; -- `hippo4j-server` :Server 端发布需要的模块聚合; -- `hippo4j-spring-boot`:SpringBoot Starter。 diff --git a/docs/versioned_docs/version-1.4.3/user_docs/user_guide/framework.md b/docs/versioned_docs/version-1.4.3/user_docs/user_guide/framework.md deleted file mode 100644 index 33e24d1c..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/user_guide/framework.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 架构设计 - -简单来说,Hippo4j 从部署的角度上分为两种角色:Server 端和 Client 端。 - -Server 端是 Hippo4j 项目打包出的 Java 进程,功能包括用户权限、线程池监控以及执行持久化的动作。 - -Client 端指的是我们 SpringBoot 应用,通过引入 Hippo4j Starter Jar 包负责与 Server 端进行交互。 - -比如拉取 Server 端线程池数据、动态更新线程池配置以及采集上报线程池运行时数据等。 - -## 基础组件 - -### 配置中心(Config) - -配置中心位于 Server 端,它的主要作用是监控 Server 端线程池配置变更,实时通知到 Client 实例执行线程池变更流程。 - -代码设计基于 Nacos 1.x 版本的 **长轮询以及异步 Servlet 机制** 实现。 - -### 注册中心(Discovery) - -负责管理 Client 端(单机或集群)注册到 Server 端的实例,包括不限于**实例注册、续约、过期剔除** 等操作,代码基于 Eureka 源码实现。 - -上面的配置中心很容易理解,动态线程池参数变更的根本。但是注册中心是用来做什么的? - -注册中心管理 Client 端注册的实例,通过这些实例可以 **实时获取线程池的运行时参数信息**。 - -目前的设计是如此,不排除后续基于 Discovery 做更多的扩展。 - -### 控制台(Console) - -对接前端项目,包括不限于以下模块管理: - -![](https://oss.open8gu.com/image-20211107122504126.png) - -## 消息通知(Notify) - -Hippo4j 内置了很多需要通知的事件,比如:线程池参数变更通知、线程池活跃度报警、拒绝策略执行报警以及阻塞队列容量报警等。 - -目前 Notify 已经接入了钉钉、企业微信和飞书,后续持续集成邮件、短信等通知渠道;并且,Notify 模块提供了消息事件的 SPI 方案,可以接受三方自定义的推送。 - -## Hippo4j-Spring-Boot-Starter - -熟悉 SpringBoot 的小伙伴对 Starter 应该不会陌生。Hippo4j 提供以 Starter Jar 包的形式嵌套在应用内,负责与 Server 端完成交互。 - -## 功能架构 - -![](https://oss.open8gu.com/image-20211105230953626.png) diff --git a/docs/versioned_docs/version-1.4.3/user_docs/user_guide/notify.md b/docs/versioned_docs/version-1.4.3/user_docs/user_guide/notify.md deleted file mode 100644 index 3373f244..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/user_guide/notify.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 通知报警 - -现阶段已集成钉钉、企业微信、飞书的消息推送,后续会持续接入邮箱、短信和自定义通知渠道。 - -![](https://oss.open8gu.com/image-20220904181527453.png) - -**通知平台** - -- DING:钉钉平台; - -- LARK:飞书平台; - -- WECHAT:企业微信。 - -**通知类型** - -- CONFIG:线程池配置变更推送; - -- ALARM:线程池运行报警推送。 - -**Token** - -获取 DING、LARK、WECHAT 机器人 Token。 - -**报警间隔** - -- CONFIG 类型通知没有报警间隔; - -- ALARM 类型设置报警间隔后,某一节点下的同一线程池指定间隔只会发送一次报警通知。 - -**接收者** - -```tex -多个接收者使用英文逗号 , 分割 (注意不要有空格) -DING:填写手机号 -WECHART:填写user_id会以@的消息发给用户,填写姓名则是普通的@,如:龙台 -LARK:填写ou_开头用户唯一标识会以@的消息发给用户,填写手机号则是普通的@ -``` - -## 钉钉平台 - -[钉钉创建群机器人](https://www.dingtalk.com/qidian/help-detail-20781541.html) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211013122816688.png) | ![](https://oss.open8gu.com/image-20211013113649068.png) | - -添加钉钉机器人后,需在机器人配置自定义关键字,才可发送成功。如下所示: - -![](https://oss.open8gu.com/image-20220530200133377.png?x-oss-process=image/resize,h_500,w_800) - -:::tip -如果使用 1.4.3 及以上版本,`警报` 替换为 `告警`。 -::: - -## 企业微信 - -[企业微信创建群机器人](https://open.work.weixin.qq.com/help2/pc/14931?person_id=1&from=homesearch) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211203213443242.png) | ![](https://oss.open8gu.com/image-20211203213512019.png) | - -## 飞书平台 - -[飞书创建群机器人](https://www.feishu.cn/hc/zh-CN/articles/360024984973) - -![](https://oss.open8gu.com/image-20220304081729347.png) - -![](https://oss.open8gu.com/image-20220304081507907.png) diff --git a/docs/versioned_docs/version-1.4.3/user_docs/user_guide/quick-start.md b/docs/versioned_docs/version-1.4.3/user_docs/user_guide/quick-start.md deleted file mode 100644 index 59c5cdd5..00000000 --- a/docs/versioned_docs/version-1.4.3/user_docs/user_guide/quick-start.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 快速开始 - -## 服务启动 - -使用 Docker 运行服务端,默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -> 如果没有 Docker,可以使用源码编译的方式,启动 [Hippo4j-Server/Hippo4j-Bootstrap](https://github.com/longtai-cn/hippo4j/tree/develop/hippo4j-server/hippo4j-bootstrap) 模块下 ServerApplication 应用类。 - -启动示例项目,[hippo4j-spring-boot-starter-example](https://github.com/opengoofy/hippo4j/tree/develop/hippo4j-example/hippo4j-spring-boot-starter-example) 模块下 ServerExampleApplication 应用类。 - -访问 Server 控制台,路径 `http://localhost:6691/index.html`,默认用户名密码:admin / 123456 - -## 配置变更 - -访问控制台动态线程池菜单下线程池实例,修改动态线程池相关参数。 - -![](https://oss.open8gu.com/image-20220813173811668.png) - -观察 Hippo4j-Example 控制台日志输出,日志输出包括不限于此信息即为成功。 - -```tex -2022-09-10 00:23:29.783 INFO 50322 --- [change.config_0] c.h.s.s.c.ServerThreadPoolDynamicRefresh : [message-consume] Dynamic thread pool change parameter. - corePoolSize: 2 => 4 - maximumPoolSize: 6 => 12 - capacity: 1024 => 2048 - keepAliveTime: 9999 => 9999 - executeTimeOut: 800 => 3000 - rejectedType: SyncPutQueuePolicy => RunsOldestTaskPolicy - allowCoreThreadTimeOut: true => true -``` - -另外,当 Client 集群部署时,可以修改某一个实例,或选择 `全部修改` 按钮,修改所有实例线程池信息。 diff --git a/docs/versioned_docs/version-1.5.0/user_docs/dev_manual/_category_.json b/docs/versioned_docs/version-1.5.0/user_docs/dev_manual/_category_.json deleted file mode 100644 index 9117307f..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/dev_manual/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "开发者手册", - "position": 5, - "link": { - "type": "generated-index", - "description": "Hippo4j 留给使用者能够扩展的知识点。" - } -} diff --git a/docs/versioned_docs/version-1.5.0/user_docs/dev_manual/rejected-policy-custom.md b/docs/versioned_docs/version-1.5.0/user_docs/dev_manual/rejected-policy-custom.md deleted file mode 100644 index e0405061..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/dev_manual/rejected-policy-custom.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 拒绝策略自定义 - -Hippo4j 通过 SPI 的方式对拒绝策略进行扩展,可以让用户在 Hippo4j 中完成自定义拒绝策略实现。 - -## Hippo4j Server 拒绝策略扩展 - -自定义拒绝策略,实现 `CustomRejectedExecutionHandler` 接口,示例如下: - -```java -public class ErrorLogRejectedExecutionHandler implements CustomRejectedExecutionHandler { - - @Override - public Integer getType() { - return 12; - } - - @Override - public RejectedExecutionHandler generateRejected() { - return new CustomErrorLogRejectedExecutionHandler(); - } - - public static class CustomErrorLogRejectedExecutionHandler implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - Logger logger = LoggerFactory.getLogger(this.getClass()); - logger.error("线程池抛出拒绝策略"); - } - } -} -``` - -创建 `src/main/resources/META-INF/services` 目录,创建 SPI 自定义拒绝策略文件 `cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler`。 - -`cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler` 文件内仅放一行自定义拒绝策略全限定名即可,示例: - -```text -cn.hippo4j.example.core.handler.ErrorLogRejectedExecutionHandler -``` - -创建、修改线程池页面选择 `CustomRejectedPolicy(自定义 SPI 策略)`。 - -![](https://oss.open8gu.com/image-20220813173907814.png) - -拒绝策略触发时,完成上述代码效果,仅打印异常日志提示。 - -```text -2022-08-01 21:27:49.515 ERROR 48928 --- [ateHandler.test] r$CustomErrorLogRejectedExecutionHandler : 线程池抛出拒绝策略 -``` - -:::note -具体参考 `hippo4j-example/hippo4j-spring-boot-starter-example` 模块。 -::: diff --git a/docs/versioned_docs/version-1.5.0/user_docs/dev_manual/rejected-policy-info.md b/docs/versioned_docs/version-1.5.0/user_docs/dev_manual/rejected-policy-info.md deleted file mode 100644 index d5c68138..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/dev_manual/rejected-policy-info.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 内置拒绝策略 - -内置两种拒绝策略说明: - -**RunsOldestTaskPolicy**:添加新任务并由主线程运行最早的任务。 - -```java -public class RunsOldestTaskPolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - BlockingQueue workQueue = executor.getQueue(); - Runnable firstWork = workQueue.poll(); - boolean newTaskAdd = workQueue.offer(r); - if (firstWork != null) { - firstWork.run(); - } - if (!newTaskAdd) { - executor.execute(r); - } - } -} -``` - -**SyncPutQueuePolicy**:主线程把拒绝任务以阻塞的方式添加到队列。 - -```java -@Slf4j -public class SyncPutQueuePolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - try { - executor.getQueue().put(r); - } catch (InterruptedException e) { - log.error("Adding Queue task to thread pool failed.", e); - } - } -} -``` \ No newline at end of file diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/_category_.json b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/_category_.json deleted file mode 100644 index 72b1e151..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "快速开始", - "position": 3, - "link": { - "type": "generated-index" - } -} diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/_category_.json b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/_category_.json deleted file mode 100644 index 78b3d9c4..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "依赖配置中心", - "position": 2, - "collapsed": true -} diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-default.md b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-default.md deleted file mode 100644 index 9c9e0fc9..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-default.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 参数默认配置 - -曾有多名小伙伴反馈说,项目中线程池一多,配置文件中配置就显得很臃肿。为此 hippo4j-config 开发出了动态线程池默认配置。 - -```yaml -spring: - dynamic: - thread-pool: - default-executor: - core-pool-size: 4 - maximum-pool-size: 6 - blocking-queue: ResizableCapacityLinkedBlockingQueue - queue-capacity: 1024 - execute-time-out: 1000 - keep-alive-time: 9999 - rejected-handler: AbortPolicy - active-alarm: 90 - capacity-alarm: 85 - alarm: true - allow-core-thread-time-out: true - notify: - interval: 5 - receives: chen.ma - executors: - - thread-pool-id: message-produce - - thread-pool-id: message-consume - core-pool-size: 80 - maximum-pool-size: 100 - execute-time-out: 1000 - notify: - interval: 6 - receives: chen.ma -``` - -`spring.dynamic.thread-pool.executors` 层级下,仅需要配置 `thread-pool-id`,其余配置从 `spring.dynamic.thread-pool.default-executor` 读取。 - -如果 `spring.dynamic.thread-pool.executors` 下配置和 `spring.dynamic.thread-pool.default-executor` 冲突,以前者为主。 - -通过该自定义配置方式,可减少大量重复线程池参数配置项,提高核心配置简洁度。 - -提示:`spring.dynamic.thread-pool.default-executor` 层级下参数,不提供动态刷新功能。 diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-monitor.md b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-monitor.md deleted file mode 100644 index 17d665e6..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-monitor.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 线程池监控 - -## 线程池监控配置 - -监控前置条件:需要先完成 hippo4j-config 的 [接入工作](/docs/user_docs/getting_started/config/hippo4j-config-start)。 - -接下来引入 SpringBoot Actuator。Spring 2.x 一般都有版本指定,所以这里不用写版本号。 - -```xml - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - -``` - -添加动态线程池监控相关配置: - -```yaml -management: - metrics: - export: - prometheus: - enabled: true - server: - port: 29999 # 可选配置,如果不配置该 port,直接使用 ${server.port} - endpoints: - web: - exposure: - include: '*' # 测试使用,开启了所有端点,生产环境不建议 * -spring: - dynamic: - thread-pool: - monitor: - enable: true # 是否开启采集线程池运行时数据 - collect-interval: 5000 # 采集线程池运行数据频率 - collect-types: micrometer # 采集线程池运行数据的类型。eg:log、micrometer。多个可以同时使用,默认 micrometer - initial-delay: 10000 # 项目启动后延迟多久进行采集 - thread-pool-types: dynamic # 采集线程池的类型。eg:dynamic、web、adapter。可任意配置,默认 dynamic -``` - -项目启动,访问 `http://localhost:29999/actuator/prometheus` 出现 `dynamic_thread_pool_` 前缀的指标,即为成功。 - -![](https://oss.open8gu.com/image-20220912220401016.png) - -## 配置 Prometheus - -通过 Docker 启动 Prometheus 服务。 - -```shell -docker run -d -p 9090:9090 --name prometheus prom/prometheus -``` - -添加 Prometheus 抽取数据任务。 - -```shell -# 进入 prometheus 容器内部 -docker exec -it prometheus /bin/sh -# 编辑 prometheus 配置文件 -vi /etc/prometheus/prometheus.yml -``` - -scrape_configs 节点下新添加一个 job,如果 Prometheus 是 Docker 方式部署,`{scrape_configs.static_configs.targets}` 需要写本机的 IP。 - -```yaml -scrape_configs: - - job_name: 'dynamic-thread-pool-job' - scrape_interval: 5s - metrics_path: '/actuator/prometheus' - static_configs: - - targets: [ '127.0.0.1:29999' ] -``` - -配置成功后 `exit` 退出容器,并进行 Prometheus 容器重启 `docker restart prometheus`。 - -访问 Prometheus 控制台 `http://localhost:9090/graph` 路径,能够展示相关指标即为配置成功。 - -![](https://oss.open8gu.com/image-20220912221237597.png) - -## 配置 Grafana - -```shell -docker run -d -p 3000:3000 --name=grafana grafana/grafana -``` - -访问 Grafana 地址,[http://localhost:3000](http://localhost:3000) 用户名密码:`admin` - -Grafana 访问 `http://localhost:3000/datasources` 导入 Prometheus 数据源。 - -![](https://oss.open8gu.com/image-20220912221646866.png) - -> 如果 Prometheus 为 Docker 方式部署,HTTP URL 需要为本地 IP,比如:http://192.168.1.5:9090 - -关注公众号 `龙台的技术笔记`,回复:`监控`,获取 Hippo4j Grafana DashBoard JSON 配置。 - -| 公众号 | 回复关键词 | -|:------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------:| -| ![](https://oss.open8gu.com/43_65f6020ed111b6bb3808ec338576bd6b.png?x-oss-process=image/resize,h_300,w_400) | ![](https://oss.open8gu.com/image-20220327171957444.png?x-oss-process=image/resize,h_300,w_400) | - -获取到 JSON 文件后,通过 `http://localhost:3000/dashboard/import` 将 JSON 文件导入至 Grafana DashBoard。 - -![](https://oss.open8gu.com/image-20220912225627272.png) - -下拉框内动态选择创建好的 Prometheus 数据源,并点击 `Import`。 - -![](https://oss.open8gu.com/image-20220912225700200.png) - -即可使用炫酷的 Hippo4j 动态线程池监控 DashBoard。大家伙儿也可以根据个人喜好进行定制 DashBoard,如果觉得有优化点,欢迎和我联系贡献。 - -![](https://oss.open8gu.com/image-20220912225813972.png) - -如果项目客户端启动多个示例,动态线程池监控效果图如下: - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-more.md b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-more.md deleted file mode 100644 index 2511b4f3..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-more.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 个性化配置 - -以下所述特性自 hippo4j-config v1.4.2 及以上版本提供,由 hippo4j 核心开发者 [@pizihao](https://github.com/pizihao) 完成相应功能开发。 - -## 需求背景 - -**1)容器及三方框架线程池自定义启用** - -最初设计容器线程池和三方框架线程池的动态变更是和启动无关的。也就是说,启动时不会根据配置文件中相关参数去修改两者对应的线程池配置。 - -这么设计的初衷是因为,不想让 hippo4j 过多的去介入框架原有的功能。因为容器和三方框架都支持线程池参数的自定义。 - -也就造成,可能你在配置中心配置了对应的容器和三方框架线程池参数,启动时是无效的。但当修改配置文件任一配置,容器和三方框架线程池配置将生效。 - -为了更好的用户体验,决定加入启用标识来控制:是否在项目初始化启动时,对容器和三方框架线程池参数进行修改。 - -**2)客户端集群个性化配置** - -大家都知道,hippo4j-config 是依赖配置中心做线程池配置动态变更。这种模式有一种缺点:改动配置文件后,所有客户端都会变更。 - -有些小伙伴希望 hippo4j-config 能够像 hippo4j-server 一样,能够针对单独的客户端进行配置变更。 - -## 容器及三方框架线程池自定义启用 - -容器及三方框架线程池添加启用配置,为了保持统一,动态线程池配置中也有该参数配置。配置项默认开启。 - -```yaml -spring: - dynamic: - thread-pool: - tomcat: - enable: true - executors: - - thread-pool-id: message-consume - enable: false - adapter-executors: - - threadPoolKey: 'input' - enable: true -``` - -## 客户端集群个性化配置 - -分别在动态线程池、容器线程池以及三方框架线程池配置下增加 `nodes` 配置节点,通过该配置可匹配需要变更的节点。 - -```yaml -spring: - dynamic: - thread-pool: - tomcat: - nodes: 192.168.1.5:*,192.168.1.6:8080 - executors: - - thread-pool-id: message-consume - nodes: 192.168.1.5:* - adapter-executors: - - threadPoolKey: 'input' - nodes: 192.168.1.5:* -``` - -来一段代码方法中的注释,大家就基本明白如何使用了。 - -```java -/** - * Matching nodes
- * nodes is ip + port.Get 'nodes' in the new Properties,Compare this with the ip + port of Application.
- * support prefix pattern matching. e.g:
- *
    - *
  • 192.168.1.5:* -- Matches all ports of 192.168.1.5
  • - *
  • 192.168.1.*:2009 -- Matches 2009 port of 192.168.1.*
  • - *
  • * -- all
  • - *
  • empty -- all
  • - *
- * The format of ip + port is ip : port. - */ -``` - -`nodes` 可与 `enable` 同时使用。如此,基于配置中心的动态线程池实现方式,将能够更方便的支持个性化需求。 diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md deleted file mode 100644 index a1885e0c..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-springboot1x-adapter.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 适配SpringBoot1x - -目前已支持 Nacos、Apollo 配置中心适配 SpringBoot 1.5.x 版本。 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-1x-starter - 1.5.0 - -``` - -Nacos SpringBoot 配置如下: - -```yaml -spring: - cloud: - nacos: - config: - ext-config: - - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP - refresh: true - server-addr: 127.0.0.1:8848 - dynamic: - thread-pool: - config-file-type: yml - nacos: - data-id: hippo4j-nacos.yaml - group: DEFAULT_GROUP -``` - -Apollo SpringBoot 配置如下: - -```yaml -apollo: - autoUpdateInjectedSpringProperties: true - bootstrap: - eagerLoad: - enabled: true - enabled: true - namespaces: application - meta: http://127.0.0.1:8080 -app: - id: dynamic-threadpool-example -spring: - dynamic: - thread-pool: - apollo: - namespace: application -``` - -动态线程池通用配置如下: - -```yaml -management: - context-path: /actuator - security: - enabled: false -server: - port: 8091 - servlet: - context-path: /example -spring: - application: - name: dynamic-threadpool-example - dynamic: - thread-pool: - banner: true - check-state-interval: 5 - collect-type: micrometer - config-file-type: properties - enable: true - executors: - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-consume - thread-pool-id: message-consume - - active-alarm: 80 - alarm: true - allow-core-thread-time-out: true - blocking-queue: LinkedBlockingQueue - capacity-alarm: 80 - core-pool-size: 1 - execute-time-out: 1000 - keep-alive-time: 6691 - maximum-pool-size: 1 - notify: - interval: 8 - receives: chen.ma - queue-capacity: 1 - rejected-handler: AbortPolicy - thread-name-prefix: message-produce - thread-pool-id: message-produce - notify-platforms: - - platform: WECHAT - token: ac0426a5-c712-474c-9bff-72b8b8f5caff - profiles: - active: dev -``` - -具体 Demo 运行请参考以下示例模块,已验证对应线程池动态变更、报警以及运行时监控功能。 - -- `/hippo4j-config-nacos-spring-boot-1x-starter-example` -- `hippo4j-example/hippo4j-config-apollo-spring-boot-1x-starter-example` diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-start.md b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-start.md deleted file mode 100644 index 6ead578b..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/config/hippo4j-config-start.md +++ /dev/null @@ -1,193 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 接入流程 - -Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 配置中心任选其一。 - -## hippo4j 配置 - -```xml - - cn.hippo4j - hippo4j-config-spring-boot-starter - 1.5.0 - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -server: - port: 8090 - servlet: - context-path: /example - -spring: - profiles: - active: dev - - dynamic: - thread-pool: - # 是否开启动态线程池 - enable: true - # 是否打印 banner - banner: true - # 是否开启线程池数据采集,对接 Micrometer、ES、Log 等 - collect: true - # 检查线程池状态,是否达到报警条件,单位毫秒 - check-state-interval: 3000 - # 通知报警平台,请替换为自己创建的群机器人 - notify-platforms: - - platform: 'WECHAT' - token: xxx - - platform: 'DING' - token: xxx - secret: xxx # 加签专属 - - platform: 'LARK' - token: xxx - # Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 任选其一 - nacos: - data-id: xxx - group: xxx - apollo: - namespace: xxxx - # 配置中心文件格式 - config-file-type: yml - # 支持 tomcat、undertow、jetty 三种容器线程池 - web: - core-pool-size: 100 - maximum-pool-size: 200 - keep-alive-time: 1000 - # 全局通知配置-是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位秒 - alarm-interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - # 动态线程池列表 - executors: - - thread-pool-id: 'message-consume' - # 核心线程数 - core-pool-size: 1 - # 最大线程数 - maximum-pool-size: 1 - # 阻塞队列名称,参考 BlockingQueueTypeEnum,支持 SPI - blocking-queue: 'LinkedBlockingQueue' - # 阻塞队列大小 - queue-capacity: 1 - # 执行超时时间,超过此时间发起报警,单位毫秒 - execute-time-out: 1000 - # 拒绝策略名称,参考 RejectedPolicyTypeEnum,支持 SPI - rejected-handler: 'AbortPolicy' - # 线程存活时间,单位秒 - keep-alive-time: 1024 - # 是否允许核心线程超时 - allow-core-thread-time-out: true - # 线程工厂名称前缀 - thread-name-prefix: 'message-consume' - # 是否报警 - alarm: true - # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警 - active-alarm: 80 - # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警 - capacity-alarm: 80 - # 通知配置,线程池中通知配置如果存在,则会覆盖全局通知配置 - notify: - # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位分钟 - interval: 8 - # 企业微信填写用户 ID(填写其它将无法达到 @ 效果)、钉钉填手机号、飞书填 ou_ 开头唯一 ID - receives: xxx - - thread-pool-id: 'message-produce' - core-pool-size: 1 - maximum-pool-size: 1 - queue-capacity: 1 - execute-time-out: 1000 - blocking-queue: 'LinkedBlockingQueue' - rejected-handler: 'AbortPolicy' - keep-alive-time: 1024 - allow-core-thread-time-out: true - thread-name-prefix: 'message-consume' - alarm: true - active-alarm: 80 - capacity-alarm: 80 - notify: - interval: 8 - receives: xxx -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从配置中心拉取。 - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/difference.md b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/difference.md deleted file mode 100644 index 549da02d..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/difference.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 0 ---- - -# 运行模式介绍 - -1.1.0 版本发布后,Hippo4j 分为两种使用模式:轻量级依赖配置中心以及无中间件依赖版本。 - -![](https://oss.open8gu.com/image-20220319154626314.png) - -### Hippo4j config - -**轻量级动态线程池管理**,依赖 Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 等三方配置中心(任选其一)完成线程池参数动态变更,支持运行时报警、监控等功能。 - -> 监控功能配置详见:[线程池监控](/docs/user_docs/getting_started/config/hippo4j-config-monitor) - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) - -### Hippo4j server - -**部署 Hippo4j server 服务**,通过可视化 Web 界面完成线程池的创建、变更以及查看,不依赖三方中间件。 - -相比较 Hippo4j config,功能会更强大,但同时也引入了一定的复杂性。需要部署一个 Java 服务,以及依赖 MySQL 数据库。 - -![](https://oss.open8gu.com/1644032018254-min.gif) - -### 使用总结 - -| | Hippo4j config | Hippo4j server | -| ---- |-------------------------------------------------------|--------------------------------------------------------| -| 依赖 | Nacos、Apollo、Zookeeper、ETCD、Polaris、Consul 配置中心(任选其一) | 部署 Hippo4j server(内部无依赖中间件) | -| 使用 | 配置中心补充线程池相关参数 | Hippo4j server web 控制台添加线程池记录 | -| 功能 | 包含基础功能:参数动态化、运行时监控、报警等 | 基础功能之外扩展控制台界面、线程池堆栈查看、线程池运行信息实时查看、历史运行信息查看、线程池配置集群个性化等 | - -使用建议:根据公司情况选择,如果基本功能可以满足使用,选择 Hippo4j config 使用即可;如果希望更多的功能,可以选择 Hippo4j server。 - -**两者在进行替换的时候,无需修改业务代码**。 diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/hippo4j-adapter.md b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/hippo4j-adapter.md deleted file mode 100644 index 68a48288..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/hippo4j-adapter.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 三方框架线程池适配 - -Hippo4j 目前已支持的三方框架线程池列表: - -- Dubbo -- Hystrix -- RabbitMQ -- RocketMQ -- AlibabaDubbo -- RocketMQSpringCloudStream -- RabbitMQSpringCloudStream - -引入 Hippo4j Server 或 Core 的 Maven Jar 坐标后,还需要引入对应的框架适配 Jar: - -```xml - - cn.hippo4j - - hippo4j-spring-boot-starter-adapter-dubbo - - hippo4j-spring-boot-starter-adapter-alibaba-dubbo - - hippo4j-spring-boot-starter-adapter-hystrix - - hippo4j-spring-boot-starter-adapter-rabbitmq - - hippo4j-spring-boot-starter-adapter-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq - - hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq - 1.5.0 - -``` - -如果想省事,仅需引入一个全量包,框架底层会根据条件判断加载具体线程池适配器。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-adapter-all - 1.5.0 - -``` - -## Hippo4j Server - -Hippo4j Server 仅需要引入上述 Jar 包,即可在 Hippo4j Server 的控制台进行查看及修改三方框架线程池。 - -![](https://oss.open8gu.com/image-20220531194810047.png) - -## Hippo4j Config - -Hippo4j Config 除了依赖上述适配 Jar 包外,还需要在配置中心添加以下配置项。 - -```yaml -spring: - dynamic: - thread-pool: - # 省略其它配置 - adapter-executors: - # threadPoolKey 代表线程池标识 - - threadPoolKey: 'input' - # mark 为三方线程池框架类型,参见文初已支持框架集合 - mark: 'RocketMQSpringCloudStream' - corePoolSize: 10 - maximumPoolSize: 10 -``` diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/img/docsVersionDropdown.png b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/img/docsVersionDropdown.png deleted file mode 100644 index 97e41646..00000000 Binary files a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/img/docsVersionDropdown.png and /dev/null differ diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/img/grafana-monitor.jpg b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/img/grafana-monitor.jpg deleted file mode 100644 index 336bd980..00000000 Binary files a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/img/grafana-monitor.jpg and /dev/null differ diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/img/localeDropdown.png b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/img/localeDropdown.png deleted file mode 100644 index e257edc1..00000000 Binary files a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/img/localeDropdown.png and /dev/null differ diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/server/_category_.json b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/server/_category_.json deleted file mode 100644 index 4063c17f..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/server/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "无中间件依赖", - "position": 3, - "collapsed": true -} diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-config.md b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-config.md deleted file mode 100644 index e1ef853f..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-config.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 服务端配置 - -`hippo4j.core.clean-history-data-enable` - -是否开启线程池历史数据清洗,默认开启。 - -`hippo4j.core.clean-history-data-period` - -线程池历史数据保留时间,默认值:30,单位分钟。 - -服务端会保留这个配置时间的数据,超过这个时间则会被清理。比如按照默认值 30 分钟来说,12:00 收集到的数据,12:30 就会被清理删除。 - -`hippo4j.core.monitor.report-type` - -客户端监控上报服务端类型,可选值:http、netty,默认 http。服务端开启 netty 配置后,需要在客户端对应开启才可生效。用来应对大量动态线程池监控场景。 diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-monitor.md b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-monitor.md deleted file mode 100644 index 08d89fa2..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-monitor.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 线程池监控 - -Server 模式默认内置线程池运行时采集和监控功能,如果想要使用 Prometheus + Grafana 的方式可以查看以下内容。 - -## 线程池监控配置 - -接下来引入 SpringBoot Actuator。Spring 2.x 一般都有版本指定,所以这里不用写版本号。 - -```xml - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - -``` - -添加动态线程池监控相关配置: - -```yaml -management: - metrics: - export: - prometheus: - enabled: true - server: - port: 29999 # 可选配置,如果不配置该 port,直接使用 ${server.port} - endpoints: - web: - exposure: - include: '*' # 测试使用,开启了所有端点,生产环境不建议 * -spring: - dynamic: - thread-pool: - monitor: - enable: true # 是否开启采集线程池运行时数据 - collect-interval: 5000 # 采集线程池运行数据频率 - collect-types: server,micrometer # 采集线程池运行数据的类型。eg:server、micrometer。多个可以同时使用,默认 server - initial-delay: 10000 # 项目启动后延迟多久进行采集 - thread-pool-types: dynamic # 采集线程池的类型。eg:dynamic、web、adapter。可任意配置,默认 dynamic -``` - -如果使用 `micrometer` 类型的监控指标,需要添加以下依赖。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter-monitor-micrometer - 1.5.0 - -``` - -项目启动,访问 `http://localhost:29999/actuator/prometheus` 出现 `dynamic_thread_pool_` 前缀的指标,即为成功。 - -![](https://oss.open8gu.com/image-20220912220401016.png) - -## 配置 Prometheus - -通过 Docker 启动 Prometheus 服务。 - -```shell -docker run -d -p 9090:9090 --name prometheus prom/prometheus -``` - -添加 Prometheus 抽取数据任务。 - -```shell -# 进入 prometheus 容器内部 -docker exec -it prometheus /bin/sh -# 编辑 prometheus 配置文件 -vi /etc/prometheus/prometheus.yml -``` - -scrape_configs 节点下新添加一个 job,如果 Prometheus 是 Docker 方式部署,`{scrape_configs.static_configs.targets}` 需要写本机的 IP。 - -```yaml -scrape_configs: - - job_name: 'dynamic-thread-pool-job' - scrape_interval: 5s - metrics_path: '/actuator/prometheus' - static_configs: - - targets: [ '127.0.0.1:29999' ] -``` - -配置成功后 `exit` 退出容器,并进行 Prometheus 容器重启 `docker restart prometheus`。 - -访问 Prometheus 控制台 `http://localhost:9090/graph` 路径,能够展示相关指标即为配置成功。 - -![](https://oss.open8gu.com/image-20220912221237597.png) - -## 配置 Grafana - -```shell -docker run -d -p 3000:3000 --name=grafana grafana/grafana -``` - -访问 Grafana 地址,[http://localhost:3000](http://localhost:3000) 用户名密码:`admin` - -Grafana 访问 `http://localhost:3000/datasources` 导入 Prometheus 数据源。 - -![](https://oss.open8gu.com/image-20220912221646866.png) - -> 如果 Prometheus 为 Docker 方式部署,HTTP URL 需要为本地 IP,比如:http://192.168.1.5:9090 - -关注公众号 `龙台的技术笔记`,回复:`监控`,获取 Hippo4j Grafana DashBoard JSON 配置。 - -| 公众号 | 回复关键词 | -|:------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------:| -| ![](https://oss.open8gu.com/43_65f6020ed111b6bb3808ec338576bd6b.png?x-oss-process=image/resize,h_300,w_400) | ![](https://oss.open8gu.com/image-20220327171957444.png?x-oss-process=image/resize,h_300,w_400) | - -获取到 JSON 文件后,通过 `http://localhost:3000/dashboard/import` 将 JSON 文件导入至 Grafana DashBoard。 - -![](https://oss.open8gu.com/image-20220912225627272.png) - -下拉框内动态选择创建好的 Prometheus 数据源,并点击 `Import`。 - -![](https://oss.open8gu.com/image-20220912225700200.png) - -即可使用炫酷的 Hippo4j 动态线程池监控 DashBoard。大家伙儿也可以根据个人喜好进行定制 DashBoard,如果觉得有优化点,欢迎和我联系贡献。 - -![](https://oss.open8gu.com/image-20220912225813972.png) - -如果项目客户端启动多个示例,动态线程池监控效果图如下: - -![](https://oss.open8gu.com/20220814_hippo4j_monitor.jpg) diff --git a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-start.md b/docs/versioned_docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-start.md deleted file mode 100644 index 17ec5224..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/getting_started/server/hippo4j-server-start.md +++ /dev/null @@ -1,127 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 接入流程 - -部署服务端,参考 [部署手册](/docs/user_docs/ops/hippo4j-server-deploy)。 - -服务端创建 [租户、项目](/community/faq#租户和项目在-hippo4j-中是什么意思) 和线程池记录。 - -需要注意,项目 ID 需要与配置文件 `{application.name}` 保持一致。 - -:::note -租户、项目、线程池 ID 如果由多个词组成,建议以 - 进行分割。比如:message-center。 -::: - -## Hippo4j 配置 - -SpringBoot Pom 引入 Hippo4j Starter Jar。 - -```xml - - cn.hippo4j - hippo4j-spring-boot-starter - 1.5.0 - -``` - -启动类上添加注解 `@EnableDynamicThreadPool`。 - -```java -@SpringBootApplication -@EnableDynamicThreadPool -public class ExampleApplication { - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } -} -``` - -SpringBoot 应用配置文件添加: - -```yaml -spring: - profiles: - active: dev - application: - # 服务端创建的项目 id 需要与 application.name 保持一致 - name: dynamic-threadpool-example - dynamic: - thread-pool: - # 服务端地址 - server-addr: http://localhost:6691 - # 用户名 - username: admin - # 密码 - password: 123456 - # 租户 id, 对应 tenant 表 - namespace: prescription - # 项目 id, 对应 item 表 - item-id: ${spring.application.name} -``` - -## ThreadPoolExecutor 适配 - -添加线程池配置类,通过 `@DynamicThreadPool` 注解修饰。`threadPoolId` 为服务端创建的线程池 ID。 - -```java -package cn.hippo4j.example; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - ThreadPoolExecutor messageConsumeDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageConsumeDynamicExecutor; - } - - @Bean - @DynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicExecutor() { - String threadPoolId = "message-produce"; - ThreadPoolExecutor messageProduceDynamicExecutor = ThreadPoolBuilder.builder() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .dynamicPool() - .build(); - return messageProduceDynamicExecutor; - } - -} -``` - -通过 ThreadPoolBuilder 构建动态线程池,只有 threadFactory、threadPoolId 为必填项,其它参数会从 hippo4j-server 服务拉取。 - -:::note -创建线程池时建议填充实际的参数。如果在连接 Hippo4j Server 端失败时,会使用填充配置创建线程池。 -::: - -项目中使用上述定义的动态线程池,如下所示: - -```java -@Resource -private ThreadPoolExecutor messageConsumeDynamicExecutor; - -messageConsumeDynamicExecutor.execute(() -> xxx); - -@Resource -private ThreadPoolExecutor messageProduceDynamicExecutor; - -messageProduceDynamicExecutor.execute(() -> xxx); -``` - diff --git a/docs/versioned_docs/version-1.5.0/user_docs/intro.md b/docs/versioned_docs/version-1.5.0/user_docs/intro.md deleted file mode 100644 index af470274..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/intro.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 简介 - -## 线程池痛点 - -线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。在高并发以及大批量的任务处理场景,线程池的使用是必不可少的。 - -如果有在项目中实际使用线程池,相信你可能会遇到以下痛点: - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -## 什么是 Hippo4j - -Hippo4j 通过对 JDK 线程池增强,以及扩展三方框架底层线程池等功能,为业务系统提高线上运行保障能力。 - -提供以下功能支持: - -- 全局管控 - 管理应用线程池实例。 - -- 动态变更 - 应用运行时动态变更线程池参数,包括不限于:核心、最大线程数、阻塞队列容量、拒绝策略等。 -- 通知报警 - 内置四种报警通知策略,线程池活跃度、容量水位、拒绝策略以及任务执行时间超长。 -- 运行监控 - 实时查看线程池运行时数据,最近半小时线程池运行数据图表展示。 -- 功能扩展 - 支持线程池任务传递上下文;项目关闭时,支持等待线程池在指定时间内完成任务。 -- 多种模式 - 内置两种使用模式:[依赖配置中心](https://hippo4j.cn/docs/user_docs/getting_started/config/hippo4j-config-start) 和 [无中间件依赖](https://hippo4j.cn/docs/user_docs/getting_started/server/hippo4j-server-start)。 -- 容器管理 - Tomcat、Jetty、Undertow 容器线程池运行时查看和线程数变更。 -- 框架适配 - Dubbo、Hystrix、RabbitMQ、RocketMQ 等消费线程池运行时数据查看和线程数变更。 - -## 快速开始 - -对于本地演示目的,请参阅 [Quick start](https://hippo4j.cn/docs/user_docs/user_guide/quick-start) - -演示环境: [http://console.hippo4j.cn/index.html](http://console.hippo4j.cn/index.html) - -## 接入登记 - -更多接入的公司,欢迎在 [登记地址](https://github.com/opengoofy/hippo4j/issues/13) 登记,登记仅仅为了产品推广。 - -## 联系我 - -开源不易,右上角点个 Star 鼓励一下吧! - -如果大家想要实时关注 Hippo4j 更新的文章以及分享的干货的话,可以关注我的公众号。 - -使用过程中有任何问题,或者对项目有什么建议,关注公众号回复:加群,和 1000+ 志同道合的朋友交流讨论。 - -![](https://oss.open8gu.com/image-20230317191041262-mini.png) - -## 友情链接 - -- [[ LiteFlow ]](https://liteflow.yomahub.com/):轻量,快速,稳定可编排的组件式规则引擎。 - -- [[ Sa-Token ]](https://github.com/dromara/sa-token):一个轻量级 java 权限认证框架,让鉴权变得简单、优雅! -- [[ HertzBeat ]](https://github.com/dromara/hertzbeat):易用友好的云监控系统, 无需 Agent, 强大自定义监控能力。 -- [[ JavaGuide ]](https://github.com/Snailclimb/JavaGuide):一份涵盖大部分 Java 程序员所需要掌握的核心知识。 -- [[ toBeBetterJavaer ]](https://github.com/itwanger/toBeBetterJavaer):一份通俗易懂、风趣幽默的 Java 学习指南。 - -## 贡献者 - -感谢所有为项目作出贡献的开发者。如果有意贡献,参考 [good first issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)。 diff --git a/docs/versioned_docs/version-1.5.0/user_docs/ops/_category_.json b/docs/versioned_docs/version-1.5.0/user_docs/ops/_category_.json deleted file mode 100644 index d5b7d1e8..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/ops/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "运维指南", - "position": 4, - "link": { - "type": "generated-index" - } -} diff --git a/docs/versioned_docs/version-1.5.0/user_docs/ops/hippo4j-server-deploy.md b/docs/versioned_docs/version-1.5.0/user_docs/ops/hippo4j-server-deploy.md deleted file mode 100644 index ffbc2306..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/ops/hippo4j-server-deploy.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 源码包部署 - -[RELEASE](https://github.com/opengoofy/hippo4j/releases) 页面下载对应版本并进行解压。 - -## 初始化 - -修改数据库相关信息。 - -```txt -/conf/application.properties -``` - -如果是新运行 Hippo4j,数据库执行下述 SQL 脚本即可。 - -```txt -/conf/hippo4j_manager.sql -``` - -如果是对已运行 Hippo4j 升级,请查看 `/conf/sql-upgrade` 目录下,是否有目标版本对应的升级脚本。 - -## 直接运行 - -Mac Linux 启动执行。 - -```txt -sh ./bin/startup.sh -``` - -Windows 启动执行。 - -```txt -bin/startup.cmd -``` - -## 访问控制台 - -启动成功后,访问链接。用户名密码:admin 123456 - -```txt -localhost:6691/index.html -``` diff --git a/docs/versioned_docs/version-1.5.0/user_docs/ops/server-docker.md b/docs/versioned_docs/version-1.5.0/user_docs/ops/server-docker.md deleted file mode 100644 index 826bb99f..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/ops/server-docker.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Docker部署 - -## 镜像启动 - -Docker 镜像默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -或者,底层存储数据库切换为 MySQL。`DATASOURCE_HOST` 需要切换为本地 IP,不能使用 `127.0.0.1` 或 `localhost`。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server \ --e DATASOURCE_MODE=mysql \ --e DATASOURCE_HOST=xxx.xxx.xxx.xxx \ --e DATASOURCE_PORT=3306 \ --e DATASOURCE_DB=hippo4j_manager \ --e DATASOURCE_USERNAME=root \ --e DATASOURCE_PASSWORD=root \ -hippo4j/hippo4j-server -``` - -访问 Server 控制台,路径 `http://localhost:6691/index.html` ,默认用户名密码:admin / 123456 - -## 镜像构建 - -如果想要自定义镜像,可以通过以下命令快速构建 Hippo4j Server: - -方式一: - -```shell -# 进入到 hippo4j-server/hippo4j-bootstrap 工程路径下 -mvn clean package -Dskip.spotless.apply=true -# 默认打包是打包的 tag 是 latest -docker build -t hippo4j/hippo4j-server ../hippo4j-bootstrap -``` - -方式二: - -通过 `maven docker plugin` - -```shell -# 进入到 hippo4j-server 工程路径下 -mvn clean package -DskipTests -Dskip.spotless.apply=true docker:build -``` diff --git a/docs/versioned_docs/version-1.5.0/user_docs/other/_category_.json b/docs/versioned_docs/version-1.5.0/user_docs/other/_category_.json deleted file mode 100644 index a74d7432..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/other/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "其它", - "position": 6, - "link": { - "type": "generated-index" - } -} diff --git a/docs/versioned_docs/version-1.5.0/user_docs/other/official-ccounts.md b/docs/versioned_docs/version-1.5.0/user_docs/other/official-ccounts.md deleted file mode 100644 index 63e07ea7..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/other/official-ccounts.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 推荐公众号 - -## JavaGuide - -专注Java后端学习和大厂面试的公众号! - -![](https://oss.open8gu.com/JavaGuide.png) - -## HelloGitHub - -HelloGitHub,专注于开源社区技术和知识内容分享。 - -![](https://oss.open8gu.com/HelloGitHub.png) - -## macrozheng - -专注Java技术分享,解析优质开源项目。涵盖SpringBoot、SpringCloud、Docker、K8S等实用技术,作者Github开源项目mall(50K+Star)。 - -![](https://oss.open8gu.com/macrozheng.png) diff --git a/docs/versioned_docs/version-1.5.0/user_docs/other/operation.md b/docs/versioned_docs/version-1.5.0/user_docs/other/operation.md deleted file mode 100644 index 62661c55..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/other/operation.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 6 ---- - -# 公众号合作 - -## 推荐须知 - -hippo4j 作为一款新兴动态线程池框架,开源出来的时间比较晚,目前迫切需要不同的途径进行推广。 - -如果您是公众号运营者或者开源爱好者,欢迎将 hippo4j 推荐给您的粉丝。 - -1. 您无需为 hippo4j 专门撰写文案,只需要直接导入 [推荐文章](https://mp.weixin.qq.com/s/JTTwcBEiK_MnFcPTZl3zGA) 即可。 -2. 在文章底部或内容中留下项目官网或者 GitHub 仓库链接。 -3. 文章需至少 1000+ 的阅读量。 - -作为推荐回报,hippo4j 可以为您: - -1. 在框架官方文档 [推荐公众号](/docs/user_docs/other/official-ccounts) 页面处留下您的公众号二维码。 -2. 在框架官方交流群里@全体成员推广您的公众号一次,附带介绍语。 -3. 您的公众号所有新推文章都可以将链接发送到 hippo4j 交流群中,增加阅读量。 - -如果您还有除公众号以外的其它途径可以与 hippo4j 相互推荐,欢迎 [加群沟通](/group)。 diff --git a/docs/versioned_docs/version-1.5.0/user_docs/other/question.md b/docs/versioned_docs/version-1.5.0/user_docs/other/question.md deleted file mode 100644 index 49fd4d77..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/other/question.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 问题提问 - -文档引用自:[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way) - -## 在提问之前 - -在你准备要通过电子邮件、新闻群组或者聊天室提出技术问题前,请先做到以下事情: - -1. 尝试在你准备提问的论坛的旧文章中搜索答案。 -2. 尝试上网搜索以找到答案。 -3. 尝试阅读手册以找到答案。 -4. 尝试阅读常见问题文件(FAQ)以找到答案。 -5. 尝试自己检查或试验以找到答案。 -6. 向你身边的强者朋友打听以找到答案。 -7. 如果你是程序开发者,请尝试阅读源代码以找到答案。 - -当你提出问题的时候,请先表明你已经做了上述的努力;这将有助于树立你并不是一个不劳而获且浪费别人的时间的提问者。如果你能一并表达在做了上述努力的过程中所**学到**的东西会更好,因为我们更乐于回答那些表现出能从答案中学习的人的问题。 - -## 当你提问时 - -### 慎选提问的论坛 -小心选择你要提问的场合。如果你做了下述的事情,你很可能被忽略掉或者被看作失败者: - -* 在与主题不合的论坛上贴出你的问题。 -* 在探讨进阶技术问题的论坛张贴非常初级的问题;反之亦然。 -* 在太多的不同新闻群组上重复转贴同样的问题(cross-post)。 -* 向既非熟人也没有义务解决你问题的人发送私人电邮。 - -因此,第一步是找到对的论坛。再说一次,Google 和其它搜索引擎还是你的朋友,用它们来找到与你遭遇到困难的软硬件问题最相关的网站。通常那儿都有常见问题(FAQ)、邮件列表及相关说明文件的链接。如果你的努力(包括**阅读** FAQ)都没有结果,网站上也许还有报告 Bug(Bug-reporting)的流程或链接,如果是这样,链过去看看。 - -### 使用有意义且描述明确的标题 - -在邮件列表、新闻群组或论坛中,大约 50 字以内的标题是抓住资深专家注意力的好机会。别用喋喋不休的帮帮忙、跪求、急(更别说救命啊!!!!这样让人反感的话,用这种标题会被条件反射式地忽略)来浪费这个机会。不要妄想用你的痛苦程度来打动我们,而应该是在这点空间中使用极简单扼要的描述方式来提出问题。 - -一个好标题范例是`目标 —— 差异`式的描述,许多技术支持组织就是这样做的。在`目标`部分指出是哪一个或哪一组东西有问题,在`差异`部分则描述与期望的行为不一致的地方。 - -> 蠢问题:救命啊!我的笔记本电脑不能正常显示了! - -> 聪明问题:X.org 6.8.1 的鼠标指针会变形,某牌显卡 MV1005 芯片组。 - -> 更聪明问题:X.org 6.8.1 的鼠标指针,在某牌显卡 MV1005 芯片组环境下 - 会变形。 - -### 使用清晰、正确、精准且合乎语法的语句 - -我们从经验中发现,粗心的提问者通常也会粗心地写程序与思考(我敢打包票)。回答粗心大意者的问题很不值得,我们宁愿把时间耗在别处。 - -正确的拼写、标点符号和大小写是很重要的。一般来说,如果你觉得这样做很麻烦,不想在乎这些,那我们也觉得麻烦,不想在乎你的提问。花点额外的精力斟酌一下字句,用不着太僵硬与正式 —— 事实上,黑客文化很看重能准确地使用非正式、俚语和幽默的语句。但它**必须很**准确,而且有迹象表明你是在思考和关注问题。 - -### 精确地描述问题并言之有物 - -* 仔细、清楚地描述你的问题或 Bug 的症状。 -* 描述问题发生的环境(机器配置、操作系统、应用程序、以及相关的信息),提供经销商的发行版和版本号(如:`Fedora Core 4`、`Slackware 9.1`等)。 -* 描述在提问前你是怎样去研究和理解这个问题的。 -* 描述在提问前为确定问题而采取的诊断步骤。 -* 描述最近做过什么可能相关的硬件或软件变更。 -* 尽可能地提供一个可以`重现这个问题的可控环境`的方法。 - -尽量去揣测一个黑客会怎样反问你,在你提问之前预先将黑客们可能提出的问题回答一遍。 - -以上几点中,当你报告的是你认为可能在代码中的问题时,给黑客一个可以重现你的问题的环境尤其重要。当你这么做时,你得到有效的回答的机会和速度都会大大的提升。 - -[Simon Tatham](http://www.chiark.greenend.org.uk/~sgtatham/) 写过一篇名为《[如何有效的报告 Bug](http://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html)》的出色文章。强力推荐你也读一读。 - -### 话不在多而在精 - -你需要提供精确有内容的信息。这并不是要求你简单的把成堆的出错代码或者资料完全转录到你的提问中。如果你有庞大而复杂的测试样例能重现程序挂掉的情境,尽量将它剪裁得越小越好。 - -这样做的用处至少有三点。 -第一,表现出你为简化问题付出了努力,这可以使你得到回答的机会增加; -第二,简化问题使你更有可能得到**有用**的答案; -第三,在精炼你的 bug 报告的过程中,你很可能就自己找到了解决方法或权宜之计。 - -### 别动辄声称找到 Bug - -当你在使用软件中遇到问题,除非你非常、**非常**的有根据,不要动辄声称找到了 Bug。提示:除非你能提供解决问题的源代码补丁,或者提供回归测试来表明前一版本中行为不正确,否则你都多半不够完全确信。这同样适用在网页和文件,如果你(声称)发现了文件的`Bug`,你应该能提供相应位置的修正或替代文件。 - -请记得,还有其他许多用户没遇到你发现的问题,否则你在阅读文件或搜索网页时就应该发现了(你在抱怨前[已经做了这些,是吧](#在提问之前)?)。这也意味着很有可能是你弄错了而不是软件本身有问题。 - -编写软件的人总是非常辛苦地使它尽可能完美。如果你声称找到了 Bug,也就是在质疑他们的能力,即使你是对的,也有可能会冒犯到其中某部分人。当你在标题中嚷嚷着有`Bug`时,这尤其严重。 - -提问时,即使你私下非常确信已经发现一个真正的 Bug,最好写得像是**你**做错了什么。如果真的有 Bug,你会在回复中看到这点。这样做的话,如果真有 Bug,维护者就会向你道歉,这总比你惹恼别人然后欠别人一个道歉要好一点。 - -### 低声下气不能代替你的功课 - -有些人明白他们不该粗鲁或傲慢的提问并要求得到答复,但他们选择另一个极端 —— 低声下气:`我知道我只是个可悲的新手,一个撸瑟,但...`。这既使人困扰,也没有用,尤其是伴随着与实际问题含糊不清的描述时更令人反感。 - -别用原始灵长类动物的把戏来浪费你我的时间。取而代之的是,尽可能清楚地描述背景条件和你的问题情况。这比低声下气更好地定位了你的位置。 - -有时网页论坛会设有专为新手提问的版面,如果你真的认为遇到了初学者的问题,到那去就是了,但一样别那么低声下气。 - -### 描述问题症状而非你的猜测 - -告诉黑客们你认为问题是怎样造成的并没什么帮助。(如果你的推断如此有效,还用向别人求助吗?),因此要确信你原原本本告诉了他们问题的症状,而不是你的解释和理论;让黑客们来推测和诊断。如果你认为陈述自己的猜测很重要,清楚地说明这只是你的猜测,并描述为什么它们不起作用。 - -**蠢问题** - -> 我在编译内核时接连遇到 SIG11 错误, -> 我怀疑某条飞线搭在主板的走线上了,这种情况应该怎样检查最好? - -**聪明问题** - -> 我的组装电脑是 FIC-PA2007 主机板搭载 AMD K6/233 CPU(威盛 Apollo VP2 芯片组), -> 256MB Corsair PC133 SDRAM 内存,在编译内核时,从开机 20 分钟以后就频频产生 SIG11 错误, -> 但是在头 20 分钟内从没发生过相同的问题。重新启动也没有用,但是关机一晚上就又能工作 20 分钟。 -> 所有内存都换过了,没有效果。相关部分的标准编译记录如下… - -由于以上这点似乎让许多人觉得难以配合,这里有句话可以提醒你:`所有的诊断专家都来自密苏里州。` 美国国务院的官方座右铭则是:`让我看看`(出自国会议员 Willard D. Vandiver 在 1899 年时的讲话:`我来自一个出产玉米,棉花,牛蒡和民主党人的国家,滔滔雄辩既不能说服我,也不会让我满意。我来自密苏里州,你必须让我看看。`) 针对诊断者而言,这并不是一种怀疑,而只是一种真实而有用的需求,以便让他们看到的是与你看到的原始证据尽可能一致的东西,而不是你的猜测与归纳的结论。所以,大方的展示给我们看吧! - -### 按发生时间先后列出问题症状 - -问题发生前的一系列操作,往往就是对找出问题最有帮助的线索。因此,你的说明里应该包含你的操作步骤,以及机器和软件的反应,直到问题发生。在命令行处理的情况下,提供一段操作记录(例如运行脚本工具所生成的),并引用相关的若干行(如 20 行)记录会非常有帮助。 - -如果挂掉的程序有诊断选项(如 -v 的详述开关),试着选择这些能在记录中增加调试信息的选项。记住,`多`不等于`好`。试着选取适当的调试级别以便提供有用的信息而不是让读者淹没在垃圾中。 - -如果你的说明很长(如超过四个段落),在开头简述问题,接下来再按时间顺序详述会有所帮助。这样黑客们在读你的记录时就知道该注意哪些内容了。 - -### 描述目标而不是过程 - -如果你想弄清楚如何做某事(而不是报告一个 Bug),在开头就描述你的目标,然后才陈述重现你所卡住的特定步骤。 - -经常寻求技术帮助的人在心中有个更高层次的目标,而他们在自以为能达到目标的特定道路上被卡住了,然后跑来问该怎么走,但没有意识到这条路本身就有问题。结果要费很大的劲才能搞定。 - -**蠢问题** - -> 我怎样才能从某绘图程序的颜色选择器中取得十六进制的 RGB 值? - -**聪明问题** - -> 我正试着用替换一幅图片的色码(color table)成自己选定的色码,我现在知道的唯一方法是编辑每个色码区块(table slot), -> 但却无法从某绘图程序的颜色选择器取得十六进制的 RGB 值。 - -第二种提问法比较聪明,你可能得到像是```建议采用另一个更合适的工具```的回复。 - -### 清楚明确的表达你的问题以及需求 - -漫无边际的提问是近乎无休无止的时间黑洞。最有可能给你有用答案的人通常也正是最忙的人(他们忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞相当厌恶,所以他们也倾向于厌恶那些漫无边际的提问。 - -如果你明确表述需要回答者做什么(如提供指点、发送一段代码、检查你的补丁、或是其他等等),就最有可能得到有用的答案。因为这会定出一个时间和精力的上限,便于回答者能集中精力来帮你。这么做很棒。 - -要理解专家们所处的世界,请把专业技能想像为充裕的资源,而回复的时间则是稀缺的资源。你要求他们奉献的时间越少,你越有可能从真正专业而且很忙的专家那里得到解答。 - -所以,界定一下你的问题,使专家花在辨识你的问题和回答所需要付出的时间减到最少,这技巧对你有用答案相当有帮助 —— 但这技巧通常和简化问题有所区别。因此,问`我想更好地理解 X,可否指点一下哪有好一点说明?`通常比问`你能解释一下 X 吗?`更好。如果你的代码不能运作,通常请别人看看哪里有问题,比要求别人替你改正要明智得多。 - -### 礼多人不怪,而且有时还很有帮助 - -彬彬有礼,多用`请`和`谢谢您的关注`,或`谢谢你的关照`。让大家都知道你对他们花时间免费提供帮助心存感激。 - -坦白说,这一点并没有比使用清晰、正确、精准且合乎语法和避免使用专用格式重要(也不能取而代之)。黑客们一般宁可读有点唐突但技术上鲜明的 Bug 报告,而不是那种有礼但含糊的报告。(如果这点让你不解,记住我们是按问题能教给我们什么来评价问题的价值的) - -然而,如果你有一串的问题待解决,客气一点肯定会增加你得到有用回应的机会。 - -(我们注意到,自从本指南发布后,从资深黑客那里得到的唯一严重缺陷反馈,就是对预先道谢这一条。一些黑客觉得`先谢了`意味着事后就不用再感谢任何人的暗示。我们的建议是要么先说`先谢了`,**然后**事后再对回复者表示感谢,或者换种方式表达感激,譬如用`谢谢你的关注`或`谢谢你的关照`。) - -## 不该问的问题 - -以下是几个经典蠢问题,以及黑客没回答时心中所想的: - -问题:[我能在哪找到 X 程序或 X 资源?](#q1) - -问题:[我怎样用 X 做 Y?](#q2) - -问题:[我的程序/设定/SQL 语句没有用](#q3) - -问题:[我的 Windows 电脑有问题,你能帮我吗?](#q4) - -问题:[我的程序不会动了,我认为系统工具 X 有问题](#q5) - -问题:[我在安装 Linux(或者 X )时有问题,你能帮我吗?](#q6) - -问题:[我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢?](#q7) - ---- - -> 问题:我能在哪找到 X 程序或 X 资源? - -回答:就在我找到它的地方啊,白痴 —— 搜索引擎的那一头。天哪!难道还有人不会用 [Google](https://www.google.com) 吗? - -> 问题:我怎样用 X 做 Y? - -回答:如果你想解决的是 Y ,提问时别给出可能并不恰当的方法。这种问题说明提问者不但对 X 完全无知,也对 Y 要解决的问题糊涂,还被特定形势禁锢了思维。最好忽略这种人,等他们把问题搞清楚了再说。 - -> 问题:我的{程序/设定/SQL 语句}没有用 - -回答:这不算是问题吧,我对要我问你二十个问题才找得出你真正问题的问题没兴趣 —— 我有更有意思的事要做呢。在看到这类问题的时候,我的反应通常不外如下三种 - -* 你还有什么要补充的吗? -* 真糟糕,希望你能搞定。 -* 这关我屁事? - -> 问题:我的 Windows 电脑有问题,你能帮我吗? - -回答:能啊,扔掉微软的垃圾,换个像 Linux 或 BSD 的开源操作系统吧。 - -注意:如果程序有官方版 Windows 或者与 Windows 有互动(如 Samba),你**可以**问与 Windows 相关的问题,只是别对问题是由 Windows 操作系统而不是程序本身造成的回复感到惊讶, 因为 Windows 一般来说实在太烂,这种说法通常都是对的。 - -> 问题:我的程序不会动了,我认为系统工具 X 有问题 - -回答:你完全有可能是第一个注意到被成千上万用户反复使用的系统调用与函数库文件有明显缺陷的人,更有可能的是你完全没有根据。不同凡响的说法需要不同凡响的证据,当你这样声称时,你必须有清楚而详尽的缺陷说明文件作后盾。 - -> 问题:我在安装 Linux(或者 X )时有问题,你能帮我吗? - -回答:不能,我只有亲自在你的电脑上动手才能找到毛病。还是去找你当地的 Linux 使用群组者寻求实际的指导吧(你能在[这儿](http://www.linux.org/groups/index.html)找到用户群组的清单)。 - -注意:如果安装问题与某 Linux 的发行版有关,在它的邮件列表、论坛或本地用户群组中提问也许是恰当的。此时,应描述问题的准确细节。在此之前,先用 `Linux` 和**所有**被怀疑的硬件作关键词仔细搜索。 - -> 问题:我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢? - -回答:想要这样做,说明了你是个卑鄙小人;想找个黑客帮你,说明你是个白痴! - -## 好问题与蠢问题 - -最后,我将透过举一些例子,来说明怎样聪明的提问;同一个问题的两种问法被放在一起,一种是愚蠢的,另一种才是明智的。 - -**蠢问题**: - -> 我从 foo 项目找来的源码没法编译。它怎么这么烂? - -他觉得都是别人的错,这个傲慢自大的提问者。 - -**聪明问题**: - -> foo 项目代码在 Nulix 6.2 版下无法编译通过。我读过了 FAQ,但里面没有提到跟 Nulix 有关的问题。这是我编译过程的记录,我有什么做的不对的地方吗? - -提问者已经指明了环境,也读过了 FAQ,还列出了错误,并且他没有把问题的责任推到别人头上,他的问题值得被关注。 - -**蠢问题**: - -> 我的主机板有问题了,谁来帮我? - -某黑客对这类问题的回答通常是:`好的,还要帮你拍拍背和换尿布吗?`,然后按下删除键。 - -**聪明问题**: - -> 我在 S2464 主机板上试过了 X 、 Y 和 Z ,但没什么作用,我又试了 A 、 B 和 C 。请注意当我尝试 C 时的奇怪现象。显然 florbish 正在 grommicking,但结果出人意料。通常在 Athlon MP 主机板上引起 grommicking 的原因是什么?有谁知道接下来我该做些什么测试才能找出问题? - -## 如果得不到回答 - -如果仍得不到回答,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。 - -总的来说,简单的重复张贴问题是个很糟的点子。这将被视为无意义的喧闹。有点耐心,知道你问题答案的人可能生活在不同的时区,可能正在睡觉,也有可能你的问题一开始就没有组织好。 - -你可以通过其他渠道获得帮助,这些渠道通常更适合初学者的需要。 diff --git a/docs/versioned_docs/version-1.5.0/user_docs/user_guide/_category_.json b/docs/versioned_docs/version-1.5.0/user_docs/user_guide/_category_.json deleted file mode 100644 index 9c505a51..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/user_guide/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "用户指南", - "position": 2, - "link": { - "type": "generated-index", - "description": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。" - } -} diff --git a/docs/versioned_docs/version-1.5.0/user_docs/user_guide/frame.md b/docs/versioned_docs/version-1.5.0/user_docs/user_guide/frame.md deleted file mode 100644 index 5992f735..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/user_guide/frame.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -sidebar_position: 1 ---- - -# 为什么写 - -[美团线程池文章](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html "美团线程池文章") 介绍中,因为业务对线程池参数没有合理配置,触发过几起生产事故,进而引发了一系列思考。最终决定封装线程池动态参数调整,扩展线程池监控以及消息报警等功能。 - -在开源平台找了挺多动态线程池项目,从功能性以及健壮性而言,个人感觉不满足企业级应用。 - -因为对动态线程池比较感兴趣,加上想写一个有意义的项目,所以决定自己来造一个轻量级的轮子。 - -想给项目起一个简单易记的名字,类似于 Eureka、Nacos、Redis;后和朋友商量,决定命名:**Hippo4j**。 - -![](https://oss.open8gu.com/动态线程池功能架构-1.jpg) - -## 它解决了什么问题 - -线程池在业务系统应该都有使用到,帮助业务流程提升效率以及管理线程,多数场景应用于大量的异步任务处理。 - -虽然线程池提供了我们许多便利,但也并非尽善尽美,比如下面这些问题就无法很好解决。 - -- 线程池随便定义,线程资源过多,造成服务器高负载。 - -- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。 - -- 线程池任务执行时间超过平均执行周期,开发人员无法感知。 - -- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。 - -- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。 - -- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。 - -- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。 - -- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。 - -Hippo4j 很好解决了这些问题,它将业务中所有线程池统一管理,增强原生线程池系列功能。 - -## 它有什么特性 - -应用系统中线程池并不容易管理。参考美团的设计,Hippo4j 按照租户、项目、线程池的维度划分。再加上系统权限,让不同的开发、管理人员负责自己系统的线程池操作。 - -举个例子,小编在一家公司的公共组件团队,团队中负责消息、短链接网关等项目。公共组件是租户,消息或短链接就是项目。 - -Hippo4j 除去动态修改线程池,还包含实时查看线程池运行时指标、负载报警、配置日志管理等。 - -- `hippo4j-adapter`:适配对第三方框架中的线程池进行监控,如 Dubbo、RocketMQ、Hystrix 等; -- `hippo4j-auth`:用户、角色、权限等; -- `hippo4j-common`:多个模块公用代码实现; -- `hippo4j-config`:提供线程池准实时参数更新功能; -- `hippo4j-console`:对接前端控制台; -- `hippo4j-core`:核心的依赖,包括配置、核心包装类等; -- `hippo4j-discovery`:提供线程池项目实例注册、续约、下线等功能; -- `hippo4j-example` :示例工程; -- `hippo4j-message` :配置变更以及报警通知发送; -- `hippo4j-monitor` :线程池运行时监控; -- `hippo4j-server` :Server 端发布需要的模块聚合; -- `hippo4j-spring-boot`:SpringBoot Starter。 diff --git a/docs/versioned_docs/version-1.5.0/user_docs/user_guide/framework.md b/docs/versioned_docs/version-1.5.0/user_docs/user_guide/framework.md deleted file mode 100644 index 33e24d1c..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/user_guide/framework.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 架构设计 - -简单来说,Hippo4j 从部署的角度上分为两种角色:Server 端和 Client 端。 - -Server 端是 Hippo4j 项目打包出的 Java 进程,功能包括用户权限、线程池监控以及执行持久化的动作。 - -Client 端指的是我们 SpringBoot 应用,通过引入 Hippo4j Starter Jar 包负责与 Server 端进行交互。 - -比如拉取 Server 端线程池数据、动态更新线程池配置以及采集上报线程池运行时数据等。 - -## 基础组件 - -### 配置中心(Config) - -配置中心位于 Server 端,它的主要作用是监控 Server 端线程池配置变更,实时通知到 Client 实例执行线程池变更流程。 - -代码设计基于 Nacos 1.x 版本的 **长轮询以及异步 Servlet 机制** 实现。 - -### 注册中心(Discovery) - -负责管理 Client 端(单机或集群)注册到 Server 端的实例,包括不限于**实例注册、续约、过期剔除** 等操作,代码基于 Eureka 源码实现。 - -上面的配置中心很容易理解,动态线程池参数变更的根本。但是注册中心是用来做什么的? - -注册中心管理 Client 端注册的实例,通过这些实例可以 **实时获取线程池的运行时参数信息**。 - -目前的设计是如此,不排除后续基于 Discovery 做更多的扩展。 - -### 控制台(Console) - -对接前端项目,包括不限于以下模块管理: - -![](https://oss.open8gu.com/image-20211107122504126.png) - -## 消息通知(Notify) - -Hippo4j 内置了很多需要通知的事件,比如:线程池参数变更通知、线程池活跃度报警、拒绝策略执行报警以及阻塞队列容量报警等。 - -目前 Notify 已经接入了钉钉、企业微信和飞书,后续持续集成邮件、短信等通知渠道;并且,Notify 模块提供了消息事件的 SPI 方案,可以接受三方自定义的推送。 - -## Hippo4j-Spring-Boot-Starter - -熟悉 SpringBoot 的小伙伴对 Starter 应该不会陌生。Hippo4j 提供以 Starter Jar 包的形式嵌套在应用内,负责与 Server 端完成交互。 - -## 功能架构 - -![](https://oss.open8gu.com/image-20211105230953626.png) diff --git a/docs/versioned_docs/version-1.5.0/user_docs/user_guide/notify.md b/docs/versioned_docs/version-1.5.0/user_docs/user_guide/notify.md deleted file mode 100644 index 3373f244..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/user_guide/notify.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 通知报警 - -现阶段已集成钉钉、企业微信、飞书的消息推送,后续会持续接入邮箱、短信和自定义通知渠道。 - -![](https://oss.open8gu.com/image-20220904181527453.png) - -**通知平台** - -- DING:钉钉平台; - -- LARK:飞书平台; - -- WECHAT:企业微信。 - -**通知类型** - -- CONFIG:线程池配置变更推送; - -- ALARM:线程池运行报警推送。 - -**Token** - -获取 DING、LARK、WECHAT 机器人 Token。 - -**报警间隔** - -- CONFIG 类型通知没有报警间隔; - -- ALARM 类型设置报警间隔后,某一节点下的同一线程池指定间隔只会发送一次报警通知。 - -**接收者** - -```tex -多个接收者使用英文逗号 , 分割 (注意不要有空格) -DING:填写手机号 -WECHART:填写user_id会以@的消息发给用户,填写姓名则是普通的@,如:龙台 -LARK:填写ou_开头用户唯一标识会以@的消息发给用户,填写手机号则是普通的@ -``` - -## 钉钉平台 - -[钉钉创建群机器人](https://www.dingtalk.com/qidian/help-detail-20781541.html) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211013122816688.png) | ![](https://oss.open8gu.com/image-20211013113649068.png) | - -添加钉钉机器人后,需在机器人配置自定义关键字,才可发送成功。如下所示: - -![](https://oss.open8gu.com/image-20220530200133377.png?x-oss-process=image/resize,h_500,w_800) - -:::tip -如果使用 1.4.3 及以上版本,`警报` 替换为 `告警`。 -::: - -## 企业微信 - -[企业微信创建群机器人](https://open.work.weixin.qq.com/help2/pc/14931?person_id=1&from=homesearch) - -| 配置变更 | 报警通知 | -| :---: | :---: | -| ![](https://oss.open8gu.com/image-20211203213443242.png) | ![](https://oss.open8gu.com/image-20211203213512019.png) | - -## 飞书平台 - -[飞书创建群机器人](https://www.feishu.cn/hc/zh-CN/articles/360024984973) - -![](https://oss.open8gu.com/image-20220304081729347.png) - -![](https://oss.open8gu.com/image-20220304081507907.png) diff --git a/docs/versioned_docs/version-1.5.0/user_docs/user_guide/quick-start.md b/docs/versioned_docs/version-1.5.0/user_docs/user_guide/quick-start.md deleted file mode 100644 index 59c5cdd5..00000000 --- a/docs/versioned_docs/version-1.5.0/user_docs/user_guide/quick-start.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 快速开始 - -## 服务启动 - -使用 Docker 运行服务端,默认使用内置 H2 数据库,数据持久化到 Docker 容器存储卷中。 - -```shell -docker run -d -p 6691:6691 --name hippo4j-server hippo4j/hippo4j-server -``` - -> 如果没有 Docker,可以使用源码编译的方式,启动 [Hippo4j-Server/Hippo4j-Bootstrap](https://github.com/longtai-cn/hippo4j/tree/develop/hippo4j-server/hippo4j-bootstrap) 模块下 ServerApplication 应用类。 - -启动示例项目,[hippo4j-spring-boot-starter-example](https://github.com/opengoofy/hippo4j/tree/develop/hippo4j-example/hippo4j-spring-boot-starter-example) 模块下 ServerExampleApplication 应用类。 - -访问 Server 控制台,路径 `http://localhost:6691/index.html`,默认用户名密码:admin / 123456 - -## 配置变更 - -访问控制台动态线程池菜单下线程池实例,修改动态线程池相关参数。 - -![](https://oss.open8gu.com/image-20220813173811668.png) - -观察 Hippo4j-Example 控制台日志输出,日志输出包括不限于此信息即为成功。 - -```tex -2022-09-10 00:23:29.783 INFO 50322 --- [change.config_0] c.h.s.s.c.ServerThreadPoolDynamicRefresh : [message-consume] Dynamic thread pool change parameter. - corePoolSize: 2 => 4 - maximumPoolSize: 6 => 12 - capacity: 1024 => 2048 - keepAliveTime: 9999 => 9999 - executeTimeOut: 800 => 3000 - rejectedType: SyncPutQueuePolicy => RunsOldestTaskPolicy - allowCoreThreadTimeOut: true => true -``` - -另外,当 Client 集群部署时,可以修改某一个实例,或选择 `全部修改` 按钮,修改所有实例线程池信息。 diff --git a/docs/versioned_sidebars/version-1.4.2-sidebars.json b/docs/versioned_sidebars/version-1.4.2-sidebars.json deleted file mode 100644 index 98d1c255..00000000 --- a/docs/versioned_sidebars/version-1.4.2-sidebars.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "tutorialSidebar": [ - { - "type": "autogenerated", - "dirName": "." - } - ], - "user_docs": [ - { - "type": "autogenerated", - "dirName": "user_docs" - } - ], - "community": [ - { - "type": "autogenerated", - "dirName": "community" - } - ], - "sponsor": [ - { - "type": "autogenerated", - "dirName": "sponsor" - } - ] -} diff --git a/docs/versioned_sidebars/version-1.4.3-sidebars.json b/docs/versioned_sidebars/version-1.4.3-sidebars.json deleted file mode 100644 index 98d1c255..00000000 --- a/docs/versioned_sidebars/version-1.4.3-sidebars.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "tutorialSidebar": [ - { - "type": "autogenerated", - "dirName": "." - } - ], - "user_docs": [ - { - "type": "autogenerated", - "dirName": "user_docs" - } - ], - "community": [ - { - "type": "autogenerated", - "dirName": "community" - } - ], - "sponsor": [ - { - "type": "autogenerated", - "dirName": "sponsor" - } - ] -} diff --git a/docs/versioned_sidebars/version-1.5.0-sidebars.json b/docs/versioned_sidebars/version-1.5.0-sidebars.json deleted file mode 100644 index b7c1650e..00000000 --- a/docs/versioned_sidebars/version-1.5.0-sidebars.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "tutorialSidebar": [ - { - "type": "autogenerated", - "dirName": "." - } - ], - "user_docs": [ - { - "type": "autogenerated", - "dirName": "user_docs" - } - ], - "sponsor": [ - { - "type": "autogenerated", - "dirName": "sponsor" - } - ] -} diff --git a/docs/versions.json b/docs/versions.json deleted file mode 100644 index e6c148d0..00000000 --- a/docs/versions.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - "1.5.0", - "1.4.3", - "1.4.2" -] diff --git a/examples/pom.xml b/examples/pom.xml deleted file mode 100644 index 95323a3c..00000000 --- a/examples/pom.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-all - ${revision} - - hippo4j-examples - pom - - - true - - - - threadpool-example - - \ No newline at end of file diff --git a/examples/threadpool-example/agent/agent-example-core/pom.xml b/examples/threadpool-example/agent/agent-example-core/pom.xml deleted file mode 100644 index c43cb21a..00000000 --- a/examples/threadpool-example/agent/agent-example-core/pom.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-agent-example - ${revision} - - - hippo4j-agent-example-core - - - true - - - - - org.springframework.boot - spring-boot-starter-test - test - - - cn.hippo4j - hippo4j-threadpool-message - ${revision} - - - org.openjdk.jmh - jmh-core - 1.23 - test - - - org.openjdk.jmh - jmh-generator-annprocess - 1.23 - test - - - - \ No newline at end of file diff --git a/examples/threadpool-example/agent/agent-example-core/src/main/java/cn/hippo4j/example/agent/core/config/ThreadPoolConfiguration.java b/examples/threadpool-example/agent/agent-example-core/src/main/java/cn/hippo4j/example/agent/core/config/ThreadPoolConfiguration.java deleted file mode 100644 index 77182468..00000000 --- a/examples/threadpool-example/agent/agent-example-core/src/main/java/cn/hippo4j/example/agent/core/config/ThreadPoolConfiguration.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.agent.core.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -@Configuration -public class ThreadPoolConfiguration { - - // ------------------------------------------------------------------------- - // 未使用 Hippo4j,原始定义线程池创建方式 - // ------------------------------------------------------------------------- - - @Bean - public ThreadPoolExecutor runMessageSendTaskExecutor() { - LinkedBlockingQueue linkedBlockingQueue = new LinkedBlockingQueue<>(1024); - return new ThreadPoolExecutor( - 1, - 10, - 1024, - TimeUnit.SECONDS, - linkedBlockingQueue); - } - - // ------------------------------------------------------------------------- - // 演示 Agent 模式修改线程池 - // ------------------------------------------------------------------------- - - public static final ThreadPoolExecutor AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR = new ThreadPoolExecutor( - 1, - 10, - 1024, - TimeUnit.SECONDS, - new LinkedBlockingQueue<>(1024)); -} diff --git a/examples/threadpool-example/agent/agent-example-core/src/main/java/cn/hippo4j/example/agent/core/inittest/AlarmSendMessageTest.java b/examples/threadpool-example/agent/agent-example-core/src/main/java/cn/hippo4j/example/agent/core/inittest/AlarmSendMessageTest.java deleted file mode 100644 index bf67eb75..00000000 --- a/examples/threadpool-example/agent/agent-example-core/src/main/java/cn/hippo4j/example/agent/core/inittest/AlarmSendMessageTest.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.agent.core.inittest; - -import cn.hippo4j.common.executor.ThreadPoolExecutorHolder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * Test alarm send message. - */ -@Slf4j -@Component -public class AlarmSendMessageTest { - - private static final int SLEEP_TIME = 10240124; - - private static final int INITIAL_DELAY = 3; - - private static final String RUN_MESSAGE_SEND_TASK_EXECUTOR = "runMessageSendTaskExecutor"; - - private static final String AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR = "cn.hippo4j.example.agent.core.config.ThreadPoolConfiguration#AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR"; - - /** - * Test alarm notification. - * If you need to run this single test, add @PostConstruct to the method. - */ - @SuppressWarnings("all") - // @PostConstruct - public void alarmSendMessageTest() { - ScheduledExecutorService scheduledThreadPool = Executors.newSingleThreadScheduledExecutor(); - scheduledThreadPool.scheduleWithFixedDelay(() -> { - ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR); - ThreadPoolExecutor poolExecutor = executorHolder.getExecutor(); - try { - poolExecutor.execute(() -> { - try { - Thread.sleep(SLEEP_TIME); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - }); - } catch (Exception ex) { - log.error("Throw reject policy.", ex.getMessage()); - } - }, INITIAL_DELAY, 2, TimeUnit.SECONDS); - - scheduledThreadPool.scheduleWithFixedDelay(() -> { - ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(RUN_MESSAGE_SEND_TASK_EXECUTOR); - ThreadPoolExecutor poolExecutor = executorHolder.getExecutor(); - try { - poolExecutor.execute(() -> { - try { - Thread.sleep(SLEEP_TIME); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - }); - } catch (Exception ex) { - log.error("Throw reject policy.", ex.getMessage()); - } - }, INITIAL_DELAY, 2, TimeUnit.SECONDS); - - } -} diff --git a/examples/threadpool-example/agent/config-apollo-spring-boot-1x/pom.xml b/examples/threadpool-example/agent/config-apollo-spring-boot-1x/pom.xml deleted file mode 100644 index 9c579ad0..00000000 --- a/examples/threadpool-example/agent/config-apollo-spring-boot-1x/pom.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-agent-example - ${revision} - - - hippo4j-threadpool-agent-config-apollo-spring-boot-1x - - - true - 1.5.22.RELEASE - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - - - cn.hippo4j - hippo4j-agent-example-core - ${revision} - - - com.ctrip.framework.apollo - apollo-client - - - org.slf4j - slf4j-api - 1.7.21 - - - org.springframework.cloud - spring-cloud-context - 1.3.6.RELEASE - - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - - \ No newline at end of file diff --git a/examples/threadpool-example/agent/config-apollo-spring-boot-1x/src/main/java/cn/hippo4j/example/agent/config/apollo/v1/AgentConfigApolloSpringBoot1xExampleApplication.java b/examples/threadpool-example/agent/config-apollo-spring-boot-1x/src/main/java/cn/hippo4j/example/agent/config/apollo/v1/AgentConfigApolloSpringBoot1xExampleApplication.java deleted file mode 100644 index 9ad3b623..00000000 --- a/examples/threadpool-example/agent/config-apollo-spring-boot-1x/src/main/java/cn/hippo4j/example/agent/config/apollo/v1/AgentConfigApolloSpringBoot1xExampleApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.agent.config.apollo.v1; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Agent config Apollo Spring Boot 1.x example application. - */ -@SpringBootApplication(scanBasePackages = "cn.hippo4j.example.agent.core") -public class AgentConfigApolloSpringBoot1xExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(AgentConfigApolloSpringBoot1xExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/agent/config-apollo-spring-boot-1x/src/main/resources/bootstrap.properties b/examples/threadpool-example/agent/config-apollo-spring-boot-1x/src/main/resources/bootstrap.properties deleted file mode 100644 index 456739df..00000000 --- a/examples/threadpool-example/agent/config-apollo-spring-boot-1x/src/main/resources/bootstrap.properties +++ /dev/null @@ -1,65 +0,0 @@ -server.port=8092 -server.servlet.context-path=/example - -app.id=dynamic-threadpool-example -apollo.meta=http://127.0.0.1:8080 -apollo.autoUpdateInjectedSpringProperties=true -apollo.bootstrap.enabled=true -apollo.bootstrap.namespaces=application -apollo.bootstrap.eagerLoad.enabled=true - -# The following parameters are used for testing -env=dev -apollo.configService=http://127.0.0.1:8080 -spring.profiles.active=dev -spring.application.name=hippo4j-config-apollo-spring-boot-starter-example - -spring.dynamic.thread-pool.enable=true -spring.dynamic.thread-pool.banner=true -spring.dynamic.thread-pool.check-state-interval=10 -spring.dynamic.thread-pool.monitor.enable=true -spring.dynamic.thread-pool.monitor.collect-types=micrometer -spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic -spring.dynamic.thread-pool.monitor.initial-delay=3000 -spring.dynamic.thread-pool.monitor.collect-interval=3000 -spring.dynamic.thread-pool.monitor.agent-micrometer-port=29999 - -spring.dynamic.thread-pool.notify-platforms[0].platform=LARK -spring.dynamic.thread-pool.notify-platforms[0].token=6de41bdc-0799-45be-b128-7cddb9e777f0 -#spring.dynamic.thread-pool.notify-platforms[1].platform=WECHAT -#spring.dynamic.thread-pool.notify-platforms[1].token=ac0426a5-c712-474c-9bff-72b8b8f5caff -#spring.dynamic.thread-pool.notify-platforms[2].platform=DING -#spring.dynamic.thread-pool.notify-platforms[2].token=56417ebba6a27ca352f0de77a2ae9da66d01f39610b5ee8a6033c60ef9071c55 - -spring.dynamic.thread-pool.apollo.namespace=application -spring.dynamic.thread-pool.config-file-type=properties - -spring.dynamic.thread-pool.executors[0].thread-name-prefix = DynamicThreadPoolConfig#FIELD1 -spring.dynamic.thread-pool.executors[0].core-pool-size = 2 -spring.dynamic.thread-pool.executors[0].thread-pool-id = cn.hippo4j.example.agent.core.config.ThreadPoolConfiguration#AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR -spring.dynamic.thread-pool.executors[0].maximum-pool-size = 20 -spring.dynamic.thread-pool.executors[0].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[0].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out = 800 -spring.dynamic.thread-pool.executors[0].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[0].alarm = true -spring.dynamic.thread-pool.executors[0].active-alarm = 80 -spring.dynamic.thread-pool.executors[0].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[0].notify.interval = 8 -spring.dynamic.thread-pool.executors[0].notify.receives = nobodyiam -spring.dynamic.thread-pool.executors[1].thread-pool-id = runMessageSendTaskExecutor -spring.dynamic.thread-pool.executors[1].thread-name-prefix = runMessageSendTaskExecutor -spring.dynamic.thread-pool.executors[1].core-pool-size = 3 -spring.dynamic.thread-pool.executors[1].maximum-pool-size = 4 -spring.dynamic.thread-pool.executors[1].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[1].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out = 800 -spring.dynamic.thread-pool.executors[1].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[1].active-alarm = 80 -spring.dynamic.thread-pool.executors[1].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[1].notify.interval = 8 -spring.dynamic.thread-pool.executors[1].notify.receives = nobodyiam diff --git a/examples/threadpool-example/agent/config-apollo-spring-boot-3x/pom.xml b/examples/threadpool-example/agent/config-apollo-spring-boot-3x/pom.xml deleted file mode 100644 index e8221449..00000000 --- a/examples/threadpool-example/agent/config-apollo-spring-boot-3x/pom.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-agent-example - 2.0.0-SNAPSHOT - - - hippo4j-threadpool-agent-config-apollo-spring-boot-3x - - - true - 3.0.2 - 17 - 17 - 17 - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - - - cn.hippo4j - hippo4j-agent-example-core - ${revision} - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-test - test - - - - com.ctrip.framework.apollo - apollo-client - 2.3.0 - - - - org.springframework.cloud - spring-cloud-context - 4.1.4 - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - 3.3.4 - - - - repackage - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - 17 - 17 - - - - - - \ No newline at end of file diff --git a/examples/threadpool-example/agent/config-apollo-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/apollo/v3/AgentConfigApolloSpringBoot3xExampleApplication.java b/examples/threadpool-example/agent/config-apollo-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/apollo/v3/AgentConfigApolloSpringBoot3xExampleApplication.java deleted file mode 100644 index 3bbd562e..00000000 --- a/examples/threadpool-example/agent/config-apollo-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/apollo/v3/AgentConfigApolloSpringBoot3xExampleApplication.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.agent.config.apollo.v3; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Agent config Apollo boot3 example application. - */ -@SpringBootApplication(scanBasePackages = "cn.hippo4j.example.agent.config.apollo.v3") -public class AgentConfigApolloSpringBoot3xExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(AgentConfigApolloSpringBoot3xExampleApplication.class, args); - } - -} diff --git a/examples/threadpool-example/agent/config-apollo-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/apollo/v3/AlarmSendMessageBootV3Test.java b/examples/threadpool-example/agent/config-apollo-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/apollo/v3/AlarmSendMessageBootV3Test.java deleted file mode 100644 index 8a6a23cd..00000000 --- a/examples/threadpool-example/agent/config-apollo-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/apollo/v3/AlarmSendMessageBootV3Test.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.agent.config.apollo.v3; - -import cn.hippo4j.common.executor.ThreadPoolExecutorHolder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import jakarta.annotation.PostConstruct; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * Test alarm send message. - */ -@Slf4j -@Component -public class AlarmSendMessageBootV3Test { - - private static final int SLEEP_TIME = 10240124; - - private static final int INITIAL_DELAY = 3; - - private static final String RUN_MESSAGE_SEND_TASK_EXECUTOR = "runMessageSendTaskExecutor"; - - private static final String AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR = "cn.hippo4j.example.agent.config.apollo.v3.ThreadPoolConfigurationBootV3#AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR"; - - /** - * Test alarm notification. - * If you need to run this single test, add @PostConstruct to the method. - */ - @SuppressWarnings("all") - // @PostConstruct - public void alarmSendMessageTest() { - ScheduledExecutorService scheduledThreadPool = Executors.newSingleThreadScheduledExecutor(); - scheduledThreadPool.scheduleWithFixedDelay(() -> { - ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR); - ThreadPoolExecutor poolExecutor = executorHolder.getExecutor(); - try { - poolExecutor.execute(() -> { - try { - Thread.sleep(SLEEP_TIME); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - }); - } catch (Exception ex) { - log.error("Throw reject policy.", ex.getMessage()); - } - }, INITIAL_DELAY, 2, TimeUnit.SECONDS); - - scheduledThreadPool.scheduleWithFixedDelay(() -> { - ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(RUN_MESSAGE_SEND_TASK_EXECUTOR); - ThreadPoolExecutor poolExecutor = executorHolder.getExecutor(); - try { - poolExecutor.execute(() -> { - try { - Thread.sleep(SLEEP_TIME); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - }); - } catch (Exception ex) { - log.error("Throw reject policy.", ex.getMessage()); - } - }, INITIAL_DELAY, 2, TimeUnit.SECONDS); - - } -} diff --git a/examples/threadpool-example/agent/config-apollo-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/apollo/v3/ThreadPoolConfigurationBootV3.java b/examples/threadpool-example/agent/config-apollo-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/apollo/v3/ThreadPoolConfigurationBootV3.java deleted file mode 100644 index 16320a45..00000000 --- a/examples/threadpool-example/agent/config-apollo-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/apollo/v3/ThreadPoolConfigurationBootV3.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.agent.config.apollo.v3; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -@Configuration -public class ThreadPoolConfigurationBootV3 { - - // ------------------------------------------------------------------------- - // 未使用 Hippo4j,原始定义线程池创建方式 - // ------------------------------------------------------------------------- - - @Bean - public ThreadPoolExecutor runMessageSendTaskExecutor() { - LinkedBlockingQueue linkedBlockingQueue = new LinkedBlockingQueue<>(1024); - return new ThreadPoolExecutor( - 1, - 10, - 1024, - TimeUnit.SECONDS, - linkedBlockingQueue); - } - - // ------------------------------------------------------------------------- - // 演示 Agent 模式修改线程池 - // ------------------------------------------------------------------------- - - public static final ThreadPoolExecutor AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR = new ThreadPoolExecutor( - 1, - 10, - 1024, - TimeUnit.SECONDS, - new LinkedBlockingQueue<>(1024)); -} diff --git a/examples/threadpool-example/agent/config-apollo-spring-boot-3x/src/main/resources/application.properties b/examples/threadpool-example/agent/config-apollo-spring-boot-3x/src/main/resources/application.properties deleted file mode 100644 index b8c971da..00000000 --- a/examples/threadpool-example/agent/config-apollo-spring-boot-3x/src/main/resources/application.properties +++ /dev/null @@ -1,66 +0,0 @@ -server.port=8092 -server.servlet.context-path=/example - -app.id=dynamic-threadpool-example-springboot3-test -apollo.meta=http://127.0.0.1:8080 -apollo.autoUpdateInjectedSpringProperties=true -apollo.bootstrap.enabled=true -apollo.bootstrap.namespaces=application -apollo.bootstrap.eagerLoad.enabled=true - -# The following parameters are used for testing -env=dev -apollo.configService=http://127.0.0.1:8080 -spring.profiles.active=dev -spring.application.name=hippo4j-config-apollo-spring-boot-starter-example - -spring.dynamic.thread-pool.enable=true -spring.dynamic.thread-pool.banner=true -spring.dynamic.thread-pool.check-state-interval=10 -spring.dynamic.thread-pool.monitor.enable=true -spring.dynamic.thread-pool.monitor.collect-types=micrometer -spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic -spring.dynamic.thread-pool.monitor.initial-delay=3000 -spring.dynamic.thread-pool.monitor.collect-interval=3000 -spring.dynamic.thread-pool.monitor.agent-micrometer-port=29999 - -spring.dynamic.thread-pool.notify-platforms[0].platform=LARK -spring.dynamic.thread-pool.notify-platforms[0].token=6de41bdc-0799-45be-b128-7cddb9e777f0 -#spring.dynamic.thread-pool.notify-platforms[1].platform=WECHAT -#spring.dynamic.thread-pool.notify-platforms[1].token=ac0426a5-c712-474c-9bff-72b8b8f5caff -#spring.dynamic.thread-pool.notify-platforms[2].platform=DING -#spring.dynamic.thread-pool.notify-platforms[2].token=56417ebba6a27ca352f0de77a2ae9da66d01f39610b5ee8a6033c60ef9071c55 - -spring.dynamic.thread-pool.apollo.namespace=application -spring.dynamic.thread-pool.config-file-type=properties - -spring.dynamic.thread-pool.executors[0].thread-name-prefix = DynamicThreadPoolConfig#FIELD1 -spring.dynamic.thread-pool.executors[0].core-pool-size = 2 -spring.dynamic.thread-pool.executors[0].thread-pool-id = cn.hippo4j.example.agent.config.apollo.v3.ThreadPoolConfigurationBootV3#AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR -spring.dynamic.thread-pool.executors[0].maximum-pool-size = 20 -spring.dynamic.thread-pool.executors[0].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[0].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out = 800 -spring.dynamic.thread-pool.executors[0].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[0].alarm = true -spring.dynamic.thread-pool.executors[0].active-alarm = 80 -spring.dynamic.thread-pool.executors[0].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[0].notify.interval = 8 -spring.dynamic.thread-pool.executors[0].notify.receives = nobodyiam - -spring.dynamic.thread-pool.executors[1].thread-pool-id = runMessageSendTaskExecutor -spring.dynamic.thread-pool.executors[1].thread-name-prefix = runMessageSendTaskExecutor -spring.dynamic.thread-pool.executors[1].core-pool-size = 3 -spring.dynamic.thread-pool.executors[1].maximum-pool-size = 4 -spring.dynamic.thread-pool.executors[1].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[1].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out = 800 -spring.dynamic.thread-pool.executors[1].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[1].active-alarm = 80 -spring.dynamic.thread-pool.executors[1].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[1].notify.interval = 8 -spring.dynamic.thread-pool.executors[1].notify.receives = nobodyiam diff --git a/examples/threadpool-example/agent/config-apollo/pom.xml b/examples/threadpool-example/agent/config-apollo/pom.xml deleted file mode 100644 index f87d6ddf..00000000 --- a/examples/threadpool-example/agent/config-apollo/pom.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-agent-example - ${revision} - - - hippo4j-threadpool-agent-config-apollo-example - - - true - - - - - cn.hippo4j - hippo4j-agent-example-core - ${revision} - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - com.ctrip.framework.apollo - apollo-client - - - - org.springframework.cloud - spring-cloud-context - 2.2.5.RELEASE - - - - org.slf4j - slf4j-api - 1.7.21 - - - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - \ No newline at end of file diff --git a/examples/threadpool-example/agent/config-apollo/src/main/java/cn/hippo4j/example/agent/config/apollo/AgentConfigApolloExampleApplication.java b/examples/threadpool-example/agent/config-apollo/src/main/java/cn/hippo4j/example/agent/config/apollo/AgentConfigApolloExampleApplication.java deleted file mode 100644 index 8879f503..00000000 --- a/examples/threadpool-example/agent/config-apollo/src/main/java/cn/hippo4j/example/agent/config/apollo/AgentConfigApolloExampleApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.agent.config.apollo; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Agent Apollo Spring Boot 2.x example application. - */ -@SpringBootApplication(scanBasePackages = "cn.hippo4j.example.agent.core") -public class AgentConfigApolloExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(AgentConfigApolloExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/agent/config-apollo/src/main/resources/bootstrap.properties b/examples/threadpool-example/agent/config-apollo/src/main/resources/bootstrap.properties deleted file mode 100644 index 5192a761..00000000 --- a/examples/threadpool-example/agent/config-apollo/src/main/resources/bootstrap.properties +++ /dev/null @@ -1,66 +0,0 @@ -server.port=8092 -server.servlet.context-path=/example - -app.id=dynamic-threadpool-example -apollo.meta=http://127.0.0.1:8080 -apollo.autoUpdateInjectedSpringProperties=true -apollo.bootstrap.enabled=true -apollo.bootstrap.namespaces=application -apollo.bootstrap.eagerLoad.enabled=true - -# The following parameters are used for testing -env=dev -apollo.configService=http://127.0.0.1:8080 -spring.profiles.active=dev -spring.application.name=hippo4j-config-apollo-spring-boot-starter-example - -spring.dynamic.thread-pool.enable=true -spring.dynamic.thread-pool.banner=true -spring.dynamic.thread-pool.check-state-interval=10 -spring.dynamic.thread-pool.monitor.enable=true -spring.dynamic.thread-pool.monitor.collect-types=micrometer -spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic -spring.dynamic.thread-pool.monitor.initial-delay=3000 -spring.dynamic.thread-pool.monitor.collect-interval=3000 -spring.dynamic.thread-pool.monitor.agent-micrometer-port=29999 - -spring.dynamic.thread-pool.notify-platforms[0].platform=LARK -spring.dynamic.thread-pool.notify-platforms[0].token=6de41bdc-0799-45be-b128-7cddb9e777f0 -#spring.dynamic.thread-pool.notify-platforms[1].platform=WECHAT -#spring.dynamic.thread-pool.notify-platforms[1].token=ac0426a5-c712-474c-9bff-72b8b8f5caff -#spring.dynamic.thread-pool.notify-platforms[2].platform=DING -#spring.dynamic.thread-pool.notify-platforms[2].token=56417ebba6a27ca352f0de77a2ae9da66d01f39610b5ee8a6033c60ef9071c55 - -spring.dynamic.thread-pool.apollo.namespace=application -spring.dynamic.thread-pool.config-file-type=properties - -spring.dynamic.thread-pool.executors[0].thread-name-prefix = DynamicThreadPoolConfig#FIELD1 -spring.dynamic.thread-pool.executors[0].core-pool-size = 2 -spring.dynamic.thread-pool.executors[0].thread-pool-id = cn.hippo4j.example.agent.core.config.ThreadPoolConfiguration#AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR -spring.dynamic.thread-pool.executors[0].maximum-pool-size = 20 -spring.dynamic.thread-pool.executors[0].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[0].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out = 800 -spring.dynamic.thread-pool.executors[0].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[0].alarm = true -spring.dynamic.thread-pool.executors[0].active-alarm = 80 -spring.dynamic.thread-pool.executors[0].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[0].notify.interval = 8 -spring.dynamic.thread-pool.executors[0].notify.receives = nobodyiam - -spring.dynamic.thread-pool.executors[1].thread-pool-id = runMessageSendTaskExecutor -spring.dynamic.thread-pool.executors[1].thread-name-prefix = runMessageSendTaskExecutor -spring.dynamic.thread-pool.executors[1].core-pool-size = 3 -spring.dynamic.thread-pool.executors[1].maximum-pool-size = 4 -spring.dynamic.thread-pool.executors[1].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[1].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out = 800 -spring.dynamic.thread-pool.executors[1].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[1].active-alarm = 80 -spring.dynamic.thread-pool.executors[1].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[1].notify.interval = 8 -spring.dynamic.thread-pool.executors[1].notify.receives = nobodyiam diff --git a/examples/threadpool-example/agent/config-nacos-spring-boot-1x/pom.xml b/examples/threadpool-example/agent/config-nacos-spring-boot-1x/pom.xml deleted file mode 100644 index 011342c8..00000000 --- a/examples/threadpool-example/agent/config-nacos-spring-boot-1x/pom.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-agent-example - ${revision} - - - hippo4j-threadpool-agent-config-nacos-spring-boot-1x - - - true - 1.5.22.RELEASE - - - - - cn.hippo4j - hippo4j-agent-example-core - ${revision} - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - 1.5.1.RELEASE - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.cloud - spring-cloud-context - 1.3.0.RELEASE - - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - - \ No newline at end of file diff --git a/examples/threadpool-example/agent/config-nacos-spring-boot-1x/src/main/java/cn/hippo4j/example/agent/config/nacos/v1/AgentConfigNacosSpringBoot1xExampleApplication.java b/examples/threadpool-example/agent/config-nacos-spring-boot-1x/src/main/java/cn/hippo4j/example/agent/config/nacos/v1/AgentConfigNacosSpringBoot1xExampleApplication.java deleted file mode 100644 index eceee1b4..00000000 --- a/examples/threadpool-example/agent/config-nacos-spring-boot-1x/src/main/java/cn/hippo4j/example/agent/config/nacos/v1/AgentConfigNacosSpringBoot1xExampleApplication.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.agent.config.nacos.v1; - -import com.alibaba.nacos.api.exception.NacosException; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Agent config Nacos example application. - */ -@SpringBootApplication(scanBasePackages = "cn.hippo4j.example.agent.core") -public class AgentConfigNacosSpringBoot1xExampleApplication { - - public static void main(String[] args) throws NacosException { - SpringApplication.run(AgentConfigNacosSpringBoot1xExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/agent/config-nacos-spring-boot-1x/src/main/resources/bootstrap.properties b/examples/threadpool-example/agent/config-nacos-spring-boot-1x/src/main/resources/bootstrap.properties deleted file mode 100644 index a16da5c4..00000000 --- a/examples/threadpool-example/agent/config-nacos-spring-boot-1x/src/main/resources/bootstrap.properties +++ /dev/null @@ -1,63 +0,0 @@ -server.port=8092 -server.servlet.context-path=/example -spring.profiles.active=dev -spring.application.name=hippo4j-config-nacos-spring-boot-starter-example - -# The following parameters are used for testing -spring.cloud.nacos.config.server-addr=127.0.0.1:8848 -spring.cloud.nacos.config.name=dynamic-threadpool-example-config -spring.cloud.nacos.config.file-extension=properties -spring.cloud.nacos.config.refresh.enabled=true - -spring.dynamic.thread-pool.enable=true -spring.dynamic.thread-pool.banner=true -spring.dynamic.thread-pool.check-state-interval=3 -spring.dynamic.thread-pool.monitor.enable=true -spring.dynamic.thread-pool.monitor.collect-types=micrometer -spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic -spring.dynamic.thread-pool.monitor.agent-micrometer-port=29999 - -spring.dynamic.thread-pool.monitor.initial-delay=3000 -spring.dynamic.thread-pool.monitor.collect-interval=3000 -spring.dynamic.thread-pool.notify-platforms[0].platform=LARK -spring.dynamic.thread-pool.notify-platforms[0].token=6de41bdc-0799-45be-b128-7cddb9e777f0 -#spring.dynamic.thread-pool.notify-platforms[1].platform=WECHAT -#spring.dynamic.thread-pool.notify-platforms[1].token=ac0426a5-c712-474c-9bff-72b8b8f5caff -#spring.dynamic.thread-pool.notify-platforms[2].platform=DING -#spring.dynamic.thread-pool.notify-platforms[2].token=56417ebba6a27ca352f0de77a2ae9da66d01f39610b5ee8a6033c60ef9071c55 - -spring.dynamic.thread-pool.nacos.data-id=dynamic-threadpool-example-config -spring.dynamic.thread-pool.nacos.group=DEFAULT_GROUP -spring.dynamic.thread-pool.nacos.namespace=public - -spring.dynamic.thread-pool.config-file-type=properties - -spring.dynamic.thread-pool.executors[0].thread-name-prefix = DynamicThreadPoolConfig#FIELD1 -spring.dynamic.thread-pool.executors[0].core-pool-size = 2 -spring.dynamic.thread-pool.executors[0].thread-pool-id = cn.hippo4j.example.agent.core.config.ThreadPoolConfiguration#AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR -spring.dynamic.thread-pool.executors[0].maximum-pool-size = 20 -spring.dynamic.thread-pool.executors[0].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[0].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out = 800 -spring.dynamic.thread-pool.executors[0].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[0].alarm = true -spring.dynamic.thread-pool.executors[0].active-alarm = 80 -spring.dynamic.thread-pool.executors[0].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[0].notify.interval = 8 -spring.dynamic.thread-pool.executors[0].notify.receives = nobodyiam -spring.dynamic.thread-pool.executors[1].thread-pool-id = runMessageSendTaskExecutor -spring.dynamic.thread-pool.executors[1].thread-name-prefix = runMessageSendTaskExecutor -spring.dynamic.thread-pool.executors[1].core-pool-size = 3 -spring.dynamic.thread-pool.executors[1].maximum-pool-size = 4 -spring.dynamic.thread-pool.executors[1].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[1].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out = 800 -spring.dynamic.thread-pool.executors[1].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[1].active-alarm = 80 -spring.dynamic.thread-pool.executors[1].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[1].notify.interval = 8 -spring.dynamic.thread-pool.executors[1].notify.receives = nobodyiam diff --git a/examples/threadpool-example/agent/config-nacos/pom.xml b/examples/threadpool-example/agent/config-nacos/pom.xml deleted file mode 100644 index 068ff153..00000000 --- a/examples/threadpool-example/agent/config-nacos/pom.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-agent-example - ${revision} - - - hippo4j-threadpool-agent-config-nacos-example - - - true - - - - - cn.hippo4j - hippo4j-agent-example-core - ${revision} - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - 2.2.5.RELEASE - - - org.springframework.cloud - spring-cloud-context - 2.2.5.RELEASE - - - org.slf4j - slf4j-api - 1.7.21 - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - \ No newline at end of file diff --git a/examples/threadpool-example/agent/config-nacos/src/main/java/cn/hippo4j/example/agent/config/nacos/AgentConfigNacosExampleApplication.java b/examples/threadpool-example/agent/config-nacos/src/main/java/cn/hippo4j/example/agent/config/nacos/AgentConfigNacosExampleApplication.java deleted file mode 100644 index 1b315207..00000000 --- a/examples/threadpool-example/agent/config-nacos/src/main/java/cn/hippo4j/example/agent/config/nacos/AgentConfigNacosExampleApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.agent.config.nacos; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Agent config Nacos example application. - */ -@SpringBootApplication(scanBasePackages = "cn.hippo4j.example.agent.core") -public class AgentConfigNacosExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(AgentConfigNacosExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/agent/config-nacos/src/main/resources/bootstrap.properties b/examples/threadpool-example/agent/config-nacos/src/main/resources/bootstrap.properties deleted file mode 100644 index 24869387..00000000 --- a/examples/threadpool-example/agent/config-nacos/src/main/resources/bootstrap.properties +++ /dev/null @@ -1,70 +0,0 @@ -server.port=8092 -server.servlet.context-path=/example - -nacos.config.auto-refresh=true -nacos.config.bootstrap.enable=true -# The following parameters are used for testing - -spring.cloud.nacos.config.server-addr=127.0.0.1:8848 -spring.cloud.nacos.config.extension-configs[0].data-id=dynamic-threadpool-example-config -spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP -spring.cloud.nacos.config.extension-configs[0].refresh=true - -spring.profiles.active=dev -spring.application.name=hippo4j-config-nacos-spring-boot-starter-example -management.metrics.export.prometheus.enabled=true -management.server.port=29998 -management.endpoints.web.exposure.include=* -spring.dynamic.thread-pool.enable=true -spring.dynamic.thread-pool.banner=true -spring.dynamic.thread-pool.check-state-interval=10 -#spring.dynamic.thread-pool.monitor.enable=true -#spring.dynamic.thread-pool.monitor.collect-types=micrometer -#spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic,web -spring.dynamic.thread-pool.monitor.agent-micrometer-port=29999 - -spring.dynamic.thread-pool.monitor.initial-delay=3000 -spring.dynamic.thread-pool.monitor.collect-interval=3000 -spring.dynamic.thread-pool.notify-platforms[0].platform=LARK -spring.dynamic.thread-pool.notify-platforms[0].token=6de41bdc-0799-45be-b128-7cddb9e777f0 -#spring.dynamic.thread-pool.notify-platforms[1].platform=WECHAT -#spring.dynamic.thread-pool.notify-platforms[1].token=ac0426a5-c712-474c-9bff-72b8b8f5caff -#spring.dynamic.thread-pool.notify-platforms[2].platform=DING -#spring.dynamic.thread-pool.notify-platforms[2].token=56417ebba6a27ca352f0de77a2ae9da66d01f39610b5ee8a6033c60ef9071c55 - -spring.dynamic.thread-pool.nacos.data-id=dynamic-threadpool-example-config -spring.dynamic.thread-pool.nacos.group=DEFAULT_GROUP -spring.dynamic.thread-pool.nacos.namespace=public - -spring.dynamic.thread-pool.config-file-type=properties - -spring.dynamic.thread-pool.executors[0].thread-name-prefix = DynamicThreadPoolConfig#FIELD1 -spring.dynamic.thread-pool.executors[0].core-pool-size = 2 -spring.dynamic.thread-pool.executors[0].thread-pool-id = cn.hippo4j.example.agent.core.config.ThreadPoolConfiguration#AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR -spring.dynamic.thread-pool.executors[0].maximum-pool-size = 20 -spring.dynamic.thread-pool.executors[0].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[0].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out = 800 -spring.dynamic.thread-pool.executors[0].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[0].alarm = true -spring.dynamic.thread-pool.executors[0].active-alarm = 80 -spring.dynamic.thread-pool.executors[0].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[0].notify.interval = 8 -spring.dynamic.thread-pool.executors[0].notify.receives = nobodyiam - -spring.dynamic.thread-pool.executors[1].thread-pool-id = runMessageSendTaskExecutor -spring.dynamic.thread-pool.executors[1].thread-name-prefix = runMessageSendTaskExecutor -spring.dynamic.thread-pool.executors[1].core-pool-size = 3 -spring.dynamic.thread-pool.executors[1].maximum-pool-size = 4 -spring.dynamic.thread-pool.executors[1].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[1].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out = 800 -spring.dynamic.thread-pool.executors[1].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[1].active-alarm = 80 -spring.dynamic.thread-pool.executors[1].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[1].notify.interval = 8 -spring.dynamic.thread-pool.executors[1].notify.receives = nobodyiam diff --git a/examples/threadpool-example/agent/config-naocs-spring-boot-3x/pom.xml b/examples/threadpool-example/agent/config-naocs-spring-boot-3x/pom.xml deleted file mode 100644 index 41282d6e..00000000 --- a/examples/threadpool-example/agent/config-naocs-spring-boot-3x/pom.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-agent-example - 2.0.0-SNAPSHOT - - - hippo4j-threadpool-agent-config-nacos-spring-boot-3x - - - true - 3.0.2 - 17 - 17 - 17 - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - - - cn.hippo4j - hippo4j-agent-example-core - ${revision} - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - 2022.0.0.0-RC2 - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.springframework - spring-core - 6.0.4 - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - 3.3.4 - - - - repackage - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - 17 - 17 - - - - - - - \ No newline at end of file diff --git a/examples/threadpool-example/agent/config-naocs-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/nacos/v3/AgentConfigNacosSpringBoot3xExampleApplication.java b/examples/threadpool-example/agent/config-naocs-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/nacos/v3/AgentConfigNacosSpringBoot3xExampleApplication.java deleted file mode 100644 index d6397c0c..00000000 --- a/examples/threadpool-example/agent/config-naocs-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/nacos/v3/AgentConfigNacosSpringBoot3xExampleApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.agent.config.nacos.v3; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Agent config Nacos boot3 example application. - */ -@SpringBootApplication(scanBasePackages = "cn.hippo4j.example.agent.config.nacos.v3") -public class AgentConfigNacosSpringBoot3xExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(AgentConfigNacosSpringBoot3xExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/agent/config-naocs-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/nacos/v3/AlarmSendMessageBootV3Test.java b/examples/threadpool-example/agent/config-naocs-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/nacos/v3/AlarmSendMessageBootV3Test.java deleted file mode 100644 index 68da590c..00000000 --- a/examples/threadpool-example/agent/config-naocs-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/nacos/v3/AlarmSendMessageBootV3Test.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.agent.config.nacos.v3; - -import cn.hippo4j.common.executor.ThreadPoolExecutorHolder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import jakarta.annotation.PostConstruct; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * Test alarm send message. - */ -@Slf4j -@Component -public class AlarmSendMessageBootV3Test { - - private static final int SLEEP_TIME = 10240124; - - private static final int INITIAL_DELAY = 3; - - private static final String RUN_MESSAGE_SEND_TASK_EXECUTOR = "runMessageSendTaskExecutor"; - - private static final String AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR = "cn.hippo4j.example.agent.config.nacos.v3.ThreadPoolConfigurationBootV3#AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR"; - - /** - * Test alarm notification. - * If you need to run this single test, add @PostConstruct to the method. - */ - @SuppressWarnings("all") - //@PostConstruct - public void alarmSendMessageTest() { - ScheduledExecutorService scheduledThreadPool = Executors.newSingleThreadScheduledExecutor(); - scheduledThreadPool.scheduleWithFixedDelay(() -> { - ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR); - ThreadPoolExecutor poolExecutor = executorHolder.getExecutor(); - try { - poolExecutor.execute(() -> { - try { - Thread.sleep(SLEEP_TIME); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - }); - } catch (Exception ex) { - log.error("Throw reject policy.", ex.getMessage()); - } - }, INITIAL_DELAY, 2, TimeUnit.SECONDS); - - scheduledThreadPool.scheduleWithFixedDelay(() -> { - ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(RUN_MESSAGE_SEND_TASK_EXECUTOR); - ThreadPoolExecutor poolExecutor = executorHolder.getExecutor(); - try { - poolExecutor.execute(() -> { - try { - Thread.sleep(SLEEP_TIME); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - }); - } catch (Exception ex) { - log.error("Throw reject policy.", ex.getMessage()); - } - }, INITIAL_DELAY, 2, TimeUnit.SECONDS); - - } -} diff --git a/examples/threadpool-example/agent/config-naocs-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/nacos/v3/ThreadPoolConfigurationBootV3.java b/examples/threadpool-example/agent/config-naocs-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/nacos/v3/ThreadPoolConfigurationBootV3.java deleted file mode 100644 index 88cdc8fb..00000000 --- a/examples/threadpool-example/agent/config-naocs-spring-boot-3x/src/main/java/cn/hippo4j/example/agent/config/nacos/v3/ThreadPoolConfigurationBootV3.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.agent.config.nacos.v3; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -@Configuration -public class ThreadPoolConfigurationBootV3 { - - // ------------------------------------------------------------------------- - // 未使用 Hippo4j,原始定义线程池创建方式 - // ------------------------------------------------------------------------- - - @Bean - public ThreadPoolExecutor runMessageSendTaskExecutor() { - LinkedBlockingQueue linkedBlockingQueue = new LinkedBlockingQueue<>(1024); - return new ThreadPoolExecutor( - 1, - 10, - 1024, - TimeUnit.SECONDS, - linkedBlockingQueue); - } - - // ------------------------------------------------------------------------- - // 演示 Agent 模式修改线程池 - // ------------------------------------------------------------------------- - - public static final ThreadPoolExecutor AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR = new ThreadPoolExecutor( - 1, - 10, - 1024, - TimeUnit.SECONDS, - new LinkedBlockingQueue<>(1024)); -} diff --git a/examples/threadpool-example/agent/config-naocs-spring-boot-3x/src/main/resources/application.properties b/examples/threadpool-example/agent/config-naocs-spring-boot-3x/src/main/resources/application.properties deleted file mode 100644 index b2940dbf..00000000 --- a/examples/threadpool-example/agent/config-naocs-spring-boot-3x/src/main/resources/application.properties +++ /dev/null @@ -1,76 +0,0 @@ -server.port=8093 -server.servlet.context-path=/example - -# The following parameters are used for testing - -# NacosCloud properties -spring.cloud.nacos.config.server-addr=127.0.0.1:8848 -# boot3 version nacosCloud must add , In order to refresh configuration to Env -spring.config.import=nacos:dynamic-threadpool-example-config-boot3?refreshEnabled=true - -# NacosBoot properties -#nacos.config.auto-refresh=true -#nacos.config.bootstrap.enable=true -#nacos.config.server-addr=127.0.0.1:8848 -#nacos.config.data-id=dynamic-threadpool-example-config-boot3 -#nacos.config.group=DEFAULT_GROUP -#nacos.config.type=properties - -spring.profiles.active=dev -spring.application.name=hippo4j-config-nacos-spring-boot-starter-example -management.metrics.export.prometheus.enabled=true -management.server.port=29998 -management.endpoints.web.exposure.include=* -spring.dynamic.thread-pool.enable=true -spring.dynamic.thread-pool.banner=true -spring.dynamic.thread-pool.check-state-interval=10 -#spring.dynamic.thread-pool.monitor.enable=true -#spring.dynamic.thread-pool.monitor.collect-types=micrometer -#spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic,web -spring.dynamic.thread-pool.monitor.agent-micrometer-port=29999 - -spring.dynamic.thread-pool.monitor.initial-delay=3000 -spring.dynamic.thread-pool.monitor.collect-interval=3000 -spring.dynamic.thread-pool.notify-platforms[0].platform=LARK -spring.dynamic.thread-pool.notify-platforms[0].token=6de41bdc-0799-45be-b128-7cddb9e777f0 -#spring.dynamic.thread-pool.notify-platforms[1].platform=WECHAT -#spring.dynamic.thread-pool.notify-platforms[1].token=ac0426a5-c712-474c-9bff-72b8b8f5caff -#spring.dynamic.thread-pool.notify-platforms[2].platform=DING -#spring.dynamic.thread-pool.notify-platforms[2].token=56417ebba6a27ca352f0de77a2ae9da66d01f39610b5ee8a6033c60ef9071c55 - -spring.dynamic.thread-pool.nacos.data-id=dynamic-threadpool-example-config-boot3 -spring.dynamic.thread-pool.nacos.group=DEFAULT_GROUP -spring.dynamic.thread-pool.nacos.namespace=public - -spring.dynamic.thread-pool.config-file-type=properties - -spring.dynamic.thread-pool.executors[0].thread-name-prefix = DynamicThreadPoolConfig#FIELD1 -spring.dynamic.thread-pool.executors[0].core-pool-size = 2 -spring.dynamic.thread-pool.executors[0].thread-pool-id =cn.hippo4j.example.agent.config.nacos.v3.ThreadPoolConfigurationBootV3#AGENT_RUN_MESSAGE_SEND_TASK_EXECUTOR -spring.dynamic.thread-pool.executors[0].maximum-pool-size = 20 -spring.dynamic.thread-pool.executors[0].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[0].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out = 800 -spring.dynamic.thread-pool.executors[0].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[0].alarm = true -spring.dynamic.thread-pool.executors[0].active-alarm = 80 -spring.dynamic.thread-pool.executors[0].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[0].notify.interval = 8 -spring.dynamic.thread-pool.executors[0].notify.receives = nobodyiam - -spring.dynamic.thread-pool.executors[1].thread-pool-id = runMessageSendTaskExecutor -spring.dynamic.thread-pool.executors[1].thread-name-prefix = runMessageSendTaskExecutor -spring.dynamic.thread-pool.executors[1].core-pool-size = 3 -spring.dynamic.thread-pool.executors[1].maximum-pool-size = 4 -spring.dynamic.thread-pool.executors[1].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[1].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out = 800 -spring.dynamic.thread-pool.executors[1].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[1].active-alarm = 80 -spring.dynamic.thread-pool.executors[1].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[1].notify.interval = 8 -spring.dynamic.thread-pool.executors[1].notify.receives = nobodyiam diff --git a/examples/threadpool-example/agent/pom.xml b/examples/threadpool-example/agent/pom.xml deleted file mode 100644 index 305226ba..00000000 --- a/examples/threadpool-example/agent/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-example - ${revision} - - - hippo4j-threadpool-agent-example - pom - - - true - - - - config-apollo - config-nacos - agent-example-core - config-nacos-spring-boot-1x - config-apollo-spring-boot-1x - - - - \ No newline at end of file diff --git a/examples/threadpool-example/config/config-apollo-spring-boot-1x/pom.xml b/examples/threadpool-example/config/config-apollo-spring-boot-1x/pom.xml deleted file mode 100644 index ba45ae88..00000000 --- a/examples/threadpool-example/config/config-apollo-spring-boot-1x/pom.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-config-mode-example - ${revision} - - hippo4j-threadpool-config-apollo-spring-boot-1x-example - - - true - 1.5.22.RELEASE - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - - cn.hippo4j - hippo4j-threadpool-config-spring-boot-1x-starter - ${revision} - - - - com.ctrip.framework.apollo - apollo-client - - - - org.slf4j - slf4j-api - 1.7.21 - - - - org.springframework.cloud - spring-cloud-context - 1.3.6.RELEASE - - - - org.springframework.boot - spring-boot-starter-actuator - - - - io.micrometer - micrometer-registry-prometheus - 1.1.3 - - - - io.micrometer - micrometer-spring-legacy - 1.1.3 - - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - diff --git a/examples/threadpool-example/config/config-apollo-spring-boot-1x/src/main/java/cn/hippo4j/example/config/apollo/ConfigApolloSpringBoot1xExampleApplication.java b/examples/threadpool-example/config/config-apollo-spring-boot-1x/src/main/java/cn/hippo4j/example/config/apollo/ConfigApolloSpringBoot1xExampleApplication.java deleted file mode 100644 index 7c80e2b5..00000000 --- a/examples/threadpool-example/config/config-apollo-spring-boot-1x/src/main/java/cn/hippo4j/example/config/apollo/ConfigApolloSpringBoot1xExampleApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.config.apollo; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Config apollo spring boot 1x example application - */ -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = "cn.hippo4j.example.core") -public class ConfigApolloSpringBoot1xExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ConfigApolloSpringBoot1xExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/config/config-apollo-spring-boot-1x/src/main/resources/apollo-config-agent.properties b/examples/threadpool-example/config/config-apollo-spring-boot-1x/src/main/resources/apollo-config-agent.properties deleted file mode 100644 index fd5ef431..00000000 --- a/examples/threadpool-example/config/config-apollo-spring-boot-1x/src/main/resources/apollo-config-agent.properties +++ /dev/null @@ -1,85 +0,0 @@ -# Copy the following to the apollo configuration file - -spring.dynamic.thread-pool.web.core-pool-size=64 -spring.dynamic.thread-pool.web.maximum-pool-size=128 -spring.dynamic.thread-pool.web.keep-alive-time=1000 -spring.dynamic.thread-pool.web.enable=true -spring.dynamic.thread-pool.default-executor.core-pool-size=1 -spring.dynamic.thread-pool.default-executor.maximum-pool-size=2 -spring.dynamic.thread-pool.default-executor.blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.default-executor.execute-time-out=100 -spring.dynamic.thread-pool.default-executor.keep-alive-time=6691 -spring.dynamic.thread-pool.default-executor.queue-capacity=1 -spring.dynamic.thread-pool.default-executor.rejected-handler=AbortPolicy -spring.dynamic.thread-pool.default-executor.active-alarm=90 -spring.dynamic.thread-pool.default-executor.capacity-alarm=85 -spring.dynamic.thread-pool.default-executor.alarm=true -spring.dynamic.thread-pool.default-executor.allow-core-thread-time-out=true -spring.dynamic.thread-pool.default-executor.notify.interval=5 -spring.dynamic.thread-pool.default-executor.notify.receives=hippo4j -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].secret-key=ec3be378-6c99-45d2-a147-b400c7e94a08 - -spring.dynamic.thread-pool.executors[0].thread-pool-id = cn.hippo4j.example.core.config.DynamicThreadPoolConfig#FIELD1 -spring.dynamic.thread-pool.executors[0].thread-name-prefix = DynamicThreadPoolConfig#FIELD1 -spring.dynamic.thread-pool.executors[0].core-pool-size = 2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size = 50 -spring.dynamic.thread-pool.executors[0].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[0].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out = 800 -spring.dynamic.thread-pool.executors[0].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[0].alarm = true -spring.dynamic.thread-pool.executors[0].active-alarm = 80 -spring.dynamic.thread-pool.executors[0].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[0].notify.interval = 8 -spring.dynamic.thread-pool.executors[0].notify.receives = hippo4j - -spring.dynamic.thread-pool.executors[1].thread-pool-id = cn.hippo4j.example.core.config.DynamicThreadPoolConfig#FIELD1 -spring.dynamic.thread-pool.executors[1].thread-name-prefix = DynamicThreadPoolConfig#FIELD2 -spring.dynamic.thread-pool.executors[1].core-pool-size = 2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size = 50 -spring.dynamic.thread-pool.executors[1].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[1].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out = 800 -spring.dynamic.thread-pool.executors[1].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[1].alarm = true -spring.dynamic.thread-pool.executors[1].active-alarm = 80 -spring.dynamic.thread-pool.executors[1].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[1].notify.interval = 8 -spring.dynamic.thread-pool.executors[1].notify.receives = hippo4j - -spring.dynamic.thread-pool.executors[2].thread-pool-id = messageConsumeTtlDynamicThreadPool -spring.dynamic.thread-pool.executors[2].thread-name-prefix = messageConsumeTtlDynamicThreadPool -spring.dynamic.thread-pool.executors[2].core-pool-size = 2 -spring.dynamic.thread-pool.executors[2].maximum-pool-size = 50 -spring.dynamic.thread-pool.executors[2].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[2].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[2].execute-time-out = 800 -spring.dynamic.thread-pool.executors[2].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[2].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[2].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[2].alarm = true -spring.dynamic.thread-pool.executors[2].active-alarm = 80 -spring.dynamic.thread-pool.executors[2].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[2].notify.interval = 8 -spring.dynamic.thread-pool.executors[2].notify.receives = hippo4j - -spring.dynamic.thread-pool.executors[3].thread-pool-id = messageProduceDynamicThreadPool -spring.dynamic.thread-pool.executors[3].thread-name-prefix = messageProduceDynamicThreadPool -spring.dynamic.thread-pool.executors[3].core-pool-size = 2 -spring.dynamic.thread-pool.executors[3].maximum-pool-size = 50 -spring.dynamic.thread-pool.executors[3].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[3].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[3].execute-time-out = 800 -spring.dynamic.thread-pool.executors[3].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[3].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[3].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[3].alarm = true -spring.dynamic.thread-pool.executors[3].active-alarm = 80 -spring.dynamic.thread-pool.executors[3].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[3].notify.interval = 8 -spring.dynamic.thread-pool.executors[3].notify.receives = hippo4j diff --git a/examples/threadpool-example/config/config-apollo-spring-boot-1x/src/main/resources/apollo-config.properties b/examples/threadpool-example/config/config-apollo-spring-boot-1x/src/main/resources/apollo-config.properties deleted file mode 100644 index 2edf88f4..00000000 --- a/examples/threadpool-example/config/config-apollo-spring-boot-1x/src/main/resources/apollo-config.properties +++ /dev/null @@ -1,51 +0,0 @@ -# Copy the following to the apollo configuration file - -spring.dynamic.thread-pool.web.core-pool-size=64 -spring.dynamic.thread-pool.web.maximum-pool-size=128 -spring.dynamic.thread-pool.web.keep-alive-time=1000 -spring.dynamic.thread-pool.web.enable=true -spring.dynamic.thread-pool.default-executor.core-pool-size=1 -spring.dynamic.thread-pool.default-executor.maximum-pool-size=2 -spring.dynamic.thread-pool.default-executor.blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.default-executor.execute-time-out=100 -spring.dynamic.thread-pool.default-executor.keep-alive-time=6691 -spring.dynamic.thread-pool.default-executor.queue-capacity=1 -spring.dynamic.thread-pool.default-executor.rejected-handler=AbortPolicy -spring.dynamic.thread-pool.default-executor.active-alarm=90 -spring.dynamic.thread-pool.default-executor.capacity-alarm=85 -spring.dynamic.thread-pool.default-executor.alarm=true -spring.dynamic.thread-pool.default-executor.allow-core-thread-time-out=true -spring.dynamic.thread-pool.default-executor.notify.interval=5 -spring.dynamic.thread-pool.default-executor.notify.receives=chen.ma -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].secret-key=ec3be378-6c99-45d2-a147-b400c7e94a08 -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[0].thread-name-prefix=message-consume -spring.dynamic.thread-pool.executors[0].core-pool-size=2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[0].queue-capacity=1024 -spring.dynamic.thread-pool.executors[0].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out=800 -spring.dynamic.thread-pool.executors[0].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].active-alarm=80 -spring.dynamic.thread-pool.executors[0].capacity-alarm=80 -spring.dynamic.thread-pool.executors[0].notify.interval=8 -spring.dynamic.thread-pool.executors[0].notify.receives=chen.ma -spring.dynamic.thread-pool.executors[1].thread-pool-id=message-produce -spring.dynamic.thread-pool.executors[1].thread-name-prefix=message-produce -spring.dynamic.thread-pool.executors[1].core-pool-size=2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[1].queue-capacity=1024 -spring.dynamic.thread-pool.executors[1].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out=800 -spring.dynamic.thread-pool.executors[1].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[1].alarm=true -spring.dynamic.thread-pool.executors[1].active-alarm=80 -spring.dynamic.thread-pool.executors[1].capacity-alarm=80 -spring.dynamic.thread-pool.executors[1].notify.interval=8 -spring.dynamic.thread-pool.executors[1].notify.receives=chen.ma diff --git a/examples/threadpool-example/config/config-apollo-spring-boot-1x/src/main/resources/bootstrap.properties b/examples/threadpool-example/config/config-apollo-spring-boot-1x/src/main/resources/bootstrap.properties deleted file mode 100644 index 59d303c4..00000000 --- a/examples/threadpool-example/config/config-apollo-spring-boot-1x/src/main/resources/bootstrap.properties +++ /dev/null @@ -1,64 +0,0 @@ -server.port=8091 -server.servlet.context-path=/example - -app.id=dynamic-threadpool-example -apollo.meta=http://127.0.0.1:8080 -apollo.autoUpdateInjectedSpringProperties=true -apollo.bootstrap.enabled=true -apollo.bootstrap.namespaces=application -apollo.bootstrap.eagerLoad.enabled=true -# If you have problems starting, add VM parameters: -Denv=dev -Dapollo.configService=http://127.0.0.1:8080 -env=dev -apollo.configService=http://127.0.0.1:8080 - -spring.profiles.active=dev -spring.application.name=hippo4j-config-apollo-spring-boot-1x-starter-example - -management.security.enabled=false -management.context-path=/actuator - -spring.dynamic.thread-pool.enable=true -spring.dynamic.thread-pool.banner=true -spring.dynamic.thread-pool.check-state-interval=5 -spring.dynamic.thread-pool.monitor.enable=true -spring.dynamic.thread-pool.monitor.collect-types=micrometer -spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic,web -spring.dynamic.thread-pool.monitor.initial-delay=10000 -spring.dynamic.thread-pool.monitor.collect-interval=5000 - -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].token=ac0426a5-c712-474c-9bff-72b8b8f5caff - -spring.dynamic.thread-pool.apollo.namespace=application -spring.dynamic.thread-pool.config-file-type=properties - -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[0].thread-name-prefix=message-consume -spring.dynamic.thread-pool.executors[0].core-pool-size=2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[0].queue-capacity=1024 -spring.dynamic.thread-pool.executors[0].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out=800 -spring.dynamic.thread-pool.executors[0].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].active-alarm=80 -spring.dynamic.thread-pool.executors[0].capacity-alarm=80 -spring.dynamic.thread-pool.executors[0].notify.interval=8 -spring.dynamic.thread-pool.executors[0].notify.receives=chen.ma -spring.dynamic.thread-pool.executors[1].thread-pool-id=message-produce -spring.dynamic.thread-pool.executors[1].thread-name-prefix=message-produce -spring.dynamic.thread-pool.executors[1].core-pool-size=2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[1].queue-capacity=1024 -spring.dynamic.thread-pool.executors[1].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out=800 -spring.dynamic.thread-pool.executors[1].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[1].alarm=true -spring.dynamic.thread-pool.executors[1].active-alarm=80 -spring.dynamic.thread-pool.executors[1].capacity-alarm=80 -spring.dynamic.thread-pool.executors[1].notify.interval=8 -spring.dynamic.thread-pool.executors[1].notify.receives=chen.ma diff --git a/examples/threadpool-example/config/config-apollo/pom.xml b/examples/threadpool-example/config/config-apollo/pom.xml deleted file mode 100644 index 416918d1..00000000 --- a/examples/threadpool-example/config/config-apollo/pom.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-config-mode-example - ${revision} - - hippo4j-threadpool-config-apollo-example - - - true - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - - cn.hippo4j - hippo4j-threadpool-config-spring-boot-starter - ${revision} - - - - com.ctrip.framework.apollo - apollo-client - - - - org.springframework.cloud - spring-cloud-context - 2.2.5.RELEASE - - - - org.slf4j - slf4j-api - 1.7.21 - - - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - diff --git a/examples/threadpool-example/config/config-apollo/src/main/java/cn/hippo4j/example/config/apollo/ConfigApolloExampleApplication.java b/examples/threadpool-example/config/config-apollo/src/main/java/cn/hippo4j/example/config/apollo/ConfigApolloExampleApplication.java deleted file mode 100644 index 7fd9d1b3..00000000 --- a/examples/threadpool-example/config/config-apollo/src/main/java/cn/hippo4j/example/config/apollo/ConfigApolloExampleApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.config.apollo; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Config apollo example application - */ -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = "cn.hippo4j.example.core") -public class ConfigApolloExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ConfigApolloExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/config/config-apollo/src/main/resources/apollo-config-agent.properties b/examples/threadpool-example/config/config-apollo/src/main/resources/apollo-config-agent.properties deleted file mode 100644 index fd5ef431..00000000 --- a/examples/threadpool-example/config/config-apollo/src/main/resources/apollo-config-agent.properties +++ /dev/null @@ -1,85 +0,0 @@ -# Copy the following to the apollo configuration file - -spring.dynamic.thread-pool.web.core-pool-size=64 -spring.dynamic.thread-pool.web.maximum-pool-size=128 -spring.dynamic.thread-pool.web.keep-alive-time=1000 -spring.dynamic.thread-pool.web.enable=true -spring.dynamic.thread-pool.default-executor.core-pool-size=1 -spring.dynamic.thread-pool.default-executor.maximum-pool-size=2 -spring.dynamic.thread-pool.default-executor.blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.default-executor.execute-time-out=100 -spring.dynamic.thread-pool.default-executor.keep-alive-time=6691 -spring.dynamic.thread-pool.default-executor.queue-capacity=1 -spring.dynamic.thread-pool.default-executor.rejected-handler=AbortPolicy -spring.dynamic.thread-pool.default-executor.active-alarm=90 -spring.dynamic.thread-pool.default-executor.capacity-alarm=85 -spring.dynamic.thread-pool.default-executor.alarm=true -spring.dynamic.thread-pool.default-executor.allow-core-thread-time-out=true -spring.dynamic.thread-pool.default-executor.notify.interval=5 -spring.dynamic.thread-pool.default-executor.notify.receives=hippo4j -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].secret-key=ec3be378-6c99-45d2-a147-b400c7e94a08 - -spring.dynamic.thread-pool.executors[0].thread-pool-id = cn.hippo4j.example.core.config.DynamicThreadPoolConfig#FIELD1 -spring.dynamic.thread-pool.executors[0].thread-name-prefix = DynamicThreadPoolConfig#FIELD1 -spring.dynamic.thread-pool.executors[0].core-pool-size = 2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size = 50 -spring.dynamic.thread-pool.executors[0].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[0].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out = 800 -spring.dynamic.thread-pool.executors[0].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[0].alarm = true -spring.dynamic.thread-pool.executors[0].active-alarm = 80 -spring.dynamic.thread-pool.executors[0].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[0].notify.interval = 8 -spring.dynamic.thread-pool.executors[0].notify.receives = hippo4j - -spring.dynamic.thread-pool.executors[1].thread-pool-id = cn.hippo4j.example.core.config.DynamicThreadPoolConfig#FIELD1 -spring.dynamic.thread-pool.executors[1].thread-name-prefix = DynamicThreadPoolConfig#FIELD2 -spring.dynamic.thread-pool.executors[1].core-pool-size = 2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size = 50 -spring.dynamic.thread-pool.executors[1].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[1].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out = 800 -spring.dynamic.thread-pool.executors[1].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[1].alarm = true -spring.dynamic.thread-pool.executors[1].active-alarm = 80 -spring.dynamic.thread-pool.executors[1].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[1].notify.interval = 8 -spring.dynamic.thread-pool.executors[1].notify.receives = hippo4j - -spring.dynamic.thread-pool.executors[2].thread-pool-id = messageConsumeTtlDynamicThreadPool -spring.dynamic.thread-pool.executors[2].thread-name-prefix = messageConsumeTtlDynamicThreadPool -spring.dynamic.thread-pool.executors[2].core-pool-size = 2 -spring.dynamic.thread-pool.executors[2].maximum-pool-size = 50 -spring.dynamic.thread-pool.executors[2].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[2].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[2].execute-time-out = 800 -spring.dynamic.thread-pool.executors[2].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[2].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[2].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[2].alarm = true -spring.dynamic.thread-pool.executors[2].active-alarm = 80 -spring.dynamic.thread-pool.executors[2].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[2].notify.interval = 8 -spring.dynamic.thread-pool.executors[2].notify.receives = hippo4j - -spring.dynamic.thread-pool.executors[3].thread-pool-id = messageProduceDynamicThreadPool -spring.dynamic.thread-pool.executors[3].thread-name-prefix = messageProduceDynamicThreadPool -spring.dynamic.thread-pool.executors[3].core-pool-size = 2 -spring.dynamic.thread-pool.executors[3].maximum-pool-size = 50 -spring.dynamic.thread-pool.executors[3].queue-capacity = 1024 -spring.dynamic.thread-pool.executors[3].blocking-queue = ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[3].execute-time-out = 800 -spring.dynamic.thread-pool.executors[3].rejected-handler = AbortPolicy -spring.dynamic.thread-pool.executors[3].keep-alive-time = 6691 -spring.dynamic.thread-pool.executors[3].allow-core-thread-time-out = true -spring.dynamic.thread-pool.executors[3].alarm = true -spring.dynamic.thread-pool.executors[3].active-alarm = 80 -spring.dynamic.thread-pool.executors[3].capacity-alarm = 80 -spring.dynamic.thread-pool.executors[3].notify.interval = 8 -spring.dynamic.thread-pool.executors[3].notify.receives = hippo4j diff --git a/examples/threadpool-example/config/config-apollo/src/main/resources/apollo-config.properties b/examples/threadpool-example/config/config-apollo/src/main/resources/apollo-config.properties deleted file mode 100644 index 747fef07..00000000 --- a/examples/threadpool-example/config/config-apollo/src/main/resources/apollo-config.properties +++ /dev/null @@ -1,51 +0,0 @@ -# Copy the following to the apollo configuration file - -spring.dynamic.thread-pool.web.core-pool-size=64 -spring.dynamic.thread-pool.web.maximum-pool-size=128 -spring.dynamic.thread-pool.web.keep-alive-time=1000 -spring.dynamic.thread-pool.web.enable=true -spring.dynamic.thread-pool.default-executor.core-pool-size=1 -spring.dynamic.thread-pool.default-executor.maximum-pool-size=2 -spring.dynamic.thread-pool.default-executor.blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.default-executor.execute-time-out=100 -spring.dynamic.thread-pool.default-executor.keep-alive-time=6691 -spring.dynamic.thread-pool.default-executor.queue-capacity=1 -spring.dynamic.thread-pool.default-executor.rejected-handler=AbortPolicy -spring.dynamic.thread-pool.default-executor.active-alarm=90 -spring.dynamic.thread-pool.default-executor.capacity-alarm=85 -spring.dynamic.thread-pool.default-executor.alarm=true -spring.dynamic.thread-pool.default-executor.allow-core-thread-time-out=true -spring.dynamic.thread-pool.default-executor.notify.interval=5 -spring.dynamic.thread-pool.default-executor.notify.receives=chen.ma -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].secret-key=ec3be378-6c99-45d2-a147-b400c7e94a08 -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[0].thread-name-prefix=message-consume -spring.dynamic.thread-pool.executors[0].core-pool-size=2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[0].queue-capacity=1024 -spring.dynamic.thread-pool.executors[0].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out=800 -spring.dynamic.thread-pool.executors[0].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].active-alarm=80 -spring.dynamic.thread-pool.executors[0].capacity-alarm=80 -spring.dynamic.thread-pool.executors[0].notify.interval=8 -spring.dynamic.thread-pool.executors[0].notify.receives=chen.ma -spring.dynamic.thread-pool.executors[1].thread-pool-id=message-produce -spring.dynamic.thread-pool.executors[1].thread-name-prefix=message-produce -spring.dynamic.thread-pool.executors[1].core-pool-size=2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[1].queue-capacity=1024 -spring.dynamic.thread-pool.executors[1].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out=800 -spring.dynamic.thread-pool.executors[1].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[1].alarm=true -spring.dynamic.thread-pool.executors[1].active-alarm=80 -spring.dynamic.thread-pool.executors[1].capacity-alarm=80 -spring.dynamic.thread-pool.executors[1].notify.interval=8 -spring.dynamic.thread-pool.executors[1].notify.receives=chen.ma \ No newline at end of file diff --git a/examples/threadpool-example/config/config-apollo/src/main/resources/bootstrap.properties b/examples/threadpool-example/config/config-apollo/src/main/resources/bootstrap.properties deleted file mode 100644 index 933209fd..00000000 --- a/examples/threadpool-example/config/config-apollo/src/main/resources/bootstrap.properties +++ /dev/null @@ -1,69 +0,0 @@ -server.port=8091 -server.servlet.context-path=/example - -app.id=dynamic-threadpool-example -apollo.meta=http://127.0.0.1:8080 -apollo.autoUpdateInjectedSpringProperties=true -apollo.bootstrap.enabled=true -apollo.bootstrap.namespaces=application -apollo.bootstrap.eagerLoad.enabled=true -# The following parameters are used for testing -env=dev -apollo.configService=http://127.0.0.1:8080 - -spring.profiles.active=dev -spring.application.name=hippo4j-config-apollo-spring-boot-starter-example - -management.metrics.export.prometheus.enabled=true -management.server.port=29998 -management.endpoints.web.exposure.include=* - -spring.dynamic.thread-pool.enable=true -spring.dynamic.thread-pool.banner=true -spring.dynamic.thread-pool.check-state-interval=3 -spring.dynamic.thread-pool.monitor.enable=true -spring.dynamic.thread-pool.monitor.collect-types=micrometer -spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic,web -spring.dynamic.thread-pool.monitor.initial-delay=10000 -spring.dynamic.thread-pool.monitor.collect-interval=5000 - -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].token=ac0426a5-c712-474c-9bff-72b8b8f5caff -spring.dynamic.thread-pool.notify-platforms[1].platform=DING -spring.dynamic.thread-pool.notify-platforms[1].token=56417ebba6a27ca352f0de77a2ae9da66d01f39610b5ee8a6033c60ef9071c55 -spring.dynamic.thread-pool.notify-platforms[2].platform=LARK -spring.dynamic.thread-pool.notify-platforms[2].token=2cbf2808-3839-4c26-a04d-fd201dd51f9e - -spring.dynamic.thread-pool.apollo.namespace=application -spring.dynamic.thread-pool.config-file-type=properties - -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[0].thread-name-prefix=message-consume -spring.dynamic.thread-pool.executors[0].core-pool-size=2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[0].queue-capacity=1024 -spring.dynamic.thread-pool.executors[0].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out=800 -spring.dynamic.thread-pool.executors[0].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].active-alarm=80 -spring.dynamic.thread-pool.executors[0].capacity-alarm=80 -spring.dynamic.thread-pool.executors[0].notify.interval=8 -spring.dynamic.thread-pool.executors[0].notify.receives=chen.ma -spring.dynamic.thread-pool.executors[1].thread-pool-id=message-produce -spring.dynamic.thread-pool.executors[1].thread-name-prefix=message-produce -spring.dynamic.thread-pool.executors[1].core-pool-size=2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[1].queue-capacity=1024 -spring.dynamic.thread-pool.executors[1].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out=800 -spring.dynamic.thread-pool.executors[1].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[1].alarm=true -spring.dynamic.thread-pool.executors[1].active-alarm=80 -spring.dynamic.thread-pool.executors[1].capacity-alarm=80 -spring.dynamic.thread-pool.executors[1].notify.interval=8 -spring.dynamic.thread-pool.executors[1].notify.receives=chen.ma diff --git a/examples/threadpool-example/config/config-consul-spring-boot/pom.xml b/examples/threadpool-example/config/config-consul-spring-boot/pom.xml deleted file mode 100644 index 30444598..00000000 --- a/examples/threadpool-example/config/config-consul-spring-boot/pom.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-config-mode-example - ${revision} - - hippo4j-threadpool-config-consul-example - - - true - - - - - org.springframework.boot - spring-boot-starter-web - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - cn.hippo4j - hippo4j-threadpool-config-spring-boot-starter - ${revision} - - - org.springframework.cloud - spring-cloud-starter-consul-config - - - io.micrometer - micrometer-registry-prometheus - - - org.springframework.boot - spring-boot-starter-actuator - - - diff --git a/examples/threadpool-example/config/config-consul-spring-boot/src/main/java/cn/hippo4j/example/config/consul/ConfigConsulExampleApplication.java b/examples/threadpool-example/config/config-consul-spring-boot/src/main/java/cn/hippo4j/example/config/consul/ConfigConsulExampleApplication.java deleted file mode 100644 index e1519933..00000000 --- a/examples/threadpool-example/config/config-consul-spring-boot/src/main/java/cn/hippo4j/example/config/consul/ConfigConsulExampleApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.config.consul; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Config consul example application - */ -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = "cn.hippo4j.example") -public class ConfigConsulExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ConfigConsulExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/config/config-consul-spring-boot/src/main/resources/bootstrap.yml b/examples/threadpool-example/config/config-consul-spring-boot/src/main/resources/bootstrap.yml deleted file mode 100644 index 12d353de..00000000 --- a/examples/threadpool-example/config/config-consul-spring-boot/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,18 +0,0 @@ -server: - port: 8091 - -spring: - application: - name: hippo4j-config-consul-spring-boot-starter-example - profiles: - active: dev - cloud: - consul: - host: 127.0.0.1 - port: 8500 - config: - enabled: true - format: yaml - data-key: hippo4j-consul - default-context: application - prefix: config diff --git a/examples/threadpool-example/config/config-consul-spring-boot/src/main/resources/consul-config.properties b/examples/threadpool-example/config/config-consul-spring-boot/src/main/resources/consul-config.properties deleted file mode 100644 index 83e2d9f9..00000000 --- a/examples/threadpool-example/config/config-consul-spring-boot/src/main/resources/consul-config.properties +++ /dev/null @@ -1,52 +0,0 @@ -# 以下内容复制到 consul 配置文件中 -# Copy the following to the consul configuration file - -spring.dynamic.thread-pool.web.core-pool-size=64 -spring.dynamic.thread-pool.web.maximum-pool-size=128 -spring.dynamic.thread-pool.web.keep-alive-time=1000 -spring.dynamic.thread-pool.web.enable=true -spring.dynamic.thread-pool.default-executor.core-pool-size=1 -spring.dynamic.thread-pool.default-executor.maximum-pool-size=2 -spring.dynamic.thread-pool.default-executor.blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.default-executor.execute-time-out=100 -spring.dynamic.thread-pool.default-executor.keep-alive-time=6691 -spring.dynamic.thread-pool.default-executor.queue-capacity=1 -spring.dynamic.thread-pool.default-executor.rejected-handler=AbortPolicy -spring.dynamic.thread-pool.default-executor.active-alarm=90 -spring.dynamic.thread-pool.default-executor.capacity-alarm=85 -spring.dynamic.thread-pool.default-executor.alarm=true -spring.dynamic.thread-pool.default-executor.allow-core-thread-time-out=true -spring.dynamic.thread-pool.default-executor.notify.interval=5 -spring.dynamic.thread-pool.default-executor.notify.receives=chen.ma -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].secret-key=ec3be378-6c99-45d2-a147-b400c7e94a08 -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[0].thread-name-prefix=message-consume -spring.dynamic.thread-pool.executors[0].core-pool-size=2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[0].queue-capacity=1024 -spring.dynamic.thread-pool.executors[0].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out=800 -spring.dynamic.thread-pool.executors[0].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].active-alarm=80 -spring.dynamic.thread-pool.executors[0].capacity-alarm=80 -spring.dynamic.thread-pool.executors[0].notify.interval=8 -spring.dynamic.thread-pool.executors[0].notify.receives=chen.ma -spring.dynamic.thread-pool.executors[1].thread-pool-id=message-produce -spring.dynamic.thread-pool.executors[1].thread-name-prefix=message-produce -spring.dynamic.thread-pool.executors[1].core-pool-size=2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[1].queue-capacity=1024 -spring.dynamic.thread-pool.executors[1].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out=800 -spring.dynamic.thread-pool.executors[1].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[1].alarm=true -spring.dynamic.thread-pool.executors[1].active-alarm=80 -spring.dynamic.thread-pool.executors[1].capacity-alarm=80 -spring.dynamic.thread-pool.executors[1].notify.interval=8 -spring.dynamic.thread-pool.executors[1].notify.receives=chen.ma diff --git a/examples/threadpool-example/config/config-etcd/pom.xml b/examples/threadpool-example/config/config-etcd/pom.xml deleted file mode 100644 index 5b015134..00000000 --- a/examples/threadpool-example/config/config-etcd/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-config-mode-example - ${revision} - - hippo4j-threadpool-config-etcd-example - - - 11 - 11 - true - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-logging - - - - cn.hippo4j - hippo4j-threadpool-config-spring-boot-starter - ${revision} - - - - io.etcd - jetcd-core - - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - diff --git a/examples/threadpool-example/config/config-etcd/src/main/java/cn/hippo4j/example/config/etcd/ConfigEtcdExampleApplication.java b/examples/threadpool-example/config/config-etcd/src/main/java/cn/hippo4j/example/config/etcd/ConfigEtcdExampleApplication.java deleted file mode 100644 index 3d670e1b..00000000 --- a/examples/threadpool-example/config/config-etcd/src/main/java/cn/hippo4j/example/config/etcd/ConfigEtcdExampleApplication.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.config.etcd; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * @author : wh - * @date : 2022/9/2 19:06 - * @description: - */ -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = "cn.hippo4j.example.config") -public class ConfigEtcdExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ConfigEtcdExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/config/config-etcd/src/main/java/cn/hippo4j/example/config/etcd/config/ThreadPoolConfig.java b/examples/threadpool-example/config/config-etcd/src/main/java/cn/hippo4j/example/config/etcd/config/ThreadPoolConfig.java deleted file mode 100644 index f1523946..00000000 --- a/examples/threadpool-example/config/config-etcd/src/main/java/cn/hippo4j/example/config/etcd/config/ThreadPoolConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.config.etcd.config; - -import java.util.concurrent.ThreadPoolExecutor; - -import cn.hippo4j.core.executor.SpringDynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; - -import org.springframework.context.annotation.Configuration; - -/** - * @author : wh - * @date : 2022/9/2 19:26 - * @description: - */ -@Configuration -public class ThreadPoolConfig { - - @SpringDynamicThreadPool - public ThreadPoolExecutor messageConsumeDynamicExecutor() { - String threadPoolId = "message-consume"; - return ThreadPoolBuilder.buildDynamicPoolById(threadPoolId); - } -} diff --git a/examples/threadpool-example/config/config-etcd/src/main/java/cn/hippo4j/example/config/etcd/controller/TestController.java b/examples/threadpool-example/config/config-etcd/src/main/java/cn/hippo4j/example/config/etcd/controller/TestController.java deleted file mode 100644 index 28646f5b..00000000 --- a/examples/threadpool-example/config/config-etcd/src/main/java/cn/hippo4j/example/config/etcd/controller/TestController.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.config.etcd.controller; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.concurrent.ThreadPoolExecutor; - -/** - * @author : wh - * @date : 2022/9/2 19:18 - * @description: - */ -@Slf4j -@RestController -@RequestMapping -public class TestController { - - @Autowired - private ThreadPoolExecutor messageConsumeDynamicExecutor; - - @GetMapping("test") - public void test() { - log.info(String.valueOf(messageConsumeDynamicExecutor.getMaximumPoolSize())); - } -} diff --git a/examples/threadpool-example/config/config-etcd/src/main/resources/application.properties b/examples/threadpool-example/config/config-etcd/src/main/resources/application.properties deleted file mode 100644 index da15b7df..00000000 --- a/examples/threadpool-example/config/config-etcd/src/main/resources/application.properties +++ /dev/null @@ -1,39 +0,0 @@ -server.port=8888 - -spring.application.name=etcd -spring.dynamic.thread-pool.etcd.endpoints= http://127.0.0.1:2379 -spring.dynamic.thread-pool.etcd.key= /thread - -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[0].thread-name-prefix=message-consume -spring.dynamic.thread-pool.executors[0].core-pool-size=2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[0].queue-capacity=1024 -spring.dynamic.thread-pool.executors[0].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out=800 -spring.dynamic.thread-pool.executors[0].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].active-alarm=80 -spring.dynamic.thread-pool.executors[0].capacity-alarm=80 -spring.dynamic.thread-pool.executors[0].notify.interval=8 -spring.dynamic.thread-pool.executors[0].notify.receives=chen.ma -spring.dynamic.thread-pool.executors[1].thread-pool-id=message-produce -spring.dynamic.thread-pool.executors[1].thread-name-prefix=message-produce -spring.dynamic.thread-pool.executors[1].core-pool-size=2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[1].queue-capacity=1024 -spring.dynamic.thread-pool.executors[1].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out=800 -spring.dynamic.thread-pool.executors[1].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[1].alarm=true -spring.dynamic.thread-pool.executors[1].active-alarm=80 -spring.dynamic.thread-pool.executors[1].capacity-alarm=80 -spring.dynamic.thread-pool.executors[1].notify.interval=8 -spring.dynamic.thread-pool.executors[1].notify.receives=chen.ma - -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].token=ac0426a5-c712-474c-9bff-72b8b8f5caff diff --git a/examples/threadpool-example/config/config-etcd/src/main/resources/etcd-config.properties b/examples/threadpool-example/config/config-etcd/src/main/resources/etcd-config.properties deleted file mode 100644 index 5387091b..00000000 --- a/examples/threadpool-example/config/config-etcd/src/main/resources/etcd-config.properties +++ /dev/null @@ -1,52 +0,0 @@ -# \u4EE5\u4E0B\u5185\u5BB9\u590D\u5236\u5230 etcd \u914D\u7F6E\u6587\u4EF6\u4E2D -# Copy the following to the etcd configuration file - -spring.dynamic.thread-pool.web.core-pool-size=64 -spring.dynamic.thread-pool.web.maximum-pool-size=128 -spring.dynamic.thread-pool.web.keep-alive-time=1000 -spring.dynamic.thread-pool.web.enable=true -spring.dynamic.thread-pool.default-executor.core-pool-size=1 -spring.dynamic.thread-pool.default-executor.maximum-pool-size=2 -spring.dynamic.thread-pool.default-executor.blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.default-executor.execute-time-out=100 -spring.dynamic.thread-pool.default-executor.keep-alive-time=6691 -spring.dynamic.thread-pool.default-executor.queue-capacity=1 -spring.dynamic.thread-pool.default-executor.rejected-handler=AbortPolicy -spring.dynamic.thread-pool.default-executor.active-alarm=90 -spring.dynamic.thread-pool.default-executor.capacity-alarm=85 -spring.dynamic.thread-pool.default-executor.alarm=true -spring.dynamic.thread-pool.default-executor.allow-core-thread-time-out=true -spring.dynamic.thread-pool.default-executor.notify.interval=5 -spring.dynamic.thread-pool.default-executor.notify.receives=chen.ma -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].secret-key=ec3be378-6c99-45d2-a147-b400c7e94a08 -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[0].thread-name-prefix=message-consume -spring.dynamic.thread-pool.executors[0].core-pool-size=2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[0].queue-capacity=1024 -spring.dynamic.thread-pool.executors[0].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out=800 -spring.dynamic.thread-pool.executors[0].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].active-alarm=80 -spring.dynamic.thread-pool.executors[0].capacity-alarm=80 -spring.dynamic.thread-pool.executors[0].notify.interval=8 -spring.dynamic.thread-pool.executors[0].notify.receives=chen.ma -spring.dynamic.thread-pool.executors[1].thread-pool-id=message-produce -spring.dynamic.thread-pool.executors[1].thread-name-prefix=message-produce -spring.dynamic.thread-pool.executors[1].core-pool-size=2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[1].queue-capacity=1024 -spring.dynamic.thread-pool.executors[1].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out=800 -spring.dynamic.thread-pool.executors[1].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[1].alarm=true -spring.dynamic.thread-pool.executors[1].active-alarm=80 -spring.dynamic.thread-pool.executors[1].capacity-alarm=80 -spring.dynamic.thread-pool.executors[1].notify.interval=8 -spring.dynamic.thread-pool.executors[1].notify.receives=chen.ma diff --git a/examples/threadpool-example/config/config-nacos-spring-boot-1x/pom.xml b/examples/threadpool-example/config/config-nacos-spring-boot-1x/pom.xml deleted file mode 100644 index cb1f1810..00000000 --- a/examples/threadpool-example/config/config-nacos-spring-boot-1x/pom.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-config-mode-example - ${revision} - - hippo4j-threadpool-config-nacos-spring-boot-1x - - - true - 1.5.22.RELEASE - 1.1.4 - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - 1.5.1.RELEASE - - - - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - - cn.hippo4j - hippo4j-threadpool-config-spring-boot-1x-starter - ${revision} - - - - org.springframework.boot - spring-boot-starter-actuator - - - - io.micrometer - micrometer-registry-prometheus - 1.1.3 - - - - io.micrometer - micrometer-spring-legacy - 1.1.3 - - - diff --git a/examples/threadpool-example/config/config-nacos-spring-boot-1x/src/main/java/cn/hippo4j/example/config/nacos/ConfigNacosSpringBoot15ExampleApplication.java b/examples/threadpool-example/config/config-nacos-spring-boot-1x/src/main/java/cn/hippo4j/example/config/nacos/ConfigNacosSpringBoot15ExampleApplication.java deleted file mode 100644 index c4f53b6f..00000000 --- a/examples/threadpool-example/config/config-nacos-spring-boot-1x/src/main/java/cn/hippo4j/example/config/nacos/ConfigNacosSpringBoot15ExampleApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.config.nacos; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Config nacos spring boot 1.5 example application - */ -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = "cn.hippo4j.example.core") -public class ConfigNacosSpringBoot15ExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ConfigNacosSpringBoot15ExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/config/config-nacos-spring-boot-1x/src/main/resources/application.properties b/examples/threadpool-example/config/config-nacos-spring-boot-1x/src/main/resources/application.properties deleted file mode 100644 index 2e8be029..00000000 --- a/examples/threadpool-example/config/config-nacos-spring-boot-1x/src/main/resources/application.properties +++ /dev/null @@ -1,66 +0,0 @@ -#debug=true -server.port=8089 -server.servlet.context-path=/example - -management.security.enabled=false -management.context-path=/actuator - -spring.profiles.active=dev -spring.application.name=hippo4j-config-nacos-spring-boot-1x-starter-example - -## nacos spring-boot -nacos.config.server-addr=127.0.0.1:8848 -nacos.config.ext-config[0].data-id=hippo4j-nacos.yaml -nacos.config.ext-config[0].group=DEFAULT_GROUP -nacos.config.ext-config[0].auto-refresh=true - -spring.dynamic.thread-pool.enable=true -spring.dynamic.thread-pool.banner=true -spring.dynamic.thread-pool.check-state-interval=5 -spring.dynamic.thread-pool.monitor.enable=true -spring.dynamic.thread-pool.monitor.collect-types=micrometer -spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic,web -spring.dynamic.thread-pool.monitor.initial-delay=10000 -spring.dynamic.thread-pool.monitor.collect-interval=5000 - -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].token=ac0426a5-c712-474c-9bff-72b8b8f5caff -spring.dynamic.thread-pool.notify-platforms[1].platform=DING -spring.dynamic.thread-pool.notify-platforms[1].token=56417ebba6a27ca352f0de77a2ae9da66d01f39610b5ee8a6033c60ef9071c55 -spring.dynamic.thread-pool.notify-platforms[2].platform=LARK -spring.dynamic.thread-pool.notify-platforms[2].token=2cbf2808-3839-4c26-a04d-fd201dd51f9e - -spring.dynamic.thread-pool.nacos.data-id=hippo4j-nacos.yaml -spring.dynamic.thread-pool.nacos.group=DEFAULT_GROUP -spring.dynamic.thread-pool.config-file-type=yaml - -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[0].thread-name-prefix=message-consume -spring.dynamic.thread-pool.executors[0].core-pool-size=2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[0].queue-capacity=1024 -spring.dynamic.thread-pool.executors[0].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out=800 -spring.dynamic.thread-pool.executors[0].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].active-alarm=80 -spring.dynamic.thread-pool.executors[0].capacity-alarm=80 -spring.dynamic.thread-pool.executors[0].notify.interval=8 -spring.dynamic.thread-pool.executors[0].notify.receives=chen.ma -spring.dynamic.thread-pool.executors[1].thread-pool-id=message-produce -spring.dynamic.thread-pool.executors[1].thread-name-prefix=message-produce -spring.dynamic.thread-pool.executors[1].core-pool-size=2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[1].queue-capacity=1024 -spring.dynamic.thread-pool.executors[1].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out=800 -spring.dynamic.thread-pool.executors[1].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[1].alarm=true -spring.dynamic.thread-pool.executors[1].active-alarm=80 -spring.dynamic.thread-pool.executors[1].capacity-alarm=80 -spring.dynamic.thread-pool.executors[1].notify.interval=8 -spring.dynamic.thread-pool.executors[1].notify.receives=chen.ma diff --git a/examples/threadpool-example/config/config-nacos-spring-boot-1x/src/main/resources/bootstrap.properties b/examples/threadpool-example/config/config-nacos-spring-boot-1x/src/main/resources/bootstrap.properties deleted file mode 100644 index 38a8364b..00000000 --- a/examples/threadpool-example/config/config-nacos-spring-boot-1x/src/main/resources/bootstrap.properties +++ /dev/null @@ -1,66 +0,0 @@ -#debug=true -server.port=8089 -server.servlet.context-path=/example - -management.security.enabled=false -management.context-path=/actuator - -spring.profiles.active=dev -spring.application.name=hippo4j-config-nacos-spring-boot-1x-starter-example - -# nacos spring-cloud -spring.cloud.nacos.config.server-addr=127.0.0.1:8848 -spring.cloud.nacos.config.ext-config[0].data-id=hippo4j-nacos.yaml -spring.cloud.nacos.config.ext-config[0].group=DEFAULT_GROUP -spring.cloud.nacos.config.ext-config[0].refresh=true - -spring.dynamic.thread-pool.enable=true -spring.dynamic.thread-pool.banner=true -spring.dynamic.thread-pool.check-state-interval=5 -spring.dynamic.thread-pool.monitor.enable=true -spring.dynamic.thread-pool.monitor.collect-types=micrometer -spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic,web -spring.dynamic.thread-pool.monitor.initial-delay=10000 -spring.dynamic.thread-pool.monitor.collect-interval=5000 - -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].token=ac0426a5-c712-474c-9bff-72b8b8f5caff -spring.dynamic.thread-pool.notify-platforms[1].platform=DING -spring.dynamic.thread-pool.notify-platforms[1].token=56417ebba6a27ca352f0de77a2ae9da66d01f39610b5ee8a6033c60ef9071c55 -spring.dynamic.thread-pool.notify-platforms[2].platform=LARK -spring.dynamic.thread-pool.notify-platforms[2].token=2cbf2808-3839-4c26-a04d-fd201dd51f9e - -spring.dynamic.thread-pool.nacos.data-id=hippo4j-nacos.yaml -spring.dynamic.thread-pool.nacos.group=DEFAULT_GROUP -spring.dynamic.thread-pool.config-file-type=yml - -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[0].thread-name-prefix=message-consume -spring.dynamic.thread-pool.executors[0].core-pool-size=2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[0].queue-capacity=1024 -spring.dynamic.thread-pool.executors[0].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out=800 -spring.dynamic.thread-pool.executors[0].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].active-alarm=80 -spring.dynamic.thread-pool.executors[0].capacity-alarm=80 -spring.dynamic.thread-pool.executors[0].notify.interval=8 -spring.dynamic.thread-pool.executors[0].notify.receives=chen.ma -spring.dynamic.thread-pool.executors[1].thread-pool-id=message-produce -spring.dynamic.thread-pool.executors[1].thread-name-prefix=message-produce -spring.dynamic.thread-pool.executors[1].core-pool-size=2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[1].queue-capacity=1024 -spring.dynamic.thread-pool.executors[1].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out=800 -spring.dynamic.thread-pool.executors[1].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[1].alarm=true -spring.dynamic.thread-pool.executors[1].active-alarm=80 -spring.dynamic.thread-pool.executors[1].capacity-alarm=80 -spring.dynamic.thread-pool.executors[1].notify.interval=8 -spring.dynamic.thread-pool.executors[1].notify.receives=chen.ma diff --git a/examples/threadpool-example/config/config-nacos-spring-boot-1x/src/main/resources/nacos-config.properties b/examples/threadpool-example/config/config-nacos-spring-boot-1x/src/main/resources/nacos-config.properties deleted file mode 100644 index 77e3f5e0..00000000 --- a/examples/threadpool-example/config/config-nacos-spring-boot-1x/src/main/resources/nacos-config.properties +++ /dev/null @@ -1,52 +0,0 @@ -# \u4EE5\u4E0B\u5185\u5BB9\u590D\u5236\u5230 nacos \u914D\u7F6E\u6587\u4EF6\u4E2D -# Copy the following to the nacos configuration file - -spring.dynamic.thread-pool.web.core-pool-size=64 -spring.dynamic.thread-pool.web.maximum-pool-size=128 -spring.dynamic.thread-pool.web.keep-alive-time=1000 -spring.dynamic.thread-pool.web.enable=true -spring.dynamic.thread-pool.default-executor.core-pool-size=1 -spring.dynamic.thread-pool.default-executor.maximum-pool-size=2 -spring.dynamic.thread-pool.default-executor.blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.default-executor.execute-time-out=100 -spring.dynamic.thread-pool.default-executor.keep-alive-time=6691 -spring.dynamic.thread-pool.default-executor.queue-capacity=1 -spring.dynamic.thread-pool.default-executor.rejected-handler=AbortPolicy -spring.dynamic.thread-pool.default-executor.active-alarm=90 -spring.dynamic.thread-pool.default-executor.capacity-alarm=85 -spring.dynamic.thread-pool.default-executor.alarm=true -spring.dynamic.thread-pool.default-executor.allow-core-thread-time-out=true -spring.dynamic.thread-pool.default-executor.notify.interval=5 -spring.dynamic.thread-pool.default-executor.notify.receives=chen.ma -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].secret-key=ec3be378-6c99-45d2-a147-b400c7e94a08 -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[0].thread-name-prefix=message-consume -spring.dynamic.thread-pool.executors[0].core-pool-size=2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[0].queue-capacity=1024 -spring.dynamic.thread-pool.executors[0].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out=800 -spring.dynamic.thread-pool.executors[0].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].active-alarm=80 -spring.dynamic.thread-pool.executors[0].capacity-alarm=80 -spring.dynamic.thread-pool.executors[0].notify.interval=8 -spring.dynamic.thread-pool.executors[0].notify.receives=chen.ma -spring.dynamic.thread-pool.executors[1].thread-pool-id=message-produce -spring.dynamic.thread-pool.executors[1].thread-name-prefix=message-produce -spring.dynamic.thread-pool.executors[1].core-pool-size=2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[1].queue-capacity=1024 -spring.dynamic.thread-pool.executors[1].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out=800 -spring.dynamic.thread-pool.executors[1].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[1].alarm=true -spring.dynamic.thread-pool.executors[1].active-alarm=80 -spring.dynamic.thread-pool.executors[1].capacity-alarm=80 -spring.dynamic.thread-pool.executors[1].notify.interval=8 -spring.dynamic.thread-pool.executors[1].notify.receives=chen.ma diff --git a/examples/threadpool-example/config/config-nacos-spring-boot3/README.md b/examples/threadpool-example/config/config-nacos-spring-boot3/README.md deleted file mode 100644 index 30067dd5..00000000 --- a/examples/threadpool-example/config/config-nacos-spring-boot3/README.md +++ /dev/null @@ -1,4 +0,0 @@ -启动项添加JVM配置参数: -``` ---add-opens java.base/java.util.concurrent=ALL-UNNAMED -``` \ No newline at end of file diff --git a/examples/threadpool-example/config/config-nacos-spring-boot3/pom.xml b/examples/threadpool-example/config/config-nacos-spring-boot3/pom.xml deleted file mode 100644 index f4293e76..00000000 --- a/examples/threadpool-example/config/config-nacos-spring-boot3/pom.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - 4.0.0 - cn.hippo4j - hippo4j-threadpool-config-nacos-spring-boot3 - ${revision} - - 2.0.0-SNAPSHOT - true - 3.3.3 - 2.4.1 - 1.17 - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - - - - com.alibaba.boot - nacos-config-spring-boot-starter - 0.3.0-RC - - - org.springframework.boot - spring-boot-starter - - - - - - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - - org.springframework.boot - spring-boot-starter-jetty - - - - org.springframework.boot - spring-boot-starter-test - test - - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - - cn.hippo4j - hippo4j-threadpool-config-spring-boot-starter - ${revision} - - - - org.springframework.boot - spring-boot-starter-actuator - - - - io.micrometer - micrometer-registry-prometheus - 1.13.3 - - - - - diff --git a/examples/threadpool-example/config/config-nacos-spring-boot3/src/main/java/cn/hippo4j/example/config/nacos/ConfigNacosSpringBootExampleApplication.java b/examples/threadpool-example/config/config-nacos-spring-boot3/src/main/java/cn/hippo4j/example/config/nacos/ConfigNacosSpringBootExampleApplication.java deleted file mode 100644 index c14f8551..00000000 --- a/examples/threadpool-example/config/config-nacos-spring-boot3/src/main/java/cn/hippo4j/example/config/nacos/ConfigNacosSpringBootExampleApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.config.nacos; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Config nacos spring boot 3.x example application - */ -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = "cn.hippo4j.example.core") -public class ConfigNacosSpringBootExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ConfigNacosSpringBootExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/config/config-nacos-spring-boot3/src/main/resources/application.properties b/examples/threadpool-example/config/config-nacos-spring-boot3/src/main/resources/application.properties deleted file mode 100644 index 166c04b3..00000000 --- a/examples/threadpool-example/config/config-nacos-spring-boot3/src/main/resources/application.properties +++ /dev/null @@ -1,66 +0,0 @@ -#debug=true -server.port=8089 -server.servlet.context-path=/example - -management.security.enabled=false -management.context-path=/actuator - -spring.profiles.active=dev -spring.application.name=hippo4j-config-nacos-spring-boot3-starter-example - -## nacos spring-boot -nacos.config.server-addr=127.0.0.1:8848 -nacos.config.ext-config[0].data-id=hippo4j-nacos.yaml -nacos.config.ext-config[0].group=DEFAULT_GROUP -nacos.config.ext-config[0].auto-refresh=true - -spring.dynamic.thread-pool.enable=true -spring.dynamic.thread-pool.banner=true -spring.dynamic.thread-pool.check-state-interval=5 -spring.dynamic.thread-pool.monitor.enable=true -spring.dynamic.thread-pool.monitor.collect-types=micrometer -spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic,web -spring.dynamic.thread-pool.monitor.initial-delay=10000 -spring.dynamic.thread-pool.monitor.collect-interval=5000 - -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].token=ac0426a5-c712-474c-9bff-72b8b8f5caff -spring.dynamic.thread-pool.notify-platforms[1].platform=DING -spring.dynamic.thread-pool.notify-platforms[1].token=56417ebba6a27ca352f0de77a2ae9da66d01f39610b5ee8a6033c60ef9071c55 -spring.dynamic.thread-pool.notify-platforms[2].platform=LARK -spring.dynamic.thread-pool.notify-platforms[2].token=2cbf2808-3839-4c26-a04d-fd201dd51f9e - -spring.dynamic.thread-pool.nacos.data-id=hippo4j-nacos.yaml -spring.dynamic.thread-pool.nacos.group=DEFAULT_GROUP -spring.dynamic.thread-pool.config-file-type=yaml - -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[0].thread-name-prefix=message-consume -spring.dynamic.thread-pool.executors[0].core-pool-size=2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[0].queue-capacity=1024 -spring.dynamic.thread-pool.executors[0].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out=800 -spring.dynamic.thread-pool.executors[0].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].active-alarm=80 -spring.dynamic.thread-pool.executors[0].capacity-alarm=80 -spring.dynamic.thread-pool.executors[0].notify.interval=8 -spring.dynamic.thread-pool.executors[0].notify.receives=chen.ma -spring.dynamic.thread-pool.executors[1].thread-pool-id=message-produce -spring.dynamic.thread-pool.executors[1].thread-name-prefix=message-produce -spring.dynamic.thread-pool.executors[1].core-pool-size=2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[1].queue-capacity=1024 -spring.dynamic.thread-pool.executors[1].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out=800 -spring.dynamic.thread-pool.executors[1].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[1].alarm=true -spring.dynamic.thread-pool.executors[1].active-alarm=80 -spring.dynamic.thread-pool.executors[1].capacity-alarm=80 -spring.dynamic.thread-pool.executors[1].notify.interval=8 -spring.dynamic.thread-pool.executors[1].notify.receives=chen.ma diff --git a/examples/threadpool-example/config/config-nacos-spring-boot3/src/main/resources/nacos-config.properties b/examples/threadpool-example/config/config-nacos-spring-boot3/src/main/resources/nacos-config.properties deleted file mode 100644 index 77e3f5e0..00000000 --- a/examples/threadpool-example/config/config-nacos-spring-boot3/src/main/resources/nacos-config.properties +++ /dev/null @@ -1,52 +0,0 @@ -# \u4EE5\u4E0B\u5185\u5BB9\u590D\u5236\u5230 nacos \u914D\u7F6E\u6587\u4EF6\u4E2D -# Copy the following to the nacos configuration file - -spring.dynamic.thread-pool.web.core-pool-size=64 -spring.dynamic.thread-pool.web.maximum-pool-size=128 -spring.dynamic.thread-pool.web.keep-alive-time=1000 -spring.dynamic.thread-pool.web.enable=true -spring.dynamic.thread-pool.default-executor.core-pool-size=1 -spring.dynamic.thread-pool.default-executor.maximum-pool-size=2 -spring.dynamic.thread-pool.default-executor.blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.default-executor.execute-time-out=100 -spring.dynamic.thread-pool.default-executor.keep-alive-time=6691 -spring.dynamic.thread-pool.default-executor.queue-capacity=1 -spring.dynamic.thread-pool.default-executor.rejected-handler=AbortPolicy -spring.dynamic.thread-pool.default-executor.active-alarm=90 -spring.dynamic.thread-pool.default-executor.capacity-alarm=85 -spring.dynamic.thread-pool.default-executor.alarm=true -spring.dynamic.thread-pool.default-executor.allow-core-thread-time-out=true -spring.dynamic.thread-pool.default-executor.notify.interval=5 -spring.dynamic.thread-pool.default-executor.notify.receives=chen.ma -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].secret-key=ec3be378-6c99-45d2-a147-b400c7e94a08 -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[0].thread-name-prefix=message-consume -spring.dynamic.thread-pool.executors[0].core-pool-size=2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[0].queue-capacity=1024 -spring.dynamic.thread-pool.executors[0].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out=800 -spring.dynamic.thread-pool.executors[0].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].active-alarm=80 -spring.dynamic.thread-pool.executors[0].capacity-alarm=80 -spring.dynamic.thread-pool.executors[0].notify.interval=8 -spring.dynamic.thread-pool.executors[0].notify.receives=chen.ma -spring.dynamic.thread-pool.executors[1].thread-pool-id=message-produce -spring.dynamic.thread-pool.executors[1].thread-name-prefix=message-produce -spring.dynamic.thread-pool.executors[1].core-pool-size=2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[1].queue-capacity=1024 -spring.dynamic.thread-pool.executors[1].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out=800 -spring.dynamic.thread-pool.executors[1].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[1].alarm=true -spring.dynamic.thread-pool.executors[1].active-alarm=80 -spring.dynamic.thread-pool.executors[1].capacity-alarm=80 -spring.dynamic.thread-pool.executors[1].notify.interval=8 -spring.dynamic.thread-pool.executors[1].notify.receives=chen.ma diff --git a/examples/threadpool-example/config/config-nacos/pom.xml b/examples/threadpool-example/config/config-nacos/pom.xml deleted file mode 100644 index c5d2b085..00000000 --- a/examples/threadpool-example/config/config-nacos/pom.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-config-mode-example - ${revision} - - hippo4j-threadpool-config-nacos-example - - - true - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - - cn.hippo4j - hippo4j-threadpool-config-spring-boot-starter - ${revision} - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - 2.2.5.RELEASE - - - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - diff --git a/examples/threadpool-example/config/config-nacos/src/main/java/cn/hippo4j/example/agent/config/nacos/ConfigNacosExampleApplication.java b/examples/threadpool-example/config/config-nacos/src/main/java/cn/hippo4j/example/agent/config/nacos/ConfigNacosExampleApplication.java deleted file mode 100644 index db2f8ea9..00000000 --- a/examples/threadpool-example/config/config-nacos/src/main/java/cn/hippo4j/example/agent/config/nacos/ConfigNacosExampleApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.agent.config.nacos; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Config nacos example application - */ -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = "cn.hippo4j.example.core") -public class ConfigNacosExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ConfigNacosExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/config/config-nacos/src/main/resources/bootstrap.properties b/examples/threadpool-example/config/config-nacos/src/main/resources/bootstrap.properties deleted file mode 100644 index ae7b0afb..00000000 --- a/examples/threadpool-example/config/config-nacos/src/main/resources/bootstrap.properties +++ /dev/null @@ -1,67 +0,0 @@ -server.port=8089 -server.servlet.context-path=/example - -management.metrics.export.prometheus.enabled=true -management.server.port=29999 -management.endpoints.web.exposure.include=* - -spring.profiles.active=dev -spring.application.name=hippo4j-config-nacos-spring-boot-starter-example - -spring.cloud.nacos.config.password=nacos -spring.cloud.nacos.config.server-addr=127.0.0.1:8848 -spring.cloud.nacos.config.username=nacos -spring.cloud.nacos.config.extension-configs[0].data-id=hippo4j-nacos.yaml -spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP -spring.cloud.nacos.config.extension-configs[0].refresh=true - -spring.dynamic.thread-pool.enable=true -spring.dynamic.thread-pool.banner=true -spring.dynamic.thread-pool.check-state-interval=5 -spring.dynamic.thread-pool.monitor.enable=true -spring.dynamic.thread-pool.monitor.collect-types=micrometer -spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic,web -spring.dynamic.thread-pool.monitor.initial-delay=10000 -spring.dynamic.thread-pool.monitor.collect-interval=5000 - -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].token=ec3be378-6c99-45d2-a147-b400c7e94a08 -# spring.dynamic.thread-pool.notify-platforms[1].platform=DING -# spring.dynamic.thread-pool.notify-platforms[1].token=56417ebba6a27ca352f0de77a2ae9da66d01f39610b5ee8a6033c60ef9071c55 -# spring.dynamic.thread-pool.notify-platforms[2].platform=LARK -# spring.dynamic.thread-pool.notify-platforms[2].token=2cbf2808-3839-4c26-a04d-fd201dd51f9e - -spring.dynamic.thread-pool.nacos.data-id=hippo4j-nacos.yaml -spring.dynamic.thread-pool.nacos.group=DEFAULT_GROUP -spring.dynamic.thread-pool.config-file-type=yml - -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[0].thread-name-prefix=message-consume -spring.dynamic.thread-pool.executors[0].core-pool-size=2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[0].queue-capacity=1024 -spring.dynamic.thread-pool.executors[0].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out=800 -spring.dynamic.thread-pool.executors[0].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].active-alarm=80 -spring.dynamic.thread-pool.executors[0].capacity-alarm=80 -spring.dynamic.thread-pool.executors[0].notify.interval=8 -spring.dynamic.thread-pool.executors[0].notify.receives=chen.ma -spring.dynamic.thread-pool.executors[1].thread-pool-id=message-produce -spring.dynamic.thread-pool.executors[1].thread-name-prefix=message-produce -spring.dynamic.thread-pool.executors[1].core-pool-size=2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[1].queue-capacity=1024 -spring.dynamic.thread-pool.executors[1].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out=800 -spring.dynamic.thread-pool.executors[1].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[1].alarm=true -spring.dynamic.thread-pool.executors[1].active-alarm=80 -spring.dynamic.thread-pool.executors[1].capacity-alarm=80 -spring.dynamic.thread-pool.executors[1].notify.interval=8 -spring.dynamic.thread-pool.executors[1].notify.receives=chen.ma diff --git a/examples/threadpool-example/config/config-nacos/src/main/resources/nacos-config.properties b/examples/threadpool-example/config/config-nacos/src/main/resources/nacos-config.properties deleted file mode 100644 index 77e3f5e0..00000000 --- a/examples/threadpool-example/config/config-nacos/src/main/resources/nacos-config.properties +++ /dev/null @@ -1,52 +0,0 @@ -# \u4EE5\u4E0B\u5185\u5BB9\u590D\u5236\u5230 nacos \u914D\u7F6E\u6587\u4EF6\u4E2D -# Copy the following to the nacos configuration file - -spring.dynamic.thread-pool.web.core-pool-size=64 -spring.dynamic.thread-pool.web.maximum-pool-size=128 -spring.dynamic.thread-pool.web.keep-alive-time=1000 -spring.dynamic.thread-pool.web.enable=true -spring.dynamic.thread-pool.default-executor.core-pool-size=1 -spring.dynamic.thread-pool.default-executor.maximum-pool-size=2 -spring.dynamic.thread-pool.default-executor.blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.default-executor.execute-time-out=100 -spring.dynamic.thread-pool.default-executor.keep-alive-time=6691 -spring.dynamic.thread-pool.default-executor.queue-capacity=1 -spring.dynamic.thread-pool.default-executor.rejected-handler=AbortPolicy -spring.dynamic.thread-pool.default-executor.active-alarm=90 -spring.dynamic.thread-pool.default-executor.capacity-alarm=85 -spring.dynamic.thread-pool.default-executor.alarm=true -spring.dynamic.thread-pool.default-executor.allow-core-thread-time-out=true -spring.dynamic.thread-pool.default-executor.notify.interval=5 -spring.dynamic.thread-pool.default-executor.notify.receives=chen.ma -spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT -spring.dynamic.thread-pool.notify-platforms[0].secret-key=ec3be378-6c99-45d2-a147-b400c7e94a08 -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[0].thread-name-prefix=message-consume -spring.dynamic.thread-pool.executors[0].core-pool-size=2 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[0].queue-capacity=1024 -spring.dynamic.thread-pool.executors[0].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].execute-time-out=800 -spring.dynamic.thread-pool.executors[0].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].active-alarm=80 -spring.dynamic.thread-pool.executors[0].capacity-alarm=80 -spring.dynamic.thread-pool.executors[0].notify.interval=8 -spring.dynamic.thread-pool.executors[0].notify.receives=chen.ma -spring.dynamic.thread-pool.executors[1].thread-pool-id=message-produce -spring.dynamic.thread-pool.executors[1].thread-name-prefix=message-produce -spring.dynamic.thread-pool.executors[1].core-pool-size=2 -spring.dynamic.thread-pool.executors[1].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[1].queue-capacity=1024 -spring.dynamic.thread-pool.executors[1].blocking-queue=ResizableCapacityLinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].execute-time-out=800 -spring.dynamic.thread-pool.executors[1].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[1].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[1].alarm=true -spring.dynamic.thread-pool.executors[1].active-alarm=80 -spring.dynamic.thread-pool.executors[1].capacity-alarm=80 -spring.dynamic.thread-pool.executors[1].notify.interval=8 -spring.dynamic.thread-pool.executors[1].notify.receives=chen.ma diff --git a/examples/threadpool-example/config/config-zookeeper/pom.xml b/examples/threadpool-example/config/config-zookeeper/pom.xml deleted file mode 100644 index 7ddb34bd..00000000 --- a/examples/threadpool-example/config/config-zookeeper/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-config-mode-example - ${revision} - - hippo4j-threadpool-config-zookeeper - - - true - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-logging - - - - cn.hippo4j - hippo4j-threadpool-config-spring-boot-starter - ${revision} - - - - org.apache.curator - curator-framework - 5.1.0 - - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - diff --git a/examples/threadpool-example/config/config-zookeeper/src/main/java/cn/hippo4j/example/config/zookeeper/ConfigZookeeperExampleApplication.java b/examples/threadpool-example/config/config-zookeeper/src/main/java/cn/hippo4j/example/config/zookeeper/ConfigZookeeperExampleApplication.java deleted file mode 100644 index b019e46a..00000000 --- a/examples/threadpool-example/config/config-zookeeper/src/main/java/cn/hippo4j/example/config/zookeeper/ConfigZookeeperExampleApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.config.zookeeper; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Config zookeeper example application - */ -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = "cn.hippo4j.example.core") -public class ConfigZookeeperExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ConfigZookeeperExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/config/config-zookeeper/src/main/resources/application.properties b/examples/threadpool-example/config/config-zookeeper/src/main/resources/application.properties deleted file mode 100644 index 33d16c9e..00000000 --- a/examples/threadpool-example/config/config-zookeeper/src/main/resources/application.properties +++ /dev/null @@ -1,9 +0,0 @@ -server.port=8888 - -spring.application.name=dynamic-threadpool-zookeeper-example - -spring.dynamic.thread-pool.config-file-type=properties -spring.dynamic.thread-pool.zookeeper.zk-connect-str=127.0.0.1:2181 -spring.dynamic.thread-pool.zookeeper.config-version=1.0.0 -spring.dynamic.thread-pool.zookeeper.root-node=/configserver/userproject -spring.dynamic.thread-pool.zookeeper.node=zookeeper-demo diff --git a/examples/threadpool-example/config/config-zookeeper/src/main/resources/zookeeper-demo.properties b/examples/threadpool-example/config/config-zookeeper/src/main/resources/zookeeper-demo.properties deleted file mode 100644 index be6976db..00000000 --- a/examples/threadpool-example/config/config-zookeeper/src/main/resources/zookeeper-demo.properties +++ /dev/null @@ -1,40 +0,0 @@ -# Export from zookeeper configuration group: [/configserver/userproject] - [1.0.0] - [zookeeper-demo]. - -spring.application.name=dynamic-threadpool-zookeeper-example -spring.dynamic.thread-pool.banner=true -spring.dynamic.thread-pool.check-state-interval=5 -spring.dynamic.thread-pool.collect=true -spring.dynamic.thread-pool.config-file-type=properties -spring.dynamic.thread-pool.enable=true -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].blocking-queue=LinkedBlockingQueue -spring.dynamic.thread-pool.executors[0].core-pool-size=2 -spring.dynamic.thread-pool.executors[0].execute-time-out=1000 -spring.dynamic.thread-pool.executors[0].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=4 -spring.dynamic.thread-pool.executors[0].active-alarm=80 -spring.dynamic.thread-pool.executors[0].capacity-alarm=80 -spring.dynamic.thread-pool.executors[0].notify.interval=8 -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].notify.receives.DING=177****6993 -spring.dynamic.thread-pool.executors[0].queue-capacity=100 -spring.dynamic.thread-pool.executors[0].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[0].thread-name-prefix=message-consume -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[1].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[1].blocking-queue=LinkedBlockingQueue -spring.dynamic.thread-pool.executors[1].core-pool-size=1 -spring.dynamic.thread-pool.executors[1].execute-time-out=1000 -spring.dynamic.thread-pool.executors[1].keep-alive-time=6691 -spring.dynamic.thread-pool.executors[1].maximum-pool-size=1 -spring.dynamic.thread-pool.executors[1].active-alarm=80 -spring.dynamic.thread-pool.executors[1].capacity-alarm=80 -spring.dynamic.thread-pool.executors[1].notify.interval=8 -spring.dynamic.thread-pool.executors[1].alarm=true -spring.dynamic.thread-pool.executors[1].notify.receives.DING=177****6993 -spring.dynamic.thread-pool.executors[1].queue-capacity=1 -spring.dynamic.thread-pool.executors[1].rejected-handler=AbortPolicy -spring.dynamic.thread-pool.executors[1].thread-name-prefix=message-produce -spring.dynamic.thread-pool.executors[1].thread-pool-id=message-produce -spring.dynamic.thread-pool.notify-platforms[0].platform=DING -spring.dynamic.thread-pool.notify-platforms[0].secret-key=aab197577f6d8cc3aa8b52ee38adb6e16a46642a9c4986f5e45ca6946fdcea6f diff --git a/examples/threadpool-example/config/pom.xml b/examples/threadpool-example/config/pom.xml deleted file mode 100644 index 62ed878f..00000000 --- a/examples/threadpool-example/config/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-example - ${revision} - - hippo4j-threadpool-config-mode-example - pom - - - true - - - - config-nacos - config-apollo - config-zookeeper - config-consul-spring-boot - config-etcd - config-nacos-spring-boot-1x - config-apollo-spring-boot-1x - - - - \ No newline at end of file diff --git a/examples/threadpool-example/example-core/pom.xml b/examples/threadpool-example/example-core/pom.xml deleted file mode 100644 index 7b6d534b..00000000 --- a/examples/threadpool-example/example-core/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-example - ${revision} - - hippo4j-example-core - - - true - 2.12.1 - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-test - test - - - cn.hippo4j - hippo4j-threadpool-message - ${revision} - - - com.alibaba - transmittable-thread-local - ${transmittable-thread-local.version} - - - org.openjdk.jmh - jmh-core - 1.23 - test - - - org.openjdk.jmh - jmh-generator-annprocess - 1.23 - test - - - diff --git a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/config/DynamicThreadPoolConfig.java b/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/config/DynamicThreadPoolConfig.java deleted file mode 100644 index 11855427..00000000 --- a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/config/DynamicThreadPoolConfig.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.core.config; - -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.SpringDynamicThreadPool; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import cn.hippo4j.example.core.handler.TaskTraceBuilderHandler; -import cn.hippo4j.example.core.inittest.TaskDecoratorTest; -import com.alibaba.ttl.threadpool.TtlExecutors; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import static cn.hippo4j.common.constant.Constants.AVAILABLE_PROCESSORS; -import static cn.hippo4j.example.core.constant.GlobalTestConstant.MESSAGE_CONSUME; -import static cn.hippo4j.example.core.constant.GlobalTestConstant.MESSAGE_PRODUCE; - -/** - * Dynamic thread-pool config. - */ -@Slf4j -@Configuration -public class DynamicThreadPoolConfig { - - public static final ThreadPoolExecutor FIELD1 = new ThreadPoolExecutor(10, 20, - 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(20)); - - public static final ThreadPoolExecutor FIELD2 = new ThreadPoolExecutor(10, 20, - 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(20)); - - private static final long EXECUTE_TIMEOUT = 800L; - - private static final long AWAIT_TERMINATION_MILLIS = 5000L; - - private static final int MAX_QUEUE_CAPACITY = 200; - - private static final int CORE_POOL_SIZE = AVAILABLE_PROCESSORS * 2; - - private static final int MAX_POOL_SIZE = AVAILABLE_PROCESSORS * 4; - - @Bean - @DynamicThreadPool - public Executor messageConsumeTtlDynamicThreadPool() { - String threadPoolId = MESSAGE_CONSUME; - ThreadPoolExecutor customExecutor = ThreadPoolBuilder.builder() - .dynamicPool() - .threadFactory(threadPoolId) - .threadPoolId(threadPoolId) - .executeTimeOut(EXECUTE_TIMEOUT) - .waitForTasksToCompleteOnShutdown(true) - .awaitTerminationMillis(AWAIT_TERMINATION_MILLIS) - .taskDecorator(new TaskTraceBuilderHandler()) - .build(); - // Ali ttl adaptation use case. - Executor ttlExecutor = TtlExecutors.getTtlExecutor(customExecutor); - return ttlExecutor; - } - - /** - * {@link Bean @Bean} and {@link DynamicThreadPool @DynamicThreadPool}. - */ - @SpringDynamicThreadPool - public ThreadPoolExecutor messageProduceDynamicThreadPool() { - return ThreadPoolBuilder.buildDynamicPoolById(MESSAGE_PRODUCE); - } - - /** - * Test spring {@link ThreadPoolTaskExecutor}, Thread-pool id: testSpringThreadPoolTaskExecutor - * - * @return - */ - // @Bean - @DynamicThreadPool - public ThreadPoolTaskExecutor testSpringThreadPoolTaskExecutor() { - ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); - threadPoolTaskExecutor.setThreadNamePrefix("test-spring-task-executor_"); - threadPoolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE); - threadPoolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE); - threadPoolTaskExecutor.setQueueCapacity(MAX_QUEUE_CAPACITY); - threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); - threadPoolTaskExecutor.setTaskDecorator(new TaskDecoratorTest.ContextCopyingDecorator()); - return threadPoolTaskExecutor; - } -} diff --git a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/constant/GlobalTestConstant.java b/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/constant/GlobalTestConstant.java deleted file mode 100644 index 45ed4808..00000000 --- a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/constant/GlobalTestConstant.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.core.constant; - -/** - * Global test variables. - */ -public class GlobalTestConstant { - - public static final String MESSAGE_PRODUCE = "message-produce"; - - public static final String MESSAGE_CONSUME = "message-consume"; - -} diff --git a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/dto/SendMessageDTO.java b/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/dto/SendMessageDTO.java deleted file mode 100644 index 48371b45..00000000 --- a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/dto/SendMessageDTO.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.core.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * Send message dto. - */ -@Data -@Accessors(chain = true) -@NoArgsConstructor -@AllArgsConstructor -public class SendMessageDTO implements Serializable { - - private String uid; - - private String receiver; - - public SendMessageDTO uid(String uid) { - this.uid = uid; - return this; - } - - public SendMessageDTO receiver(String receiver) { - this.receiver = receiver; - return this; - } - - public static SendMessageDTO builder() { - return new SendMessageDTO(); - } - - public SendMessageDTO build() { - return this; - } -} diff --git a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/handler/CustomerClientNetworkService.java b/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/handler/CustomerClientNetworkService.java deleted file mode 100644 index d01f01bb..00000000 --- a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/handler/CustomerClientNetworkService.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.core.handler; - -import cn.hippo4j.core.api.ClientNetworkService; -import org.springframework.core.env.ConfigurableEnvironment; - -/** - * Customer client network service. - */ -public class CustomerClientNetworkService implements ClientNetworkService { - - @Override - public String[] getNetworkIpPort(ConfigurableEnvironment environment) { - String[] network = new String[2]; - network[0] = "127.0.0.1"; - network[1] = environment.getProperty("server.port", "1994"); - return network; - } -} diff --git a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/handler/ErrorLogRejectedExecutionHandler.java b/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/handler/ErrorLogRejectedExecutionHandler.java deleted file mode 100644 index 47fa7e18..00000000 --- a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/handler/ErrorLogRejectedExecutionHandler.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.core.handler; - -import cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ThreadPoolExecutor; - -/** - * Custom Deny Policy. - */ -public class ErrorLogRejectedExecutionHandler implements CustomRejectedExecutionHandler { - - private static final int REJECTED_TYPE = 12; - - @Override - public Integer getType() { - return REJECTED_TYPE; - } - - @Override - public RejectedExecutionHandler generateRejected() { - return new CustomErrorLogRejectedExecutionHandler(); - } - - /** - * Custom Error Log Rejected Execution Handler - */ - public static class CustomErrorLogRejectedExecutionHandler implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - Logger logger = LoggerFactory.getLogger(this.getClass()); - logger.error("线程池抛出拒绝策略."); - } - } -} diff --git a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/handler/TaskTraceBuilderHandler.java b/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/handler/TaskTraceBuilderHandler.java deleted file mode 100644 index 6e95a969..00000000 --- a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/handler/TaskTraceBuilderHandler.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.core.handler; - -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.threadpool.alarm.toolkit.ExecutorTraceContextUtil; -import org.slf4j.MDC; -import org.springframework.core.task.TaskDecorator; - -import static cn.hippo4j.common.constant.Constants.EXECUTE_TIMEOUT_TRACE; - -/** - * Task trace builder handler. - */ -public final class TaskTraceBuilderHandler implements TaskDecorator { - - @Override - public Runnable decorate(Runnable runnable) { - String executeTimeoutTrace = MDC.get(EXECUTE_TIMEOUT_TRACE); - Runnable taskRun = () -> { - if (StringUtil.isNotBlank(executeTimeoutTrace)) { - ExecutorTraceContextUtil.putTimeoutTrace(executeTimeoutTrace); - } - runnable.run(); - // There is no need to clean up here, and it will be cleaned up after the thread task is executed. - }; - return taskRun; - } -} diff --git a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/inittest/AlarmSendMessageTest.java b/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/inittest/AlarmSendMessageTest.java deleted file mode 100644 index b26b6b01..00000000 --- a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/inittest/AlarmSendMessageTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.core.inittest; - -import cn.hippo4j.common.executor.ThreadPoolExecutorHolder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.example.core.constant.GlobalTestConstant; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * Test alarm send message. - */ -@Slf4j -@Component -public class AlarmSendMessageTest { - - private static final int SLEEP_TIME = 10240124; - - private static final int INITIAL_DELAY = 3; - - /** - * Test alarm notification. - * If you need to run this single test, add @PostConstruct to the method. - */ - @SuppressWarnings("all") - public void alarmSendMessageTest() { - ScheduledExecutorService scheduledThreadPool = Executors.newSingleThreadScheduledExecutor(); - scheduledThreadPool.scheduleWithFixedDelay(() -> { - ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(GlobalTestConstant.MESSAGE_PRODUCE); - ThreadPoolExecutor poolExecutor = executorHolder.getExecutor(); - try { - poolExecutor.execute(() -> { - try { - Thread.sleep(SLEEP_TIME); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - }); - } catch (Exception ex) { - log.error("Throw reject policy.", ex.getMessage()); - } - }, INITIAL_DELAY, 1, TimeUnit.SECONDS); - } -} diff --git a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/inittest/RegisterDynamicThreadPoolTest.java b/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/inittest/RegisterDynamicThreadPoolTest.java deleted file mode 100644 index 23892224..00000000 --- a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/inittest/RegisterDynamicThreadPoolTest.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.core.inittest; - -import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum; -import cn.hippo4j.common.executor.support.RejectedPolicyTypeEnum; -import cn.hippo4j.common.model.register.DynamicThreadPoolRegisterParameter; -import cn.hippo4j.common.model.register.DynamicThreadPoolRegisterWrapper; -import cn.hippo4j.common.model.register.notify.DynamicThreadPoolRegisterCoreNotifyParameter; -import cn.hippo4j.common.model.register.notify.DynamicThreadPoolRegisterServerNotifyParameter; -import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage; -import cn.hippo4j.threadpool.message.api.NotifyPlatformEnum; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ThreadPoolExecutor; - -/** - * Register dynamic thread-pool test. - */ -@Slf4j -public class RegisterDynamicThreadPoolTest { - - private static final int CAPACITY = 1024; - private static final long KEEP_ALIVE_TIME = 1024L; - private static final long EXECUTE_TIMEOUT = 1024L; - private static final int CAPACITY_ALARM = 90; - private static final int ACTIVE_ALARM = 90; - private static final int CORE_NOTIFY_INTERVAL = 5; - private static final int SERVER_NOTIFY_INTERVAL = 10; - - public static ThreadPoolExecutor registerDynamicThreadPool(String threadPoolId) { - DynamicThreadPoolRegisterParameter parameterInfo = DynamicThreadPoolRegisterParameter.builder() - .corePoolSize(1) - .maximumPoolSize(2) - .blockingQueueType(BlockingQueueTypeEnum.LINKED_BLOCKING_QUEUE) - .capacity(CAPACITY) - // TimeUnit.SECONDS - .keepAliveTime(KEEP_ALIVE_TIME) - // TimeUnit.MILLISECONDS - .executeTimeOut(EXECUTE_TIMEOUT) - .rejectedPolicyType(RejectedPolicyTypeEnum.DISCARD_POLICY) - .isAlarm(true) - .allowCoreThreadTimeOut(false) - .capacityAlarm(CAPACITY_ALARM) - .activeAlarm(ACTIVE_ALARM) - .threadPoolId(threadPoolId) - .threadNamePrefix(threadPoolId) - .build(); - // Core mode and server mode, you can choose one of them. - DynamicThreadPoolRegisterCoreNotifyParameter coreNotifyParameter = DynamicThreadPoolRegisterCoreNotifyParameter.builder() - .receives("chen.ma") - .interval(CORE_NOTIFY_INTERVAL) - .build(); - DynamicThreadPoolRegisterServerNotifyParameter serverNotifyParameter = DynamicThreadPoolRegisterServerNotifyParameter.builder() - .platform(NotifyPlatformEnum.WECHAT.name()) - .accessToken("7487d0a0-20ec-40ab-b67b-ce68db406b37") - .interval(SERVER_NOTIFY_INTERVAL) - .receives("chen.ma") - .build(); - DynamicThreadPoolRegisterWrapper registerWrapper = DynamicThreadPoolRegisterWrapper.builder() - .updateIfExists(true) - .notifyUpdateIfExists(true) - .parameter(parameterInfo) - .configNotify(coreNotifyParameter) - .serverNotify(serverNotifyParameter) - .build(); - ThreadPoolExecutor dynamicThreadPool = GlobalThreadPoolManage.dynamicRegister(registerWrapper); - log.info("Dynamic registration thread pool parameter details: {}", dynamicThreadPool); - return dynamicThreadPool; - } -} diff --git a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/inittest/RunStateHandlerTest.java b/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/inittest/RunStateHandlerTest.java deleted file mode 100644 index df1bc329..00000000 --- a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/inittest/RunStateHandlerTest.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.core.inittest; - -import lombok.extern.slf4j.Slf4j; -import org.slf4j.MDC; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import java.util.Random; -import java.util.concurrent.Executor; -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import static cn.hippo4j.common.constant.Constants.EXECUTE_TIMEOUT_TRACE; - -/** - * Run state handler test. - */ -@Slf4j -@Component -public class RunStateHandlerTest { - - @Resource - private Executor messageConsumeTtlDynamicThreadPool; - - @Resource - private ThreadPoolExecutor messageProduceDynamicThreadPool; - - private static final int MAX_RANDOM = 10; - private static final int SLEEP_500 = 500; - private static final int SLEEP_1000 = 1000; - private static final int SLEEP_3000 = 3000; - private static final int SLEEP_5000 = 5000; - - /* - * @Resource private ThreadPoolTaskExecutor testSpringThreadPoolTaskExecutor; - */ - private final ThreadPoolExecutor runStateHandlerTestExecutor = new ThreadPoolExecutor( - 4, - 4, - 0L, - TimeUnit.MILLISECONDS, - new SynchronousQueue<>(), - r -> { - Thread t = new Thread(r); - t.setName("client.example.runStateHandler.test"); - t.setDaemon(true); - return t; - }, - new ThreadPoolExecutor.AbortPolicy()); - - @PostConstruct - @SuppressWarnings("all") - public void runStateHandlerTest() { - log.info("Test thread pool runtime state interface..."); - // Start the dynamic thread pool to simulate running tasks - runTask(messageConsumeTtlDynamicThreadPool); - runTask(messageProduceDynamicThreadPool); - // runTask(testThreadPoolTaskExecutor); - // Dynamically register thread pool - // ThreadPoolExecutor registerDynamicThreadPool = RegisterDynamicThreadPoolTest.registerDynamicThreadPool("auto-register-dynamic-thread-pool"); - // runTask(registerDynamicThreadPool); - } - - private void runTask(Executor executor) { - // Simulate task run - runStateHandlerTestExecutor.execute(() -> { - /** - * When the execution of the thread pool task times out, the Trace flag is put into the MDC, and it is printed out when an alarm occurs. - */ - MDC.put(EXECUTE_TIMEOUT_TRACE, "39948722194639841.251.16612352194691531"); - try { - Thread.sleep(SLEEP_5000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - for (int i = 0; i < Integer.MAX_VALUE; i++) { - try { - executor.execute(() -> { - try { - int maxRandom = MAX_RANDOM; - int temp = 2; - Random random = new Random(); - // Assignment thread pool completedTaskCount - if (random.nextInt(maxRandom) % temp == 0) { - Thread.sleep(SLEEP_1000); - } else { - Thread.sleep(SLEEP_3000); - } - } catch (InterruptedException ignored) { - } - }); - } catch (Exception ignored) { - } - try { - Thread.sleep(SLEEP_500); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - }); - } -} diff --git a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/inittest/TaskDecoratorTest.java b/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/inittest/TaskDecoratorTest.java deleted file mode 100644 index e9da08f1..00000000 --- a/examples/threadpool-example/example-core/src/main/java/cn/hippo4j/example/core/inittest/TaskDecoratorTest.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.core.inittest; - -import cn.hippo4j.common.executor.ThreadPoolExecutorHolder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.example.core.constant.GlobalTestConstant; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.MDC; -import org.springframework.core.task.TaskDecorator; -import org.springframework.stereotype.Component; - -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * TaskDecorator test. - */ -@Slf4j -@Component -public class TaskDecoratorTest { - - public static final String PLACEHOLDER = "site"; - - private static final int SLEEP_TIME = 5000; - - private final ThreadPoolExecutor taskDecoratorTestExecutor = new ThreadPoolExecutor( - 1, - 1, - 0L, - TimeUnit.MILLISECONDS, - new SynchronousQueue<>(), - r -> { - Thread t = new Thread(r); - t.setName("client.example.taskDecorator.test"); - t.setDaemon(true); - return t; - }, - new ThreadPoolExecutor.AbortPolicy()); - - /** - * Test dynamic thread pool passing {@link TaskDecorator} - * If you need to run this single test, add @PostConstruct to the method. - */ - public void taskDecoratorTest() { - taskDecoratorTestExecutor.execute(() -> { - MDC.put(PLACEHOLDER, "View the official website: https://www.hippo4j.cn"); - try { - Thread.sleep(SLEEP_TIME); - ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(GlobalTestConstant.MESSAGE_PRODUCE); - ThreadPoolExecutor threadPoolExecutor = executorHolder.getExecutor(); - threadPoolExecutor.execute(() -> log.info("Pass context via taskDecorator MDC: {}", MDC.get(PLACEHOLDER))); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - }); - } - - /** - * Context Copying Decorator - */ - public static class ContextCopyingDecorator implements TaskDecorator { - - @Override - public Runnable decorate(Runnable runnable) { - String placeholderVal = MDC.get(PLACEHOLDER); - // other context... - return () -> { - try { - MDC.put(PLACEHOLDER, placeholderVal); - runnable.run(); - } finally { - MDC.clear(); - } - }; - } - } -} diff --git a/examples/threadpool-example/example-core/src/test/java/cn/hippo4j/example/core/TaskTimeRecordPluginBenchmarkTest.java b/examples/threadpool-example/example-core/src/test/java/cn/hippo4j/example/core/TaskTimeRecordPluginBenchmarkTest.java deleted file mode 100644 index e38b5136..00000000 --- a/examples/threadpool-example/example-core/src/test/java/cn/hippo4j/example/core/TaskTimeRecordPluginBenchmarkTest.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.core; - -import cn.hippo4j.core.executor.ExtensibleThreadPoolExecutor; -import cn.hippo4j.core.executor.plugin.impl.TaskTimeRecordPlugin; -import cn.hippo4j.core.executor.plugin.manager.DefaultThreadPoolPluginManager; -import lombok.SneakyThrows; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.BenchmarkMode; -import org.openjdk.jmh.annotations.Fork; -import org.openjdk.jmh.annotations.Measurement; -import org.openjdk.jmh.annotations.Mode; -import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.State; -import org.openjdk.jmh.annotations.Threads; -import org.openjdk.jmh.annotations.Warmup; -import org.openjdk.jmh.infra.Blackhole; -import org.openjdk.jmh.results.format.ResultFormatType; -import org.openjdk.jmh.runner.Runner; -import org.openjdk.jmh.runner.options.Options; -import org.openjdk.jmh.runner.options.OptionsBuilder; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * benchmark test for {@link TaskTimeRecordPlugin} - */ -@BenchmarkMode(Mode.All) -@OutputTimeUnit(TimeUnit.MILLISECONDS) -@State(Scope.Thread) -@Warmup(iterations = 1) -@Measurement(iterations = 3) -@Fork(1) -@Threads(6) -public class TaskTimeRecordPluginBenchmarkTest { - - @SneakyThrows - @Benchmark - public void origin_200(Blackhole blackhole) { - int threadCount = 200; - ThreadPoolExecutor executor = new ThreadPoolExecutor( - threadCount, threadCount, 1000L, TimeUnit.MILLISECONDS, - new ArrayBlockingQueue<>(threadCount), Thread::new, new ThreadPoolExecutor.DiscardPolicy()); - executor.prestartAllCoreThreads(); - - List tasks = getTask(threadCount, blackhole); - tasks.forEach(executor::execute); - - executor.shutdown(); - while (!executor.isTerminated()) { - } - } - - @SneakyThrows - @Benchmark - public void origin_50(Blackhole blackhole) { - int threadCount = 50; - ThreadPoolExecutor executor = new ThreadPoolExecutor( - threadCount, threadCount, 1000L, TimeUnit.MILLISECONDS, - new ArrayBlockingQueue<>(threadCount), Thread::new, new ThreadPoolExecutor.DiscardPolicy()); - executor.prestartAllCoreThreads(); - - List tasks = getTask(threadCount, blackhole); - tasks.forEach(executor::execute); - - executor.shutdown(); - while (!executor.isTerminated()) { - } - } - - @SneakyThrows - @Benchmark - public void not_plugin_50(Blackhole blackhole) { - int threadCount = 50; - ExtensibleThreadPoolExecutor executor = new ExtensibleThreadPoolExecutor( - "test", new DefaultThreadPoolPluginManager(), - threadCount, threadCount, 1000L, TimeUnit.MILLISECONDS, - new ArrayBlockingQueue<>(threadCount), Thread::new, new ThreadPoolExecutor.DiscardPolicy()); - executor.prestartAllCoreThreads(); - - List tasks = getTask(threadCount, blackhole); - tasks.forEach(executor::execute); - - executor.shutdown(); - while (!executor.isTerminated()) { - } - } - - @SneakyThrows - @Benchmark - public void not_plugin_200(Blackhole blackhole) { - int threadCount = 200; - ExtensibleThreadPoolExecutor executor = new ExtensibleThreadPoolExecutor( - "test", new DefaultThreadPoolPluginManager(), - threadCount, threadCount, 1000L, TimeUnit.MILLISECONDS, - new ArrayBlockingQueue<>(threadCount), Thread::new, new ThreadPoolExecutor.DiscardPolicy()); - executor.prestartAllCoreThreads(); - - List tasks = getTask(threadCount, blackhole); - tasks.forEach(executor::execute); - - executor.shutdown(); - while (!executor.isTerminated()) { - } - } - - @SneakyThrows - @Benchmark - public void plugin_50(Blackhole blackhole) { - int threadCount = 50; - ExtensibleThreadPoolExecutor executor = new ExtensibleThreadPoolExecutor( - "test", new DefaultThreadPoolPluginManager(), - threadCount, threadCount, 1000L, TimeUnit.MILLISECONDS, - new ArrayBlockingQueue<>(threadCount), Thread::new, new ThreadPoolExecutor.DiscardPolicy()); - executor.prestartAllCoreThreads(); - executor.register(new TaskTimeRecordPlugin()); - - List tasks = getTask(threadCount, blackhole); - tasks.forEach(executor::execute); - - executor.shutdown(); - while (!executor.isTerminated()) { - } - } - - @SneakyThrows - @Benchmark - public void plugin_200(Blackhole blackhole) { - int threadCount = 200; - ExtensibleThreadPoolExecutor executor = new ExtensibleThreadPoolExecutor( - "test", new DefaultThreadPoolPluginManager(), - threadCount, threadCount, 1000L, TimeUnit.MILLISECONDS, - new ArrayBlockingQueue<>(threadCount), Thread::new, new ThreadPoolExecutor.DiscardPolicy()); - executor.prestartAllCoreThreads(); - executor.register(new TaskTimeRecordPlugin()); - - List tasks = getTask(threadCount, blackhole); - tasks.forEach(executor::execute); - - executor.shutdown(); - while (!executor.isTerminated()) { - } - } - - private List getTask(int count, Blackhole blackhole) { - List tasks = new ArrayList<>(count); - for (int i = 1; i < count * 2; i++) { - int index = i; - tasks.add(() -> blackhole.consume(index)); - } - return tasks; - } - - public static void main(String[] args) throws Exception { - Options opts = new OptionsBuilder() - .include(TaskTimeRecordPluginBenchmarkTest.class.getSimpleName()) - .resultFormat(ResultFormatType.JSON) - .build(); - new Runner(opts).run(); - } - -} diff --git a/examples/threadpool-example/pom.xml b/examples/threadpool-example/pom.xml deleted file mode 100644 index c25dd9b8..00000000 --- a/examples/threadpool-example/pom.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-examples - ${revision} - - hippo4j-threadpool-example - pom - - - true - - - - config - example-core - server - agent - - diff --git a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/README.md b/examples/threadpool-example/server/adapter-dubbo-spring-boot3/README.md deleted file mode 100644 index 5a267d79..00000000 --- a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/README.md +++ /dev/null @@ -1,5 +0,0 @@ -## spring-boot3 仅支持jdk17以上版本 -## 启动项添加JVM配置参数: -``` ---add-opens java.base/java.util.concurrent=ALL-UNNAMED -``` \ No newline at end of file diff --git a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-consumer-example/pom.xml b/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-consumer-example/pom.xml deleted file mode 100644 index 7203785e..00000000 --- a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-consumer-example/pom.xml +++ /dev/null @@ -1,118 +0,0 @@ - - - - cn.hippo4j - hippo4j-threadpool-adapter-dubbo-spring-boot3-example - ${revision} - - 4.0.0 - - hippo4j-threadpool-adapter-dubbo-spring-boot3-consumer-example - - - - cn.hippo4j - hippo4j-threadpool-adapter-dubbo-spring-boot3-interface-example - ${project.version} - - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter - ${revision} - - - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - - - - cn.hippo4j - hippo4j-spring-boot-starter-monitor-micrometer - ${revision} - - - - org.springframework.boot - spring-boot-starter-web - - - - org.apache.tomcat.embed - tomcat-embed-core - - - - - org.apache.dubbo - dubbo - ${dubbo.version} - - - org.apache.zookeeper - zookeeper - ${zookeeper_version} - - - io.netty - netty-handler - - - io.netty - netty-transport-native-epoll - - - - - org.apache.curator - curator-framework - ${curator.version} - - - org.apache.curator - curator-client - ${curator.version} - - - org.apache.curator - curator-recipes - ${curator.version} - - - org.apache.curator - curator-x-discovery - ${curator.version} - - - - - diff --git a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-consumer-example/src/main/java/cn/hippo4j/example/server/adapter/dubbo/springboot3/consumer/ConsumerApplication.java b/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-consumer-example/src/main/java/cn/hippo4j/example/server/adapter/dubbo/springboot3/consumer/ConsumerApplication.java deleted file mode 100644 index a17925d6..00000000 --- a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-consumer-example/src/main/java/cn/hippo4j/example/server/adapter/dubbo/springboot3/consumer/ConsumerApplication.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.server.adapter.dubbo.springboot3.consumer; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.stereotype.Service; - -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = {"cn.hippo4j.example.core", "cn.hippo4j.example.server"}) -@EnableDubbo -public class ConsumerApplication { - - public static void main(String[] args) { - SpringApplication.run(ConsumerApplication.class, args); - } - -} diff --git a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-consumer-example/src/main/java/cn/hippo4j/example/server/adapter/dubbo/springboot3/consumer/DubboThreadTestService.java b/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-consumer-example/src/main/java/cn/hippo4j/example/server/adapter/dubbo/springboot3/consumer/DubboThreadTestService.java deleted file mode 100644 index 0d2e82fc..00000000 --- a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-consumer-example/src/main/java/cn/hippo4j/example/server/adapter/dubbo/springboot3/consumer/DubboThreadTestService.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.hippo4j.example.server.adapter.dubbo.springboot3.consumer; - -import cn.hippo4j.example.server.adapter.dubbo.springboot3.DemoService; -import lombok.extern.slf4j.Slf4j; -import org.apache.dubbo.config.annotation.DubboReference; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -@Slf4j -@Service -public class DubboThreadTestService { - - - @DubboReference(timeout = 2000, version = "1.0.0") - private DemoService demoService; - - @PostConstruct - public void init() { - ExecutorService executorService = Executors.newFixedThreadPool(10); - - ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); - scheduledExecutorService.scheduleAtFixedRate(() -> - executorService.execute(() -> { - try { - String result = demoService.sayHello("world"); - log.info("返回信息:{}", result); - } catch (Exception e) { - log.error("dubbo接口抛出错误:", e); - } - }), 500, 500, TimeUnit.MILLISECONDS); - } -} diff --git a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-consumer-example/src/main/resources/application.properties b/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-consumer-example/src/main/resources/application.properties deleted file mode 100644 index 03c3f2a8..00000000 --- a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-consumer-example/src/main/resources/application.properties +++ /dev/null @@ -1,23 +0,0 @@ -server.port=8089 -debug=true - -spring.application.name=hippo4j-threadpool-adapter-dubbo-spring-boot3-consumer-example - -spring.dynamic.thread-pool.server-addr=http://localhost:6691 -### Use netty to report thread pool monitoring data. The default is http. -# spring.dynamic.thread-pool.report-type=netty -# spring.dynamic.thread-pool.netty-server-port=8899 -spring.dynamic.thread-pool.namespace=prescription -spring.dynamic.thread-pool.item-id=dynamic-threadpool-example -spring.dynamic.thread-pool.username=admin -spring.dynamic.thread-pool.password=123456 - -dubbo.application.name=${spring.application.name} -dubbo.protocol.name=dubbo -dubbo.protocol.port=20881 -# ??ip????????????????ip?localhost?127.0.x.x? -#dubbo.protocol.host=192.168.66.66 -dubbo.registry.id=zk-registry -dubbo.registry.address=zookeeper://127.0.0.1:2181 -dubbo.config-center.address=zookeeper://127.0.0.1:2181 -dubbo.metadata-report.address=zookeeper://127.0.0.1:2181 \ No newline at end of file diff --git a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-interface-example/pom.xml b/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-interface-example/pom.xml deleted file mode 100644 index 7ab6a8b0..00000000 --- a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-interface-example/pom.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - cn.hippo4j - hippo4j-threadpool-adapter-dubbo-spring-boot3-example - ${revision} - - 4.0.0 - - hippo4j-threadpool-adapter-dubbo-spring-boot3-interface-example - - - - ${project.name} - - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - - - diff --git a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-interface-example/src/main/java/cn/hippo4j/example/server/adapter/dubbo/springboot3/DemoService.java b/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-interface-example/src/main/java/cn/hippo4j/example/server/adapter/dubbo/springboot3/DemoService.java deleted file mode 100644 index 01dc5b2e..00000000 --- a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-interface-example/src/main/java/cn/hippo4j/example/server/adapter/dubbo/springboot3/DemoService.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.hippo4j.example.server.adapter.dubbo.springboot3; - -import java.util.concurrent.CompletableFuture; - -public interface DemoService { - - String sayHello(String name); - - default CompletableFuture sayHelloAsync(String name) { - return CompletableFuture.completedFuture(sayHello(name)); - } - -} diff --git a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-provider-example/pom.xml b/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-provider-example/pom.xml deleted file mode 100644 index 870fbe5f..00000000 --- a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-provider-example/pom.xml +++ /dev/null @@ -1,140 +0,0 @@ - - - - cn.hippo4j - hippo4j-threadpool-adapter-dubbo-spring-boot3-example - ${revision} - - 4.0.0 - - hippo4j-threadpool-adapter-dubbo-spring-boot3-provider-example - - - - cn.hippo4j - hippo4j-threadpool-adapter-dubbo-spring-boot3-interface-example - ${project.version} - - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter - ${revision} - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-dubbo - ${revision} - - - - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - - - - cn.hippo4j - hippo4j-spring-boot-starter-monitor-micrometer - ${revision} - - - - org.springframework.boot - spring-boot-starter-web - - - - org.apache.tomcat.embed - tomcat-embed-core - - - - - org.apache.dubbo - dubbo - ${dubbo.version} - - - org.apache.zookeeper - zookeeper - ${zookeeper_version} - - - io.netty - netty-handler - - - io.netty - netty-transport-native-epoll - - - - - org.apache.curator - curator-framework - ${curator.version} - - - org.apache.curator - curator-client - ${curator.version} - - - org.apache.curator - curator-recipes - ${curator.version} - - - org.apache.curator - curator-x-discovery - ${curator.version} - - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - diff --git a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-provider-example/src/main/java/cn/hippo4j/example/server/adapter/dubbo/springboot3/DemoServiceImpl.java b/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-provider-example/src/main/java/cn/hippo4j/example/server/adapter/dubbo/springboot3/DemoServiceImpl.java deleted file mode 100644 index 6330cd87..00000000 --- a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-provider-example/src/main/java/cn/hippo4j/example/server/adapter/dubbo/springboot3/DemoServiceImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.hippo4j.example.server.adapter.dubbo.springboot3; - - -import org.apache.dubbo.config.annotation.DubboService; -import org.apache.dubbo.config.annotation.Method; -import org.apache.dubbo.rpc.RpcContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.TimeUnit; - -@DubboService(interfaceClass = DemoService.class, version = "1.0.0", retries = 4, methods = { - @Method(name = "sayHello", retries = 6) -}) -public class DemoServiceImpl implements DemoService { - - private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class); - - @Override - public String sayHello(String name) { - logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress()); - try { - TimeUnit.SECONDS.sleep(1); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - return "Hello " + name; - - } - - -} diff --git a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-provider-example/src/main/java/cn/hippo4j/example/server/adapter/dubbo/springboot3/ProviderApplication.java b/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-provider-example/src/main/java/cn/hippo4j/example/server/adapter/dubbo/springboot3/ProviderApplication.java deleted file mode 100644 index 727ec17e..00000000 --- a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-provider-example/src/main/java/cn/hippo4j/example/server/adapter/dubbo/springboot3/ProviderApplication.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.server.adapter.dubbo.springboot3; - - -import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import cn.hippo4j.core.enable.EnableDynamicThreadPool; - -import java.util.concurrent.CountDownLatch; - -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = {"cn.hippo4j.example.core", "cn.hippo4j.example.server"}) -@EnableDubbo(scanBasePackages = {"cn.hippo4j.example.server.adapter.dubbo.springboot3"}) -public class ProviderApplication { - public static void main(String[] args) throws Exception { - SpringApplication.run(ProviderApplication.class, args); - System.out.println("dubbo service started"); - new CountDownLatch(1).await(); - } -} diff --git a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-provider-example/src/main/resources/application.properties b/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-provider-example/src/main/resources/application.properties deleted file mode 100644 index 26ed77c3..00000000 --- a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/adapter-dubbo-spring-boot-3x-provider-example/src/main/resources/application.properties +++ /dev/null @@ -1,23 +0,0 @@ -server.port=8088 -debug=true - -spring.application.name=hippo4j-threadpool-adapter-dubbo-spring-boot3-provider-example - -spring.dynamic.thread-pool.server-addr=http://localhost:6691 -### Use netty to report thread pool monitoring data. The default is http. -# spring.dynamic.thread-pool.report-type=netty -# spring.dynamic.thread-pool.netty-server-port=8899 -spring.dynamic.thread-pool.namespace=prescription -spring.dynamic.thread-pool.item-id=dynamic-threadpool-example -spring.dynamic.thread-pool.username=admin -spring.dynamic.thread-pool.password=123456 - -dubbo.application.name=${spring.application.name} -dubbo.protocol.name=dubbo -dubbo.protocol.port= -1 -# ??ip????????????????ip?localhost?127.0.x.x? -#dubbo.protocol.host=192.168.66.66 -dubbo.registry.id=zk-registry -dubbo.registry.address=zookeeper://127.0.0.1:2181 -dubbo.config-center.address=zookeeper://127.0.0.1:2181 -dubbo.metadata-report.address=zookeeper://127.0.0.1:2181 \ No newline at end of file diff --git a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/pom.xml b/examples/threadpool-example/server/adapter-dubbo-spring-boot3/pom.xml deleted file mode 100644 index d8683d0c..00000000 --- a/examples/threadpool-example/server/adapter-dubbo-spring-boot3/pom.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - 4.0.0 - cn.hippo4j - hippo4j-threadpool-adapter-dubbo-spring-boot3-example - ${revision} - pom - - - adapter-dubbo-spring-boot3-consumer-example - adapter-dubbo-spring-boot3-provider-example - adapter-dubbo-spring-boot3-interface-example - - - - true - 2.0.0-SNAPSHOT - true - 3.3.3 - 3.2.15 - 3.8.1 - 5.1.0 - 1.17 - 17 - 17 - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - diff --git a/examples/threadpool-example/server/adapter-kafka/pom.xml b/examples/threadpool-example/server/adapter-kafka/pom.xml deleted file mode 100644 index b37b9396..00000000 --- a/examples/threadpool-example/server/adapter-kafka/pom.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-server-mode-example - ${revision} - - hippo4j-threadpool-adapter-kafka-example - - - true - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - org.projectlombok - lombok - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-kafka - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter - ${project.version} - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - org.springframework.kafka - spring-kafka - - - diff --git a/examples/threadpool-example/server/adapter-kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/example/MessageConsume.java b/examples/threadpool-example/server/adapter-kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/example/MessageConsume.java deleted file mode 100644 index c146b598..00000000 --- a/examples/threadpool-example/server/adapter-kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/example/MessageConsume.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.kafka.example; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.kafka.annotation.KafkaListener; -import org.springframework.stereotype.Service; - -/** - * Message consume. - */ -@Slf4j -@Service -public class MessageConsume { - - @KafkaListener(id = "testId1", topics = MessageProduce.TOPIC, groupId = "testGroup") - public void onMessage(String message) { - log.info("Message: {}", message); - } -} diff --git a/examples/threadpool-example/server/adapter-kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/example/MessageProduce.java b/examples/threadpool-example/server/adapter-kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/example/MessageProduce.java deleted file mode 100644 index 133889d5..00000000 --- a/examples/threadpool-example/server/adapter-kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/example/MessageProduce.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.kafka.example; - -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.kafka.core.KafkaTemplate; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.PostConstruct; -import java.util.UUID; -import java.util.concurrent.TimeUnit; - -/** - * Message produce. - */ -@Slf4j -@Component -@RestController -@AllArgsConstructor -public class MessageProduce { - - public static final String TOPIC = "test"; - - private static final int SLEEP_TIME = 3; - - private final KafkaTemplate template; - - @GetMapping("/message/send") - public String sendMessage() { - template.send(TOPIC, "testMessage"); - return "success"; - } - - @PostConstruct - public void init() { - Thread t = new Thread(() -> { - while (true) { - String message = UUID.randomUUID().toString(); - template.send(TOPIC, "autoTestMessage " + message); - try { - TimeUnit.SECONDS.sleep(SLEEP_TIME); - } catch (InterruptedException e) { - log.error(e.getMessage()); - } - } - }); - t.start(); - } -} diff --git a/examples/threadpool-example/server/adapter-kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/example/ServerAdapterKafkaExampleApplication.java b/examples/threadpool-example/server/adapter-kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/example/ServerAdapterKafkaExampleApplication.java deleted file mode 100644 index 32987cb1..00000000 --- a/examples/threadpool-example/server/adapter-kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/example/ServerAdapterKafkaExampleApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.kafka.example; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Server adapter kafka example application - */ -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = {"cn.hippo4j.example.core", "cn.hippo4j.springboot.starter.adapter.kafka.example"}) -public class ServerAdapterKafkaExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ServerAdapterKafkaExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/server/adapter-kafka/src/main/resources/application.properties b/examples/threadpool-example/server/adapter-kafka/src/main/resources/application.properties deleted file mode 100644 index ed0c980e..00000000 --- a/examples/threadpool-example/server/adapter-kafka/src/main/resources/application.properties +++ /dev/null @@ -1,13 +0,0 @@ -server.port=8011 - -debug=true - -spring.application.name=hippo4j-spring-boot-starter-adapter-kafka-example -spring.dynamic.thread-pool.server-addr=http://localhost:6691 -spring.dynamic.thread-pool.namespace=prescription -spring.dynamic.thread-pool.item-id=dynamic-threadpool-example -spring.dynamic.thread-pool.username=admin -spring.dynamic.thread-pool.password=123456 - - -spring.kafka.bootstrap-servers=localhost:9093,localhost:9094,localhost:9095 \ No newline at end of file diff --git a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/README.md b/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/README.md deleted file mode 100644 index 5a267d79..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/README.md +++ /dev/null @@ -1,5 +0,0 @@ -## spring-boot3 仅支持jdk17以上版本 -## 启动项添加JVM配置参数: -``` ---add-opens java.base/java.util.concurrent=ALL-UNNAMED -``` \ No newline at end of file diff --git a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/pom.xml b/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/pom.xml deleted file mode 100644 index 7afe3d37..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/pom.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-adapter-rabbitmq-spring-boot3-example - ${revision} - - true - 2.0.0-SNAPSHOT - 3.3.3 - 1.17 - 17 - 17 - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - org.projectlombok - lombok - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-rabbitmq - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter - ${project.version} - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - org.springframework.boot - spring-boot-starter-amqp - - - diff --git a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/ServerAdapterRabbitMQExampleApplication.java b/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/ServerAdapterRabbitMQExampleApplication.java deleted file mode 100644 index 821ccbdd..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/ServerAdapterRabbitMQExampleApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rabbitmq.example; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Server Adapter RabbitMQ Example Application - */ -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = {"cn.hippo4j.example.core", "cn.hippo4j.springboot.starter.adapter.rabbitmq.example"}) -public class ServerAdapterRabbitMQExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ServerAdapterRabbitMQExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/config/RabbitMQTemplateConfig.java b/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/config/RabbitMQTemplateConfig.java deleted file mode 100644 index b517e05a..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/config/RabbitMQTemplateConfig.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rabbitmq.example.config; - -import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; -import org.springframework.amqp.support.converter.MessageConverter; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * RabbitMQ template config. - */ -@Configuration -public class RabbitMQTemplateConfig { - - @Bean - public RabbitTemplate rabbitTemplate(CachingConnectionFactory connectionFactory) { - RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); - rabbitTemplate.setMessageConverter(jackson2JsonMessageConverter()); - return rabbitTemplate; - } - - @Bean - public MessageConverter jackson2JsonMessageConverter() { - return new Jackson2JsonMessageConverter(); - } -} diff --git a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/config/RabbitMQThreadPoolConfig.java b/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/config/RabbitMQThreadPoolConfig.java deleted file mode 100644 index 7eb4f6b4..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/config/RabbitMQThreadPoolConfig.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rabbitmq.example.config; - -import org.springframework.amqp.rabbit.config.AbstractRabbitListenerContainerFactory; -import org.springframework.amqp.rabbit.config.DirectRabbitListenerContainerFactory; -import org.springframework.amqp.rabbit.connection.AbstractConnectionFactory; -import org.springframework.amqp.support.converter.MessageConverter; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -/** - * RabbitMQ thread-pool config. - */ -@Configuration -public class RabbitMQThreadPoolConfig { - - private static final int MAX_POOL_SIZE = 5; - - private static final int CORE_POOL_SIZE = 5; - - private static final int QUEUE_CAPACITY = 1000; - - private static final int CONSUMERS_PER_QUEUE = 10; - - @Bean - public ThreadPoolTaskExecutor rabbitListenerTaskExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - // Specify the maximum number of threads. - executor.setMaxPoolSize(MAX_POOL_SIZE); - // Specifies the minimum number of thread pool maintenance threads. - executor.setCorePoolSize(CORE_POOL_SIZE); - // Specifies the number of tasks waiting to be processed. - executor.setQueueCapacity(QUEUE_CAPACITY); - executor.setThreadNamePrefix("RabbitListenerTaskExecutor-"); - return executor; - } - - @Bean - public AbstractRabbitListenerContainerFactory defaultRabbitListenerContainerFactory(ThreadPoolTaskExecutor rabbitListenerTaskExecutor, - MessageConverter messageConverter, AbstractConnectionFactory abstractConnectionFactory) { - DirectRabbitListenerContainerFactory factory = new DirectRabbitListenerContainerFactory(); - factory.setConnectionFactory(abstractConnectionFactory); - factory.setMessageConverter(messageConverter); - factory.setConsumersPerQueue(CONSUMERS_PER_QUEUE); - abstractConnectionFactory.setExecutor(rabbitListenerTaskExecutor); - return factory; - } -} diff --git a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/constants/SimpleMQConstant.java b/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/constants/SimpleMQConstant.java deleted file mode 100644 index 2d12c40b..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/constants/SimpleMQConstant.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rabbitmq.example.constants; - -/** - * Simple MQ constant. - */ -public class SimpleMQConstant { - - public static final String QUEUE_NAME = "framework_message-center_queue"; -} diff --git a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/consumer/MessageConsumer.java b/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/consumer/MessageConsumer.java deleted file mode 100644 index b4ae7bd9..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/consumer/MessageConsumer.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rabbitmq.example.consumer; - -import cn.hippo4j.example.core.dto.SendMessageDTO; -import cn.hippo4j.springboot.starter.adapter.rabbitmq.example.constants.SimpleMQConstant; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.rabbit.annotation.Queue; -import org.springframework.amqp.rabbit.annotation.RabbitHandler; -import org.springframework.amqp.rabbit.annotation.RabbitListener; -import org.springframework.stereotype.Component; - -import java.util.concurrent.TimeUnit; - -/** - * Message consume. - */ -@Slf4j -@Component -public class MessageConsumer { - - @RabbitHandler - @RabbitListener(queuesToDeclare = @Queue(SimpleMQConstant.QUEUE_NAME), containerFactory = "defaultRabbitListenerContainerFactory") - public void receiveObject(SendMessageDTO simple) throws Exception { - TimeUnit.SECONDS.sleep(1); - ObjectMapper objectMapper = new ObjectMapper(); - String message = objectMapper.writeValueAsString(simple); - log.info("consumer1 threadId {} Message: {}", Thread.currentThread().getName(), message); - } -} diff --git a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/producer/MessageProduce.java b/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/producer/MessageProduce.java deleted file mode 100644 index 978f4ce4..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/producer/MessageProduce.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rabbitmq.example.producer; - -import cn.hippo4j.common.toolkit.IdUtil; -import cn.hippo4j.example.core.dto.SendMessageDTO; -import cn.hippo4j.springboot.starter.adapter.rabbitmq.example.constants.SimpleMQConstant; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -/** - * Message produce. - */ -@Slf4j -@Component -@RestController -@AllArgsConstructor -public class MessageProduce { - - private final RabbitTemplate rabbitTemplate; - - @GetMapping("/message/send") - public String sendMessage(@RequestParam(name = "count") Integer count) { - for (int i = 0; i < count; i++) { - String keys = IdUtil.randomUUID(); - SendMessageDTO payload = SendMessageDTO.builder() - .receiver("156011xxx91") - .uid(keys) - .build(); - rabbitTemplate.convertAndSend(SimpleMQConstant.QUEUE_NAME, payload); - } - return "success"; - } -} diff --git a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/resources/application.properties b/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/resources/application.properties deleted file mode 100644 index f3bc5fd4..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq-spring-boot3/src/main/resources/application.properties +++ /dev/null @@ -1,17 +0,0 @@ -server.port=8091 - -spring.profiles.active=dev -spring.application.name=hippo4j-spring-boot-starter-adapter-rabbitmq-spring-boot3-example - -spring.dynamic.thread-pool.server-addr=http://localhost:6691 -spring.dynamic.thread-pool.namespace=prescription -spring.dynamic.thread-pool.item-id=dynamic-threadpool-example -spring.dynamic.thread-pool.username=admin -spring.dynamic.thread-pool.password=123456 - -# Please replace the local configuration. -spring.rabbitmq.host=127.0.0.1 -spring.rabbitmq.port=5672 -spring.rabbitmq.username=guest -spring.rabbitmq.password=guest -spring.rabbitmq.virtual-host=/ diff --git a/examples/threadpool-example/server/adapter-rabbitmq/pom.xml b/examples/threadpool-example/server/adapter-rabbitmq/pom.xml deleted file mode 100644 index fd0fd5ca..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq/pom.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-server-mode-example - ${revision} - - hippo4j-threadpool-adapter-rabbitmq-example - - - true - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - org.projectlombok - lombok - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-rabbitmq - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter - ${project.version} - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - org.springframework.boot - spring-boot-starter-amqp - - - diff --git a/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/ServerAdapterRabbitMQExampleApplication.java b/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/ServerAdapterRabbitMQExampleApplication.java deleted file mode 100644 index 821ccbdd..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/ServerAdapterRabbitMQExampleApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rabbitmq.example; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Server Adapter RabbitMQ Example Application - */ -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = {"cn.hippo4j.example.core", "cn.hippo4j.springboot.starter.adapter.rabbitmq.example"}) -public class ServerAdapterRabbitMQExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ServerAdapterRabbitMQExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/config/RabbitMQTemplateConfig.java b/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/config/RabbitMQTemplateConfig.java deleted file mode 100644 index b517e05a..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/config/RabbitMQTemplateConfig.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rabbitmq.example.config; - -import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; -import org.springframework.amqp.support.converter.MessageConverter; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * RabbitMQ template config. - */ -@Configuration -public class RabbitMQTemplateConfig { - - @Bean - public RabbitTemplate rabbitTemplate(CachingConnectionFactory connectionFactory) { - RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); - rabbitTemplate.setMessageConverter(jackson2JsonMessageConverter()); - return rabbitTemplate; - } - - @Bean - public MessageConverter jackson2JsonMessageConverter() { - return new Jackson2JsonMessageConverter(); - } -} diff --git a/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/config/RabbitMQThreadPoolConfig.java b/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/config/RabbitMQThreadPoolConfig.java deleted file mode 100644 index 7eb4f6b4..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/config/RabbitMQThreadPoolConfig.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rabbitmq.example.config; - -import org.springframework.amqp.rabbit.config.AbstractRabbitListenerContainerFactory; -import org.springframework.amqp.rabbit.config.DirectRabbitListenerContainerFactory; -import org.springframework.amqp.rabbit.connection.AbstractConnectionFactory; -import org.springframework.amqp.support.converter.MessageConverter; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -/** - * RabbitMQ thread-pool config. - */ -@Configuration -public class RabbitMQThreadPoolConfig { - - private static final int MAX_POOL_SIZE = 5; - - private static final int CORE_POOL_SIZE = 5; - - private static final int QUEUE_CAPACITY = 1000; - - private static final int CONSUMERS_PER_QUEUE = 10; - - @Bean - public ThreadPoolTaskExecutor rabbitListenerTaskExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - // Specify the maximum number of threads. - executor.setMaxPoolSize(MAX_POOL_SIZE); - // Specifies the minimum number of thread pool maintenance threads. - executor.setCorePoolSize(CORE_POOL_SIZE); - // Specifies the number of tasks waiting to be processed. - executor.setQueueCapacity(QUEUE_CAPACITY); - executor.setThreadNamePrefix("RabbitListenerTaskExecutor-"); - return executor; - } - - @Bean - public AbstractRabbitListenerContainerFactory defaultRabbitListenerContainerFactory(ThreadPoolTaskExecutor rabbitListenerTaskExecutor, - MessageConverter messageConverter, AbstractConnectionFactory abstractConnectionFactory) { - DirectRabbitListenerContainerFactory factory = new DirectRabbitListenerContainerFactory(); - factory.setConnectionFactory(abstractConnectionFactory); - factory.setMessageConverter(messageConverter); - factory.setConsumersPerQueue(CONSUMERS_PER_QUEUE); - abstractConnectionFactory.setExecutor(rabbitListenerTaskExecutor); - return factory; - } -} diff --git a/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/constants/SimpleMQConstant.java b/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/constants/SimpleMQConstant.java deleted file mode 100644 index 2d12c40b..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/constants/SimpleMQConstant.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rabbitmq.example.constants; - -/** - * Simple MQ constant. - */ -public class SimpleMQConstant { - - public static final String QUEUE_NAME = "framework_message-center_queue"; -} diff --git a/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/consumer/MessageConsumer.java b/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/consumer/MessageConsumer.java deleted file mode 100644 index b4ae7bd9..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/consumer/MessageConsumer.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rabbitmq.example.consumer; - -import cn.hippo4j.example.core.dto.SendMessageDTO; -import cn.hippo4j.springboot.starter.adapter.rabbitmq.example.constants.SimpleMQConstant; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.rabbit.annotation.Queue; -import org.springframework.amqp.rabbit.annotation.RabbitHandler; -import org.springframework.amqp.rabbit.annotation.RabbitListener; -import org.springframework.stereotype.Component; - -import java.util.concurrent.TimeUnit; - -/** - * Message consume. - */ -@Slf4j -@Component -public class MessageConsumer { - - @RabbitHandler - @RabbitListener(queuesToDeclare = @Queue(SimpleMQConstant.QUEUE_NAME), containerFactory = "defaultRabbitListenerContainerFactory") - public void receiveObject(SendMessageDTO simple) throws Exception { - TimeUnit.SECONDS.sleep(1); - ObjectMapper objectMapper = new ObjectMapper(); - String message = objectMapper.writeValueAsString(simple); - log.info("consumer1 threadId {} Message: {}", Thread.currentThread().getName(), message); - } -} diff --git a/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/producer/MessageProduce.java b/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/producer/MessageProduce.java deleted file mode 100644 index 5113bad8..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/example/producer/MessageProduce.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rabbitmq.example.producer; - -import cn.hippo4j.common.toolkit.IdUtil; -import cn.hippo4j.example.core.dto.SendMessageDTO; -import cn.hippo4j.springboot.starter.adapter.rabbitmq.example.constants.SimpleMQConstant; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * Message produce. - */ -@Slf4j -@Component -@RestController -@AllArgsConstructor -public class MessageProduce { - - private final RabbitTemplate rabbitTemplate; - - @GetMapping("/message/send") - public String sendMessage(Integer count) { - for (int i = 0; i < count; i++) { - String keys = IdUtil.randomUUID(); - SendMessageDTO payload = SendMessageDTO.builder() - .receiver("156011xxx91") - .uid(keys) - .build(); - rabbitTemplate.convertAndSend(SimpleMQConstant.QUEUE_NAME, payload); - } - return "success"; - } -} diff --git a/examples/threadpool-example/server/adapter-rabbitmq/src/main/resources/application.properties b/examples/threadpool-example/server/adapter-rabbitmq/src/main/resources/application.properties deleted file mode 100644 index 51840916..00000000 --- a/examples/threadpool-example/server/adapter-rabbitmq/src/main/resources/application.properties +++ /dev/null @@ -1,17 +0,0 @@ -server.port=8091 - -spring.profiles.active=dev -spring.application.name=hippo4j-spring-boot-starter-adapter-rabbitmq-example - -spring.dynamic.thread-pool.server-addr=http://localhost:6691 -spring.dynamic.thread-pool.namespace=prescription -spring.dynamic.thread-pool.item-id=dynamic-threadpool-example -spring.dynamic.thread-pool.username=admin -spring.dynamic.thread-pool.password=123456 - -# Please replace the local configuration. -spring.rabbitmq.host=127.0.0.1 -spring.rabbitmq.port=5672 -spring.rabbitmq.username=guest -spring.rabbitmq.password=guest -spring.rabbitmq.virtual-host=/ diff --git a/examples/threadpool-example/server/adapter-rocketmq/pom.xml b/examples/threadpool-example/server/adapter-rocketmq/pom.xml deleted file mode 100644 index 04e533d3..00000000 --- a/examples/threadpool-example/server/adapter-rocketmq/pom.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-server-mode-example - ${revision} - - hippo4j-threadpool-adapter-rocketmq-example - - - true - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - org.projectlombok - lombok - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-rocketmq - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter - ${project.version} - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - org.apache.rocketmq - rocketmq-spring-boot-starter - - - diff --git a/examples/threadpool-example/server/adapter-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rocketmq/example/MessageConsume.java b/examples/threadpool-example/server/adapter-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rocketmq/example/MessageConsume.java deleted file mode 100644 index a4d0041f..00000000 --- a/examples/threadpool-example/server/adapter-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rocketmq/example/MessageConsume.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rocketmq.example; - -import lombok.extern.slf4j.Slf4j; -import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; -import org.apache.rocketmq.spring.core.RocketMQListener; -import org.springframework.stereotype.Service; - -/** - * Message consume. - */ -@Slf4j -@Service -@RocketMQMessageListener(topic = "test-topic", consumerGroup = "my-consumer_test-topic", consumeThreadNumber = 2) -public class MessageConsume implements RocketMQListener { - - @Override - public void onMessage(String message) { - log.info("Message: {}", message); - } -} diff --git a/examples/threadpool-example/server/adapter-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rocketmq/example/MessageProduce.java b/examples/threadpool-example/server/adapter-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rocketmq/example/MessageProduce.java deleted file mode 100644 index 475ecff8..00000000 --- a/examples/threadpool-example/server/adapter-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rocketmq/example/MessageProduce.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rocketmq.example; - -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.rocketmq.spring.core.RocketMQTemplate; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; -import java.util.Date; - -/** - * Message produce. - */ -@Slf4j -@Component -@RestController -@AllArgsConstructor -public class MessageProduce { - - private final RocketMQTemplate rocketMQTemplate; - - @GetMapping("/message/send") - public String sendMessage() { - rocketMQTemplate.convertAndSend("test-topic", new Date().toString()); - return "success"; - } -} diff --git a/examples/threadpool-example/server/adapter-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rocketmq/example/ServerAdapterRocketMQExampleApplication.java b/examples/threadpool-example/server/adapter-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rocketmq/example/ServerAdapterRocketMQExampleApplication.java deleted file mode 100644 index f9daad69..00000000 --- a/examples/threadpool-example/server/adapter-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rocketmq/example/ServerAdapterRocketMQExampleApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rocketmq.example; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Server adapter rocketMQ example application - */ -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = {"cn.hippo4j.example.core", "cn.hippo4j.springboot.starter.adapter.rocketmq.example"}) -public class ServerAdapterRocketMQExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ServerAdapterRocketMQExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/server/adapter-rocketmq/src/main/resources/application.properties b/examples/threadpool-example/server/adapter-rocketmq/src/main/resources/application.properties deleted file mode 100644 index cbf34d4c..00000000 --- a/examples/threadpool-example/server/adapter-rocketmq/src/main/resources/application.properties +++ /dev/null @@ -1,12 +0,0 @@ -server.port=8099 - -spring.profiles.active=dev -spring.application.name=hippo4j-spring-boot-starter-adapter-rocketmq-example -spring.dynamic.thread-pool.server-addr=http://localhost:6691 -spring.dynamic.thread-pool.namespace=prescription -spring.dynamic.thread-pool.item-id=dynamic-threadpool-example -spring.dynamic.thread-pool.username=admin -spring.dynamic.thread-pool.password=123456 - -rocketmq.nameServer=127.0.0.1:9876 -rocketmq.producer.group=my-producer diff --git a/examples/threadpool-example/server/adapter-stream-rabbitmq-spring-boot3/README.md b/examples/threadpool-example/server/adapter-stream-rabbitmq-spring-boot3/README.md deleted file mode 100644 index 5a267d79..00000000 --- a/examples/threadpool-example/server/adapter-stream-rabbitmq-spring-boot3/README.md +++ /dev/null @@ -1,5 +0,0 @@ -## spring-boot3 仅支持jdk17以上版本 -## 启动项添加JVM配置参数: -``` ---add-opens java.base/java.util.concurrent=ALL-UNNAMED -``` \ No newline at end of file diff --git a/examples/threadpool-example/server/adapter-stream-rabbitmq-spring-boot3/pom.xml b/examples/threadpool-example/server/adapter-stream-rabbitmq-spring-boot3/pom.xml deleted file mode 100644 index 64f72234..00000000 --- a/examples/threadpool-example/server/adapter-stream-rabbitmq-spring-boot3/pom.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-adapter-stream-rabbitmq-spring-boot3-example - ${revision} - - true - 2.0.0-SNAPSHOT - 3.3.3 - 4.1.3 - 1.17 - 17 - 17 - - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - org.projectlombok - lombok - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-stream-rabbitmq - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter - ${project.version} - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - org.springframework.cloud - spring-cloud-starter-stream-rabbit - ${spring-clound-stream.version} - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - diff --git a/examples/threadpool-example/server/adapter-stream-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rabbitmq/example/MessageProduce.java b/examples/threadpool-example/server/adapter-stream-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rabbitmq/example/MessageProduce.java deleted file mode 100644 index 45883273..00000000 --- a/examples/threadpool-example/server/adapter-stream-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rabbitmq/example/MessageProduce.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.springcloud.stream.rabbitmq.example; - -import cn.hippo4j.common.toolkit.IdUtil; -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.example.core.dto.SendMessageDTO; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.stream.function.StreamBridge; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -/** - * Message produce. - */ -@Slf4j -@RestController -@AllArgsConstructor -public class MessageProduce { - - private final StreamBridge streamBridge; - - private static final int MAX_SEND_SIZE = 10; - - @GetMapping("/message/send") - public String sendMessage(@RequestParam(required = false,name = "maxSendSize") Integer maxSendSize) { - if (maxSendSize == null) { - maxSendSize = MAX_SEND_SIZE; - } - for (int i = 0; i < maxSendSize; i++) { - sendMessage0(); - } - return "success"; - } - - private void sendMessage0() { - String keys = IdUtil.randomUUID(); - SendMessageDTO payload = SendMessageDTO.builder() - .receiver("156011xxx91") - .uid(keys) - .build(); - long startTime = System.currentTimeMillis(); - boolean sendResult = false; - try { - sendResult = streamBridge.send("demoOutput", payload); - } finally { - log.info("Send status: {}, Keys: {}, Execute time: {} ms, Message: {}", - sendResult, - keys, - System.currentTimeMillis() - startTime, - JSONUtil.toJSONString(payload)); - } - } -} diff --git a/examples/threadpool-example/server/adapter-stream-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rabbitmq/example/ServerAdapterSpringCloudStreamRabbitMQApplication.java b/examples/threadpool-example/server/adapter-stream-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rabbitmq/example/ServerAdapterSpringCloudStreamRabbitMQApplication.java deleted file mode 100644 index 1f974800..00000000 --- a/examples/threadpool-example/server/adapter-stream-rabbitmq-spring-boot3/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rabbitmq/example/ServerAdapterSpringCloudStreamRabbitMQApplication.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.springcloud.stream.rabbitmq.example; - -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.support.AmqpHeaders; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.messaging.Message; -import org.springframework.messaging.MessageHeaders; - -import java.util.function.Consumer; - -/** - * Server Adapter Spring Cloud Stream RabbitMQ Application - */ -@Slf4j -@EnableDynamicThreadPool -@SpringBootApplication -public class ServerAdapterSpringCloudStreamRabbitMQApplication { - - public static void main(String[] args) { - SpringApplication.run(ServerAdapterSpringCloudStreamRabbitMQApplication.class, args); - } - - @Bean - public Consumer> demoInput() { - return message -> { - MessageHeaders headers = message.getHeaders(); - log.info("Input current thread name: {} ,{} received from partition {}", - Thread.currentThread().getName(), - JSONUtil.toJSONString(message.getPayload()), - headers.get(AmqpHeaders.CONSUMER_QUEUE)); - }; - } - -} diff --git a/examples/threadpool-example/server/adapter-stream-rabbitmq-spring-boot3/src/main/resources/application.properties b/examples/threadpool-example/server/adapter-stream-rabbitmq-spring-boot3/src/main/resources/application.properties deleted file mode 100644 index 075e4ff8..00000000 --- a/examples/threadpool-example/server/adapter-stream-rabbitmq-spring-boot3/src/main/resources/application.properties +++ /dev/null @@ -1,29 +0,0 @@ -server.port=8090 - -spring.application.name=hippo4j-spring-boot-starter-adapter-rabbitmq-spring-boot3-example - -spring.profiles.active=dev -spring.dynamic.thread-pool.server-addr=http://localhost:6691 -spring.dynamic.thread-pool.namespace=prescription -spring.dynamic.thread-pool.item-id=dynamic-threadpool-example -spring.dynamic.thread-pool.username=admin -spring.dynamic.thread-pool.password=123456 - -spring.rabbitmq.host=localhost -spring.rabbitmq.port=5672 -spring.rabbitmq.username=root -spring.rabbitmq.password=123456 -spring.rabbitmq.virtual-host=/ - -# Please replace the local configuration. -spring.cloud.stream.binders.defaultRabbit.type=rabbit - -# === produce === -spring.cloud.stream.bindings.demoOutput.destination=exchange-demo -spring.cloud.stream.bindings.demoOutput.content-type=application/json - -# === consume === -spring.cloud.stream.bindings.demoInput-in-0.destination=exchange-demo -spring.cloud.stream.bindings.demoInput-in-0.content-type=application/json -spring.cloud.stream.bindings.demoInput-in-0.group=myGroup -spring.cloud.stream.bindings.demoInput-in-0.consumer.concurrency=1 diff --git a/examples/threadpool-example/server/adapter-stream-rabbitmq/pom.xml b/examples/threadpool-example/server/adapter-stream-rabbitmq/pom.xml deleted file mode 100644 index 8950dbf8..00000000 --- a/examples/threadpool-example/server/adapter-stream-rabbitmq/pom.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-server-mode-example - ${revision} - - hippo4j-threadpool-adapter-stream-rabbitmq-example - - - true - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - org.projectlombok - lombok - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-stream-rabbitmq - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter - ${project.version} - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - org.springframework.cloud - spring-cloud-starter-stream-rabbit - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - diff --git a/examples/threadpool-example/server/adapter-stream-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rabbitmq/example/MessageProduce.java b/examples/threadpool-example/server/adapter-stream-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rabbitmq/example/MessageProduce.java deleted file mode 100644 index 06d5f1f0..00000000 --- a/examples/threadpool-example/server/adapter-stream-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rabbitmq/example/MessageProduce.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.springcloud.stream.rabbitmq.example; - -import cn.hippo4j.common.toolkit.IdUtil; -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.example.core.dto.SendMessageDTO; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.stream.function.StreamBridge; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -/** - * Message produce. - */ -@Slf4j -@RestController -@AllArgsConstructor -public class MessageProduce { - - private final StreamBridge streamBridge; - - private static final int MAX_SEND_SIZE = 10; - - @GetMapping("/message/send") - public String sendMessage(@RequestParam(required = false) Integer maxSendSize) { - if (maxSendSize == null) { - maxSendSize = MAX_SEND_SIZE; - } - for (int i = 0; i < maxSendSize; i++) { - sendMessage0(); - } - return "success"; - } - - private void sendMessage0() { - String keys = IdUtil.randomUUID(); - SendMessageDTO payload = SendMessageDTO.builder() - .receiver("156011xxx91") - .uid(keys) - .build(); - long startTime = System.currentTimeMillis(); - boolean sendResult = false; - try { - sendResult = streamBridge.send("demoOutput", payload); - } finally { - log.info("Send status: {}, Keys: {}, Execute time: {} ms, Message: {}", - sendResult, - keys, - System.currentTimeMillis() - startTime, - JSONUtil.toJSONString(payload)); - } - } -} diff --git a/examples/threadpool-example/server/adapter-stream-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rabbitmq/example/ServerAdapterSpringCloudStreamRabbitMQApplication.java b/examples/threadpool-example/server/adapter-stream-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rabbitmq/example/ServerAdapterSpringCloudStreamRabbitMQApplication.java deleted file mode 100644 index 1f974800..00000000 --- a/examples/threadpool-example/server/adapter-stream-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rabbitmq/example/ServerAdapterSpringCloudStreamRabbitMQApplication.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.springcloud.stream.rabbitmq.example; - -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.support.AmqpHeaders; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.messaging.Message; -import org.springframework.messaging.MessageHeaders; - -import java.util.function.Consumer; - -/** - * Server Adapter Spring Cloud Stream RabbitMQ Application - */ -@Slf4j -@EnableDynamicThreadPool -@SpringBootApplication -public class ServerAdapterSpringCloudStreamRabbitMQApplication { - - public static void main(String[] args) { - SpringApplication.run(ServerAdapterSpringCloudStreamRabbitMQApplication.class, args); - } - - @Bean - public Consumer> demoInput() { - return message -> { - MessageHeaders headers = message.getHeaders(); - log.info("Input current thread name: {} ,{} received from partition {}", - Thread.currentThread().getName(), - JSONUtil.toJSONString(message.getPayload()), - headers.get(AmqpHeaders.CONSUMER_QUEUE)); - }; - } - -} diff --git a/examples/threadpool-example/server/adapter-stream-rabbitmq/src/main/resources/application.properties b/examples/threadpool-example/server/adapter-stream-rabbitmq/src/main/resources/application.properties deleted file mode 100644 index 813a9f87..00000000 --- a/examples/threadpool-example/server/adapter-stream-rabbitmq/src/main/resources/application.properties +++ /dev/null @@ -1,28 +0,0 @@ -server.port=8090 -logging.level.org.springframework.amqp. - -spring.profiles.active=dev -spring.dynamic.thread-pool.server-addr=http://localhost:6691 -spring.dynamic.thread-pool.namespace=prescription -spring.dynamic.thread-pool.item-id=dynamic-threadpool-example -spring.dynamic.thread-pool.username=admin -spring.dynamic.thread-pool.password=123456 - -spring.rabbitmq.host=localhost -spring.rabbitmq.port=5672 -spring.rabbitmq.username=root -spring.rabbitmq.password=123456 -spring.rabbitmq.virtual-host=/ - -# Please replace the local configuration. -spring.cloud.stream.binders.defaultRabbit.type=rabbit - -# === produce === -spring.cloud.stream.bindings.demoOutput.destination=exchange-demo -spring.cloud.stream.bindings.demoOutput.content-type=application/json - -# === consume === -spring.cloud.stream.bindings.demoInput-in-0.destination=exchange-demo -spring.cloud.stream.bindings.demoInput-in-0.content-type=application/json -spring.cloud.stream.bindings.demoInput-in-0.group=myGroup -spring.cloud.stream.bindings.demoInput-in-0.consumer.concurrency=1 diff --git a/examples/threadpool-example/server/adapter-stream-rocketmq/pom.xml b/examples/threadpool-example/server/adapter-stream-rocketmq/pom.xml deleted file mode 100644 index 279beee3..00000000 --- a/examples/threadpool-example/server/adapter-stream-rocketmq/pom.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-server-mode-example - ${revision} - - hippo4j-threadpool-adapter-stream-rocketmq-example - - - true - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - com.alibaba.cloud - spring-cloud-starter-stream-rocketmq - - - org.projectlombok - lombok - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-stream-rocketmq - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter - ${project.version} - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - io.micrometer - micrometer-registry-prometheus - - - org.springframework.boot - spring-boot-starter-actuator - - - cn.hippo4j - hippo4j-spring-boot-starter-monitor-micrometer - ${revision} - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - diff --git a/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rocketmq/example/MessageConsume.java b/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rocketmq/example/MessageConsume.java deleted file mode 100644 index 9b546442..00000000 --- a/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rocketmq/example/MessageConsume.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.springcloud.stream.rocketmq.example; - -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.example.core.dto.SendMessageDTO; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.stream.annotation.StreamListener; -import org.springframework.messaging.handler.annotation.Headers; -import org.springframework.messaging.handler.annotation.Payload; -import org.springframework.stereotype.Component; - -import java.util.Map; - -/** - * Message consume. - */ -@Slf4j -@Component -public class MessageConsume { - - @StreamListener(MySink.INPUT) - public void consumeMessage(@Payload SendMessageDTO message, @Headers Map headers) { - long startTime = System.currentTimeMillis(); - try { - // ignore - log.info("Message: {}", JSONUtil.toJSONString(message)); - } finally { - log.info("Keys: {}, Msg id: {}, Execute time: {} ms, Message: {}", headers.get("rocketmq_KEYS"), headers.get("rocketmq_MESSAGE_ID"), System.currentTimeMillis() - startTime, - JSONUtil.toJSONString(message)); - } - log.info("Input current thread name: {}", Thread.currentThread().getName()); - } - - @StreamListener(MySink.INPUT2) - public void consumeSaveMessage(@Payload SendMessageDTO message, @Headers Map headers) { - long startTime = System.currentTimeMillis(); - try { - // ignore - log.info("Message: {}", JSONUtil.toJSONString(message)); - } finally { - log.info("Keys: {}, Msg id: {}, Execute time: {} ms, Message: {}", headers.get("rocketmq_KEYS"), headers.get("rocketmq_MESSAGE_ID"), System.currentTimeMillis() - startTime, - JSONUtil.toJSONString(message)); - } - log.info("Input2 current thread name: {}", Thread.currentThread().getName()); - } -} diff --git a/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rocketmq/example/MessageProduce.java b/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rocketmq/example/MessageProduce.java deleted file mode 100644 index 6410eb5f..00000000 --- a/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rocketmq/example/MessageProduce.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.springcloud.stream.rocketmq.example; - -import cn.hippo4j.common.toolkit.IdUtil; -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.example.core.dto.SendMessageDTO; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.rocketmq.common.message.MessageConst; -import org.springframework.messaging.Message; -import org.springframework.messaging.MessageChannel; -import org.springframework.messaging.support.MessageBuilder; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * Message produce. - */ -@Slf4j -@RestController -@AllArgsConstructor -public class MessageProduce { - - private final MessageChannel output; - - public static final String MESSAGE_CENTER_SEND_MESSAGE_TAG = "framework_message-center_send-message_tag"; - - public static final String MESSAGE_CENTER_SAVE_MESSAGE_TAG = "framework_message-center_save-message_tag"; - - private static final int MAX_SEND_SIZE = 10; - - private static final long SEND_TIMEOUT = 2000L; - - @GetMapping("/message/send") - public String sendMessage() { - for (int i = 0; i < MAX_SEND_SIZE; i++) { - sendMessage(MESSAGE_CENTER_SEND_MESSAGE_TAG); - sendMessage(MESSAGE_CENTER_SAVE_MESSAGE_TAG); - } - return "success"; - } - - private void sendMessage(String tags) { - String keys = IdUtil.randomUUID(); - SendMessageDTO payload = SendMessageDTO.builder() - .receiver("156011xxx91") - .uid(keys) - .build(); - Message message = MessageBuilder - .withPayload(JSONUtil.toJSONString(payload)) - .setHeader(MessageConst.PROPERTY_KEYS, keys) - .setHeader(MessageConst.PROPERTY_TAGS, tags) - .build(); - long startTime = System.currentTimeMillis(); - boolean sendResult = false; - try { - sendResult = output.send(message, SEND_TIMEOUT); - } finally { - log.info("Send status: {}, Keys: {}, Execute time: {} ms, Message: {}", - sendResult, - keys, - System.currentTimeMillis() - startTime, - JSONUtil.toJSONString(payload)); - } - } -} diff --git a/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rocketmq/example/MySink.java b/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rocketmq/example/MySink.java deleted file mode 100644 index d3dd3180..00000000 --- a/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rocketmq/example/MySink.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.springcloud.stream.rocketmq.example; - -import org.springframework.cloud.stream.annotation.Input; -import org.springframework.cloud.stream.messaging.Sink; -import org.springframework.messaging.SubscribableChannel; - -/** - * My sink. - */ -public interface MySink extends Sink { - - /** - * Input channel name. - */ - String INPUT2 = "input2"; - - /** - * @return input channel. - */ - @Input(MySink.INPUT2) - SubscribableChannel input2(); -} diff --git a/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rocketmq/example/ServerAdapterSpringCloudStreamRocketMQApplication.java b/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rocketmq/example/ServerAdapterSpringCloudStreamRocketMQApplication.java deleted file mode 100644 index 79194b6f..00000000 --- a/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rocketmq/example/ServerAdapterSpringCloudStreamRocketMQApplication.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.springcloud.stream.rocketmq.example; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.stream.annotation.EnableBinding; -import org.springframework.cloud.stream.messaging.Source; - -/** - * Server Adapter Spring Cloud Stream RocketMQ Application - */ -@Slf4j -@EnableDynamicThreadPool -@EnableBinding({Source.class, MySink.class}) -@SpringBootApplication -public class ServerAdapterSpringCloudStreamRocketMQApplication { - - public static void main(String[] args) { - SpringApplication.run(ServerAdapterSpringCloudStreamRocketMQApplication.class, args); - } -} diff --git a/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/resources/META-INF/services/cn.hippo4j.core.api.ClientNetworkService b/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/resources/META-INF/services/cn.hippo4j.core.api.ClientNetworkService deleted file mode 100644 index 76cecf59..00000000 --- a/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/resources/META-INF/services/cn.hippo4j.core.api.ClientNetworkService +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.example.core.handler.CustomerClientNetworkService \ No newline at end of file diff --git a/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/resources/application.properties b/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/resources/application.properties deleted file mode 100644 index 7631eb07..00000000 --- a/examples/threadpool-example/server/adapter-stream-rocketmq/src/main/resources/application.properties +++ /dev/null @@ -1,45 +0,0 @@ -server.port=8090 - -spring.profiles.active=dev -spring.application.name=springcloud-rocketmq-stream-example -spring.dynamic.thread-pool.server-addr=http://localhost:6691 -spring.dynamic.thread-pool.namespace=prescription -spring.dynamic.thread-pool.item-id=dynamic-threadpool-example -spring.dynamic.thread-pool.username=admin -spring.dynamic.thread-pool.password=123456 - -# Enable server and micrometer monitoring at the same time -spring.dynamic.thread-pool.monitor.enable=true -spring.dynamic.thread-pool.monitor.collect-types=server,micrometer -spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic,adapter -spring.dynamic.thread-pool.monitor.initial-delay=10000 -spring.dynamic.thread-pool.monitor.collect-interval=5000 - -management.metrics.export.prometheus.enabled=true -management.server.port=29901 -management.endpoints.web.exposure.include=* - -# Please replace the local configuration. -spring.cloud.stream.rocketmq.binder.name-server=127.0.0.1:9876 - -# === produce === -spring.cloud.stream.bindings.output.content-type=application/json -spring.cloud.stream.bindings.output.destination=framework_message-center_topic -spring.cloud.stream.bindings.output.group=framework_message-center_send-message_pg - -# === consume === -spring.cloud.stream.bindings.input.content-type=application/json -spring.cloud.stream.bindings.input.destination=framework_message-center_topic -spring.cloud.stream.bindings.input.group=framework_message-center_send-message_cg -spring.cloud.stream.bindings.input.consumer.max-attempts=1 -spring.cloud.stream.bindings.input.consumer.concurrency=1 -spring.cloud.stream.rocketmq.bindings.input.consumer.tags=framework_message-center_send-message_tag -spring.cloud.stream.rocketmq.bindings.input.consumer.delay-level-when-next-consume=-1 - -spring.cloud.stream.bindings.input2.content-type=application/json -spring.cloud.stream.bindings.input2.destination=framework_message-center_topic -spring.cloud.stream.bindings.input2.group=framework_message-center_save-message_cg -spring.cloud.stream.bindings.input2.consumer.max-attempts=1 -spring.cloud.stream.bindings.input2.consumer.concurrency=1 -spring.cloud.stream.rocketmq.bindings.input2.consumer.tags=framework_message-center_save-message_tag -spring.cloud.stream.rocketmq.bindings.input2.consumer.delay-level-when-next-consume=-1 diff --git a/examples/threadpool-example/server/monitor-elasticsearch/pom.xml b/examples/threadpool-example/server/monitor-elasticsearch/pom.xml deleted file mode 100644 index d9bdf0d2..00000000 --- a/examples/threadpool-example/server/monitor-elasticsearch/pom.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-server-mode-example - ${revision} - - hippo4j-threadpool-monitor-elasticsearch-example - - - true - - - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - - cn.hippo4j - hippo4j-threadpool-config-spring-boot-starter - ${revision} - - - - org.springframework.boot - spring-boot-starter-web - - - - org.apache.tomcat.embed - tomcat-embed-core - - - - cn.hippo4j - hippo4j-spring-boot-starter-monitor-elasticsearch - ${revision} - - - - - - - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - diff --git a/examples/threadpool-example/server/monitor-elasticsearch/src/main/java/cn/hippo4j/example/es/monitor/ServerEsMonitorExampleApplication.java b/examples/threadpool-example/server/monitor-elasticsearch/src/main/java/cn/hippo4j/example/es/monitor/ServerEsMonitorExampleApplication.java deleted file mode 100644 index 9f26765c..00000000 --- a/examples/threadpool-example/server/monitor-elasticsearch/src/main/java/cn/hippo4j/example/es/monitor/ServerEsMonitorExampleApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.es.monitor; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Server es monitor example application - */ -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = {"cn.hippo4j.example.core", "cn.hippo4j.monitor"}) -public class ServerEsMonitorExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ServerEsMonitorExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/server/monitor-elasticsearch/src/main/resources/application.properties b/examples/threadpool-example/server/monitor-elasticsearch/src/main/resources/application.properties deleted file mode 100644 index 8b2e675d..00000000 --- a/examples/threadpool-example/server/monitor-elasticsearch/src/main/resources/application.properties +++ /dev/null @@ -1,44 +0,0 @@ -server.port=8088 - -server.servlet.context-path=/example - -spring.profiles.active=dev -spring.application.name=hippo4j-spring-boot-starter-es-monitor-example - -es.thread-pool-state.host = ip1:port,ip2:port -es.thread-pool-state.scheme = http -es.thread-pool-state.userName = xxx -es.thread-pool-state.password = xxx -es.thread-pool-state.index.name = thread-pool-state - -spring.dynamic.thread-pool.item-id=test -spring.dynamic.thread-pool.enable=true -spring.dynamic.thread-pool.banner=false -spring.dynamic.thread-pool.monitor.enable=true -spring.dynamic.thread-pool.monitor.collect-types=elasticsearch -spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic -spring.dynamic.thread-pool.monitor.initial-delay=10000 -spring.dynamic.thread-pool.monitor.collect-interval=5000 -spring.dynamic.thread-pool.notify-platforms[0].platform=DING -spring.dynamic.thread-pool.notify-platforms[0].token=xxx -spring.dynamic.thread-pool.notify-platforms[0].secret=xxx -spring.dynamic.thread-pool.apollo.namespace=threadpool.yaml -spring.dynamic.thread-pool.config-file-type=yaml -spring.dynamic.thread-pool.alarm=true -spring.dynamic.thread-pool.check-state-interval=3000 -spring.dynamic.thread-pool.capacity-alarm=80 -spring.dynamic.thread-pool.alarm-interval=8 -spring.dynamic.thread-pool.executors[0].thread-pool-id=message-consume -spring.dynamic.thread-pool.executors[0].core-pool-size=32 -spring.dynamic.thread-pool.executors[0].maximum-pool-size=32 -spring.dynamic.thread-pool.executors[0].queue-capacity=999 -spring.dynamic.thread-pool.executors[0].execute-time-out=1500 -spring.dynamic.thread-pool.executors[0].blocking-queue=ResizableCapacityLinkedBlockIngQueue -spring.dynamic.thread-pool.executors[0].rejected-handler=CallerRunsPolicy -spring.dynamic.thread-pool.executors[0].keep-alive-time=1024 -spring.dynamic.thread-pool.executors[0].allow-core-thread-time-out=true -spring.dynamic.thread-pool.executors[0].thread-name-prefix=untimely-thread-pool -spring.dynamic.thread-pool.executors[0].alarm=true -spring.dynamic.thread-pool.executors[0].capacity-alarm=20 -spring.dynamic.thread-pool.executors[0].notify.interval=2 -spring.dynamic.thread-pool.executors[0].notify.receives=chen.ma diff --git a/examples/threadpool-example/server/pom.xml b/examples/threadpool-example/server/pom.xml deleted file mode 100644 index 7d1d7804..00000000 --- a/examples/threadpool-example/server/pom.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-example - ${revision} - - hippo4j-threadpool-server-mode-example - pom - - - true - - - - adapter-rabbitmq - adapter-stream-rabbitmq - adapter-stream-rocketmq - adapter-rocketmq - adapter-kafka - server - monitor-elasticsearch - - \ No newline at end of file diff --git a/examples/threadpool-example/server/server-spring-boot3/README.md b/examples/threadpool-example/server/server-spring-boot3/README.md deleted file mode 100644 index 30067dd5..00000000 --- a/examples/threadpool-example/server/server-spring-boot3/README.md +++ /dev/null @@ -1,4 +0,0 @@ -启动项添加JVM配置参数: -``` ---add-opens java.base/java.util.concurrent=ALL-UNNAMED -``` \ No newline at end of file diff --git a/examples/threadpool-example/server/server-spring-boot3/pom.xml b/examples/threadpool-example/server/server-spring-boot3/pom.xml deleted file mode 100644 index e5df15cb..00000000 --- a/examples/threadpool-example/server/server-spring-boot3/pom.xml +++ /dev/null @@ -1,107 +0,0 @@ - - - 4.0.0 - cn.hippo4j - hippo4j-threadpool-server-spring-boot3-example - ${revision} - - 2.0.0-SNAPSHOT - true - 3.3.3 - 1.17 - 17 - 17 - - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter - ${revision} - - - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - - - - cn.hippo4j - hippo4j-spring-boot-starter-monitor-micrometer - ${revision} - - - - org.springframework.boot - spring-boot-starter-web - - - - org.apache.tomcat.embed - tomcat-embed-core - - - - - - - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - diff --git a/examples/threadpool-example/server/server-spring-boot3/src/main/java/cn/hippo4j/example/server/ServerExampleApplication.java b/examples/threadpool-example/server/server-spring-boot3/src/main/java/cn/hippo4j/example/server/ServerExampleApplication.java deleted file mode 100644 index 23d6ed17..00000000 --- a/examples/threadpool-example/server/server-spring-boot3/src/main/java/cn/hippo4j/example/server/ServerExampleApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.server; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Server Example Application - */ -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = {"cn.hippo4j.example.core", "cn.hippo4j.example.server"}) -public class ServerExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ServerExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/server/server-spring-boot3/src/main/resources/META-INF/services/cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler b/examples/threadpool-example/server/server-spring-boot3/src/main/resources/META-INF/services/cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler deleted file mode 100644 index bf4970df..00000000 --- a/examples/threadpool-example/server/server-spring-boot3/src/main/resources/META-INF/services/cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.example.core.handler.ErrorLogRejectedExecutionHandler \ No newline at end of file diff --git a/examples/threadpool-example/server/server-spring-boot3/src/main/resources/application.properties b/examples/threadpool-example/server/server-spring-boot3/src/main/resources/application.properties deleted file mode 100644 index 0c8d952e..00000000 --- a/examples/threadpool-example/server/server-spring-boot3/src/main/resources/application.properties +++ /dev/null @@ -1,26 +0,0 @@ -server.port=8088 -debug=true -server.servlet.context-path=/example - -management.prometheus.metrics.export.enabled=true -management.server.port=29901 -management.endpoints.web.exposure.include=* - -spring.profiles.active=dev -spring.application.name=hippo4j-spring-boot3-starter-example - -spring.dynamic.thread-pool.server-addr=http://localhost:6691 -### Use netty to report thread pool monitoring data. The default is http. -# spring.dynamic.thread-pool.report-type=netty -# spring.dynamic.thread-pool.netty-server-port=8899 -spring.dynamic.thread-pool.namespace=prescription -spring.dynamic.thread-pool.item-id=dynamic-threadpool-example -spring.dynamic.thread-pool.username=admin -spring.dynamic.thread-pool.password=123456 - -# Enable server and micrometer monitoring at the same time -spring.dynamic.thread-pool.monitor.enable=true -spring.dynamic.thread-pool.monitor.collect-types=server,micrometer -spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic,web -spring.dynamic.thread-pool.monitor.initial-delay=10000 -spring.dynamic.thread-pool.monitor.collect-interval=5000 diff --git a/examples/threadpool-example/server/server/pom.xml b/examples/threadpool-example/server/server/pom.xml deleted file mode 100644 index f1972f2b..00000000 --- a/examples/threadpool-example/server/server/pom.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-server-mode-example - ${revision} - - hippo4j-threadpool-server-example - - - true - - - - - cn.hippo4j - hippo4j-example-core - ${revision} - - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter - ${revision} - - - - io.micrometer - micrometer-registry-prometheus - - - - org.springframework.boot - spring-boot-starter-actuator - - - - cn.hippo4j - hippo4j-spring-boot-starter-monitor-micrometer - ${revision} - - - - org.springframework.boot - spring-boot-starter-web - - - - org.apache.tomcat.embed - tomcat-embed-core - - - - - - - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - diff --git a/examples/threadpool-example/server/server/src/main/java/cn/hippo4j/example/server/ServerExampleApplication.java b/examples/threadpool-example/server/server/src/main/java/cn/hippo4j/example/server/ServerExampleApplication.java deleted file mode 100644 index 23d6ed17..00000000 --- a/examples/threadpool-example/server/server/src/main/java/cn/hippo4j/example/server/ServerExampleApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.example.server; - -import cn.hippo4j.core.enable.EnableDynamicThreadPool; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Server Example Application - */ -@EnableDynamicThreadPool -@SpringBootApplication(scanBasePackages = {"cn.hippo4j.example.core", "cn.hippo4j.example.server"}) -public class ServerExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ServerExampleApplication.class, args); - } -} diff --git a/examples/threadpool-example/server/server/src/main/resources/META-INF/services/cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler b/examples/threadpool-example/server/server/src/main/resources/META-INF/services/cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler deleted file mode 100644 index bf4970df..00000000 --- a/examples/threadpool-example/server/server/src/main/resources/META-INF/services/cn.hippo4j.common.executor.support.CustomRejectedExecutionHandler +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.example.core.handler.ErrorLogRejectedExecutionHandler \ No newline at end of file diff --git a/examples/threadpool-example/server/server/src/main/resources/META-INF/services/cn.hippo4j.core.api.ClientNetworkService b/examples/threadpool-example/server/server/src/main/resources/META-INF/services/cn.hippo4j.core.api.ClientNetworkService deleted file mode 100644 index 76cecf59..00000000 --- a/examples/threadpool-example/server/server/src/main/resources/META-INF/services/cn.hippo4j.core.api.ClientNetworkService +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.example.core.handler.CustomerClientNetworkService \ No newline at end of file diff --git a/examples/threadpool-example/server/server/src/main/resources/application.properties b/examples/threadpool-example/server/server/src/main/resources/application.properties deleted file mode 100644 index 3d283f86..00000000 --- a/examples/threadpool-example/server/server/src/main/resources/application.properties +++ /dev/null @@ -1,26 +0,0 @@ -server.port=8088 - -server.servlet.context-path=/example - -management.metrics.export.prometheus.enabled=true -management.server.port=29901 -management.endpoints.web.exposure.include=* - -spring.profiles.active=dev -spring.application.name=hippo4j-spring-boot-starter-example - -spring.dynamic.thread-pool.server-addr=http://localhost:6691 -### Use netty to report thread pool monitoring data. The default is http. -# spring.dynamic.thread-pool.report-type=netty -# spring.dynamic.thread-pool.netty-server-port=8899 -spring.dynamic.thread-pool.namespace=prescription -spring.dynamic.thread-pool.item-id=dynamic-threadpool-example -spring.dynamic.thread-pool.username=admin -spring.dynamic.thread-pool.password=123456 - -# Enable server and micrometer monitoring at the same time -spring.dynamic.thread-pool.monitor.enable=true -spring.dynamic.thread-pool.monitor.collect-types=server,micrometer -spring.dynamic.thread-pool.monitor.thread-pool-types=dynamic,web -spring.dynamic.thread-pool.monitor.initial-delay=10000 -spring.dynamic.thread-pool.monitor.collect-interval=5000 diff --git a/format/hippo4j_spotless_formatter.xml b/format/hippo4j_spotless_formatter.xml deleted file mode 100644 index 162d395e..00000000 --- a/format/hippo4j_spotless_formatter.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/format/license-header b/format/license-header deleted file mode 100644 index 6a9c0641..00000000 --- a/format/license-header +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - diff --git a/infra/common/pom.xml b/infra/common/pom.xml deleted file mode 100644 index 607b5caf..00000000 --- a/infra/common/pom.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-infra - ${revision} - - hippo4j-threadpool-infra-common - - - - com.google.code.gson - gson - ${gson.version} - provided - - - com.fasterxml.jackson.core - jackson-databind - - - org.projectlombok - lombok - - - com.github.ben-manes.caffeine - caffeine - - - com.github.dozermapper - dozer-core - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.mockito - mockito-core - test - - - org.mockito - mockito-inline - test - - - org.apache.tomcat.embed - tomcat-embed-core - test - - - - diff --git a/infra/common/src/main/java/cn/hippo4j/common/api/ClientCloseHookExecute.java b/infra/common/src/main/java/cn/hippo4j/common/api/ClientCloseHookExecute.java deleted file mode 100644 index fba4248e..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/api/ClientCloseHookExecute.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.api; - -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * Client close hook execute. - */ -public interface ClientCloseHookExecute { - - /** - * Client close hook function execution. - * - * @param requestParam - */ - void closeHook(ClientCloseHookReq requestParam); - - /** - * Client close hook req. - */ - @Data - @Accessors(chain = true) - class ClientCloseHookReq { - - /** - * appName - */ - private String appName; - - /** - * instanceId - */ - private String instanceId; - - /** - * groupKey - */ - private String groupKey; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/api/DynamicThreadPoolAdapter.java b/infra/common/src/main/java/cn/hippo4j/common/api/DynamicThreadPoolAdapter.java deleted file mode 100644 index b47fe01d..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/api/DynamicThreadPoolAdapter.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.api; - -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; - -/** - * Dynamic thread pool adapter. - */ -public interface DynamicThreadPoolAdapter { - - /** - * Check if the object contains thread pool information. - * - * @param executor objects where there may be instances - * of dynamic thread pools - * @return matching results - */ - boolean match(Object executor); - - /** - * Get the dynamic thread pool reference in the object. - * - * @param executor objects where there may be instances - * of dynamic thread pools - * @return get the real dynamic thread pool instance - */ - ThreadPoolExecutor unwrap(Object executor); - - /** - * If the {@link DynamicThreadPoolAdapter#match(Object)} conditions are met, - * the thread pool is replaced with a dynamic thread pool. - * - * @param executor objects where there may be instances - * of dynamic thread pools - * @param dynamicThreadPoolExecutor dynamic thread-pool executor - */ - void replace(Object executor, Executor dynamicThreadPoolExecutor); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/api/IExecutorProperties.java b/infra/common/src/main/java/cn/hippo4j/common/api/IExecutorProperties.java deleted file mode 100644 index a5420f4b..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/api/IExecutorProperties.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.api; - -import cn.hippo4j.common.model.executor.ExecutorNotifyProperties; - -/** - * Interface for thread pool configuration. - */ -public interface IExecutorProperties { - - /** - * Thread pool id - */ - String getThreadPoolId(); - - /** - * Core pool size - */ - Integer getCorePoolSize(); - - /** - * Maximum pool size - */ - Integer getMaximumPoolSize(); - - /** - * Keep alive time - */ - Long getKeepAliveTime(); - - /** - * Notify configs - */ - ExecutorNotifyProperties getNotify(); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/api/JsonFacade.java b/infra/common/src/main/java/cn/hippo4j/common/api/JsonFacade.java deleted file mode 100644 index 97e68659..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/api/JsonFacade.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.api; - -import com.fasterxml.jackson.core.type.TypeReference; - -import java.util.List; - -/** - * Json facade. - */ -public interface JsonFacade { - - /** - * To JSON string. - * - * @param object - * @return - */ - String toJSONString(Object object); - - /** - * Parse object. - * - * @param text - * @param clazz - * @param - * @return - */ - T parseObject(String text, Class clazz); - - /** - * Parse object. - * - * @param text - * @param valueTypeRef - * @param - * @return - */ - T parseObject(String text, TypeReference valueTypeRef); - - /** - * Parse array. - * - * @param text - * @param clazz - * @param - * @return - */ - List parseArray(String text, Class clazz); - - /** - * Validate json. - * - * @param text - * @return - */ - boolean isJson(String text); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/api/NotifyRequest.java b/infra/common/src/main/java/cn/hippo4j/common/api/NotifyRequest.java deleted file mode 100644 index 9b2b71ee..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/api/NotifyRequest.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.api; - -/** - * Notify request. - */ -public interface NotifyRequest { -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/api/ThreadDetailState.java b/infra/common/src/main/java/cn/hippo4j/common/api/ThreadDetailState.java deleted file mode 100644 index 1fdd66f5..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/api/ThreadDetailState.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.api; - -import cn.hippo4j.common.model.ThreadDetailStateInfo; - -import java.util.List; -import java.util.concurrent.ThreadPoolExecutor; - -/** - * Get thread status in thread pool. - */ -public interface ThreadDetailState { - - /** - * Get thread status in thread pool. - * - * @param threadPoolId - * @return - */ - List getThreadDetailStateInfo(String threadPoolId); - - /** - * Get thread status in thread pool. - * - * @param threadPoolExecutor - * @return - */ - List getThreadDetailStateInfo(ThreadPoolExecutor threadPoolExecutor); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/api/ThreadPoolConfigChange.java b/infra/common/src/main/java/cn/hippo4j/common/api/ThreadPoolConfigChange.java deleted file mode 100644 index 8086240e..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/api/ThreadPoolConfigChange.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.api; - -/** - * Thread-pool config change. - */ -public interface ThreadPoolConfigChange { - - /** - * Send pool config change. - * - * @param requestParam request param - */ - void sendPoolConfigChange(T requestParam); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/boot/AgentPackageNotFoundException.java b/infra/common/src/main/java/cn/hippo4j/common/boot/AgentPackageNotFoundException.java deleted file mode 100644 index 273d47e6..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/boot/AgentPackageNotFoundException.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.boot; - -public class AgentPackageNotFoundException extends Exception { - - public AgentPackageNotFoundException(String message) { - super(message); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/boot/AgentPackagePath.java b/infra/common/src/main/java/cn/hippo4j/common/boot/AgentPackagePath.java deleted file mode 100644 index 1afbdfb7..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/boot/AgentPackagePath.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.boot; - -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.api.LogManager; - -import java.io.File; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; - -/** - * AgentPackagePath is a flag and finder to locate the Hippo4j agent.jar. It gets the absolute path of the agent jar. - * The path is the required metadata for agent core looking up the plugins and toolkit activations. If the lookup - * mechanism fails, the agent will exit directly. - */ -public class AgentPackagePath { - - private static final ILog LOGGER = LogManager.getLogger(AgentPackagePath.class); - - private static File AGENT_PACKAGE_PATH; - - public static File getPath() throws AgentPackageNotFoundException { - if (AGENT_PACKAGE_PATH == null) { - AGENT_PACKAGE_PATH = findPath(); - } - return AGENT_PACKAGE_PATH; - } - - public static boolean isPathFound() { - return AGENT_PACKAGE_PATH != null; - } - - private static File findPath() throws AgentPackageNotFoundException { - String classResourcePath = AgentPackagePath.class.getName().replaceAll("\\.", "/") + ".class"; - - URL resource = ClassLoader.getSystemClassLoader().getResource(classResourcePath); - if (resource != null) { - String urlString = resource.toString(); - - LOGGER.debug("The beacon class location is {}.", urlString); - - int insidePathIndex = urlString.indexOf('!'); - boolean isInJar = insidePathIndex > -1; - - if (isInJar) { - urlString = urlString.substring(urlString.indexOf("file:"), insidePathIndex); - File agentJarFile = null; - try { - agentJarFile = new File(new URL(urlString).toURI()); - } catch (MalformedURLException | URISyntaxException e) { - LOGGER.error(e, "Can not locate agent jar file by url:" + urlString); - } - if (agentJarFile.exists()) { - return agentJarFile.getParentFile(); - } - } else { - int prefixLength = "file:".length(); - String classLocation = urlString.substring( - prefixLength, urlString.length() - classResourcePath.length()); - return new File(classLocation); - } - } - - LOGGER.error("Can not locate agent jar file."); - throw new AgentPackageNotFoundException("Can not locate agent jar file."); - } - -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/boot/ClassCacheMode.java b/infra/common/src/main/java/cn/hippo4j/common/boot/ClassCacheMode.java deleted file mode 100644 index 5db729f5..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/boot/ClassCacheMode.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.boot; - -public enum ClassCacheMode { - FILE, MEMORY -} \ No newline at end of file diff --git a/infra/common/src/main/java/cn/hippo4j/common/boot/DefaultNamedThreadFactory.java b/infra/common/src/main/java/cn/hippo4j/common/boot/DefaultNamedThreadFactory.java deleted file mode 100644 index 1bbe203c..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/boot/DefaultNamedThreadFactory.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.boot; - -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.atomic.AtomicInteger; - -public class DefaultNamedThreadFactory implements ThreadFactory { - - private static final AtomicInteger BOOT_SERVICE_SEQ = new AtomicInteger(0); - private final AtomicInteger threadSeq = new AtomicInteger(0); - private final String namePrefix; - - public DefaultNamedThreadFactory(String name) { - namePrefix = "Hippo4jAgent-" + BOOT_SERVICE_SEQ.incrementAndGet() + "-" + name + "-"; - } - - @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(r, namePrefix + threadSeq.getAndIncrement()); - t.setDaemon(true); - return t; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/conf/Config.java b/infra/common/src/main/java/cn/hippo4j/common/conf/Config.java deleted file mode 100644 index 85030554..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/conf/Config.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.conf; - -import cn.hippo4j.common.boot.ClassCacheMode; -import cn.hippo4j.common.logging.core.LogLevel; -import cn.hippo4j.common.logging.core.LogOutput; -import cn.hippo4j.common.logging.core.ResolverType; -import cn.hippo4j.common.toolkit.agent.Length; - -import java.util.Arrays; -import java.util.List; - -/** - * This is the core config in hippo4j agent. - */ -public class Config { - - public static class Agent { - - /** - * Namespace represents a subnet, such as kubernetes namespace, or 172.10.*.*. - * - * @since 8.10.0 namespace would be added as {@link #SERVICE_NAME} suffix. - * - * Removed namespace isolating headers in cross process propagation. The HEADER name was - * `HeaderName:Namespace`. - */ - @Length(20) - public static String NAMESPACE = ""; - - /** - * Service name is showed on the UI. Suggestion: set a unique name for each service, service instance nodes - * share the same code - * - * @since 8.10.0 ${service name} = [${group name}::]${logic name}|${NAMESPACE}|${CLUSTER} - * - * The group name, namespace and cluster are optional. Once they are all blank, service name would be the final - * name. - */ - @Length(50) - public static String SERVICE_NAME = ""; - - /** - * Cluster defines the physical cluster in a data center or same network segment. In one cluster, IP address - * should be unique identify. - * - * The cluster name would be - * - * 1. Add as {@link #SERVICE_NAME} suffix. - * - * 2. Add as exit span's peer, ${CLUSTER} / original peer - * - * 3. Cross Process Propagation Header's value addressUsedAtClient[index=8] (Target address of this request used - * on the client end). - * - * @since 8.10.0 - */ - @Length(20) - public static String CLUSTER = ""; - - /** - * If true, Hippo4j agent will save all instrumented classes files in `/debugging` folder. Hippo4j team - * may ask for these files in order to resolve compatible problem. - */ - public static boolean IS_OPEN_DEBUGGING_CLASS = false; - - /** - * If true, Hippo4j agent will cache all instrumented classes to memory or disk files (decided by class cache - * mode), allow other javaagent to enhance those classes that enhanced by Hippo4j agent. - */ - public static boolean IS_CACHE_ENHANCED_CLASS = false; - - /** - * The instrumented classes cache mode: MEMORY or FILE MEMORY: cache class bytes to memory, if instrumented - * classes is too many or too large, it may take up more memory FILE: cache class bytes in `/class-cache` - * folder, automatically clean up cached class files when the application exits - */ - public static ClassCacheMode CLASS_CACHE_MODE = ClassCacheMode.MEMORY; - } - - public static class Logging { - - /** - * Log file name. - */ - public static String FILE_NAME = "hippo4j-api.log"; - - /** - * Log files directory. Default is blank string, means, use "{theHippo4jAgentJarDir}/logs " to output logs. - * {theHippo4jAgentJarDir} is the directory where the hippo4j agent jar file is located. - *

- * Ref to {@link WriterFactory#getLogWriter()} - */ - public static String DIR = ""; - - /** - * The max size of log file. If the size is bigger than this, archive the current file, and write into a new - * file. - */ - public static int MAX_FILE_SIZE = 300 * 1024 * 1024; - - /** - * The max history log files. When rollover happened, if log files exceed this number, then the oldest file will - * be delete. Negative or zero means off, by default. - */ - public static int MAX_HISTORY_FILES = -1; - - /** - * The log level. Default is debug. - */ - public static LogLevel LEVEL = LogLevel.DEBUG; - - /** - * The log output. Default is FILE. - */ - public static LogOutput OUTPUT = LogOutput.FILE; - - /** - * The log resolver type. Default is PATTERN which will create PatternLogResolver later. - */ - public static ResolverType RESOLVER = ResolverType.PATTERN; - - /** - * The log patten. Default is "%level %timestamp %thread %class : %msg %throwable". Each conversion specifiers - * starts with a percent sign '%' and fis followed by conversion word. There are some default conversion - * specifiers: %thread = ThreadName %level = LogLevel {@link LogLevel} %timestamp = The now() who format is - * 'yyyy-MM-dd HH:mm:ss:SSS' %class = SimpleName of TargetClass %msg = Message of user input %throwable = - * Throwable of user input %agent_name = ServiceName of Agent {@link Agent#SERVICE_NAME} - * - * @see cn.hippo4j.agent.core.logging.core.PatternLogger#DEFAULT_CONVERTER_MAP - */ - public static String PATTERN = "%level %timestamp %thread %class : %msg %throwable"; - } - - public static class Plugin { - - /** - * Control the length of the peer field. - */ - public static int PEER_MAX_LENGTH = 200; - - /** - * Exclude activated plugins - */ - public static String EXCLUDE_PLUGINS = ""; - - /** - * Mount the folders of the plugins. The folder path is relative to agent.jar. - */ - public static List MOUNT = Arrays.asList("plugins", "activations"); - - public static class ThreadPool { - - public static List EXCLUDE_PACKAGE_PREFIX = Arrays.asList( - "java", "sun", "okhttp3", "retrofit2", "reactor", - "org.apache", "io.netty", "org.springframework", "com.ctrip", "com.google", - "io.undertow", "org.xnio", "org.jboss", "com.zaxxer", "org.redisson", "com.alibaba", - "com.netflix", "com.mysql", "rx.internal", "io.shardingjdbc", "org.drools", "org.elasticsearch", - "ch.qos.logback", "net.sf.ehcache"); - } - - public static class Apollo { - - public static class App { - - public static String ID; - } - public static String META; - - public static class BootStrap { - - public static boolean ENABLED = false; - - public static List NAMESPACES; - } - } - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/conf/ConfigNotFoundException.java b/infra/common/src/main/java/cn/hippo4j/common/conf/ConfigNotFoundException.java deleted file mode 100644 index b32bd864..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/conf/ConfigNotFoundException.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.conf; - -public class ConfigNotFoundException extends Exception { - - public ConfigNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public ConfigNotFoundException(String message) { - super(message); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/conf/Constants.java b/infra/common/src/main/java/cn/hippo4j/common/conf/Constants.java deleted file mode 100644 index 1973cebe..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/conf/Constants.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.conf; - -public class Constants { - - public static String PATH_SEPARATOR = System.getProperty("file.separator", "/"); - - public static String LINE_SEPARATOR = System.getProperty("line.separator", "\n"); - - public static String EMPTY_STRING = ""; - - public static char SERVICE_NAME_PART_CONNECTOR = '|'; - - // The name of the layer that represents agent-installed services, - // which is defined at - // https://github.com/apache/skywalking/blob/85ce1645be53e46286f36c0ea206c60db2d1a716/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/Layer.java#L30 - public static String EVENT_LAYER_NAME = "GENERAL"; - - public static int NULL_VALUE = 0; - - public static boolean IS_INIT_COMPLETED = false; - -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/conf/RuntimeContextConfiguration.java b/infra/common/src/main/java/cn/hippo4j/common/conf/RuntimeContextConfiguration.java deleted file mode 100644 index 372492eb..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/conf/RuntimeContextConfiguration.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.conf; - -public class RuntimeContextConfiguration { - - public static String[] NEED_PROPAGATE_CONTEXT_KEY = new String[]{ - "SW_REQUEST", - "SW_RESPONSE", - "SW_WEBFLUX_REQUEST_KEY" - }; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/constant/ChangeThreadPoolConstants.java b/infra/common/src/main/java/cn/hippo4j/common/constant/ChangeThreadPoolConstants.java deleted file mode 100644 index 07bf223c..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/constant/ChangeThreadPoolConstants.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.constant; - -/** - * Change thread-pool constants. - */ -public class ChangeThreadPoolConstants { - - /** - * Dynamic thread pool parameter change text - */ - public static final String CHANGE_THREAD_POOL_TEXT = "[{}] Dynamic thread pool change parameter." - + "\n corePoolSize: {}" - + "\n maximumPoolSize: {}" - + "\n capacity: {}" - + "\n keepAliveTime: {}" - + "\n executeTimeOut: {}" - + "\n rejectedType: {}" - + "\n allowCoreThreadTimeOut: {}"; - - /** - * Dynamic thread pool parameter change separator - */ - public static final String CHANGE_DELIMITER = "%s => %s"; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/constant/ConfigModifyTypeConstants.java b/infra/common/src/main/java/cn/hippo4j/common/constant/ConfigModifyTypeConstants.java deleted file mode 100644 index deb4465c..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/constant/ConfigModifyTypeConstants.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.constant; - -/** - * Config modify type constants. - */ -public class ConfigModifyTypeConstants { - - /** - * Thread pool manager change - */ - public static final int THREAD_POOL_MANAGER = 1; - - /** - * Thread pool instance change - */ - public static final int THREAD_POOL_INSTANCE = 2; - - /** - * Web thread pool change - */ - public static final int WEB_THREAD_POOL = 3; - - /** - * Adapter thread pool change - */ - public static final int ADAPTER_THREAD_POOL = 4; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/constant/Constants.java b/infra/common/src/main/java/cn/hippo4j/common/constant/Constants.java deleted file mode 100644 index 71577018..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/constant/Constants.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.constant; - -/** - * Constants. - */ -public class Constants { - - public static final String TP_ID = "tpId"; - - public static final String ITEM_ID = "itemId"; - - public static final String NAMESPACE = "namespace"; - - public static final String GROUP_KEY = "groupKey"; - - public static final String AUTHORITIES_KEY = "auth"; - - public static final String ACCESS_TOKEN = "accessToken"; - - public static final String TOKEN_TTL = "tokenTtl"; - - public static final String DEFAULT_NAMESPACE_ID = "public"; - - public static final String ADMIN_USER = "admin"; - - public static final String ENCODE = "UTF-8"; - - public static final String NULL = ""; - - public static final String UP = "UP"; - - public static final String CONTENT_TYPE = "Content-Type"; - - public static final int CONFIG_LONG_POLL_TIMEOUT = 30000; - - public static final String LINE_SEPARATOR = Character.toString((char) 1); - - public static final String WORD_SEPARATOR = Character.toString((char) 2); - - public static final String GENERAL_SPLIT_SYMBOL = ","; - - public static final String DOT_SPLIT_SYMBOL = "."; - - public static final String IDENTIFY_SLICER_SYMBOL = "_"; - - public static final String LONG_POLLING_LINE_SEPARATOR = "\r\n"; - - public static final String BASE_PATH = "/hippo4j/v1/cs"; - - public static final String CONFIG_CONTROLLER_PATH = BASE_PATH + "/configs"; - - public static final String LISTENER_PATH = CONFIG_CONTROLLER_PATH + "/listener"; - - public static final String VERIFY_PATH = CONFIG_CONTROLLER_PATH + "/verify"; - - public static final String MONITOR_PATH = BASE_PATH + "/monitor"; - - public static final String REGISTER_ADAPTER_BASE_PATH = BASE_PATH + "/adapter/thread-pool"; - - public static final String REGISTER_ADAPTER_PATH = REGISTER_ADAPTER_BASE_PATH + "/register"; - - public static final String REGISTER_DYNAMIC_THREAD_POOL_PATH = CONFIG_CONTROLLER_PATH + "/register"; - - public static final String HEALTH_CHECK_PATH = BASE_PATH + "/health/check"; - - public static final String LONG_PULLING_TIMEOUT = "Long-Pulling-Timeout"; - - public static final String LONG_PULLING_TIMEOUT_NO_HANGUP = "Long-Pulling-Timeout-No-Hangup"; - - public static final String LONG_PULLING_CLIENT_IDENTIFICATION = "Long-Pulling-Client-Identification"; - - public static final String LISTENING_CONFIGS = "Listening-Configs"; - - public static final String WEIGHT_CONFIGS = "Weight-Configs"; - - public static final String GROUP_KEY_DELIMITER = "+"; - - public static final String GROUP_KEY_DELIMITER_TRANSLATION = "\\+"; - - public static final long EVICTION_INTERVAL_TIMER_IN_MS = 60 * 1000; - - public static final int SCHEDULED_THREAD_CORE_NUM = 1; - - public static final int MAP_INITIAL_CAPACITY = 16; - - public static final int HEALTH_CHECK_INTERVAL = 5; - - public static final int MAX_CHECK_FAILURE_COUNT = 4; - - public static final int INITIAL_CAPACITY = 3; - - public static final int DATA_GROUP_TENANT_SIZE = 3; - - public static final int ACTIVE_ALARM = 80; - - public static final int CAPACITY_ALARM = 80; - - public static final long EXECUTE_TIME_OUT = 10000L; - - public static final int SECONDS_IN_MILLISECONDS = 1000; - - public static final long FAILURE_SLEEP_INTERVAL = 25000L; - - public static final int AVAILABLE_PROCESSORS = Runtime.getRuntime().availableProcessors(); - - public static final String DEFAULT_GROUP = "default group"; - - public static final String EXECUTE_TIMEOUT_TRACE = "executeTimeoutTrace"; - - public static final long HTTP_EXECUTE_TIMEOUT = 5000L; - - public static final String CLIENT_VERSION = "Client-Version"; - - public static final String CONFIGURATION_PROPERTIES_PREFIX = "spring.dynamic.thread-pool"; - - public static final String EXECUTORS = "executors"; - - public static final long NO_REJECT_COUNT_NUM = -1L; - - public static final String DYNAMIC_THREAD_POOL_EXECUTOR = "cn.hippo4j.core.executor.DynamicThreadPoolExecutor"; - - public static final int DEFAULT_INTERVAL = 5; - -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/constant/HttpHeaderConstants.java b/infra/common/src/main/java/cn/hippo4j/common/constant/HttpHeaderConstants.java deleted file mode 100644 index a0e61a2c..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/constant/HttpHeaderConstants.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.constant; - -/** - * Http header constants. - */ -public class HttpHeaderConstants { - - public static final String CLIENT_VERSION_HEADER = "Client-Version"; - - public static final String USER_AGENT_HEADER = "User-Agent"; - - public static final String REQUEST_SOURCE_HEADER = "Request-Source"; - - public static final String CONTENT_TYPE = "Content-Type"; - - public static final String CONTENT_LENGTH = "Content-Length"; - - public static final String ACCEPT_CHARSET = "Accept-Charset"; - - public static final String ACCEPT_ENCODING = "Accept-Encoding"; - - public static final String CONTENT_ENCODING = "Content-Encoding"; - - public static final String CONNECTION = "Requester"; - - public static final String REQUEST_ID = "RequestId"; - - public static final String REQUEST_MODULE = "Request-Module"; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/constant/HttpMediaType.java b/infra/common/src/main/java/cn/hippo4j/common/constant/HttpMediaType.java deleted file mode 100644 index fe45a4be..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/constant/HttpMediaType.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.constant; - -import cn.hippo4j.common.toolkit.StringUtil; - -/** - * Http media type. - */ -public final class HttpMediaType { - - public static final String APPLICATION_ATOM_XML = "application/atom+xml"; - - public static final String APPLICATION_FORM_URLENCODED = "application/x-www-form-urlencoded;charset=UTF-8"; - - public static final String APPLICATION_OCTET_STREAM = "application/octet-stream"; - - public static final String APPLICATION_SVG_XML = "application/svg+xml"; - - public static final String APPLICATION_XHTML_XML = "application/xhtml+xml"; - - public static final String APPLICATION_XML = "application/xml;charset=UTF-8"; - - public static final String APPLICATION_JSON = "application/json;charset=UTF-8"; - - public static final String MULTIPART_FORM_DATA = "multipart/form-data;charset=UTF-8"; - - public static final String TEXT_HTML = "text/html;charset=UTF-8"; - - public static final String TEXT_PLAIN = "text/plain;charset=UTF-8"; - - private HttpMediaType(String type, String charset) { - this.type = type; - this.charset = charset; - } - - /** - * content type. - */ - private final String type; - - /** - * content type charset. - */ - private final String charset; - - /** - * Parse the given String contentType into a {@code MediaType} object. - * - * @param contentType mediaType - * @return MediaType - */ - public static HttpMediaType valueOf(String contentType) { - if (StringUtil.isEmpty(contentType)) { - throw new IllegalArgumentException("MediaType must not be empty"); - } - String[] values = contentType.split(";"); - String charset = Constants.ENCODE; - for (String value : values) { - if (value.startsWith("charset=")) { - charset = value.substring("charset=".length()); - } - } - return new HttpMediaType(values[0], charset); - } - - /** - * Use the given contentType and charset to assemble into a {@code MediaType} object. - * - * @param contentType contentType - * @param charset charset - * @return MediaType - */ - public static HttpMediaType valueOf(String contentType, String charset) { - if (StringUtil.isEmpty(contentType)) { - throw new IllegalArgumentException("MediaType must not be empty"); - } - String[] values = contentType.split(";"); - return new HttpMediaType(values[0], StringUtil.isEmpty(charset) ? Constants.ENCODE : charset); - } - - public String getType() { - return type; - } - - public String getCharset() { - return charset; - } - - @Override - public String toString() { - return type + ";charset=" + charset; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/constant/HttpMethod.java b/infra/common/src/main/java/cn/hippo4j/common/constant/HttpMethod.java deleted file mode 100644 index 01bc3734..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/constant/HttpMethod.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.constant; - -/** - * Http method constants. - */ -public class HttpMethod { - - public static final String GET = "GET"; - - public static final String HEAD = "HEAD"; - - public static final String POST = "POST"; - - public static final String PUT = "PUT"; - - public static final String PATCH = "PATCH"; - - public static final String DELETE = "DELETE"; - - public static final String OPTIONS = "OPTIONS"; - - public static final String TRACE = "TRACE"; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/constant/HttpResponseCode.java b/infra/common/src/main/java/cn/hippo4j/common/constant/HttpResponseCode.java deleted file mode 100644 index e5117937..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/constant/HttpResponseCode.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.constant; - -/** - * Http response code. - */ -public class HttpResponseCode { - - /* 2XX: generally "OK" */ - - /** - * HTTP Status-Code 200: OK. - */ - public static final int SC_OK = 200; - - /** - * HTTP Status-Code 201: Created. - */ - public static final int SC_HTTP_CREATED = 201; - - /** - * HTTP Status-Code 202: Accepted. - */ - public static final int SC_HTTP_ACCEPTED = 202; - - /** - * HTTP Status-Code 203: Non-Authoritative Information. - */ - public static final int SC_HTTP_NOT_AUTHORITATIVE = 203; - - /** - * HTTP Status-Code 204: No Content. - */ - public static final int SC_HTTP_NO_CONTENT = 204; - - /** - * HTTP Status-Code 205: Reset Content. - */ - public static final int SC_HTTP_RESET = 205; - - /** - * HTTP Status-Code 206: Partial Content. - */ - public static final int SC_HTTP_PARTIAL = 206; - - /* 3XX: relocation/redirect */ - - /** - * HTTP Status-Code 300: Multiple Choices. - */ - public static final int SC_HTTP_MULT_CHOICE = 300; - - /** - * HTTP Status-Code 301: Moved Permanently. - */ - public static final int SC_HTTP_MOVED_PERM = 301; - - /** - * HTTP Status-Code 302: Temporary Redirect. - */ - public static final int SC_HTTP_MOVED_TEMP = 302; - - /** - * HTTP Status-Code 303: See Other. - */ - public static final int SC_HTTP_SEE_OTHER = 303; - - /** - * HTTP Status-Code 304: Not Modified. - */ - public static final int SC_HTTP_NOT_MODIFIED = 304; - - /** - * HTTP Status-Code 305: Use Proxy. - */ - public static final int SC_HTTP_USE_PROXY = 305; - - /** - * HTTP 1.1 Status-Code 307: Temporary Redirect. - */ - public static final int SC_HTTP_TEMP_REDIRECT = 307; - - /** - * HTTP 1.1 Status-Code 308: Permanent Redirect - */ - public static final int SC_HTTP_PERMANENT_REDIRECT = 308; - - /* 4XX: client error */ - - /** - * HTTP Status-Code 400: Bad Request. - */ - public static final int SC_HTTP_BAD_REQUEST = 400; - - /** - * HTTP Status-Code 401: Unauthorized. - */ - public static final int SC_HTTP_UNAUTHORIZED = 401; - - /** - * HTTP Status-Code 402: Payment Required. - */ - public static final int SC_HTTP_PAYMENT_REQUIRED = 402; - - /** - * HTTP Status-Code 403: Forbidden. - */ - public static final int SC_HTTP_FORBIDDEN = 403; - - /** - * HTTP Status-Code 404: Not Found. - */ - public static final int SC_HTTP_NOT_FOUND = 404; - - /** - * HTTP Status-Code 405: Method Not Allowed. - */ - public static final int SC_HTTP_BAD_METHOD = 405; - - /** - * HTTP Status-Code 406: Not Acceptable. - */ - public static final int SC_HTTP_NOT_ACCEPTABLE = 406; - - /** - * HTTP Status-Code 407: Proxy Authentication Required. - */ - public static final int SC_HTTP_PROXY_AUTH = 407; - - /** - * HTTP Status-Code 408: Request Time-Out. - */ - public static final int SC_HTTP_CLIENT_TIMEOUT = 408; - - /** - * HTTP Status-Code 409: Conflict. - */ - public static final int SC_HTTP_CONFLICT = 409; - - /** - * HTTP Status-Code 410: Gone. - */ - public static final int SC_HTTP_GONE = 410; - - /** - * HTTP Status-Code 411: Length Required. - */ - public static final int SC_HTTP_LENGTH_REQUIRED = 411; - - /** - * HTTP Status-Code 412: Precondition Failed. - */ - public static final int SC_HTTP_PRECON_FAILED = 412; - - /** - * HTTP Status-Code 413: Request Entity Too Large. - */ - public static final int SC_HTTP_ENTITY_TOO_LARGE = 413; - - /** - * HTTP Status-Code 414: Request-URI Too Large. - */ - public static final int SC_HTTP_REQ_TOO_LONG = 414; - - /** - * HTTP Status-Code 415: Unsupported Media Type. - */ - public static final int SC_HTTP_UNSUPPORTED_TYPE = 415; - - /* 5XX: server error */ - - /** - * HTTP Status-Code 500: Internal Server Error. - */ - public static final int SC_HTTP_INTERNAL_ERROR = 500; - - /** - * HTTP Status-Code 501: Not Implemented. - */ - public static final int SC_HTTP_NOT_IMPLEMENTED = 501; - - /** - * HTTP Status-Code 502: Bad Gateway. - */ - public static final int SC_HTTP_BAD_GATEWAY = 502; - - /** - * HTTP Status-Code 503: Service Unavailable. - */ - public static final int SC_HTTP_UNAVAILABLE = 503; - - /** - * HTTP Status-Code 504: Gateway Timeout. - */ - public static final int SC_HTTP_GATEWAY_TIMEOUT = 504; - - /** - * HTTP Status-Code 505: HTTP Version Not Supported. - */ - public static final int SC_HTTP_VERSION = 505; - - public static boolean isOk(int code) { - return (code >= SC_OK && code < SC_HTTP_MULT_CHOICE) || code == SC_HTTP_NOT_MODIFIED; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/constant/MagicNumberConstants.java b/infra/common/src/main/java/cn/hippo4j/common/constant/MagicNumberConstants.java deleted file mode 100644 index 1893f172..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/constant/MagicNumberConstants.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.constant; - -/** - * Magic Number Constants - */ -public class MagicNumberConstants { - - public static final int INDEX_NEGATIVE_1 = -1; - - public static final int INDEX_0 = 0; - - public static final int INDEX_1 = 1; - - public static final int INDEX_2 = 2; - - public static final int INDEX_3 = 3; - - public static final int INDEX_10 = 10; - - public static final int SIZE_4 = 4; - - public static final long LONG_5 = 5L; - -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/executor/ExecutorFactory.java b/infra/common/src/main/java/cn/hippo4j/common/executor/ExecutorFactory.java deleted file mode 100644 index 664cc7bc..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/executor/ExecutorFactory.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor; - -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ThreadFactory; - -/** - * Executor factory. - */ -public class ExecutorFactory { - - /** - * Thread pool management tool. - */ - public static final class Managed { - - private static final String DEFAULT_NAMESPACE = "dynamic.thread-pool"; - - private static final ThreadPoolManager THREAD_POOL_MANAGER = ThreadPoolManager.getInstance(); - - public static ScheduledExecutorService newSingleScheduledExecutorService(String group, ThreadFactory threadFactory) { - ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1, threadFactory); - THREAD_POOL_MANAGER.register(DEFAULT_NAMESPACE, group, executorService); - return executorService; - } - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/executor/ThreadFactoryBuilder.java b/infra/common/src/main/java/cn/hippo4j/common/executor/ThreadFactoryBuilder.java deleted file mode 100644 index 6da911ac..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/executor/ThreadFactoryBuilder.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor; - -import cn.hippo4j.common.extension.design.Builder; - -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.atomic.AtomicLong; - -/** - * Thread-factory builder. - */ -public class ThreadFactoryBuilder implements Builder { - - private static final long serialVersionUID = 1L; - - private ThreadFactory backingThreadFactory; - - private String namePrefix; - - private Boolean daemon; - - private Integer priority; - - private Thread.UncaughtExceptionHandler uncaughtExceptionHandler; - - public ThreadFactoryBuilder threadFactory(ThreadFactory backingThreadFactory) { - this.backingThreadFactory = backingThreadFactory; - return this; - } - - public ThreadFactoryBuilder prefix(String namePrefix) { - this.namePrefix = namePrefix; - return this; - } - - public ThreadFactoryBuilder daemon(boolean daemon) { - this.daemon = daemon; - return this; - } - - public ThreadFactoryBuilder priority(int priority) { - if (priority < Thread.MIN_PRIORITY) { - throw new IllegalArgumentException(String.format("Thread priority (%s) must be >= %s", priority, Thread.MIN_PRIORITY)); - } - if (priority > Thread.MAX_PRIORITY) { - throw new IllegalArgumentException(String.format("Thread priority (%s) must be <= %s", priority, Thread.MAX_PRIORITY)); - } - this.priority = priority; - return this; - } - - public void uncaughtExceptionHandler(Thread.UncaughtExceptionHandler uncaughtExceptionHandler) { - this.uncaughtExceptionHandler = uncaughtExceptionHandler; - } - - public static ThreadFactoryBuilder builder() { - return new ThreadFactoryBuilder(); - } - - @Override - public ThreadFactory build() { - return build(this); - } - - private static ThreadFactory build(ThreadFactoryBuilder builder) { - final ThreadFactory backingThreadFactory = (null != builder.backingThreadFactory) - ? builder.backingThreadFactory - : Executors.defaultThreadFactory(); - final String namePrefix = builder.namePrefix; - final Boolean daemon = builder.daemon; - final Integer priority = builder.priority; - final Thread.UncaughtExceptionHandler handler = builder.uncaughtExceptionHandler; - final AtomicLong count = (null == namePrefix) ? null : new AtomicLong(); - return r -> { - final Thread thread = backingThreadFactory.newThread(r); - if (null != namePrefix) { - thread.setName(namePrefix + "_" + count.getAndIncrement()); - } - if (null != daemon) { - thread.setDaemon(daemon); - } - if (null != priority) { - thread.setPriority(priority); - } - if (null != handler) { - thread.setUncaughtExceptionHandler(handler); - } - return thread; - }; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/executor/ThreadPoolExecutorHolder.java b/infra/common/src/main/java/cn/hippo4j/common/executor/ThreadPoolExecutorHolder.java deleted file mode 100644 index 0569e683..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/executor/ThreadPoolExecutorHolder.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor; - -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import cn.hippo4j.common.model.executor.ExecutorProperties; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.concurrent.ThreadPoolExecutor; - -@Data -@NoArgsConstructor -public class ThreadPoolExecutorHolder { - - public static final ThreadPoolExecutorHolder EMPTY = new ThreadPoolExecutorHolder(); - - private String threadPoolId; - - private ThreadPoolExecutor executor; - - private ExecutorProperties executorProperties; - - /** - * The Server mode is used to compare whether the parameters have changed, - * and consider refactoring later - */ - private ThreadPoolParameterInfo parameterInfo; - - public ThreadPoolExecutorHolder(String threadPoolId, ThreadPoolExecutor executor, ExecutorProperties executorProperties) { - this.threadPoolId = threadPoolId; - this.executor = executor; - this.executorProperties = executorProperties; - } - - public boolean isEmpty() { - return this == EMPTY; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/executor/ThreadPoolExecutorRegistry.java b/infra/common/src/main/java/cn/hippo4j/common/executor/ThreadPoolExecutorRegistry.java deleted file mode 100644 index f785c3ce..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/executor/ThreadPoolExecutorRegistry.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor; - -import cn.hippo4j.common.model.executor.ExecutorProperties; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ThreadPoolExecutor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ThreadPoolExecutorRegistry { - - private static final Map HOLDER_MAP = new ConcurrentHashMap<>(); - - public static final Map> REFERENCED_CLASS_MAP = new ConcurrentHashMap<>(); - - public static Map getHolderMap() { - return HOLDER_MAP; - } - - public static void putHolder(String executorName, ThreadPoolExecutor executor, ExecutorProperties executorProperties) { - ThreadPoolExecutorHolder executorHolder = new ThreadPoolExecutorHolder(executorName, executor, executorProperties); - HOLDER_MAP.put(executorHolder.getThreadPoolId(), executorHolder); - } - - public static void putHolder(ThreadPoolExecutorHolder executorHolder) { - HOLDER_MAP.put(executorHolder.getThreadPoolId(), executorHolder); - } - - public static ThreadPoolExecutorHolder getHolder(String executorName) { - return Optional.ofNullable(HOLDER_MAP.get(executorName)).orElse(ThreadPoolExecutorHolder.EMPTY); - } - - public static Map> getReferencedClassMap() { - return REFERENCED_CLASS_MAP; - } - - public static List listThreadPoolExecutorId() { - return new ArrayList<>(HOLDER_MAP.keySet()); - } - - /** - * Get the number of dynamic thread pools. - *

The data may be inaccurate when the project is initially - * launched because registration is done asynchronously. - * - * @return thread-pool size - */ - public static Integer getThreadPoolExecutorSize() { - return listThreadPoolExecutorId().size(); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/executor/ThreadPoolManager.java b/infra/common/src/main/java/cn/hippo4j/common/executor/ThreadPoolManager.java deleted file mode 100644 index aa3be5bd..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/executor/ThreadPoolManager.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; - -/** - * Thread-pool manager. - */ -public final class ThreadPoolManager { - - private Map>> resourcesManager; - - private Map lockers = new ConcurrentHashMap(); - - private static final ThreadPoolManager INSTANCE = new ThreadPoolManager(); - - public static ThreadPoolManager getInstance() { - return INSTANCE; - } - - private ThreadPoolManager() { - } - - static { - INSTANCE.init(); - } - - private void init() { - resourcesManager = new ConcurrentHashMap(); - } - - public void register(String tenantId, String group, ExecutorService executor) { - if (!resourcesManager.containsKey(tenantId)) { - synchronized (this) { - lockers.put(tenantId, new Object()); - } - } - final Object monitor = lockers.get(tenantId); - synchronized (monitor) { - Map> map = resourcesManager.get(tenantId); - if (map == null) { - map = new HashMap(); - map.put(group, new HashSet()); - map.get(group).add(executor); - resourcesManager.put(tenantId, map); - return; - } - if (!map.containsKey(group)) { - map.put(group, new HashSet()); - } - map.get(group).add(executor); - } - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/executor/support/BlockingQueueManager.java b/infra/common/src/main/java/cn/hippo4j/common/executor/support/BlockingQueueManager.java deleted file mode 100644 index 99e87146..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/executor/support/BlockingQueueManager.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.support; - -import cn.hippo4j.common.extension.spi.ServiceLoaderRegistry; -import lombok.extern.slf4j.Slf4j; - -import java.util.Collection; -import java.util.Objects; -import java.util.concurrent.BlockingQueue; - -/** - * Blocking queue runtime manager. - * Provides queue management operations: capacity adjustment, type recognition, and configuration validation. - * - *

Note: For queue creation, use {@link BlockingQueueTypeEnum#createBlockingQueue(int, Integer)} - * or {@link BlockingQueueTypeEnum#createBlockingQueue(String, Integer)} directly.

- */ -@Slf4j -public class BlockingQueueManager { - - /** - * Check if queue capacity can be dynamically changed - * - * @param currentQueue current queue instance - * @return true if capacity can be changed - */ - public static boolean canChangeCapacity(BlockingQueue currentQueue) { - if (currentQueue == null) { - return false; - } - // Only ResizableCapacityLinkedBlockingQueue supports capacity change - return currentQueue instanceof ResizableCapacityLinkedBlockingQueue; - } - - /** - * Change queue capacity if supported - * - * @param currentQueue current queue instance - * @param newCapacity new capacity - * @return true if capacity was changed - */ - public static boolean changeQueueCapacity(BlockingQueue currentQueue, Integer newCapacity) { - if (!canChangeCapacity(currentQueue) || newCapacity == null) { - return false; - } - try { - if (currentQueue instanceof ResizableCapacityLinkedBlockingQueue) { - ResizableCapacityLinkedBlockingQueue resizableQueue = - (ResizableCapacityLinkedBlockingQueue) currentQueue; - resizableQueue.setCapacity(newCapacity); - log.debug("Queue capacity changed to: {}", newCapacity); - return true; - } - } catch (Exception e) { - log.error("Failed to change queue capacity to: {}", newCapacity, e); - } - return false; - } - - /** - * Get queue type from queue instance - * - * @param queue queue instance - * @return queue type, null if not found - */ - public static Integer getQueueType(BlockingQueue queue) { - if (queue == null) { - return null; - } - String queueName = queue.getClass().getSimpleName(); - for (BlockingQueueTypeEnum typeEnum : BlockingQueueTypeEnum.values()) { - if (Objects.equals(typeEnum.getName(), queueName)) { - return typeEnum.getType(); - } - } - Collection customQueues = ServiceLoaderRegistry - .getSingletonServiceInstances(CustomBlockingQueue.class); - for (CustomBlockingQueue customQueue : customQueues) { - if (Objects.equals(customQueue.getName(), queueName)) { - return customQueue.getType(); - } - } - return null; - } - - /** - * Get queue name from queue instance - * - * @param queue queue instance - * @return queue name - */ - public static String getQueueName(BlockingQueue queue) { - if (queue == null) { - return "Unknown"; - } - return queue.getClass().getSimpleName(); - } - - /** - * Validate queue configuration - * - * @param queueType queue type - * @param capacity queue capacity - * @return validation result - */ - public static boolean validateQueueConfig(Integer queueType, Integer capacity) { - if (queueType == null) { - return false; - } - String queueName = BlockingQueueTypeEnum.getBlockingQueueNameByType(queueType); - if (queueName.isEmpty()) { - Collection customQueues = ServiceLoaderRegistry - .getSingletonServiceInstances(CustomBlockingQueue.class); - boolean found = customQueues.stream() - .anyMatch(customQueue -> Objects.equals(customQueue.getType(), queueType)); - if (!found) { - log.warn("Invalid queue type: {}", queueType); - return false; - } - } - if (capacity != null && capacity <= 0) { - if (queueType.equals(BlockingQueueTypeEnum.SYNCHRONOUS_QUEUE.getType()) || - queueType.equals(BlockingQueueTypeEnum.LINKED_TRANSFER_QUEUE.getType())) { - return true; - } - log.warn("Invalid capacity: {} for queue type: {}", capacity, queueType); - return false; - } - return true; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/executor/support/BlockingQueueTypeEnum.java b/infra/common/src/main/java/cn/hippo4j/common/executor/support/BlockingQueueTypeEnum.java deleted file mode 100644 index 2cf11b57..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/executor/support/BlockingQueueTypeEnum.java +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.support; - -import cn.hippo4j.common.extension.spi.ServiceLoaderRegistry; -import lombok.Getter; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.LinkedTransferQueue; -import java.util.concurrent.PriorityBlockingQueue; -import java.util.concurrent.SynchronousQueue; -import java.util.function.Predicate; - -/** - * Blocking queue type enum. - */ -public enum BlockingQueueTypeEnum { - - /** - * {@link java.util.concurrent.ArrayBlockingQueue} - */ - ARRAY_BLOCKING_QUEUE(1, "ArrayBlockingQueue") { - - @Override - BlockingQueue of(Integer capacity) { - return new ArrayBlockingQueue<>(capacity); - } - - @Override - BlockingQueue of() { - return new ArrayBlockingQueue<>(DEFAULT_CAPACITY); - } - }, - - /** - * {@link java.util.concurrent.LinkedBlockingQueue} - */ - LINKED_BLOCKING_QUEUE(2, "LinkedBlockingQueue") { - - @Override - BlockingQueue of(Integer capacity) { - return new LinkedBlockingQueue<>(capacity); - } - - @Override - BlockingQueue of() { - return new LinkedBlockingQueue<>(); - } - }, - - /** - * {@link java.util.concurrent.LinkedBlockingDeque} - */ - LINKED_BLOCKING_DEQUE(3, "LinkedBlockingDeque") { - - @Override - BlockingQueue of(Integer capacity) { - return new LinkedBlockingDeque<>(capacity); - } - - @Override - BlockingQueue of() { - return new LinkedBlockingDeque<>(); - } - }, - - /** - * {@link java.util.concurrent.SynchronousQueue} - */ - SYNCHRONOUS_QUEUE(4, "SynchronousQueue") { - - @Override - BlockingQueue of(Integer capacity) { - return new SynchronousQueue<>(); - } - - @Override - BlockingQueue of() { - return new SynchronousQueue<>(); - } - }, - - /** - * {@link java.util.concurrent.LinkedTransferQueue} - */ - LINKED_TRANSFER_QUEUE(5, "LinkedTransferQueue") { - - @Override - BlockingQueue of(Integer capacity) { - return new LinkedTransferQueue<>(); - } - - @Override - BlockingQueue of() { - return new LinkedTransferQueue<>(); - } - }, - - /** - * {@link java.util.concurrent.PriorityBlockingQueue} - */ - PRIORITY_BLOCKING_QUEUE(6, "PriorityBlockingQueue") { - - @Override - BlockingQueue of(Integer capacity) { - return new PriorityBlockingQueue<>(capacity); - } - - @Override - BlockingQueue of() { - return new PriorityBlockingQueue<>(); - } - }, - - /** - * {@link ResizableCapacityLinkedBlockingQueue} - */ - RESIZABLE_LINKED_BLOCKING_QUEUE(9, "ResizableCapacityLinkedBlockingQueue") { - - @Override - BlockingQueue of(Integer capacity) { - return new ResizableCapacityLinkedBlockingQueue<>(capacity); - } - - @Override - BlockingQueue of() { - return new ResizableCapacityLinkedBlockingQueue<>(); - } - }; - - @Getter - private final Integer type; - - @Getter - private final String name; - - /** - * Create the specified implement of BlockingQueue with init capacity. - * Abstract method, depends on sub override - * - * @param capacity the capacity of the queue - * @param the class of the objects in the BlockingQueue - * @return a BlockingQueue view of the specified T - */ - abstract BlockingQueue of(Integer capacity); - - /** - * Create the specified implement of BlockingQueue,has no capacity limit. - * Abstract method, depends on sub override - * - * @param the class of the objects in the BlockingQueue - * @return a BlockingQueue view of the specified T - */ - abstract BlockingQueue of(); - - BlockingQueueTypeEnum(int type, String name) { - this.type = type; - this.name = name; - } - - private static final Map TYPE_TO_ENUM_MAP; - private static final Map NAME_TO_ENUM_MAP; - - static { - final BlockingQueueTypeEnum[] values = BlockingQueueTypeEnum.values(); - TYPE_TO_ENUM_MAP = new HashMap<>(values.length); - NAME_TO_ENUM_MAP = new HashMap<>(values.length); - for (BlockingQueueTypeEnum value : values) { - TYPE_TO_ENUM_MAP.put(value.type, value); - NAME_TO_ENUM_MAP.put(value.name, value); - } - } - - /** - * Creates a BlockingQueue with the given {@link BlockingQueueTypeEnum#name BlockingQueueTypeEnum.name} - * and capacity. - * - * @param blockingQueueName {@link BlockingQueueTypeEnum#name BlockingQueueTypeEnum.name} - * @param capacity the capacity of the BlockingQueue - * @param the class of the objects in the BlockingQueue - * @return a BlockingQueue view of the specified T - */ - private static BlockingQueue of(String blockingQueueName, Integer capacity) { - final BlockingQueueTypeEnum typeEnum = NAME_TO_ENUM_MAP.get(blockingQueueName); - if (typeEnum == null) { - return null; - } - return Objects.isNull(capacity) ? typeEnum.of() : typeEnum.of(capacity); - } - - /** - * Creates a BlockingQueue with the given {@link BlockingQueueTypeEnum#type BlockingQueueTypeEnum.type} - * and capacity. - * - * @param type {@link BlockingQueueTypeEnum#type BlockingQueueTypeEnum.type} - * @param capacity the capacity of the BlockingQueue - * @param the class of the objects in the BlockingQueue - * @return a BlockingQueue view of the specified T - */ - private static BlockingQueue of(int type, Integer capacity) { - final BlockingQueueTypeEnum typeEnum = TYPE_TO_ENUM_MAP.get(type); - if (typeEnum == null) { - return null; - } - return Objects.isNull(capacity) ? typeEnum.of() : typeEnum.of(capacity); - } - - private static final int DEFAULT_CAPACITY = 1024; - - static { - ServiceLoaderRegistry.register(CustomBlockingQueue.class); - } - - private static BlockingQueue customOrDefaultQueue(Integer capacity, Predicate predicate) { - Collection customBlockingQueues = ServiceLoaderRegistry - .getSingletonServiceInstances(CustomBlockingQueue.class); - - Integer resolvedCapacity = capacity; - if (resolvedCapacity == null || resolvedCapacity <= 0) { - resolvedCapacity = DEFAULT_CAPACITY; - } - - Integer finalResolvedCapacity = resolvedCapacity; - return customBlockingQueues.stream() - .filter(predicate) - .map(each -> each.generateBlockingQueue(finalResolvedCapacity)) - .findFirst() - .orElseGet(() -> new LinkedBlockingQueue(finalResolvedCapacity)); - } - - /** - * Creates a BlockingQueue with the given {@link BlockingQueueTypeEnum#name BlockingQueueTypeEnum.name} - * and capacity. if can't find the blockingQueueName with {@link BlockingQueueTypeEnum#name BlockingQueueTypeEnum.name}, - * create custom or default BlockingQueue {@link BlockingQueueTypeEnum#customOrDefaultQueue BlockingQueueTypeEnum.customOrDefaultQueue}. - * - * @param blockingQueueName {@link BlockingQueueTypeEnum#name BlockingQueueTypeEnum.name} - * @param capacity the capacity of the BlockingQueue - * @param the class of the objects in the BlockingQueue - * @return a BlockingQueue view of the specified T - */ - public static BlockingQueue createBlockingQueue(String blockingQueueName, Integer capacity) { - final BlockingQueue of = of(blockingQueueName, capacity); - if (of != null) { - return of; - } - - return customOrDefaultQueue(capacity, - (customerQueue) -> Objects.equals(customerQueue.getName(), blockingQueueName)); - } - - /** - * Creates a BlockingQueue with the given {@link BlockingQueueTypeEnum#type BlockingQueueTypeEnum.type} - * and capacity. if can't find the blockingQueueName with {@link BlockingQueueTypeEnum#type BlockingQueueTypeEnum.type}, - * create custom or default BlockingQueue {@link BlockingQueueTypeEnum#customOrDefaultQueue BlockingQueueTypeEnum.customOrDefaultQueue}. - * - * @param type {@link BlockingQueueTypeEnum#type BlockingQueueTypeEnum.type} - * @param capacity the capacity of the BlockingQueue - * @param the class of the objects in the BlockingQueue - * @return a BlockingQueue view of the specified T - */ - public static BlockingQueue createBlockingQueue(int type, Integer capacity) { - final BlockingQueue of = of(type, capacity); - if (of != null) { - return of; - } - - return customOrDefaultQueue(capacity, - (customeQueue) -> Objects.equals(customeQueue.getType(), type)); - } - - /** - * Map {@link BlockingQueueTypeEnum#type BlockingQueueTypeEnum.type } to {@link BlockingQueueTypeEnum#name BlockingQueueTypeEnum.name } - * or "" if can't mapping. - * - * @param type {@link BlockingQueueTypeEnum#type BlockingQueueTypeEnum.type} - * @return {@link BlockingQueueTypeEnum#name BlockingQueueTypeEnum.name } or "". - */ - public static String getBlockingQueueNameByType(int type) { - return Optional.ofNullable(TYPE_TO_ENUM_MAP.get(type)) - .map(value -> value.getName()) - .orElse(""); - } - - /** - * find {@link BlockingQueueTypeEnum} by {@link BlockingQueueTypeEnum#name BlockingQueueTypeEnum.name } - * or {@link BlockingQueueTypeEnum#LINKED_BLOCKING_QUEUE} if can't mapping. - * - * @param name {@link BlockingQueueTypeEnum#name BlockingQueueTypeEnum.name } - * @return enum {@link BlockingQueueTypeEnum} - */ - public static BlockingQueueTypeEnum getBlockingQueueTypeEnumByName(String name) { - return Optional.ofNullable(NAME_TO_ENUM_MAP.get(name)) - .orElse(LINKED_BLOCKING_QUEUE); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/executor/support/CustomBlockingQueue.java b/infra/common/src/main/java/cn/hippo4j/common/executor/support/CustomBlockingQueue.java deleted file mode 100644 index 10db6d2e..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/executor/support/CustomBlockingQueue.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.support; - -import java.util.concurrent.BlockingQueue; - -/** - * Custom blocking-queue. - */ -public interface CustomBlockingQueue { - - /** - * Gets the custom blocking queue type. - * - * @return - */ - Integer getType(); - - /** - * Adapt hippo4j core blocking queue. - * - * @return - */ - default String getName() { - return ""; - } - - /** - * Get custom blocking queue. - * Deprecated: override {@link #generateBlockingQueue(Integer)} to access capacity info. - * - * @return blocking queue instance - */ - @Deprecated - BlockingQueue generateBlockingQueue(); - - /** - * Get custom blocking queue with capacity info from server configuration. - * - * @param capacity configured queue capacity (may be null or non-positive when not configured by user) - * @return blocking queue instance - */ - default BlockingQueue generateBlockingQueue(Integer capacity) { - return generateBlockingQueue(); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/executor/support/CustomRejectedExecutionHandler.java b/infra/common/src/main/java/cn/hippo4j/common/executor/support/CustomRejectedExecutionHandler.java deleted file mode 100644 index c76fcc7b..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/executor/support/CustomRejectedExecutionHandler.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.support; - -import java.util.concurrent.RejectedExecutionHandler; - -/** - * Custom rejected execution handler. - */ -public interface CustomRejectedExecutionHandler { - - /** - * Get custom reject policy type. - * - * @return - */ - Integer getType(); - - /** - * Adapt hippo-4j core rejected execution handler. - * - * @return - */ - default String getName() { - return ""; - } - - /** - * Get custom reject policy. - * - * @return - */ - RejectedExecutionHandler generateRejected(); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/executor/support/RejectedPolicyTypeEnum.java b/infra/common/src/main/java/cn/hippo4j/common/executor/support/RejectedPolicyTypeEnum.java deleted file mode 100644 index 0f8c0c69..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/executor/support/RejectedPolicyTypeEnum.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.support; - -import cn.hippo4j.common.extension.spi.ServiceLoaderRegistry; -import lombok.Getter; - -import java.util.Collection; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.stream.Stream; - -/** - * Rejected policy type Enum. - */ -public enum RejectedPolicyTypeEnum { - - CALLER_RUNS_POLICY(1, "CallerRunsPolicy", new ThreadPoolExecutor.CallerRunsPolicy()), - - ABORT_POLICY(2, "AbortPolicy", new ThreadPoolExecutor.AbortPolicy()), - - DISCARD_POLICY(3, "DiscardPolicy", new ThreadPoolExecutor.DiscardPolicy()), - - DISCARD_OLDEST_POLICY(4, "DiscardOldestPolicy", new ThreadPoolExecutor.DiscardOldestPolicy()), - - RUNS_OLDEST_TASK_POLICY(5, "RunsOldestTaskPolicy", new RunsOldestTaskPolicy()), - - SYNC_PUT_QUEUE_POLICY(6, "SyncPutQueuePolicy", new SyncPutQueuePolicy()); - - @Getter - private Integer type; - - @Getter - private String name; - - private RejectedExecutionHandler rejectedHandler; - - RejectedPolicyTypeEnum(Integer type, String name, RejectedExecutionHandler rejectedHandler) { - this.type = type; - this.name = name; - this.rejectedHandler = rejectedHandler; - } - - static { - ServiceLoaderRegistry.register(CustomRejectedExecutionHandler.class); - } - - public static RejectedExecutionHandler createPolicy(String name) { - RejectedPolicyTypeEnum rejectedTypeEnum = Stream.of(RejectedPolicyTypeEnum.values()) - .filter(each -> Objects.equals(each.name, name)) - .findFirst() - .orElse(null); - if (rejectedTypeEnum != null) { - return rejectedTypeEnum.rejectedHandler; - } - Collection customRejectedExecutionHandlers = ServiceLoaderRegistry - .getSingletonServiceInstances(CustomRejectedExecutionHandler.class); - Optional customRejected = customRejectedExecutionHandlers.stream() - .filter(each -> Objects.equals(name, each.getName())) - .map(each -> each.generateRejected()) - .findFirst(); - return customRejected.orElse(ABORT_POLICY.rejectedHandler); - } - - public static RejectedExecutionHandler createPolicy(int type) { - Optional rejectedTypeEnum = Stream.of(RejectedPolicyTypeEnum.values()) - .filter(each -> Objects.equals(type, each.type)) - .map(each -> each.rejectedHandler) - .findFirst(); - RejectedExecutionHandler resultRejected = rejectedTypeEnum.orElseGet(() -> { - Collection customRejectedExecutionHandlers = ServiceLoaderRegistry - .getSingletonServiceInstances(CustomRejectedExecutionHandler.class); - Optional customRejected = customRejectedExecutionHandlers.stream() - .filter(each -> Objects.equals(type, each.getType())) - .map(each -> each.generateRejected()) - .findFirst(); - return customRejected.orElse(ABORT_POLICY.rejectedHandler); - }); - return resultRejected; - } - - public static String getRejectedNameByType(int type) { - return createPolicy(type).getClass().getSimpleName(); - } - - public static RejectedPolicyTypeEnum getRejectedPolicyTypeEnumByName(String name) { - Optional rejectedTypeEnum = Stream.of(RejectedPolicyTypeEnum.values()) - .filter(each -> each.name.equals(name)) - .findFirst(); - return rejectedTypeEnum.orElse(ABORT_POLICY); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/executor/support/ResizableCapacityLinkedBlockingQueue.java b/infra/common/src/main/java/cn/hippo4j/common/executor/support/ResizableCapacityLinkedBlockingQueue.java deleted file mode 100644 index 2df8b54d..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/executor/support/ResizableCapacityLinkedBlockingQueue.java +++ /dev/null @@ -1,844 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.support; - -import java.util.AbstractQueue; -import java.util.Collection; -import java.util.Iterator; -import java.util.NoSuchElementException; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.ReentrantLock; - -/** - * A clone of {@linkplain java.util.concurrent.LinkedBlockingQueue} - * with the addition of a {@link #setCapacity(int)} method, allowing us to - * change the capacity of the queue while it is in use.

- *

- * The documentation for LinkedBlockingQueue follows...

- *

- * An optionally-bounded {@linkplain BlockingQueue blocking queue} based on - * linked nodes. - * This queue orders elements FIFO (first-in-first-out). - * The head of the queue is that element that has been on the - * queue the longest time. - * The tail of the queue is that element that has been on the - * queue the shortest time. New elements - * are inserted at the tail of the queue, and the queue retrieval - * operations obtain elements at the head of the queue. - * Linked queues typically have higher throughput than array-based queues but - * less predictable performance in most concurrent applications. - * - *

The optional capacity bound constructor argument serves as a - * way to prevent excessive queue expansion. The capacity, if unspecified, - * is equal to {@link Integer#MAX_VALUE}. Linked nodes are - * dynamically created upon each insertion unless this would bring the - * queue above capacity. - * - *

This class implements all of the optional methods - * of the {@link Collection} and {@link Iterator} interfaces. - * - *

This class is a member of the - * - * Java Collections Framework. - * - * @param the type of elements held in this collection - * @author Doug Lea - * @since 1.5 - **/ -public class ResizableCapacityLinkedBlockingQueue extends AbstractQueue - implements - BlockingQueue, - java.io.Serializable { - - private static final long serialVersionUID = -6903933977591709194L; - - /* - * A variant of the "two lock queue" algorithm. The putLock gates entry to put (and offer), and has an associated condition for waiting puts. Similarly for the takeLock. The "count" field that - * they both rely on is maintained as an atomic to avoid needing to get both locks in most cases. Also, to minimize need for puts to get takeLock and vice-versa, cascading notifies are used. When - * a put notices that it has enabled at least one take, it signals taker. That taker in turn signals others if more items have been entered since the signal. And symmetrically for takes signalling - * puts. Operations such as remove(Object) and iterators acquire both locks. - */ - - /** - * Linked list node class - */ - static class Node { - - /** - * The item, volatile to ensure barrier separating write and read - */ - volatile E item; - Node next; - - Node(E x) { - item = x; - } - } - - /** - * The capacity bound, or Integer.MAX_VALUE if none - */ - private int capacity; - - /** - * Current number of elements - */ - private final AtomicInteger count = new AtomicInteger(0); - - /** - * Head of linked list - */ - private transient Node head; - - /** - * Tail of linked list - */ - private transient Node last; - - /** - * Lock held by take, poll, etc - */ - private final ReentrantLock takeLock = new ReentrantLock(); - - /** - * Wait queue for waiting takes - */ - private final Condition notEmpty = takeLock.newCondition(); - - /** - * Lock held by put, offer, etc - */ - private final ReentrantLock putLock = new ReentrantLock(); - - /** - * Wait queue for waiting puts - */ - private final Condition notFull = putLock.newCondition(); - - /** - * Signal a waiting take. Called only from put/offer (which do not - * otherwise ordinarily lock takeLock.) - */ - private void signalNotEmpty() { - final ReentrantLock takeLock = this.takeLock; - takeLock.lock(); - try { - notEmpty.signal(); - } finally { - takeLock.unlock(); - } - } - - /** - * Signal a waiting put. Called only from take/poll. - */ - private void signalNotFull() { - final ReentrantLock putLock = this.putLock; - putLock.lock(); - try { - notFull.signal(); - } finally { - putLock.unlock(); - } - } - - /** - * Create a node and link it at end of queue - * - * @param x the item - */ - private void insert(E x) { - last = last.next = new Node(x); - } - - /** - * Remove a node from head of queue, - * - * @return the node - */ - private E extract() { - Node first = head.next; - head = first; - E x = first.item; - first.item = null; - return x; - } - - /** - * Lock to prevent both puts and takes. - */ - private void fullyLock() { - putLock.lock(); - takeLock.lock(); - } - - /** - * Unlock to allow both puts and takes. - */ - private void fullyUnlock() { - takeLock.unlock(); - putLock.unlock(); - } - - /** - * Creates a LinkedBlockingQueue with a capacity of - * {@link Integer#MAX_VALUE}. - */ - public ResizableCapacityLinkedBlockingQueue() { - this(Integer.MAX_VALUE); - } - - /** - * Creates a LinkedBlockingQueue with the given (fixed) capacity. - * - * @param capacity the capacity of this queue. - * @throws IllegalArgumentException if capacity is not greater - * than zero. - */ - public ResizableCapacityLinkedBlockingQueue(int capacity) { - if (capacity <= 0) { - throw new IllegalArgumentException(); - } - this.capacity = capacity; - last = head = new Node(null); - } - - /** - * Creates a LinkedBlockingQueue with a capacity of - * {@link Integer#MAX_VALUE}, initially containing the elements of the - * given collection, - * added in traversal order of the collection's iterator. - * - * @param c the collection of elements to initially contain - * @throws NullPointerException if c or any element within it - * is null - */ - public ResizableCapacityLinkedBlockingQueue(Collection c) { - this(Integer.MAX_VALUE); - for (Iterator it = c.iterator(); it.hasNext();) { - add(it.next()); - } - } - - // this doc comment is overridden to remove the reference to collections - // greater in size than Integer.MAX_VALUE - - /** - * Returns the number of elements in this queue. - * - * @return the number of elements in this queue. - */ - @Override - public int size() { - return count.get(); - } - - /** - * Set a new capacity for the queue. Increasing the capacity can - * cause any waiting {@link #put(Object)} invocations to succeed if the new - * capacity is larger than the queue. - * - * @param capacity the new capacity for the queue - */ - public void setCapacity(int capacity) { - final int oldCapacity = this.capacity; - this.capacity = capacity; - final int size = count.get(); - if (capacity > size && size >= oldCapacity) { - signalNotFull(); - } - } - - // this doc comment is a modified copy of the inherited doc comment, - // without the reference to unlimited queues. - - /** - * Returns the number of elements that this queue can ideally (in - * the absence of memory or resource constraints) accept without - * blocking. This is always equal to the initial capacity of this queue - * less the current size of this queue. - *

Note that you cannot always tell if - * an attempt to add an element will succeed by - * inspecting remainingCapacity because it may be the - * case that a waiting consumer is ready to take an - * element out of an otherwise full queue. - */ - @Override - public int remainingCapacity() { - return capacity - count.get(); - } - - /** - * Adds the specified element to the tail of this queue, waiting if - * necessary for space to become available. - * - * @param o the element to add - * @throws InterruptedException if interrupted while waiting. - * @throws NullPointerException if the specified element is null. - */ - @Override - public void put(E o) throws InterruptedException { - if (o == null) { - throw new NullPointerException(); - } - // Note: convention in all put/take/etc is to preset - // local var holding count negative to indicate failure unless set. - int c = -1; - final ReentrantLock putLock = this.putLock; - final AtomicInteger count = this.count; - putLock.lockInterruptibly(); - try { - /* - * Note that count is used in wait guard even though it is not protected by lock. This works because count can only decrease at this point (all other puts are shut out by lock), and we (or - * some other waiting put) are signalled if it ever changes from capacity. Similarly for all other uses of count in other wait guards. - */ - try { - while (count.get() >= capacity) { - notFull.await(); - } - } catch (InterruptedException ie) { - notFull.signal(); // propagate to a non-interrupted thread - throw ie; - } - insert(o); - c = count.getAndIncrement(); - if (c + 1 < capacity) { - notFull.signal(); - } - } finally { - putLock.unlock(); - } - if (c == 0) { - signalNotEmpty(); - } - } - - /** - * Inserts the specified element at the tail of this queue, waiting if - * necessary up to the specified wait time for space to become available. - * - * @param o the element to add - * @param timeout how long to wait before giving up, in units of - * unit - * @param unit a TimeUnit determining how to interpret the - * timeout parameter - * @return true if successful, or false if - * the specified waiting time elapses before space is available. - * @throws InterruptedException if interrupted while waiting. - * @throws NullPointerException if the specified element is null. - */ - @Override - public boolean offer(E o, long timeout, TimeUnit unit) throws InterruptedException { - - if (o == null) { - throw new NullPointerException(); - } - long nanos = unit.toNanos(timeout); - int c = -1; - final ReentrantLock putLock = this.putLock; - final AtomicInteger count = this.count; - putLock.lockInterruptibly(); - try { - for (;;) { - if (count.get() < capacity) { - insert(o); - c = count.getAndIncrement(); - if (c + 1 < capacity) { - notFull.signal(); - } - break; - } - if (nanos <= 0) { - return false; - } - try { - nanos = notFull.awaitNanos(nanos); - } catch (InterruptedException ie) { - notFull.signal(); // propagate to a non-interrupted thread - throw ie; - } - } - } finally { - putLock.unlock(); - } - if (c == 0) { - signalNotEmpty(); - } - return true; - } - - /** - * Inserts the specified element at the tail of this queue if possible, - * returning immediately if this queue is full. - * - * @param o the element to add. - * @return true if it was possible to add the element to - * this queue, else false - * @throws NullPointerException if the specified element is null - */ - @Override - public boolean offer(E o) { - if (o == null) { - throw new NullPointerException(); - } - final AtomicInteger count = this.count; - if (count.get() >= capacity) { - return false; - } - int c = -1; - final ReentrantLock putLock = this.putLock; - putLock.lock(); - try { - if (count.get() < capacity) { - insert(o); - c = count.getAndIncrement(); - if (c + 1 < capacity) { - notFull.signal(); - } - } - } finally { - putLock.unlock(); - } - if (c == 0) { - signalNotEmpty(); - } - return c >= 0; - } - - @Override - public E take() throws InterruptedException { - E x; - int c = -1; - final AtomicInteger count = this.count; - final ReentrantLock takeLock = this.takeLock; - takeLock.lockInterruptibly(); - try { - try { - while (count.get() == 0) { - notEmpty.await(); - } - } catch (InterruptedException ie) { - notEmpty.signal(); // propagate to a non-interrupted thread - throw ie; - } - - x = extract(); - c = count.getAndDecrement(); - if (c > 1) { - notEmpty.signal(); - } - } finally { - takeLock.unlock(); - } - if (c >= capacity) { - signalNotFull(); - } - return x; - } - - @Override - public E poll(long timeout, TimeUnit unit) throws InterruptedException { - E x = null; - int c = -1; - long nanos = unit.toNanos(timeout); - final AtomicInteger count = this.count; - final ReentrantLock takeLock = this.takeLock; - takeLock.lockInterruptibly(); - try { - for (;;) { - if (count.get() > 0) { - x = extract(); - c = count.getAndDecrement(); - if (c > 1) { - notEmpty.signal(); - } - break; - } - if (nanos <= 0) { - return null; - } - try { - nanos = notEmpty.awaitNanos(nanos); - } catch (InterruptedException ie) { - notEmpty.signal(); // propagate to a non-interrupted thread - throw ie; - } - } - } finally { - takeLock.unlock(); - } - if (c >= capacity) { - signalNotFull(); - } - return x; - } - - @Override - public E poll() { - final AtomicInteger count = this.count; - if (count.get() == 0) { - return null; - } - E x = null; - int c = -1; - final ReentrantLock takeLock = this.takeLock; - takeLock.lock(); - try { - if (count.get() > 0) { - x = extract(); - c = count.getAndDecrement(); - if (c > 1) { - notEmpty.signal(); - } - } - } finally { - takeLock.unlock(); - } - if (c >= capacity) { - signalNotFull(); - } - return x; - } - - @Override - public E peek() { - if (count.get() == 0) { - return null; - } - final ReentrantLock takeLock = this.takeLock; - takeLock.lock(); - try { - Node first = head.next; - if (first == null) { - return null; - } else { - return first.item; - } - } finally { - takeLock.unlock(); - } - } - - @Override - public boolean remove(Object o) { - if (o == null) { - return false; - } - boolean removed = false; - fullyLock(); - try { - Node trail = head; - Node p = head.next; - while (p != null) { - if (o.equals(p.item)) { - removed = true; - break; - } - trail = p; - p = p.next; - } - if (removed) { - p.item = null; - trail.next = p.next; - if (count.getAndDecrement() >= capacity) { - notFull.signalAll(); - } - } - } finally { - fullyUnlock(); - } - return removed; - } - - @Override - public Object[] toArray() { - fullyLock(); - try { - int size = count.get(); - Object[] a = new Object[size]; - int k = 0; - for (Node p = head.next; p != null; p = p.next) { - a[k++] = p.item; - } - return a; - } finally { - fullyUnlock(); - } - } - - @Override - @SuppressWarnings("unchecked") - public T[] toArray(T[] a) { - fullyLock(); - try { - int size = count.get(); - if (a.length < size) { - a = (T[]) java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size); - } - int k = 0; - for (Node p = head.next; p != null; p = p.next) { - a[k++] = (T) p.item; - } - return a; - } finally { - fullyUnlock(); - } - } - - @Override - public String toString() { - fullyLock(); - try { - return super.toString(); - } finally { - fullyUnlock(); - } - } - - @Override - public void clear() { - fullyLock(); - try { - head.next = null; - if (count.getAndSet(0) >= capacity) { - notFull.signalAll(); - } - } finally { - fullyUnlock(); - } - } - - @Override - public int drainTo(Collection c) { - if (c == null) { - throw new NullPointerException(); - } - if (c == this) { - throw new IllegalArgumentException(); - } - Node first; - fullyLock(); - try { - first = head.next; - head.next = null; - if (count.getAndSet(0) >= capacity) { - notFull.signalAll(); - } - } finally { - fullyUnlock(); - } - // Transfer the elements outside of locks - int n = 0; - for (Node p = first; p != null; p = p.next) { - c.add(p.item); - p.item = null; - ++n; - } - return n; - } - - @Override - public int drainTo(Collection c, int maxElements) { - if (c == null) { - throw new NullPointerException(); - } - if (c == this) { - throw new IllegalArgumentException(); - } - if (maxElements <= 0) { - return 0; - } - fullyLock(); - try { - int n = 0; - Node p = head.next; - while (p != null && n < maxElements) { - c.add(p.item); - p.item = null; - p = p.next; - ++n; - } - if (n != 0) { - head.next = p; - if (count.getAndAdd(-n) >= capacity) { - notFull.signalAll(); - } - } - return n; - } finally { - fullyUnlock(); - } - } - - /** - * Returns an iterator over the elements in this queue in proper sequence. - * The returned Iterator is a "weakly consistent" iterator that - * will never throw {@link java.util.ConcurrentModificationException}, - * and guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not guaranteed to) - * reflect any modifications subsequent to construction. - * - * @return an iterator over the elements in this queue in proper sequence. - */ - @Override - public Iterator iterator() { - return new Itr(); - } - - /** - * Itr. - */ - private class Itr implements Iterator { - - /* - * Basic weak-consistent iterator. At all times hold the next item to hand out so that if hasNext() reports true, we will still have it to return even if lost race with a take etc. - */ - private Node current; - private Node lastRet; - private E currentElement; - - Itr() { - final ReentrantLock putLock = ResizableCapacityLinkedBlockingQueue.this.putLock; - final ReentrantLock takeLock = ResizableCapacityLinkedBlockingQueue.this.takeLock; - putLock.lock(); - takeLock.lock(); - try { - current = head.next; - if (current != null) { - currentElement = current.item; - } - } finally { - takeLock.unlock(); - putLock.unlock(); - } - } - - @Override - public boolean hasNext() { - return current != null; - } - - @Override - public E next() { - final ReentrantLock putLock = ResizableCapacityLinkedBlockingQueue.this.putLock; - final ReentrantLock takeLock = ResizableCapacityLinkedBlockingQueue.this.takeLock; - putLock.lock(); - takeLock.lock(); - try { - if (current == null) { - throw new NoSuchElementException(); - } - E x = currentElement; - lastRet = current; - current = current.next; - if (current != null) { - currentElement = current.item; - } - return x; - } finally { - takeLock.unlock(); - putLock.unlock(); - } - } - - @Override - public void remove() { - if (lastRet == null) { - throw new IllegalStateException(); - } - final ReentrantLock putLock = ResizableCapacityLinkedBlockingQueue.this.putLock; - final ReentrantLock takeLock = ResizableCapacityLinkedBlockingQueue.this.takeLock; - putLock.lock(); - takeLock.lock(); - try { - Node node = lastRet; - lastRet = null; - Node trail = head; - Node p = head.next; - while (p != null && p != node) { - trail = p; - p = p.next; - } - if (p == node) { - p.item = null; - trail.next = p.next; - int c = count.getAndDecrement(); - if (c >= capacity) { - notFull.signalAll(); - } - } - } finally { - takeLock.unlock(); - putLock.unlock(); - } - } - } - - /** - * Save the state to a stream (that is, serialize it). - * - * @param s the stream - * @serialData The capacity is emitted (int), followed by all of - * its elements (each an Object) in the proper order, - * followed by a null - */ - private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { - - fullyLock(); - try { - // Write out any hidden stuff, plus capacity - s.defaultWriteObject(); - - // Write out all elements in the proper order. - for (Node p = head.next; p != null; p = p.next) { - s.writeObject(p.item); - } - // Use trailing null as sentinel - s.writeObject(null); - } finally { - fullyUnlock(); - } - } - - /** - * Reconstitute this queue instance from a stream (that is, - * deserialize it). - * - * @param s the stream - */ - private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { - // Read in capacity, and any hidden stuff - s.defaultReadObject(); - - count.set(0); - last = head = new Node(null); - - // Read in all elements and place in queue - for (;;) { - @SuppressWarnings("unchecked") - E item = (E) s.readObject(); - if (item == null) { - break; - } - add(item); - } - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/executor/support/RunsOldestTaskPolicy.java b/infra/common/src/main/java/cn/hippo4j/common/executor/support/RunsOldestTaskPolicy.java deleted file mode 100644 index 26dac5a6..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/executor/support/RunsOldestTaskPolicy.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.support; - -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ThreadPoolExecutor; - -/** - * Run the oldest task policy. - */ -public class RunsOldestTaskPolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - BlockingQueue workQueue = executor.getQueue(); - Runnable firstWork = workQueue.poll(); - boolean newTaskAdd = workQueue.offer(r); - if (firstWork != null) { - firstWork.run(); - } - if (!newTaskAdd) { - executor.execute(r); - } - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/executor/support/SyncPutQueuePolicy.java b/infra/common/src/main/java/cn/hippo4j/common/executor/support/SyncPutQueuePolicy.java deleted file mode 100644 index 961b80f6..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/executor/support/SyncPutQueuePolicy.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.support; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ThreadPoolExecutor; - -/** - * Synchronous put queue policy. - */ -@Slf4j -public class SyncPutQueuePolicy implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - try { - executor.getQueue().put(r); - } catch (InterruptedException e) { - log.error("Adding Queue task to thread pool failed.", e); - } - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/extension/design/AbstractSubjectCenter.java b/infra/common/src/main/java/cn/hippo4j/common/extension/design/AbstractSubjectCenter.java deleted file mode 100644 index 07d58a89..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/extension/design/AbstractSubjectCenter.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.extension.design; - -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.common.toolkit.StringUtil; -import lombok.extern.slf4j.Slf4j; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Send observer notification. - */ -@Slf4j -public class AbstractSubjectCenter { - - private static final Map> OBSERVERS_MAP = new ConcurrentHashMap(); - - /** - * Register observer. - * - * @param observer - */ - public static void register(Observer observer) { - register(SubjectType.SPRING_CONTENT_REFRESHED.name(), observer); - } - - /** - * Register observer. - * - * @param subjectType - * @param observer - */ - public static void register(SubjectType subjectType, Observer observer) { - register(subjectType.name(), observer); - } - - /** - * Register observer. - * - * @param subject - * @param observer - */ - public static void register(String subject, Observer observer) { - if (StringUtil.isBlank(subject) || observer == null) { - log.warn("Register observer. A string whose subject or observer is empty or empty."); - return; - } - List observers = OBSERVERS_MAP.get(subject); - if (CollectionUtil.isEmpty(observers)) { - observers = new ArrayList(); - } - observers.add(observer); - OBSERVERS_MAP.put(subject, observers); - } - - /** - * Remove observer. - * - * @param observer - */ - public static void remove(Observer observer) { - remove(SubjectType.SPRING_CONTENT_REFRESHED.name(), observer); - } - - /** - * Remove observer. - * - * @param subject - * @param observer - */ - public static void remove(String subject, Observer observer) { - List observers = OBSERVERS_MAP.get(subject); - if (StringUtil.isBlank(subject) || CollectionUtil.isEmpty(observers) || observer == null) { - log.warn("Remove observer. A string whose subject or observer is empty or empty."); - return; - } - observers.remove(observer); - } - - /** - * get observer by subject. - * - * @param subject - */ - public static List get(SubjectType subjectType) { - return OBSERVERS_MAP.get(subjectType.name()); - } - - /** - * Notify. - * - * @param subjectType - * @param observerMessage - */ - public static void notify(SubjectType subjectType, ObserverMessage observerMessage) { - notify(subjectType.name(), observerMessage); - } - - /** - * Notify. - * - * @param subject - * @param observerMessage - */ - public static void notify(String subject, ObserverMessage observerMessage) { - List observers = OBSERVERS_MAP.get(subject); - if (CollectionUtil.isEmpty(observers)) { - log.warn("Under the subject, there is no observer group."); - return; - } - observers.parallelStream().forEach(each -> { - try { - each.accept(observerMessage); - } catch (Exception ex) { - log.error("Notification subject: {} observer exception", subject); - } - }); - } - - /** - * Subject type. - */ - public enum SubjectType { - - /** - * Spring content refreshed. - */ - SPRING_CONTENT_REFRESHED, - - /** - * Clear config cache. - */ - CLEAR_CONFIG_CACHE, - - /** - * Thread-pool dynamic refresh. - */ - THREAD_POOL_DYNAMIC_REFRESH, - - /** - * Agent Spring Properties Loader Completed. - */ - AGENT_SPRING_PROPERTIES_LOADER_COMPLETED - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/extension/design/Builder.java b/infra/common/src/main/java/cn/hippo4j/common/extension/design/Builder.java deleted file mode 100644 index 2c0a30cf..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/extension/design/Builder.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.extension.design; - -import java.io.Serializable; - -/** - * Builder pattern interface definition. - */ -public interface Builder extends Serializable { - - T build(); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/extension/design/Observer.java b/infra/common/src/main/java/cn/hippo4j/common/extension/design/Observer.java deleted file mode 100644 index 30d9297c..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/extension/design/Observer.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.extension.design; - -/** - * Observer. - */ -public interface Observer { - - /** - * Receive notification. - * - * @param observerMessage - */ - void accept(ObserverMessage observerMessage); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/extension/design/ObserverMessage.java b/infra/common/src/main/java/cn/hippo4j/common/extension/design/ObserverMessage.java deleted file mode 100644 index 38759155..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/extension/design/ObserverMessage.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.extension.design; - -/** - * Message notifying observer. - */ -public interface ObserverMessage { - - /** - * Message method definition - * - * @return Different message formats - */ - T message(); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/extension/enums/DelEnum.java b/infra/common/src/main/java/cn/hippo4j/common/extension/enums/DelEnum.java deleted file mode 100644 index 763ced85..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/extension/enums/DelEnum.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.extension.enums; - -/** - * Del enum. - */ -public enum DelEnum { - - /** - * Normal state - */ - NORMAL("0"), - - /** - * Deleted state - */ - DELETE("1"); - - private final String statusCode; - - DelEnum(String statusCode) { - this.statusCode = statusCode; - } - - public String getCode() { - return this.statusCode; - } - - public Integer getIntCode() { - return Integer.parseInt(this.statusCode); - } - - @Override - public String toString() { - return statusCode; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/extension/enums/EnableEnum.java b/infra/common/src/main/java/cn/hippo4j/common/extension/enums/EnableEnum.java deleted file mode 100644 index 624e1df5..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/extension/enums/EnableEnum.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.extension.enums; - -import java.util.Objects; - -/** - * Enable enum. - */ -public enum EnableEnum { - - /** - * True. - */ - YES("1"), - - /** - * False. - */ - NO("0"); - - private final String statusCode; - - EnableEnum(String statusCode) { - this.statusCode = statusCode; - } - - public String getCode() { - return this.statusCode; - } - - public Integer getIntCode() { - return Integer.parseInt(this.statusCode); - } - - @Override - public String toString() { - return statusCode; - } - - public static boolean getBool(Integer intStatusCode) { - return Objects.equals(intStatusCode, EnableEnum.YES.getIntCode()) ? true : false; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/extension/enums/VerifyEnum.java b/infra/common/src/main/java/cn/hippo4j/common/extension/enums/VerifyEnum.java deleted file mode 100644 index b14b177f..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/extension/enums/VerifyEnum.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.extension.enums; - -/** - * Enumeration of thread pool audit status. - */ -public enum VerifyEnum { - - /** - * To verify - */ - TO_VERIFY(0, "待审核"), - - /** - * Verify accept - */ - VERIFY_ACCEPT(1, "审核通过"), - - /** - * Verify reject - */ - VERIFY_REJECT(2, "审核拒绝"), - - /** - * Verify invalid - */ - VERIFY_INVALID(3, "失效"); - - /** - * Verify status - */ - private final Integer verifyStatus; - - /** - * Desc - */ - private final String desc; - - VerifyEnum(Integer verifyStatus, String desc) { - this.verifyStatus = verifyStatus; - this.desc = desc; - } - - public String getDesc() { - return this.desc; - } - - public Integer getVerifyStatus() { - return this.verifyStatus; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/extension/enums/WebContainerEnum.java b/infra/common/src/main/java/cn/hippo4j/common/extension/enums/WebContainerEnum.java deleted file mode 100644 index 179dbccb..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/extension/enums/WebContainerEnum.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.extension.enums; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -/** - * Web container enum. - */ -@RequiredArgsConstructor -public enum WebContainerEnum { - - /** - * Tomcat - */ - TOMCAT("Tomcat"), - - /** - * Jetty - */ - JETTY("Jetty"), - - /** - * Undertow - */ - UNDERTOW("Undertow"); - - @Getter - private final String name; - - @Override - public String toString() { - return getName(); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/extension/function/Matcher.java b/infra/common/src/main/java/cn/hippo4j/common/extension/function/Matcher.java deleted file mode 100644 index 4371aa4e..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/extension/function/Matcher.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.extension.function; - -/** - * Matcher. - */ -@FunctionalInterface -public interface Matcher { - - /** - * Returns {@code true} if this matches {@code t}, {@code false} otherwise. - */ - boolean match(T t); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/extension/function/NoArgsConsumer.java b/infra/common/src/main/java/cn/hippo4j/common/extension/function/NoArgsConsumer.java deleted file mode 100644 index b6452d14..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/extension/function/NoArgsConsumer.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.extension.function; - -/** - * No args consumer. - */ -@FunctionalInterface -public interface NoArgsConsumer { - - /** - * Execute operation without parameters. - */ - void accept(); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/extension/spi/ServiceLoaderInstantiationException.java b/infra/common/src/main/java/cn/hippo4j/common/extension/spi/ServiceLoaderInstantiationException.java deleted file mode 100644 index f45b5009..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/extension/spi/ServiceLoaderInstantiationException.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.extension.spi; - -/** - * Service loader instantiation exception. - */ -public class ServiceLoaderInstantiationException extends RuntimeException { - - public ServiceLoaderInstantiationException(final Class clazz, final Exception cause) { - super(String.format("Can not find public default constructor for SPI class `%s`", clazz.getName()), cause); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/extension/spi/ServiceLoaderRegistry.java b/infra/common/src/main/java/cn/hippo4j/common/extension/spi/ServiceLoaderRegistry.java deleted file mode 100644 index 5a698ce6..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/extension/spi/ServiceLoaderRegistry.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.extension.spi; - -import java.lang.reflect.InvocationTargetException; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedList; -import java.util.Map; -import java.util.ServiceLoader; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; - -/** - * Dynamic thread-pool SPI service loader. - */ -public final class ServiceLoaderRegistry { - - /** - * safe container。 - * key : SPI interface class type. - * value : collection whose elements are object of key's class type. - */ - private static final Map, Collection> SERVICES = new ConcurrentHashMap<>(); - - private ServiceLoaderRegistry() { - } - - /** - * Register. - * - * @param serviceInterface - */ - public static void register(final Class serviceInterface) { - if (!SERVICES.containsKey(serviceInterface)) { - SERVICES.put(serviceInterface, load(serviceInterface)); - } - } - - /** - * Load. - * - * @param serviceInterface - * @param - * @return - */ - private static Collection load(final Class serviceInterface) { - Collection result = new LinkedList<>(); - for (T each : ServiceLoader.load(serviceInterface)) { - result.add(each); - } - return result; - } - - /** - * Get Service instances - * - * @param serviceClass serviceClass - * @param - * @return - */ - public static Collection getServiceInstances(final Class serviceClass) { - return null == serviceClass.getAnnotation(SingletonSPI.class) ? newServiceInstances(serviceClass) : getSingletonServiceInstances(serviceClass); - } - - /** - * Get singleton service instances. - * - * @param service - * @param - * @return - */ - @SuppressWarnings("unchecked") - public static Collection getSingletonServiceInstances(final Class service) { - return (Collection) SERVICES.getOrDefault(service, Collections.emptyList()); - } - - /** - * New service instances. - * - * @param service - * @param - * @return - */ - public static Collection newServiceInstances(final Class service) { - return SERVICES.containsKey(service) ? SERVICES.get(service).stream().map(each -> (T) newServiceInstance(each.getClass())).collect(Collectors.toList()) : Collections.emptyList(); - } - - /** - * New service instance. - * - * @param clazz - * @return - */ - private static Object newServiceInstance(final Class clazz) { - try { - return clazz.getDeclaredConstructor().newInstance(); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException - | NoSuchMethodException e) { - throw new ServiceLoaderInstantiationException(clazz, e); - } - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/extension/spi/SingletonSPI.java b/infra/common/src/main/java/cn/hippo4j/common/extension/spi/SingletonSPI.java deleted file mode 100644 index 664e3cb4..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/extension/spi/SingletonSPI.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.extension.spi; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Annotation of singleton SPI. - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -public @interface SingletonSPI { -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/handler/DynamicThreadPoolAdapterChoose.java b/infra/common/src/main/java/cn/hippo4j/common/handler/DynamicThreadPoolAdapterChoose.java deleted file mode 100644 index 3f2b3d17..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/handler/DynamicThreadPoolAdapterChoose.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.handler; - -import cn.hippo4j.common.api.DynamicThreadPoolAdapter; -import cn.hippo4j.common.extension.spi.ServiceLoaderRegistry; -import cn.hippo4j.common.toolkit.CollectionUtil; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; - -/** - * Dynamic thread pool adapter choose. - */ -public class DynamicThreadPoolAdapterChoose { - - private static final List DYNAMIC_THREAD_POOL_ADAPTERS = new ArrayList<>(); - - static { - DYNAMIC_THREAD_POOL_ADAPTERS.add(new TransmittableThreadLocalExecutorAdapter()); - DYNAMIC_THREAD_POOL_ADAPTERS.add(new TransmittableThreadLocalExecutorServiceAdapter()); - DYNAMIC_THREAD_POOL_ADAPTERS.add(new ZipkinExecutorAdapter()); - loadCustomerAdapter(); - } - - /** - * Check if the object contains thread pool information. - * - * @param executor objects where there may be instances - * of dynamic thread pools - * @return matching results - */ - public static boolean match(Object executor) { - return DYNAMIC_THREAD_POOL_ADAPTERS.stream().anyMatch(each -> each.match(executor)); - } - - /** - * Get the dynamic thread pool reference in the object. - * - * @param executor objects where there may be instances - * of dynamic thread pools - * @return get the real dynamic thread pool instance - */ - public static ThreadPoolExecutor unwrap(Object executor) { - Optional dynamicThreadPoolAdapterOptional = DYNAMIC_THREAD_POOL_ADAPTERS.stream().filter(each -> each.match(executor)).findFirst(); - return dynamicThreadPoolAdapterOptional.map(each -> each.unwrap(executor)).orElse(null); - } - - /** - * If the {@link DynamicThreadPoolAdapter#match(Object)} conditions are met, - * the thread pool is replaced with a dynamic thread pool. - * - * @param executor objects where there may be instances - * of dynamic thread pools - * @param dynamicThreadPoolExecutor dynamic thread-pool executor - */ - public static void replace(Object executor, Executor dynamicThreadPoolExecutor) { - Optional dynamicThreadPoolAdapterOptional = DYNAMIC_THREAD_POOL_ADAPTERS.stream().filter(each -> each.match(executor)).findFirst(); - dynamicThreadPoolAdapterOptional.ifPresent(dynamicThreadPoolAdapter -> dynamicThreadPoolAdapter.replace(executor, dynamicThreadPoolExecutor)); - } - - /** - * Load SPI customer adapter. - */ - private static void loadCustomerAdapter() { - ServiceLoaderRegistry.register(DynamicThreadPoolAdapter.class); - Collection instances = ServiceLoaderRegistry.getSingletonServiceInstances(DynamicThreadPoolAdapter.class); - if (CollectionUtil.isEmpty(instances)) { - return; - } - for (DynamicThreadPoolAdapter instance : instances) { - if (instance != null) { - DYNAMIC_THREAD_POOL_ADAPTERS.add(instance); - } - } - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/handler/ThreadPoolStatusHandler.java b/infra/common/src/main/java/cn/hippo4j/common/handler/ThreadPoolStatusHandler.java deleted file mode 100644 index 5cba3676..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/handler/ThreadPoolStatusHandler.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.handler; - -import cn.hippo4j.common.toolkit.ReflectUtil; -import lombok.extern.slf4j.Slf4j; - -import java.lang.reflect.Method; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * ThreadPool status handler. - */ -@Slf4j -public class ThreadPoolStatusHandler { - - private static final String RUNNING = "Running"; - - private static final String TERMINATED = "Terminated"; - - private static final String SHUTTING_DOWN = "Shutting down"; - - private static final AtomicBoolean EXCEPTION_FLAG = new AtomicBoolean(Boolean.TRUE); - - /** - * Get thread-pool state. - * - * @param executor executor - * @return thread-pool state - */ - public static String getThreadPoolState(ThreadPoolExecutor executor) { - if (EXCEPTION_FLAG.get()) { - try { - Method runStateLessThan = ReflectUtil.getMethodByName(ThreadPoolExecutor.class, "runStateLessThan"); - ReflectUtil.setAccessible(runStateLessThan); - AtomicInteger ctl = (AtomicInteger) ReflectUtil.getFieldValue(executor, "ctl"); - int shutdown = (int) ReflectUtil.getFieldValue(executor, "SHUTDOWN"); - boolean runStateLessThanBool = ReflectUtil.invoke(executor, runStateLessThan, ctl.get(), shutdown); - if (runStateLessThanBool) { - return RUNNING; - } - Method runStateAtLeast = ReflectUtil.getMethodByName(ThreadPoolExecutor.class, "runStateAtLeast"); - cn.hippo4j.common.toolkit.ReflectUtil.setAccessible(runStateAtLeast); - int terminated = (int) ReflectUtil.getFieldValue(executor, "TERMINATED"); - String resultStatus = ReflectUtil.invoke(executor, runStateAtLeast, ctl.get(), terminated) ? TERMINATED : SHUTTING_DOWN; - return resultStatus; - } catch (Exception ex) { - log.error("Failed to get thread pool status.", ex); - EXCEPTION_FLAG.set(Boolean.FALSE); - } - } - return "UNKNOWN"; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/handler/TransmittableThreadLocalExecutorAdapter.java b/infra/common/src/main/java/cn/hippo4j/common/handler/TransmittableThreadLocalExecutorAdapter.java deleted file mode 100644 index 079fc11e..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/handler/TransmittableThreadLocalExecutorAdapter.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.handler; - -import cn.hippo4j.common.api.DynamicThreadPoolAdapter; -import cn.hippo4j.common.toolkit.ReflectUtil; - -import java.util.Objects; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; - -/** - * Transmittable thread local executor adapter. - */ -public class TransmittableThreadLocalExecutorAdapter implements DynamicThreadPoolAdapter { - - private static final String MATCH_CLASS_NAME = "ExecutorTtlWrapper"; - - private static final String FIELD_NAME = "executor"; - - @Override - public boolean match(Object executor) { - return Objects.equals(MATCH_CLASS_NAME, executor.getClass().getSimpleName()); - } - - @Override - public ThreadPoolExecutor unwrap(Object executor) { - return (ThreadPoolExecutor) ReflectUtil.getFieldValue(executor, FIELD_NAME); - } - - @Override - public void replace(Object executor, Executor dynamicThreadPoolExecutor) { - ReflectUtil.setFieldValue(executor, FIELD_NAME, dynamicThreadPoolExecutor); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/handler/TransmittableThreadLocalExecutorServiceAdapter.java b/infra/common/src/main/java/cn/hippo4j/common/handler/TransmittableThreadLocalExecutorServiceAdapter.java deleted file mode 100644 index 5dd27df9..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/handler/TransmittableThreadLocalExecutorServiceAdapter.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.handler; - -import cn.hippo4j.common.api.DynamicThreadPoolAdapter; -import cn.hippo4j.common.toolkit.ReflectUtil; - -import java.util.Objects; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; - -/** - * Transmittable thread local executor service adapter. - */ -public class TransmittableThreadLocalExecutorServiceAdapter implements DynamicThreadPoolAdapter { - - private static final String MATCH_CLASS_NAME = "ExecutorServiceTtlWrapper"; - - private static final String FIELD_NAME = "executorService"; - - @Override - public boolean match(Object executor) { - return Objects.equals(MATCH_CLASS_NAME, executor.getClass().getSimpleName()); - } - - @Override - public ThreadPoolExecutor unwrap(Object executor) { - return (ThreadPoolExecutor) ReflectUtil.getFieldValue(executor, FIELD_NAME); - } - - @Override - public void replace(Object executor, Executor dynamicThreadPoolExecutor) { - ReflectUtil.setFieldValue(executor, FIELD_NAME, dynamicThreadPoolExecutor); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/handler/ZipkinExecutorAdapter.java b/infra/common/src/main/java/cn/hippo4j/common/handler/ZipkinExecutorAdapter.java deleted file mode 100644 index 7177c070..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/handler/ZipkinExecutorAdapter.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.handler; - -import cn.hippo4j.common.api.DynamicThreadPoolAdapter; -import cn.hippo4j.common.toolkit.ReflectUtil; - -import java.lang.reflect.Field; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; - -/** - * Zipkin thread local executor adapter. - */ -public class ZipkinExecutorAdapter implements DynamicThreadPoolAdapter { - - private static final String MATCH_CLASS_NAME = "brave.internal.WrappingExecutorService"; - private static final String FIELD_NAME = "delegate"; - private static final String TYPE_NAME = "java.util.concurrent.ExecutorService"; - - @Override - public boolean match(Object executor) { - return matchSuper(executor); - } - - public boolean matchSuper(Object executor) { - if (Objects.equals(MATCH_CLASS_NAME, Optional.ofNullable(executor).map(Object::getClass).map(Class::getName).orElse(null))) { - return true; - } else { - return Objects.equals(MATCH_CLASS_NAME, Optional.ofNullable(executor).map(Object::getClass).map(Class::getSuperclass).map(Class::getName).orElse(null)); - } - } - - @Override - public ThreadPoolExecutor unwrap(Object executor) { - Object unwrap = doUnwrap(executor); - if (unwrap == null) { - return null; - } - return (ThreadPoolExecutor) unwrap; - } - - @Override - public void replace(Object executor, Executor dynamicThreadPoolExecutor) { - Field field = ReflectUtil.findField(executor, FIELD_NAME, TYPE_NAME); - ReflectUtil.setFieldValue(executor, field, dynamicThreadPoolExecutor); - } - - private Object doUnwrap(Object executor) { - Object unwrap = ReflectUtil.getFieldValue(executor, FIELD_NAME); - if (unwrap == null) { - Field field = ReflectUtil.findField(executor, FIELD_NAME, TYPE_NAME); - if (field != null) { - return ReflectUtil.getFieldValue(executor, field); - } - } - return null; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/api/ILog.java b/infra/common/src/main/java/cn/hippo4j/common/logging/api/ILog.java deleted file mode 100644 index 3bb9cba0..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/api/ILog.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.api; - -/** - * The Log interface. It's very easy to understand, like any other log-component. Do just like log4j or log4j2 does. - *

- */ -public interface ILog { - - void info(String format); - - void info(String format, Object... arguments); - - void info(Throwable t, String format, Object... arguments); - - void warn(String format, Object... arguments); - - void warn(Throwable e, String format, Object... arguments); - - void error(String format, Throwable e); - - void error(Throwable e, String format, Object... arguments); - - boolean isDebugEnable(); - - boolean isInfoEnable(); - - boolean isWarnEnable(); - - boolean isErrorEnable(); - - boolean isTraceEnabled(); - - void debug(String format); - - void debug(String format, Object... arguments); - - void debug(Throwable t, String format, Object... arguments); - - void error(String format); - - void trace(String format); - - void trace(String format, Object... arguments); - - void trace(Throwable t, String format, Object... arguments); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/api/LogManager.java b/infra/common/src/main/java/cn/hippo4j/common/logging/api/LogManager.java deleted file mode 100644 index 3c72d7ef..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/api/LogManager.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.api; - -import cn.hippo4j.common.logging.core.PatternLogResolver; - -/** - * LogManager is the {@link LogResolver} implementation manager. By using {@link LogResolver}, {@link - * LogManager#getLogger(Class)} returns a {@link ILog} implementation. This module use this class as the main entrance, - * and block the implementation detail about log-component. In different modules, like server or sniffer, it will use - * different implementations. - * - *

If no {@link LogResolver} is registered, return {@link NoopLogger#INSTANCE} to avoid - * {@link NullPointerException}. If {@link LogManager#setLogResolver(LogResolver)} is called twice, the second will - * override the first without any warning or exception. - * - *

Created by xin on 2016/11/10. - */ -public class LogManager { - - private static LogResolver RESOLVER = new PatternLogResolver(); - - public static void setLogResolver(LogResolver resolver) { - LogManager.RESOLVER = resolver; - } - - public static ILog getLogger(Class clazz) { - if (RESOLVER == null) { - return NoopLogger.INSTANCE; - } - return LogManager.RESOLVER.getLogger(clazz); - } - - public static ILog getLogger(String clazz) { - if (RESOLVER == null) { - return NoopLogger.INSTANCE; - } - return LogManager.RESOLVER.getLogger(clazz); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/api/LogResolver.java b/infra/common/src/main/java/cn/hippo4j/common/logging/api/LogResolver.java deleted file mode 100644 index a6cf32a0..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/api/LogResolver.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.api; - -/** - * {@link LogResolver} just do only one thing: return the {@link ILog} implementation. - *

- */ -public interface LogResolver { - - /** - * @param clazz the class is showed in log message. - * @return {@link ILog} implementation. - */ - ILog getLogger(Class clazz); - - /** - * @param clazz the class is showed in log message. - * @return {@link ILog} implementation. - */ - ILog getLogger(String clazz); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/api/NoopLogger.java b/infra/common/src/main/java/cn/hippo4j/common/logging/api/NoopLogger.java deleted file mode 100644 index 99bc3db7..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/api/NoopLogger.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.api; - -/** - * No operation logger implementation. Just implement {@link ILog} interface, but do nothing. - *

- */ -public enum NoopLogger implements ILog { - - INSTANCE; - - @Override - public void info(String message) { - - } - - @Override - public void info(String format, Object... arguments) { - - } - - @Override - public void info(final Throwable t, final String format, final Object... arguments) { - - } - - @Override - public void warn(String format, Object... arguments) { - - } - - @Override - public void error(String format, Throwable e) { - - } - - @Override - public boolean isDebugEnable() { - return false; - } - - @Override - public boolean isInfoEnable() { - return false; - } - - @Override - public boolean isWarnEnable() { - return false; - } - - @Override - public boolean isErrorEnable() { - return false; - } - - @Override - public boolean isTraceEnabled() { - return false; - } - - @Override - public void debug(String format) { - - } - - @Override - public void debug(String format, Object... arguments) { - - } - - @Override - public void debug(final Throwable t, final String format, final Object... arguments) { - - } - - @Override - public void error(String format) { - - } - - @Override - public void trace(final String format) { - - } - - @Override - public void trace(final String format, final Object... arguments) { - - } - - @Override - public void trace(final Throwable t, final String format, final Object... arguments) { - - } - - @Override - public void error(Throwable e, String format, Object... arguments) { - - } - - @Override - public void warn(Throwable e, String format, Object... arguments) { - - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/AbstractLogger.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/AbstractLogger.java deleted file mode 100644 index c67121c7..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/AbstractLogger.java +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -import cn.hippo4j.common.conf.Config; -import cn.hippo4j.common.logging.api.ILog; -import cn.hippo4j.common.logging.core.converters.*; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; - -/** - * An abstract class to simplify the real implementation of the loggers. - * It hold the class name of the logger, and is responsible for log level check, - * message interpolation, etc. - */ -public abstract class AbstractLogger implements ILog { - - public static final Map> DEFAULT_CONVERTER_MAP = new HashMap<>(); - protected List converters = new ArrayList<>(); - - static { - DEFAULT_CONVERTER_MAP.put("thread", ThreadConverter.class); - DEFAULT_CONVERTER_MAP.put("level", LevelConverter.class); - DEFAULT_CONVERTER_MAP.put("agent_name", AgentNameConverter.class); - DEFAULT_CONVERTER_MAP.put("timestamp", DateConverter.class); - DEFAULT_CONVERTER_MAP.put("msg", MessageConverter.class); - DEFAULT_CONVERTER_MAP.put("throwable", ThrowableConverter.class); - DEFAULT_CONVERTER_MAP.put("class", ClassConverter.class); - } - - protected final String targetClass; - - public AbstractLogger(String targetClass) { - this.targetClass = targetClass; - } - - @Override - public void info(String message) { - if (this.isInfoEnable()) { - this.logger(LogLevel.INFO, message, null); - } - } - - @Override - public void info(String message, Object... objects) { - if (this.isInfoEnable()) { - this.logger(LogLevel.INFO, replaceParam(message, objects), null); - } - } - - @Override - public void info(final Throwable throwable, final String message, final Object... objects) { - if (this.isInfoEnable()) { - this.logger(LogLevel.INFO, replaceParam(message, objects), throwable); - } - } - - @Override - public void warn(String message, Object... objects) { - if (this.isWarnEnable()) { - this.logger(LogLevel.WARN, replaceParam(message, objects), null); - } - } - - @Override - public void warn(Throwable throwable, String message, Object... objects) { - if (this.isWarnEnable()) { - this.logger(LogLevel.WARN, replaceParam(message, objects), throwable); - } - } - - @Override - public void error(String message, Throwable throwable) { - if (this.isErrorEnable()) { - this.logger(LogLevel.ERROR, message, throwable); - } - } - - @Override - public void error(Throwable throwable, String message, Object... objects) { - if (this.isErrorEnable()) { - this.logger(LogLevel.ERROR, replaceParam(message, objects), throwable); - } - } - - @Override - public void error(String message) { - if (this.isErrorEnable()) { - this.logger(LogLevel.ERROR, message, null); - } - } - - @Override - public void debug(String message) { - if (this.isDebugEnable()) { - this.logger(LogLevel.DEBUG, message, null); - } - } - - @Override - public void debug(String message, Object... objects) { - if (this.isDebugEnable()) { - this.logger(LogLevel.DEBUG, replaceParam(message, objects), null); - } - } - - @Override - public void debug(Throwable throwable, String message, Object... objects) { - if (this.isDebugEnable()) { - this.logger(LogLevel.DEBUG, replaceParam(message, objects), throwable); - } - } - - @Override - public boolean isDebugEnable() { - return LogLevel.DEBUG.compareTo(Config.Logging.LEVEL) >= 0; - } - - @Override - public boolean isInfoEnable() { - return LogLevel.INFO.compareTo(Config.Logging.LEVEL) >= 0; - } - - @Override - public boolean isWarnEnable() { - return LogLevel.WARN.compareTo(Config.Logging.LEVEL) >= 0; - } - - @Override - public boolean isErrorEnable() { - return LogLevel.ERROR.compareTo(Config.Logging.LEVEL) >= 0; - } - - @Override - public boolean isTraceEnabled() { - return LogLevel.TRACE.compareTo(Config.Logging.LEVEL) >= 0; - } - - @Override - public void trace(final String message) { - if (this.isTraceEnabled()) { - this.logger(LogLevel.TRACE, message, null); - } - } - - @Override - public void trace(final String message, final Object... objects) { - if (this.isTraceEnabled()) { - this.logger(LogLevel.TRACE, replaceParam(message, objects), null); - } - } - - @Override - public void trace(final Throwable throwable, final String message, final Object... objects) { - if (this.isTraceEnabled()) { - this.logger(LogLevel.TRACE, replaceParam(message, objects), throwable); - } - } - - protected String replaceParam(String message, Object... parameters) { - if (message == null) { - return message; - } - int startSize = 0; - int parametersIndex = 0; - int index; - String tmpMessage = message; - while ((index = message.indexOf("{}", startSize)) != -1) { - if (parametersIndex >= parameters.length) { - break; - } - /** - * @Fix the Illegal group reference issue - */ - tmpMessage = tmpMessage.replaceFirst("\\{\\}", Matcher.quoteReplacement(String.valueOf(parameters[parametersIndex++]))); - startSize = index + 2; - } - return tmpMessage; - } - - protected void logger(LogLevel level, String message, Throwable e) { - WriterFactory.getLogWriter().write(this.format(level, message, e)); - } - - /** - * The abstract method left for real loggers. - * Any implementation MUST return string, which will be directly transferred to log destination, - * i.e. log files OR stdout - * - * @param level log level - * @param message log message, which has been interpolated with user-defined parameters. - * @param e throwable if exists - * @return string representation of the log, for example, raw json string for {@link JsonLogger} - */ - protected abstract String format(LogLevel level, String message, Throwable e); - -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/Converter.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/Converter.java deleted file mode 100644 index 27dd8981..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/Converter.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -/** - * The Converter, it is used to convert the LogEvent to the String. - * For JsonLogger, the `getKey()` method is used to generate the key for json. - */ -public interface Converter { - - String convert(LogEvent logEvent); - - String getKey(); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/FileWriter.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/FileWriter.java deleted file mode 100644 index 72397d71..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/FileWriter.java +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -import cn.hippo4j.common.boot.DefaultNamedThreadFactory; -import cn.hippo4j.common.conf.Config; -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.common.toolkit.agent.RunnableWithExceptionProtection; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FilenameFilter; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.Date; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.Callable; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.regex.Pattern; - -/** - * The FileWriter support async file output, by using a queue as buffer. - */ -public class FileWriter implements IWriter { - - private static FileWriter INSTANCE; - private static final Object CREATE_LOCK = new Object(); - private FileOutputStream fileOutputStream; - private ArrayBlockingQueue logBuffer; - private volatile int fileSize; - private Pattern filenamePattern = Pattern.compile(Config.Logging.FILE_NAME + "\\.\\d{4}_\\d{2}_\\d{2}_\\d{2}_\\d{2}_\\d{2}"); - - public static FileWriter get() { - if (INSTANCE == null) { - synchronized (CREATE_LOCK) { - if (INSTANCE == null) { - INSTANCE = new FileWriter(); - } - } - } - return INSTANCE; - } - - private FileWriter() { - logBuffer = new ArrayBlockingQueue(1024); - final ArrayList outputLogs = new ArrayList(200); - Executors.newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory("LogFileWriter")) - .scheduleAtFixedRate(new RunnableWithExceptionProtection(new Runnable() { - - @Override - public void run() { - try { - logBuffer.drainTo(outputLogs); - for (String log : outputLogs) { - writeToFile(log + Constants.LINE_SEPARATOR); - } - try { - if (fileOutputStream != null) { - fileOutputStream.flush(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } finally { - outputLogs.clear(); - } - } - }, new RunnableWithExceptionProtection.CallbackWhenException() { - - @Override - public void handle(Throwable t) { - } - }), 0, 1, TimeUnit.SECONDS); - } - - /** - * @param message to be written into the file. - */ - private void writeToFile(String message) { - if (prepareWriteStream()) { - try { - fileOutputStream.write(message.getBytes()); - fileSize += message.length(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - switchFile(); - } - } - } - - private void switchFile() { - if (fileSize > Config.Logging.MAX_FILE_SIZE) { - forceExecute(new Callable() { - - @Override - public Object call() throws Exception { - fileOutputStream.flush(); - return null; - } - }); - forceExecute(new Callable() { - - @Override - public Object call() throws Exception { - fileOutputStream.close(); - return null; - } - }); - forceExecute(new Callable() { - - @Override - public Object call() throws Exception { - new File(Config.Logging.DIR, Config.Logging.FILE_NAME).renameTo(new File(Config.Logging.DIR, Config.Logging.FILE_NAME + new SimpleDateFormat(".yyyy_MM_dd_HH_mm_ss") - .format(new Date()))); - return null; - } - }); - forceExecute(new Callable() { - - @Override - public Object call() throws Exception { - fileOutputStream = null; - return null; - } - }); - - if (Config.Logging.MAX_HISTORY_FILES > 0) { - deleteExpiredFiles(); - } - } - } - - /** - * load history log file name array - * - * @return history log file name array - */ - private String[] getHistoryFilePath() { - File path = new File(Config.Logging.DIR); - String[] pathArr = path.list(new FilenameFilter() { - - @Override - public boolean accept(File dir, String name) { - return filenamePattern.matcher(name).matches(); - } - }); - - return pathArr; - } - - /** - * delete expired log files - */ - private void deleteExpiredFiles() { - String[] historyFileArr = getHistoryFilePath(); - if (historyFileArr != null && historyFileArr.length > Config.Logging.MAX_HISTORY_FILES) { - - Arrays.sort(historyFileArr, new Comparator() { - - @Override - public int compare(String o1, String o2) { - return o2.compareTo(o1); - } - }); - - for (int i = Config.Logging.MAX_HISTORY_FILES; i < historyFileArr.length; i++) { - File expiredFile = new File(Config.Logging.DIR, historyFileArr[i]); - expiredFile.delete(); - } - } - } - - private void forceExecute(Callable callable) { - try { - callable.call(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * @return true if stream is prepared ready. - */ - private boolean prepareWriteStream() { - if (fileOutputStream != null) { - return true; - } - File logFilePath = new File(Config.Logging.DIR); - if (!logFilePath.exists()) { - logFilePath.mkdirs(); - } else if (!logFilePath.isDirectory()) { - System.err.println("Log dir(" + Config.Logging.DIR + ") is not a directory."); - } - try { - fileOutputStream = new FileOutputStream(new File(logFilePath, Config.Logging.FILE_NAME), true); - fileSize = Long.valueOf(new File(logFilePath, Config.Logging.FILE_NAME).length()).intValue(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - - return fileOutputStream != null; - } - - /** - * Write log to the queue. W/ performance trade off. - * - * @param message to log - */ - @Override - public void write(String message) { - logBuffer.offer(message); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/IWriter.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/IWriter.java deleted file mode 100644 index d0acc94f..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/IWriter.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -public interface IWriter { - - void write(String message); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/JsonLogResolver.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/JsonLogResolver.java deleted file mode 100644 index befbdc9a..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/JsonLogResolver.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -import cn.hippo4j.common.logging.api.LogResolver; -import cn.hippo4j.common.logging.api.ILog; -import com.google.gson.Gson; - -public class JsonLogResolver implements LogResolver { - - private static final Gson GSON = new Gson(); - - @Override - public ILog getLogger(Class aClass) { - return new JsonLogger(aClass, GSON); - } - - @Override - public ILog getLogger(String s) { - return new JsonLogger(s, GSON); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/JsonLogger.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/JsonLogger.java deleted file mode 100644 index 001684df..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/JsonLogger.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -import cn.hippo4j.common.logging.core.converters.LiteralConverter; -import com.google.gson.Gson; - -import java.util.HashMap; -import java.util.Map; - -/** - * An alternative logger for the Hippo4j agent. The default layout is - * { - * "@timestamp": "", // timestamp - * "logger": "", // name of the Logger - * "level": "", // info|debug|warn|error - * "thread": "", // thread where the log method is called - * "message": "", // your log message - * "throwable": "", - * "agent_name" "service_name" - * } - */ -public class JsonLogger extends AbstractLogger { - - private final Gson gson; - - public JsonLogger(Class targetClass, Gson gson) { - this(targetClass.getSimpleName(), gson); - } - - /** - * In the Constructor, the instances of converters are created, - * except those {@link LiteralConverter} since this class is used - * only the literals in {@link PatternLogger} , - * and thus should not be added to the json log. - * - * @param targetClass the logger class - * @param gson instance of Gson works as json serializer - */ - public JsonLogger(String targetClass, Gson gson) { - super(targetClass); - this.gson = gson; - for (Map.Entry> entry : DEFAULT_CONVERTER_MAP.entrySet()) { - final Class converterClass = entry.getValue(); - try { - if (converters instanceof LiteralConverter) { - continue; - } - converters.add(converterClass.newInstance()); - } catch (IllegalAccessException | InstantiationException e) { - throw new IllegalStateException("Create Converter error. Class: " + converterClass, e); - } - } - } - - @Override - protected String format(LogLevel level, String message, Throwable e) { - LogEvent logEvent = new LogEvent(level, message, e, this.targetClass); - Map log = new HashMap<>(this.converters.size()); - for (Converter converter : this.converters) { - log.put(converter.getKey(), converter.convert(logEvent)); - } - return this.gson.toJson(log); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/LogEvent.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/LogEvent.java deleted file mode 100644 index a0aa11ab..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/LogEvent.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -/** - * The representation of logging events. This instance is pass around to the List of Converter. - */ -public class LogEvent { - - public LogEvent(LogLevel level, String message, Throwable throwable, String targetClass) { - this.level = level; - this.message = message; - this.throwable = throwable; - this.targetClass = targetClass; - } - - private LogLevel level; - private String message; - private Throwable throwable; - private String targetClass; - - public String getTargetClass() { - return targetClass; - } - - public void setTargetClass(String targetClass) { - this.targetClass = targetClass; - } - - public LogLevel getLevel() { - return level; - } - - public void setLevel(LogLevel level) { - this.level = level; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public Throwable getThrowable() { - return throwable; - } - - public void setThrowable(Throwable throwable) { - this.throwable = throwable; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/LogLevel.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/LogLevel.java deleted file mode 100644 index 73791af9..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/LogLevel.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -public enum LogLevel { - TRACE, DEBUG, INFO, WARN, ERROR, OFF -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/LogMessageHolder.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/LogMessageHolder.java deleted file mode 100644 index 005d2d4d..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/LogMessageHolder.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -/** - * The LogMessageHolder is a {@link String} holder, in order to in-process propagation String across the - * disruptor queue. - */ -public class LogMessageHolder { - - private String message; - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/LogOutput.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/LogOutput.java deleted file mode 100644 index c8ba7bc2..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/LogOutput.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -public enum LogOutput { - FILE, CONSOLE -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/Parser.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/Parser.java deleted file mode 100644 index 24cabc4a..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/Parser.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -import cn.hippo4j.common.logging.core.converters.LiteralConverter; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * Parser of LogPattern. It is used to parse a pattern to the List of Converter. - */ -public class Parser { - - private final Map> convertMaps; - - enum State { - LITERAL_STATE, KEYWORD_STATE - } - - public static final char ESCAPE_CHAR = '\\'; - public static final char PERCENT_CHAR = '%'; - - private final String pattern; - private final int patternLength; - private int pointer = 0; - private State state = State.LITERAL_STATE; - - public Parser(String pattern, Map> convertMaps) { - if (pattern == null || pattern.length() == 0) { - throw new IllegalArgumentException("null or empty pattern string not allowed"); - } - this.convertMaps = convertMaps; - this.pattern = pattern; - this.patternLength = pattern.length(); - } - - public List parse() { - List patternConverters = new ArrayList(); - StringBuilder buf = new StringBuilder(); - while (pointer < patternLength) { - char c = pattern.charAt(pointer); - pointer++; - switch (state) { - case LITERAL_STATE: - handleLiteralState(c, buf, patternConverters); - break; - case KEYWORD_STATE: - handleKeywordState(c, buf, patternConverters); - break; - default: - } - } - - switch (state) { - case LITERAL_STATE: - addConverter(buf, patternConverters, LiteralConverter.class); - break; - case KEYWORD_STATE: - addConverterWithKeyword(buf, patternConverters); - break; - default: - } - return combineLiteral(patternConverters); - } - - private List combineLiteral(List patternConverters) { - List converterList = new ArrayList(); - StringBuilder stringBuilder = new StringBuilder(); - for (Converter patternConverter : patternConverters) { - if (patternConverter instanceof LiteralConverter) { - stringBuilder.append(patternConverter.convert(null)); - } else { - if (stringBuilder.length() > 0) { - converterList.add(new LiteralConverter(stringBuilder.toString())); - stringBuilder.setLength(0); - } - converterList.add(patternConverter); - } - } - return converterList; - } - - private void handleKeywordState(char c, StringBuilder buf, List patternConverters) { - if (Character.isJavaIdentifierPart(c)) { - buf.append(c); - } else if (c == PERCENT_CHAR) { - addConverterWithKeyword(buf, patternConverters); - } else { - addConverterWithKeyword(buf, patternConverters); - if (c == ESCAPE_CHAR) { - escape("%", buf); - } else { - buf.append(c); - } - state = State.LITERAL_STATE; - } - } - - private void addConverterWithKeyword(StringBuilder buf, List patternConverters) { - String keyword = buf.toString(); - if (convertMaps.containsKey(keyword)) { - addConverter(buf, patternConverters, convertMaps.get(keyword)); - } else { - buf.insert(0, "%"); - addConverter(buf, patternConverters, LiteralConverter.class); - } - } - - private void handleLiteralState(char c, StringBuilder buf, List patternConverters) { - switch (c) { - case ESCAPE_CHAR: - escape("%", buf); - break; - case PERCENT_CHAR: - addConverter(buf, patternConverters, LiteralConverter.class); - state = State.KEYWORD_STATE; - break; - default: - buf.append(c); - } - - } - - private void escape(String escapeChars, StringBuilder buf) { - if (pointer < patternLength) { - char next = pattern.charAt(pointer++); - escape(escapeChars, buf, next); - } - } - - private void addConverter(StringBuilder buf, List patternConverters, Class aClass) { - if (buf.length() > 0) { - String result = buf.toString(); - if (LiteralConverter.class.equals(aClass)) { - patternConverters.add(new LiteralConverter(result)); - } else { - try { - patternConverters.add(aClass.newInstance()); - } catch (Exception e) { - throw new IllegalStateException("Create Converter error. Class: " + aClass, e); - } - } - buf.setLength(0); - } - } - - private void escape(String escapeChars, StringBuilder buf, char next) { - if (escapeChars.indexOf(next) >= 0) { - buf.append(next); - } else { - switch (next) { - case '_': - // the \_ sequence is swallowed - break; - case '\\': - buf.append(next); - break; - case 't': - buf.append('\t'); - break; - case 'r': - buf.append('\r'); - break; - case 'n': - buf.append('\n'); - break; - default: - throw new IllegalArgumentException("Illegal char " + next + ". It not allowed as escape characters."); - } - } - } - -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/PatternLogResolver.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/PatternLogResolver.java deleted file mode 100644 index 0a761683..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/PatternLogResolver.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -import cn.hippo4j.common.conf.Config; -import cn.hippo4j.common.logging.api.LogResolver; -import cn.hippo4j.common.logging.api.ILog; - -public class PatternLogResolver implements LogResolver { - - @Override - public ILog getLogger(Class clazz) { - return new PatternLogger(clazz, Config.Logging.PATTERN); - } - - @Override - public ILog getLogger(String clazz) { - return new PatternLogger(clazz, Config.Logging.PATTERN); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/PatternLogger.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/PatternLogger.java deleted file mode 100644 index c713bb5a..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/PatternLogger.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -import cn.hippo4j.common.toolkit.StringUtil; - -/** - * A flexible Logger configurable with pattern string. This is default implementation of {@link ILog} This can parse a - * pattern to the List of converter with Parser. We package LogEvent with message, level,timestamp ..., passing around - * to the List of converter to concat actually Log-String. - */ -public class PatternLogger extends AbstractLogger { - - public static final String DEFAULT_PATTERN = "%level %timestamp %thread %class : %msg %throwable"; - - private String pattern; - - public PatternLogger(Class targetClass, String pattern) { - this(targetClass.getSimpleName(), pattern); - } - - public PatternLogger(String targetClass, String pattern) { - super(targetClass); - this.setPattern(pattern); - } - - public String getPattern() { - return pattern; - } - - public void setPattern(String pattern) { - if (StringUtil.isEmpty(pattern)) { - pattern = DEFAULT_PATTERN; - } - this.pattern = pattern; - this.converters = new Parser(pattern, DEFAULT_CONVERTER_MAP).parse(); - } - - @Override - protected String format(LogLevel level, String message, Throwable t) { - LogEvent logEvent = new LogEvent(level, message, t, targetClass); - StringBuilder stringBuilder = new StringBuilder(); - for (Converter converter : this.converters) { - stringBuilder.append(converter.convert(logEvent)); - } - return stringBuilder.toString(); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/ResolverType.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/ResolverType.java deleted file mode 100644 index 774cb310..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/ResolverType.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -public enum ResolverType { - JSON, PATTERN -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/SystemOutWriter.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/SystemOutWriter.java deleted file mode 100644 index 312d8fd2..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/SystemOutWriter.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -import java.io.PrintStream; - -public enum SystemOutWriter implements IWriter { - - INSTANCE; - - /** - * Tricky codes for avoiding style-check. Because, in here, "system.out.println" is the only choice to output logs. - */ - @Override - public void write(String message) { - PrintStream out = System.out; - out.println(message); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/WriterFactory.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/WriterFactory.java deleted file mode 100644 index 4bf5331b..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/WriterFactory.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core; - -import cn.hippo4j.common.boot.AgentPackageNotFoundException; -import cn.hippo4j.common.boot.AgentPackagePath; -import cn.hippo4j.common.conf.Config; -import cn.hippo4j.common.conf.Constants; -import cn.hippo4j.common.toolkit.StringUtil; - -public class WriterFactory { - - private static IWriter WRITER; - - public static IWriter getLogWriter() { - - switch (Config.Logging.OUTPUT) { - case FILE: - if (WRITER != null) { - return WRITER; - } - if (Constants.IS_INIT_COMPLETED - && AgentPackagePath.isPathFound()) { - if (StringUtil.isEmpty(Config.Logging.DIR)) { - try { - Config.Logging.DIR = AgentPackagePath.getPath() + "/logs"; - } catch (AgentPackageNotFoundException e) { - e.printStackTrace(); - } - } - WRITER = FileWriter.get(); - } else { - return SystemOutWriter.INSTANCE; - } - break; - default: - return SystemOutWriter.INSTANCE; - - } - return WRITER; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/AgentNameConverter.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/AgentNameConverter.java deleted file mode 100644 index d6015b21..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/AgentNameConverter.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core.converters; - -import cn.hippo4j.common.conf.Config; -import cn.hippo4j.common.logging.core.Converter; -import cn.hippo4j.common.logging.core.LogEvent; - -public class AgentNameConverter implements Converter { - - @Override - public String convert(LogEvent logEvent) { - return Config.Agent.SERVICE_NAME; - } - - @Override - public String getKey() { - return "agent_name"; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/ClassConverter.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/ClassConverter.java deleted file mode 100644 index 96dbcdc2..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/ClassConverter.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core.converters; - -import cn.hippo4j.common.logging.core.Converter; -import cn.hippo4j.common.logging.core.LogEvent; - -/** - * Just return logEvent.getTargetClass(). - */ -public class ClassConverter implements Converter { - - @Override - public String convert(LogEvent logEvent) { - return logEvent.getTargetClass(); - } - - @Override - public String getKey() { - return "logger"; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/DateConverter.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/DateConverter.java deleted file mode 100644 index f18da36b..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/DateConverter.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core.converters; - -import cn.hippo4j.common.logging.core.Converter; -import cn.hippo4j.common.logging.core.LogEvent; - -import java.text.SimpleDateFormat; -import java.util.Date; - -/** - * The Converter is used to return a now date with format. - */ -public class DateConverter implements Converter { - - @Override - public String convert(LogEvent logEvent) { - return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()); - } - - @Override - public String getKey() { - return "@timestamp"; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/LevelConverter.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/LevelConverter.java deleted file mode 100644 index ff818c18..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/LevelConverter.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core.converters; - -import cn.hippo4j.common.logging.core.Converter; -import cn.hippo4j.common.logging.core.LogEvent; - -/** - * Just return logEvent.getLevel().name() - */ -public class LevelConverter implements Converter { - - @Override - public String convert(LogEvent logEvent) { - return logEvent.getLevel().name(); - } - - @Override - public String getKey() { - return "level"; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/LiteralConverter.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/LiteralConverter.java deleted file mode 100644 index 58bb4734..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/LiteralConverter.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core.converters; - -import cn.hippo4j.common.logging.core.Converter; -import cn.hippo4j.common.logging.core.LogEvent; - -/** - * This Converter is used to return the literal. - */ -public class LiteralConverter implements Converter { - - private final String literal; - - public LiteralConverter(String literal) { - this.literal = literal; - } - - @Override - public String convert(LogEvent logEvent) { - return literal; - } - - @Override - public String getKey() { - return ""; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/MessageConverter.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/MessageConverter.java deleted file mode 100644 index fc15990f..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/MessageConverter.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core.converters; - -import cn.hippo4j.common.logging.core.Converter; -import cn.hippo4j.common.logging.core.LogEvent; - -/** - * Just return the logEvent.getMessage() - */ -public class MessageConverter implements Converter { - - @Override - public String convert(LogEvent logEvent) { - return logEvent.getMessage(); - } - - @Override - public String getKey() { - return "message"; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/ThreadConverter.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/ThreadConverter.java deleted file mode 100644 index a22e16df..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/ThreadConverter.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core.converters; - -import cn.hippo4j.common.logging.core.Converter; -import cn.hippo4j.common.logging.core.LogEvent; - -/** - * Just return the Thread.currentThread().getName() - */ -public class ThreadConverter implements Converter { - - @Override - public String convert(LogEvent logEvent) { - return Thread.currentThread().getName(); - } - - @Override - public String getKey() { - return "thread"; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/ThrowableConverter.java b/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/ThrowableConverter.java deleted file mode 100644 index 3bab6e2b..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/logging/core/converters/ThrowableConverter.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.logging.core.converters; - -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.common.logging.core.Converter; -import cn.hippo4j.common.logging.core.LogEvent; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * Return the StackTrace of String with logEvent.getThrowable() - */ -public class ThrowableConverter implements Converter { - - @Override - public String convert(LogEvent logEvent) { - Throwable t = logEvent.getThrowable(); - return t == null ? "" : format(t); - } - - public static String format(Throwable t) { - ByteArrayOutputStream buf = new ByteArrayOutputStream(); - t.printStackTrace(new java.io.PrintWriter(buf, true)); - String expMessage = buf.toString(); - try { - buf.close(); - } catch (IOException e) { - e.printStackTrace(); - } - return Constants.LINE_SEPARATOR + expMessage; - } - - @Override - public String getKey() { - return "throwable"; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/GlobalRemotePoolInfo.java b/infra/common/src/main/java/cn/hippo4j/common/model/GlobalRemotePoolInfo.java deleted file mode 100644 index f704c49b..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/GlobalRemotePoolInfo.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model; - -import lombok.Getter; -import lombok.Setter; - -import java.io.Serializable; - -/** - * Global remote pool info. - */ -@Getter -@Setter -public class GlobalRemotePoolInfo implements Serializable { - - private static final long serialVersionUID = 5447003335557127308L; - - /** - * tenantId - */ - private String tenantId; - - /** - * itemId - */ - private String itemId; - - /** - * tpId - */ - private String tpId; - - /** - * coreSize - */ - private Integer coreSize; - - /** - * maxSize - */ - private Integer maxSize; - - /** - * queueType - */ - private Integer queueType; - - /** - * capacity - */ - private Integer capacity; - - /** - * keepAliveTime - */ - private Integer keepAliveTime; - - /** - * isAlarm - */ - private Integer isAlarm; - - /** - * capacityAlarm - */ - private Integer capacityAlarm; - - /** - * livenessAlarm - */ - private Integer livenessAlarm; - - /** - * md5 - */ - private String md5; - - /** - * content - */ - private String content; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/IncrementalFieldMetadataProvider.java b/infra/common/src/main/java/cn/hippo4j/common/model/IncrementalFieldMetadataProvider.java deleted file mode 100644 index 1e0b3f5b..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/IncrementalFieldMetadataProvider.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model; - -import java.util.Collections; -import java.util.Map; - -/** - * Optional provider for field-version metadata. - *

- * Thread pool parameter models implementing this interface can explicitly declare the - * relationship between fields and the protocol versions that understand them. This allows - * the incremental content builder to omit unsupported fields for legacy clients and avoid - * unnecessary refresh loops triggered by unknown data. - */ -public interface IncrementalFieldMetadataProvider { - - /** - * Return a mapping of field name to the minimum protocol version that can observe it. - * - * @return field -> minimum semantic version; fields not present fall back to defaults - */ - default Map getFieldVersionMetadata() { - return Collections.emptyMap(); - } - - /** - * Optional version string of the metadata definition, useful for caching or diagnostics. - * - * @return metadata version identifier, or {@code null} if not set - */ - default String getFieldMetadataVersion() { - return null; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/InstanceInfo.java b/infra/common/src/main/java/cn/hippo4j/common/model/InstanceInfo.java deleted file mode 100644 index 204e856a..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/InstanceInfo.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model; - -import lombok.Data; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; -import lombok.extern.slf4j.Slf4j; - -/** - * Instance info. - */ -@Slf4j -@Getter -@Setter -@Accessors(chain = true) -public class InstanceInfo { - - private static final String UNKNOWN = "unknown"; - - private String appName = UNKNOWN; - - private String hostName; - - private String groupKey; - - private String port; - - private String instanceId; - - private String ipApplicationName; - - private String clientBasePath; - - private String callBackUrl; - - private String identify; - - private String active; - - private volatile String vipAddress; - - private volatile String secureVipAddress; - - private volatile ActionType actionType; - - private volatile boolean isInstanceInfoDirty = false; - - private volatile Long lastUpdatedTimestamp; - - private volatile Long lastDirtyTimestamp; - - private volatile InstanceStatus status = InstanceStatus.UP; - - private volatile InstanceStatus overriddenStatus = InstanceStatus.UNKNOWN; - - public InstanceInfo() { - this.lastUpdatedTimestamp = System.currentTimeMillis(); - this.lastDirtyTimestamp = lastUpdatedTimestamp; - } - - public void setLastUpdatedTimestamp() { - this.lastUpdatedTimestamp = System.currentTimeMillis(); - } - - public Long getLastDirtyTimestamp() { - return lastDirtyTimestamp; - } - - public synchronized void setOverriddenStatus(InstanceStatus status) { - if (this.overriddenStatus != status) { - this.overriddenStatus = status; - } - } - - public InstanceStatus getStatus() { - return status; - } - - public synchronized void setIsDirty() { - isInstanceInfoDirty = true; - lastDirtyTimestamp = System.currentTimeMillis(); - } - - public synchronized long setIsDirtyWithTime() { - setIsDirty(); - return lastDirtyTimestamp; - } - - public synchronized void unsetIsDirty(long unsetDirtyTimestamp) { - if (lastDirtyTimestamp <= unsetDirtyTimestamp) { - isInstanceInfoDirty = false; - } - } - - public void setActionType(ActionType actionType) { - this.actionType = actionType; - } - - /** - * Instance status. - */ - public enum InstanceStatus { - - /** - * UP - */ - UP, - - /** - * DOWN - */ - DOWN, - - /** - * STARTING - */ - STARTING, - - /** - * OUT_OF_SERVICE - */ - OUT_OF_SERVICE, - - /** - * UNKNOWN - */ - UNKNOWN; - - public static InstanceStatus toEnum(String s) { - if (s != null) { - try { - return InstanceStatus.valueOf(s.toUpperCase()); - } catch (IllegalArgumentException e) { - // ignore and fall through to unknown - log.debug("illegal argument supplied to InstanceStatus.valueOf: {}, defaulting to {}", s, UNKNOWN); - } - } - return UNKNOWN; - } - } - - /** - * Action type. - */ - public enum ActionType { - /** - * ADDED - */ - ADDED, - - /** - * MODIFIED - */ - MODIFIED, - - /** - * DELETED - */ - DELETED - } - - /** - * Instance renew. - */ - @Data - @Accessors(chain = true) - public static class InstanceRenew { - - private String appName; - - private String instanceId; - - private String lastDirtyTimestamp; - - private String status; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/ManyThreadPoolRunStateInfo.java b/infra/common/src/main/java/cn/hippo4j/common/model/ManyThreadPoolRunStateInfo.java deleted file mode 100644 index 385e5a21..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/ManyThreadPoolRunStateInfo.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model; - -import lombok.Data; - -/** - * Many pool run state info. - */ -@Data -public class ManyThreadPoolRunStateInfo extends ThreadPoolRunStateInfo { - - /** - * identify - */ - private String identify; - - /** - * active - */ - private String active; - - /** - * state - */ - private String state; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/Result.java b/infra/common/src/main/java/cn/hippo4j/common/model/Result.java deleted file mode 100644 index 878b1926..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/Result.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model; - -import lombok.Data; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * Result. - */ -@Data -@Accessors(chain = true) -public class Result implements Serializable { - - private static final long serialVersionUID = -4408341719434417427L; - - /** - * Correct return code. - */ - public static final String SUCCESS_CODE = "0"; - - /** - * Return code. - */ - private String code; - - /** - * Message. - */ - private String message; - - /** - * Response data. - */ - private T data; - - /** - * Is success. - * - * @return - */ - public boolean isSuccess() { - return SUCCESS_CODE.equals(code); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/ThreadDetailStateInfo.java b/infra/common/src/main/java/cn/hippo4j/common/model/ThreadDetailStateInfo.java deleted file mode 100644 index b8777540..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/ThreadDetailStateInfo.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.util.List; - -/** - * Thread detail state info. - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Accessors(chain = true) -public class ThreadDetailStateInfo { - - /** - * threadId - */ - private Long threadId; - - /** - * threadName - */ - private String threadName; - - /** - * threadStatus - */ - private String threadStatus; - - /** - * threadStack - */ - private List threadStack; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/ThreadPoolAdapterState.java b/infra/common/src/main/java/cn/hippo4j/common/model/ThreadPoolAdapterState.java deleted file mode 100644 index ad7322d9..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/ThreadPoolAdapterState.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model; - -import lombok.Data; - -/** - * Thread pool adapter state info. - */ -@Data -public class ThreadPoolAdapterState { - - /** - * Thread-pool keu - */ - private String threadPoolKey; - - /** - * Active - */ - private String active; - - /** - * identify - */ - private String identify; - - /** - * Client address - */ - private String clientAddress; - - /** - * Core size - */ - private Integer coreSize; - - /** - * Maximum size - */ - private Integer maximumSize; - - /** - * Blocking queue type - */ - private String blockingQueueType; - - /** - * Blocking queue capacity - */ - private Integer blockingQueueCapacity; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/ThreadPoolBaseInfo.java b/infra/common/src/main/java/cn/hippo4j/common/model/ThreadPoolBaseInfo.java deleted file mode 100644 index 8fba9dd0..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/ThreadPoolBaseInfo.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model; - -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * Thread-pool base info. - */ -@Data -@Accessors(chain = true) -public class ThreadPoolBaseInfo { - - /** - * coreSize - */ - private Integer coreSize; - - /** - * maximumSize - */ - private Integer maximumSize; - - /** - * queueType - */ - private String queueType; - - /** - * queueCapacity - */ - private Integer queueCapacity; - - /** - * rejectedName - */ - private String rejectedName; - - /** - * keepAliveTime - */ - private Long keepAliveTime; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/ThreadPoolParameter.java b/infra/common/src/main/java/cn/hippo4j/common/model/ThreadPoolParameter.java deleted file mode 100644 index 26101088..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/ThreadPoolParameter.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model; - -/** - * Thread-pool parameter. - */ -public interface ThreadPoolParameter { - - /** - * Get tenant id - * - * @return - */ - String getTenantId(); - - /** - * Get item id - * - * @return - */ - String getItemId(); - - /** - * Get thread-pool id - * - * @return - */ - String getTpId(); - - /** - * Get core size - * - * @return - */ - Integer getCoreSize(); - - /** - * Get max size - * - * @return - */ - Integer getMaxSize(); - - /** - * Get queue type - * - * @return - */ - Integer getQueueType(); - - /** - * Get capacity - * - * @return - */ - Integer getCapacity(); - - /** - * Get keep alive time - * - * @return - */ - Long getKeepAliveTime(); - - /** - * Get execute time out - * - * @return - */ - Long getExecuteTimeOut(); - - /** - * Get rejected type - * - * @return - */ - Integer getRejectedType(); - - /** - * Get is alarm - * - * @return - */ - Integer getIsAlarm(); - - /** - * Get capacity alarm - * - * @return - */ - Integer getCapacityAlarm(); - - /** - * Get liveness alarm - * - * @return - */ - Integer getLivenessAlarm(); - - /** - * Get allow core thread timeOut - * - * @return - */ - Integer getAllowCoreThreadTimeOut(); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/ThreadPoolParameterInfo.java b/infra/common/src/main/java/cn/hippo4j/common/model/ThreadPoolParameterInfo.java deleted file mode 100644 index 2148468c..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/ThreadPoolParameterInfo.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model; - -import com.fasterxml.jackson.annotation.JsonAlias; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Map; - -/** - * Thread pool parameter info. - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Accessors(chain = true) -public class ThreadPoolParameterInfo implements ThreadPoolParameter, Serializable, IncrementalFieldMetadataProvider { - - private static final long serialVersionUID = -7123935122108553864L; - - /** - * Tenant id - */ - private String tenantId; - - /** - * Item id - */ - private String itemId; - - /** - * Thread-pool id - */ - @JsonAlias("threadPoolId") - private String tpId; - - /** - * Content - */ - private String content; - - /** - * Core size - */ - @Deprecated - private Integer coreSize; - - /** - * Max size - */ - @Deprecated - private Integer maxSize; - - /** - * Core pool size - */ - private Integer corePoolSize; - - /** - * Maximum pool size - */ - private Integer maximumPoolSize; - - /** - * Queue type - */ - private Integer queueType; - - /** - * Capacity - */ - private Integer capacity; - - /** - * Keep alive time - */ - private Long keepAliveTime; - - /** - * Execute time out - */ - private Long executeTimeOut; - - /** - * Rejected type - */ - private Integer rejectedType; - - /** - * Is alarm - */ - private Integer isAlarm; - - /** - * Capacity alarm - */ - private Integer capacityAlarm; - - /** - * Liveness alarm - */ - @JsonAlias("activeAlarm") - private Integer livenessAlarm; - - /** - * Allow core thread timeout - */ - private Integer allowCoreThreadTimeOut; - - /** - * Field-to-minimum-version mapping used by clients to filter unsupported fields. - */ - private Map fieldVersionMetadata; - - /** - * Optional metadata version identifier for diagnostics or caching. - */ - private String fieldMetadataVersion; - - public Integer corePoolSizeAdapt() { - return this.corePoolSize == null ? this.coreSize : this.corePoolSize; - } - - public Integer maximumPoolSizeAdapt() { - return this.maximumPoolSize == null ? this.maxSize : this.maximumPoolSize; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/ThreadPoolRunStateInfo.java b/infra/common/src/main/java/cn/hippo4j/common/model/ThreadPoolRunStateInfo.java deleted file mode 100644 index 66029232..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/ThreadPoolRunStateInfo.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.io.Serializable; -import java.util.Objects; - -/** - * Pool run state info. - */ -@Getter -@Setter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ThreadPoolRunStateInfo extends ThreadPoolBaseInfo implements Serializable { - - /** - * currentLoad - */ - private String currentLoad; - - /** - * peakLoad - */ - private String peakLoad; - - /** - * tpId - */ - private String tpId; - - /** - * activeCount - */ - private Integer activeCount; - - /** - * poolSize - */ - private Integer poolSize; - - /** - * activeSize - */ - private Integer activeSize; - - /** - * The maximum number of threads that enter the thread pool at the same time - */ - private Integer largestPoolSize; - - /** - * queueSize - */ - private Integer queueSize; - - /** - * queueRemainingCapacity - */ - private Integer queueRemainingCapacity; - - /** - * completedTaskCount - */ - private Long completedTaskCount; - - /** - * rejectCount - */ - private Long rejectCount; - - /** - * host - */ - private String host; - - /** - * memoryProportion - */ - private String memoryProportion; - - /** - * freeMemory - */ - private String freeMemory; - - /** - * clientLastRefreshTime - */ - private String clientLastRefreshTime; - - /** - * timestamp - */ - private Long timestamp; - - public Integer getSimpleCurrentLoad() { - if (Objects.nonNull(getCurrentLoad())) { - return Integer.parseInt(getCurrentLoad().replace("%", "")); - } - return null; - } - - public Integer getSimplePeakLoad() { - if (Objects.nonNull(getPeakLoad())) { - return Integer.parseInt(getPeakLoad().replace("%", "")); - } - return null; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/TokenInfo.java b/infra/common/src/main/java/cn/hippo4j/common/model/TokenInfo.java deleted file mode 100644 index 8dfe3587..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/TokenInfo.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * Token info. - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class TokenInfo { - - /** - * accessToken - */ - private String accessToken; - - /** - * tokenTtl - */ - private Long tokenTtl; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/WebIpAndPortInfo.java b/infra/common/src/main/java/cn/hippo4j/common/model/WebIpAndPortInfo.java deleted file mode 100644 index de16032e..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/WebIpAndPortInfo.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model; - -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -/** - * Web ip and port info - */ -@Data -@Slf4j -public class WebIpAndPortInfo { - - protected static final String ALL = "*"; - - protected static final String SPOT = "\\."; - - protected static final String COLON = ":"; - - private String ip; - - private String port; - - private String[] ipSegment; - - public WebIpAndPortInfo(String ip, String port) { - this.ip = ip; - this.port = port; - this.ipSegment = ip.split(SPOT); - } - - public static WebIpAndPortInfo build(String node) { - if (ALL.equals(node)) { - return new WebIpAndPortInfo(ALL, ALL); - } - String[] ipPort = node.split(COLON); - if (ipPort.length != 2) { - log.error("The IP address format is error : {}", node); - return null; - } - return new WebIpAndPortInfo(ipPort[0], ipPort[1]); - } - - /** - * Check. - * - * @param appIpSegment application ip segment - * @param port application port - */ - public boolean check(String[] appIpSegment, String port) { - return checkPort(port) && checkIp(appIpSegment); - } - - /** - * Check ip. - * - * @param appIpSegment application ip segment - */ - protected boolean checkIp(String[] appIpSegment) { - if (ALL.equals(this.ip)) { - return true; - } - boolean flag = true; - for (int i = 0; i < ipSegment.length && flag; i++) { - String propIp = ipSegment[i]; - String appIp = appIpSegment[i]; - flag = contrastSegment(appIp, propIp); - } - return flag; - } - - /** - * Check port. - * - * @param port application port - */ - protected boolean checkPort(String port) { - return contrastSegment(port, this.port); - } - - /** - * Check whether the strings are the same. - * - * @param appIp appIp - * @param propIp propIp - */ - protected boolean contrastSegment(String appIp, String propIp) { - return ALL.equals(propIp) || appIp.equals(propIp); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/executor/ExecutorNotifyProperties.java b/infra/common/src/main/java/cn/hippo4j/common/model/executor/ExecutorNotifyProperties.java deleted file mode 100644 index da3cb3c1..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/executor/ExecutorNotifyProperties.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model.executor; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * Dynamic thread-pool notify properties. - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class ExecutorNotifyProperties { - - /** - * Thread pool run alarm interval. unit: s - */ - private Integer interval; - - /** - * Receives - */ - private String receives; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/executor/ExecutorProperties.java b/infra/common/src/main/java/cn/hippo4j/common/model/executor/ExecutorProperties.java deleted file mode 100644 index 5aff08b8..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/executor/ExecutorProperties.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model.executor; - -import cn.hippo4j.common.api.IExecutorProperties; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * Executor properties. - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Accessors(chain = true) -public class ExecutorProperties implements IExecutorProperties { - - /** - * Thread pool id - */ - private String threadPoolId; - - /** - * Core pool size - */ - private Integer corePoolSize; - - /** - * Maximum pool size - */ - private Integer maximumPoolSize; - - /** - * Queue capacity - */ - private Integer queueCapacity; - - /** - * Blocking queue - */ - private String blockingQueue; - - /** - * Rejected handler - */ - private String rejectedHandler; - - /** - * Keep alive time - */ - private Long keepAliveTime; - - /** - * Execute timeout - */ - private Long executeTimeOut; - - /** - * Allow core thread timeout - */ - private Boolean allowCoreThreadTimeOut; - - /** - * Thread name prefix - */ - private String threadNamePrefix; - - /** - * Whether to enable thread pool running alarm - */ - private Boolean alarm; - - /** - * Active alarm - */ - private Integer activeAlarm; - - /** - * Capacity alarm - */ - private Integer capacityAlarm; - - /** - * Notify - */ - private ExecutorNotifyProperties notify; - - /** - * Nodes, application startup is not affect, change properties is effect - */ - private String nodes; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/register/DynamicThreadPoolRegisterParameter.java b/infra/common/src/main/java/cn/hippo4j/common/model/register/DynamicThreadPoolRegisterParameter.java deleted file mode 100644 index 48671de5..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/register/DynamicThreadPoolRegisterParameter.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model.register; - -import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum; -import cn.hippo4j.common.executor.support.RejectedPolicyTypeEnum; -import com.fasterxml.jackson.annotation.JsonAlias; -import com.fasterxml.jackson.annotation.JsonIgnore; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.concurrent.ThreadFactory; - -/** - * Dynamic thread-pool register parameter. - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class DynamicThreadPoolRegisterParameter { - - /** - * Thread-pool id - * Empty or empty strings are not allowed, and `+` signs are not allowed - */ - private String threadPoolId; - - /** - * Content - */ - private String content; - - /** - * Core pool size - */ - private Integer corePoolSize; - - /** - * Maximum pool size - */ - private Integer maximumPoolSize; - - /** - * Blocking queue type - */ - private BlockingQueueTypeEnum blockingQueueType; - - /** - * Capacity - */ - private Integer capacity; - - /** - * Keep alive time - */ - private Long keepAliveTime; - - /** - * Rejected policy type - */ - private RejectedPolicyTypeEnum rejectedPolicyType; - - /** - * Is alarm - */ - private Boolean isAlarm; - - /** - * Capacity alarm - */ - private Integer capacityAlarm; - - /** - * Active alarm - */ - @JsonAlias("livenessAlarm") - private Integer activeAlarm; - - /** - * Allow core thread timeout - */ - private Boolean allowCoreThreadTimeOut; - - /** - * Thread name prefix - */ - private String threadNamePrefix; - - /** - * Thread factory - */ - @JsonIgnore - private ThreadFactory threadFactory; - - /** - * Execute timeout - */ - private Long executeTimeOut; - - public Integer getIsAlarm() { - return this.isAlarm ? 1 : 0; - } - - public Integer getAllowCoreThreadTimeOut() { - return this.allowCoreThreadTimeOut ? 1 : 0; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/register/DynamicThreadPoolRegisterWrapper.java b/infra/common/src/main/java/cn/hippo4j/common/model/register/DynamicThreadPoolRegisterWrapper.java deleted file mode 100644 index a14fbc53..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/register/DynamicThreadPoolRegisterWrapper.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model.register; - -import cn.hippo4j.common.model.register.notify.DynamicThreadPoolRegisterCoreNotifyParameter; -import cn.hippo4j.common.model.register.notify.DynamicThreadPoolRegisterServerNotifyParameter; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * Dynamic thread-pool register wrapper. - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class DynamicThreadPoolRegisterWrapper { - - // Hippo4j common ---------------------------------------------------------------------- - - /** - * Dynamic thread-pool register parameter - */ - private DynamicThreadPoolRegisterParameter parameter; - - // Hippo4j server ---------------------------------------------------------------------- - - /** - * Tenant id - */ - private String tenantId; - - /** - * Item id - */ - private String itemId; - - /** - * Update if exists - */ - private Boolean updateIfExists = Boolean.FALSE; - - /** - * Notify update if exists - */ - private Boolean notifyUpdateIfExists = Boolean.FALSE; - - /** - * Dynamic thread-pool server notify parameter - */ - private DynamicThreadPoolRegisterServerNotifyParameter serverNotify; - - // Hippo4j core ---------------------------------------------------------------------- - - /** - * Dynamic thread-pool config notify parameter - */ - private DynamicThreadPoolRegisterCoreNotifyParameter configNotify; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/register/notify/DynamicThreadPoolRegisterCoreNotifyParameter.java b/infra/common/src/main/java/cn/hippo4j/common/model/register/notify/DynamicThreadPoolRegisterCoreNotifyParameter.java deleted file mode 100644 index 052c5cbf..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/register/notify/DynamicThreadPoolRegisterCoreNotifyParameter.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model.register.notify; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * Dynamic thread-pool register core notify parameter. - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class DynamicThreadPoolRegisterCoreNotifyParameter { - - /** - * Interval - */ - private Integer interval; - - /** - * Receive - */ - private String receives; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/model/register/notify/DynamicThreadPoolRegisterServerNotifyParameter.java b/infra/common/src/main/java/cn/hippo4j/common/model/register/notify/DynamicThreadPoolRegisterServerNotifyParameter.java deleted file mode 100644 index d549b2d8..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/model/register/notify/DynamicThreadPoolRegisterServerNotifyParameter.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.model.register.notify; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * Dynamic thread-pool register server notify parameter. - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class DynamicThreadPoolRegisterServerNotifyParameter { - - /** - * Platform - */ - private String platform; - - /** - * Access token - */ - private String accessToken; - - /** - * Interval - */ - private Integer interval; - - /** - * Receives - */ - private String receives; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/monitor/AbstractMessage.java b/infra/common/src/main/java/cn/hippo4j/common/monitor/AbstractMessage.java deleted file mode 100644 index 51f47037..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/monitor/AbstractMessage.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.monitor; - -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -/** - * Base message. - */ -@Data -@NoArgsConstructor -public abstract class AbstractMessage implements Message { - - /** - * GroupKey: tenant + item + threadPoolId + identify - */ - private String groupKey; - - /** - * Message type enum - */ - private MessageTypeEnum messageType; - - /** - * Message - */ - private List messages; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/monitor/Message.java b/infra/common/src/main/java/cn/hippo4j/common/monitor/Message.java deleted file mode 100644 index 87538dc3..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/monitor/Message.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.monitor; - -import java.io.Serializable; -import java.util.List; - -/** - * Abstract message monitoring interface. - */ -public interface Message extends Serializable { - - /** - * Get groupKey. - * - * @return - */ - String getGroupKey(); - - /** - * Get message type. - * - * @return - */ - MessageTypeEnum getMessageType(); - - /** - * Get messages. - * - * @return - */ - List getMessages(); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/monitor/MessageRequest.java b/infra/common/src/main/java/cn/hippo4j/common/monitor/MessageRequest.java deleted file mode 100644 index 1778b9a7..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/monitor/MessageRequest.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.monitor; - -import java.util.List; -import java.util.Map; - -/** - * Message request. - */ -public interface MessageRequest { - - /** - * Get content params. - * - * @return - */ - List> getContentParams(); - - /** - * Get response class. - * - * @return - */ - Class getResponseClass(); - - /** - * Get message type. - * - * @return - */ - MessageTypeEnum getMessageType(); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/monitor/MessageTypeEnum.java b/infra/common/src/main/java/cn/hippo4j/common/monitor/MessageTypeEnum.java deleted file mode 100644 index 3bbfbed3..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/monitor/MessageTypeEnum.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.monitor; - -/** - * Message type enum. - */ -public enum MessageTypeEnum { - - /** - * RUNTIME - */ - RUNTIME, - - /** - * DEFAULT - */ - DEFAULT -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/monitor/MessageWrapper.java b/infra/common/src/main/java/cn/hippo4j/common/monitor/MessageWrapper.java deleted file mode 100644 index 464d6fe5..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/monitor/MessageWrapper.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.monitor; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; -import java.util.List; -import java.util.Map; - -/** - * Message wrapper. - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class MessageWrapper implements MessageRequest, Serializable { - - /** - * contentParams - */ - private List> contentParams; - - /** - * responseClass - */ - private Class responseClass; - - /** - * getMessageType - */ - private MessageTypeEnum messageType; - - @Override - public List> getContentParams() { - return contentParams; - } - - @Override - public Class getResponseClass() { - return responseClass; - } - - @Override - public MessageTypeEnum getMessageType() { - return messageType; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/monitor/MonitorCollectTypeEnum.java b/infra/common/src/main/java/cn/hippo4j/common/monitor/MonitorCollectTypeEnum.java deleted file mode 100644 index b7a4a8b1..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/monitor/MonitorCollectTypeEnum.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.monitor; - -/** - * MonitorCollect type enum. - */ -public enum MonitorCollectTypeEnum { - - /** - * Micrometer - */ - MICROMETER("micrometer"), - - /** - * ELASTICSEARCH - */ - ELASTICSEARCH("elasticsearch"), - - /** - * LOG - */ - LOG("log"); - - private final String value; - - MonitorCollectTypeEnum(String value) { - this.value = value; - } - - public String getValue() { - return value; - } - -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/monitor/MonitorHandlerTypeEnum.java b/infra/common/src/main/java/cn/hippo4j/common/monitor/MonitorHandlerTypeEnum.java deleted file mode 100644 index 5cf7ad65..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/monitor/MonitorHandlerTypeEnum.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.monitor; - -/** - * MonitorHandler type enum. - */ -public enum MonitorHandlerTypeEnum { - /** - * DYNAMIC - */ - DYNAMIC, - /** - * WEB - */ - WEB, - /** - * ADAPTER - */ - ADAPTER -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/monitor/RuntimeMessage.java b/infra/common/src/main/java/cn/hippo4j/common/monitor/RuntimeMessage.java deleted file mode 100644 index 444aaa01..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/monitor/RuntimeMessage.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.monitor; - -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * Dynamic thread pool runtime data. - */ -@Data -@NoArgsConstructor -public class RuntimeMessage extends AbstractMessage { - - /** - * currentLoad - */ - private String currentLoad; - - /** - * peakLoad - */ - private String peakLoad; - - /** - * poolSize - */ - private Integer poolSize; - - /** - * The maximum number of threads that enter the thread pool at the same time - */ - private Integer largestPoolSize; - - /** - * activeSize - */ - private String activeSize; - - /** - * queueCapacity - */ - private Integer queueCapacity; - - /** - * queueSize - */ - private Integer queueSize; - - /** - * queueRemainingCapacity - */ - private String queueRemainingCapacity; - - /** - * completedTaskCount - */ - private Long completedTaskCount; - - /** - * rejectCount - */ - private Integer rejectCount; - - /** - * timestamp - */ - private Long timestamp; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/propertie/EnvironmentProperties.java b/infra/common/src/main/java/cn/hippo4j/common/propertie/EnvironmentProperties.java deleted file mode 100644 index c874df49..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/propertie/EnvironmentProperties.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.propertie; - -/** - * Configurable environment properties. - */ -public final class EnvironmentProperties { - - /** - * spring.profiles.active - */ - public static String active = "UNKNOWN"; - - /** - * spring.dynamic.thread-pool.item-id - */ - public static String itemId; - - /** - * spring.application.name - */ - public static String applicationName; - - /** - * spring.dynamic.thread-pool.check-state-interval - */ - public static Long checkStateInterval; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/propertie/IdentifyProperties.java b/infra/common/src/main/java/cn/hippo4j/common/propertie/IdentifyProperties.java deleted file mode 100644 index 0382e6b7..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/propertie/IdentifyProperties.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.propertie; - -import lombok.Setter; - -/** - * Identify properties. - */ -public class IdentifyProperties { - - /** - * The unique identifier of the client, initialized when the project starts - */ - @Setter - public static String IDENTIFY; -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/support/AbstractThreadPoolRuntime.java b/infra/common/src/main/java/cn/hippo4j/common/support/AbstractThreadPoolRuntime.java deleted file mode 100644 index f227137e..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/support/AbstractThreadPoolRuntime.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.support; - -import cn.hippo4j.common.executor.ThreadPoolExecutorHolder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.model.ThreadPoolRunStateInfo; -import cn.hippo4j.common.toolkit.CalculateUtil; -import cn.hippo4j.common.toolkit.ReflectUtil; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Objects; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; - -import static cn.hippo4j.common.constant.Constants.NO_REJECT_COUNT_NUM; - -/** - * Abstract threadPool runtime info. - */ -public abstract class AbstractThreadPoolRuntime { - - /** - * Supplemental thread pool runtime information. - * - * @param threadPoolRunStateInfo thread-pool run state info - * @return thread-pool run state info - */ - public abstract ThreadPoolRunStateInfo supplement(ThreadPoolRunStateInfo threadPoolRunStateInfo); - - /** - * Get pool run state. - * - * @param threadPoolId thread-pool id - * @return thread-pool run state info - */ - public ThreadPoolRunStateInfo getPoolRunState(String threadPoolId) { - ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(threadPoolId); - ThreadPoolExecutor pool = executorHolder.getExecutor(); - return getPoolRunState(threadPoolId, pool); - } - - /** - * Get pool run state. - * - * @param threadPoolId thread-pool id - * @param executor executor - * @return thread-pool run state info - */ - public ThreadPoolRunStateInfo getPoolRunState(String threadPoolId, Executor executor) { - ThreadPoolExecutor actualExecutor = (ThreadPoolExecutor) executor; - int activeCount = actualExecutor.getActiveCount(); - int largestPoolSize = actualExecutor.getLargestPoolSize(); - BlockingQueue blockingQueue = actualExecutor.getQueue(); - long rejectCount = NO_REJECT_COUNT_NUM; - if (Objects.equals(actualExecutor.getClass().getName(), "cn.hippo4j.core.executor.DynamicThreadPoolExecutor")) { - Object actualRejectCountNum = ReflectUtil.invoke(actualExecutor, "getRejectCountNum"); - if (actualRejectCountNum != null) { - rejectCount = (long) actualRejectCountNum; - } - } - ThreadPoolRunStateInfo stateInfo = ThreadPoolRunStateInfo.builder() - .tpId(threadPoolId) - .activeSize(activeCount) - .poolSize(actualExecutor.getPoolSize()) - .completedTaskCount(actualExecutor.getCompletedTaskCount()) - .largestPoolSize(largestPoolSize) - .currentLoad(CalculateUtil.divide(activeCount, actualExecutor.getMaximumPoolSize()) + "") - .clientLastRefreshTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))) - .peakLoad(CalculateUtil.divide(largestPoolSize, actualExecutor.getMaximumPoolSize()) + "") - .queueSize(blockingQueue.size()) - .queueRemainingCapacity(blockingQueue.remainingCapacity()) - .rejectCount(rejectCount) - .timestamp(System.currentTimeMillis()) - .build(); - stateInfo.setCoreSize(actualExecutor.getCorePoolSize()); - stateInfo.setMaximumSize(actualExecutor.getMaximumPoolSize()); - stateInfo.setQueueType(blockingQueue.getClass().getSimpleName()); - stateInfo.setQueueCapacity(blockingQueue.size() + blockingQueue.remainingCapacity()); - return supplement(stateInfo); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ArrayUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/ArrayUtil.java deleted file mode 100644 index 4290fe7b..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ArrayUtil.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.extension.function.Matcher; - -import java.lang.reflect.Array; - -/** - * Array util.
- * Refer to cn.hutool.core.util.ArrayUtil:
- */ -public class ArrayUtil { - - /** - * Is empty. - * - * @param array - * @param - * @return - */ - public static boolean isEmpty(T[] array) { - return array == null || array.length == 0; - } - - /** - * Is not empty. - * - * @param array - * @param - * @return - */ - public static boolean isNotEmpty(T[] array) { - return !isEmpty(array); - } - - /** - * First match. - * - * @param matcher - * @param array - * @param - * @return - */ - public static T firstMatch(Matcher matcher, T... array) { - if (!isEmpty(array)) { - for (final T val : array) { - if (matcher.match(val)) { - return val; - } - } - } - return null; - } - - /** - * Add all. - * - * @param array1 - * @param array2 - * @param - * @return - */ - public static T[] addAll(final T[] array1, @SuppressWarnings("unchecked") final T... array2) { - if (array1 == null) { - return clone(array2); - } else if (array2 == null) { - return clone(array1); - } - final Class type1 = array1.getClass().getComponentType(); - @SuppressWarnings("unchecked") - final T[] joinedArray = (T[]) Array.newInstance(type1, array1.length + array2.length); - System.arraycopy(array1, 0, joinedArray, 0, array1.length); - try { - System.arraycopy(array2, 0, joinedArray, array1.length, array2.length); - } catch (final ArrayStoreException ase) { - final Class type2 = array2.getClass().getComponentType(); - if (!type1.isAssignableFrom(type2)) { - throw new IllegalArgumentException("Cannot store " + type2.getName() + " in an array of " - + type1.getName(), ase); - } - throw ase; - } - return joinedArray; - } - - /** - * Clone. - * - * @param array - * @param - * @return - */ - public static T[] clone(final T[] array) { - if (array == null) { - return null; - } - return array.clone(); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/Assert.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/Assert.java deleted file mode 100644 index cfcc3ae7..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/Assert.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import java.util.Collection; -import java.util.Map; - -/** - * Assert. - */ -public class Assert { - - public static void isTrue(boolean expression, String message) { - if (!expression) { - throw new IllegalArgumentException(message); - } - } - - public static void isTrue(boolean expression) { - isTrue(expression, "[Assertion failed] - this expression must be true"); - } - - public static void isEmpty(Collection collection, String message) { - if (!CollectionUtil.isEmpty(collection)) { - throw new IllegalArgumentException(message); - } - } - - public static void isNull(Object object, String message) { - if (object != null) { - throw new IllegalArgumentException(message); - } - } - - public static void isNull(Object object) { - isNull(object, "[Assertion failed] - the object argument must be null"); - } - - public static void notNull(Object object, String message) { - if (object == null) { - throw new IllegalArgumentException(message); - } - } - - public static void notNull(Object object) { - notNull(object, "[Assertion failed] - this argument is required; it must not be null"); - } - - public static void notEmpty(Collection collection, String message) { - if (CollectionUtil.isEmpty(collection)) { - throw new IllegalArgumentException(message); - } - } - - public static void notEmpty(Collection collection) { - notEmpty(collection, - "[Assertion failed] - this collection must not be empty: it must contain at least 1 element"); - } - - public static void notEmpty(Map map, String message) { - if (CollectionUtil.isEmpty(map)) { - throw new IllegalArgumentException(message); - } - } - - public static void notEmpty(Map map) { - notEmpty(map, "[Assertion failed] - this map must not be empty; it must contain at least one entry"); - } - - public static void notEmpty(String str, String message) { - if (StringUtil.isEmpty(str)) { - throw new IllegalArgumentException(message); - } - } - - public static void notEmpty(String str) { - if (StringUtil.isEmpty(str)) { - notEmpty(str, "[Assertion failed] - this string must not be empty"); - } - } - - public static void notBlank(String str, String message) { - if (StringUtil.isBlank(str)) { - throw new IllegalArgumentException(message); - } - } - - public static void notBlank(String str) { - notBlank(str, "[Assertion failed] - this string must not be blank"); - } - - public static void hasText(String text, String message) { - if (!StringUtil.hasText(text)) { - throw new IllegalArgumentException(message); - } - } - - public static void hasText(String text) { - hasText(text, - "[Assertion failed] - this String argument must have text; it must not be null, empty, or blank"); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/BeanUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/BeanUtil.java deleted file mode 100644 index 5fed71f2..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/BeanUtil.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import com.github.dozermapper.core.DozerBeanMapperBuilder; -import com.github.dozermapper.core.Mapper; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.beans.IntrospectionException; -import java.beans.PropertyDescriptor; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; - -/** - * Bean util.
- * use com.github.dozermapper - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class BeanUtil { - - protected static final Mapper BEAN_MAPPER_BUILDER; - - static { - BEAN_MAPPER_BUILDER = DozerBeanMapperBuilder.buildDefault(); - } - - public static T convert(S source, Class clazz) { - return Optional.ofNullable(source) - .map(each -> BEAN_MAPPER_BUILDER.map(each, clazz)) - .orElse(null); - } - - public static T convert(S source, T target) { - Optional.ofNullable(source) - .ifPresent(each -> BEAN_MAPPER_BUILDER.map(each, target)); - return target; - } - - public static List convert(List sources, Class clazz) { - return Optional.ofNullable(sources) - .map(each -> { - List targetList = new ArrayList(each.size()); - each.forEach(item -> targetList.add(BEAN_MAPPER_BUILDER.map(item, clazz))); - return targetList; - }) - .orElse(null); - } - - public static Set convert(Set sources, Class clazz) { - return Optional.ofNullable(sources) - .map(each -> { - Set targetSize = new HashSet(each.size()); - each.forEach(item -> targetSize.add(BEAN_MAPPER_BUILDER.map(item, clazz))); - return targetSize; - }) - .orElse(null); - } - - /** - * map to bean - * - * @param map source data - * @param clazz type - * @param toCamelCase key convert - */ - public static T mapToBean(Map map, Class clazz, boolean toCamelCase) { - if (clazz == null) { - return null; - } - try { - T newInstance = clazz.newInstance(); - return mapToBean(map, newInstance, toCamelCase); - } catch (InstantiationException | IllegalAccessException e) { - throw new RuntimeException("do not create instance for " + clazz.getName(), e); - } - } - - /** - * map to bean - * - * @param map map - * @param bean obj bean - * @param toCamelCase format to camel case - * @param bean type - * @return T - */ - public static T mapToBean(Map map, T bean, boolean toCamelCase) { - if (bean == null) { - return null; - } - if (map.isEmpty()) { - return bean; - } - Class clazz = bean.getClass(); - map.forEach((s, o) -> { - String name = toCamelCase ? StringUtil.toCamelCase(s, StringUtil.UNDERLINE) : s; - Method method = setter(clazz, name); - if (method != null) { - ReflectUtil.invoke(bean, method, o); - } - }); - return bean; - } - - /** - * getter for properties - * - * @param o obj - * @param propertiesName name - * @return Method for get - */ - public static Method getter(Class o, String propertiesName) { - if (o == null) { - return null; - } - try { - PropertyDescriptor descriptor = new PropertyDescriptor(propertiesName, o); - return descriptor.getReadMethod(); - } catch (IntrospectionException e) { - throw new RuntimeException("not find getter for" + propertiesName + "in" + o.getName(), e); - } - } - - /** - * setter for properties - * - * @param o obj - * @param propertiesName name - * @return Method for set - */ - public static Method setter(Class o, String propertiesName) { - if (o == null) { - return null; - } - try { - PropertyDescriptor descriptor = new PropertyDescriptor(propertiesName, o); - return descriptor.getWriteMethod(); - } catch (IntrospectionException e) { - throw new RuntimeException("not find setter for" + propertiesName + "in" + o.getName(), e); - } - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/BooleanUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/BooleanUtil.java deleted file mode 100644 index 8885aab5..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/BooleanUtil.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import java.util.HashSet; -import java.util.Set; - -/** - * Boolean util. - */ -public class BooleanUtil { - - private static final Set TREE_SET = new HashSet(3); - - static { - TREE_SET.add("true"); - TREE_SET.add("yes"); - TREE_SET.add("1"); - } - - /** - * To boolean. - * - * @param valueStr - * @return - */ - public static boolean toBoolean(String valueStr) { - if (StringUtil.isNotBlank(valueStr)) { - valueStr = valueStr.trim().toLowerCase(); - return TREE_SET.contains(valueStr); - } - return false; - } - - /** - * Is true. - * - * @param bool - * @return - */ - public static boolean isTrue(Boolean bool) { - return Boolean.TRUE.equals(bool); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ByteConvertUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/ByteConvertUtil.java deleted file mode 100644 index 995209de..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ByteConvertUtil.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import java.text.DecimalFormat; - -/** - * Byte conversion tool class - */ -public class ByteConvertUtil { - - public static final int KB_SIZE = 2 << 9; - - public static final int MB_SIZE = 2 << 19; - - public static final int GB_SIZE = 2 << 29; - - public static String getPrintSize(long size) { - DecimalFormat df = new DecimalFormat("#.00"); - if (size < KB_SIZE) { - return size + "B"; - } else if (size < MB_SIZE) { - return df.format((double) size / KB_SIZE) + "KB"; - } else if (size < GB_SIZE) { - return df.format((double) size / MB_SIZE) + "MB"; - } else { - return df.format((double) size / GB_SIZE) + "GB"; - } - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/CalculateUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/CalculateUtil.java deleted file mode 100644 index cbb7c52d..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/CalculateUtil.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -/** - * Calculate util. - */ -public class CalculateUtil { - - private static final int PERCENTAGE = 100; - - public static int divide(int num1, int num2) { - return ((int) (Double.parseDouble(num1 + "") / Double.parseDouble(num2 + "") * PERCENTAGE)); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ClassUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/ClassUtil.java deleted file mode 100644 index 94950732..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ClassUtil.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -/** - * Class Util. - */ -public class ClassUtil { - - /** - * get class loader - * - * @param clazz - * @return class loader - */ - public static ClassLoader getClassLoader(Class clazz) { - ClassLoader cl = null; - try { - cl = Thread.currentThread().getContextClassLoader(); - } catch (Throwable ex) { - // Cannot access thread context ClassLoader - falling back to system class loader... - } - if (cl == null) { - // No thread context class loader -> use class loader of this class. - cl = clazz.getClassLoader(); - if (cl == null) { - // getClassLoader() returning null indicates the bootstrap ClassLoader - try { - cl = ClassLoader.getSystemClassLoader(); - } catch (Throwable ex) { - // Cannot access system ClassLoader - oh well, maybe the caller can live with null... - } - } - } - - return cl; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/CollectionUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/CollectionUtil.java deleted file mode 100644 index 9e3c1792..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/CollectionUtil.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.constant.MagicNumberConstants; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * Collection util.
- * Refer to cn.hutool.core.collection.CollUtil:
- */ -public class CollectionUtil { - - /** - * Get first. - * - * @param iterable - * @param - * @return - */ - public static T getFirst(Iterable iterable) { - if (iterable != null) { - Iterator iterator = iterable.iterator(); - if (iterator != null && iterator.hasNext()) { - return iterator.next(); - } - } - return null; - } - - /** - * Is empty. - * - * @param list - * @return - */ - public static boolean isEmpty(List list) { - return list == null || list.isEmpty(); - } - - /** - * Is not empty. - * - * @param list - * @return - */ - public static boolean isNotEmpty(List list) { - return !isEmpty(list); - } - - /** - * Is empty. - * - * @param map - * @return - */ - public static boolean isEmpty(Map map) { - return map == null || map.isEmpty(); - } - - /** - * Is not empty. - * - * @param map - * @return - */ - public static boolean isNotEmpty(Map map) { - return !isEmpty(map); - } - - /** - * Is empty. - * - * @param iterator - * @return - */ - public static boolean isEmpty(Iterator iterator) { - return null == iterator || !iterator.hasNext(); - } - - /** - * Is not empty. - * - * @param iterator - * @return - */ - public static boolean isNotEmpty(Iterator iterator) { - return !isEmpty(iterator); - } - - /** - * Is empty. - * - * @param collection - * @return - */ - public static boolean isEmpty(Collection collection) { - return collection == null || collection.isEmpty(); - } - - /** - * Is not empty. - * - * @param collection - * @return - */ - public static boolean isNotEmpty(Collection collection) { - return !isEmpty(collection); - } - - /** - * to list - * - * @param ts elements - * @param type - * @return List - */ - public static List toList(T... ts) { - if (ts == null || ts.length == 0) { - return new ArrayList<>(); - } - return Arrays.stream(ts) - .collect(Collectors.toList()); - } - - /** - * reference google guava - * - * @param elements - * @return - */ - @SafeVarargs - public static ArrayList newArrayList(E... elements) { - Objects.requireNonNull(elements); - // Avoid integer overflow when a large array is passed in - int capacity = computeArrayListCapacity(elements.length); - ArrayList list = new ArrayList<>(capacity); - Collections.addAll(list, elements); - return list; - } - - private static int computeArrayListCapacity(int arraySize) { - checkNonnegative(arraySize); - // TODO(kevinb): Figure out the right behavior, and document it - return saturatedCast(MagicNumberConstants.LONG_5 + arraySize + (arraySize / MagicNumberConstants.INDEX_10)); - } - - private static void checkNonnegative(int value) { - if (value < 0) { - throw new IllegalArgumentException("arraySize cannot be negative but was: " + value); - } - } - - private static int saturatedCast(long value) { - if (value > Integer.MAX_VALUE) { - return Integer.MAX_VALUE; - } - if (value < Integer.MIN_VALUE) { - return Integer.MIN_VALUE; - } - return (int) value; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ConditionUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/ConditionUtil.java deleted file mode 100644 index 7188acba..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ConditionUtil.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.extension.function.NoArgsConsumer; - -/** - * Condition util. - */ -public class ConditionUtil { - - public static void condition(boolean condition, NoArgsConsumer trueConsumer, NoArgsConsumer falseConsumer) { - if (condition) { - trueConsumer.accept(); - } else { - falseConsumer.accept(); - } - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ContentUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/ContentUtil.java deleted file mode 100644 index eeca6fd2..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ContentUtil.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.common.model.IncrementalFieldMetadataProvider; -import cn.hippo4j.common.model.ThreadPoolParameter; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; - -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * Content util. - */ -public class ContentUtil { - - /** - * Get pool content. - * - * @param parameter thread-pool parameter - * @return dynamic thread-pool content str - */ - public static String getPoolContent(ThreadPoolParameter parameter) { - ThreadPoolParameterInfo threadPoolParameterInfo = new ThreadPoolParameterInfo(); - threadPoolParameterInfo.setTenantId(parameter.getTenantId()) - .setItemId(parameter.getItemId()) - .setTpId(parameter.getTpId()) - .setCoreSize((parameter instanceof ThreadPoolParameterInfo) - ? ((ThreadPoolParameterInfo) parameter).corePoolSizeAdapt() - : parameter.getCoreSize()) - .setMaxSize((parameter instanceof ThreadPoolParameterInfo) - ? ((ThreadPoolParameterInfo) parameter).maximumPoolSizeAdapt() - : parameter.getMaxSize()) - .setQueueType(parameter.getQueueType()) - .setCapacity(parameter.getCapacity()) - .setKeepAliveTime(parameter.getKeepAliveTime()) - .setExecuteTimeOut(parameter.getExecuteTimeOut()) - .setIsAlarm(parameter.getIsAlarm()) - .setCapacityAlarm(parameter.getCapacityAlarm()) - .setLivenessAlarm(parameter.getLivenessAlarm()) - .setAllowCoreThreadTimeOut(parameter.getAllowCoreThreadTimeOut()) - .setRejectedType(parameter.getRejectedType()); - if (parameter instanceof IncrementalFieldMetadataProvider) { - IncrementalFieldMetadataProvider provider = (IncrementalFieldMetadataProvider) parameter; - Map metadata = provider.getFieldVersionMetadata(); - if (metadata != null && !metadata.isEmpty()) { - threadPoolParameterInfo.setFieldVersionMetadata(new LinkedHashMap<>(metadata)); - } - threadPoolParameterInfo.setFieldMetadataVersion(provider.getFieldMetadataVersion()); - } - return JSONUtil.toJSONString(threadPoolParameterInfo); - } - - /** - * Get group key. - * - * @param parameter thread-pool parameter - * @return group key - */ - public static String getGroupKey(ThreadPoolParameter parameter) { - return StringUtil.createBuilder() - .append(parameter.getTpId()) - .append(Constants.GROUP_KEY_DELIMITER) - .append(parameter.getItemId()) - .append(Constants.GROUP_KEY_DELIMITER) - .append(parameter.getTenantId()) - .toString(); - } - - /** - * Get group key. - * - * @param parameters thread-pool parameters - * @return group key - */ - public static String getGroupKey(String... parameters) { - StringBuilder stringBuilder = new StringBuilder(); - for (int i = 0; i < parameters.length; i++) { - stringBuilder.append(parameters[i]); - if (i < parameters.length - 1) { - stringBuilder.append(Constants.GROUP_KEY_DELIMITER); - } - } - return stringBuilder.toString(); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/DateUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/DateUtil.java deleted file mode 100644 index dc3e8ddc..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/DateUtil.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Date; -import java.util.TimeZone; - -/** - * date and time util - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class DateUtil { - - /** - * get time zone for this JVM - */ - private static final TimeZone TIME_ZONE = TimeZone.getDefault(); - - public static final String NORM_DATE_PATTERN = "yyyy-MM-dd"; - - public static final String NORM_TIME_PATTERN = "HH:mm:ss"; - - public static final String NORM_DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; - - /** - * Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT - * represented by this Date object. - * - * @return the number of milliseconds since January 1, 1970, 00:00:00 GMT - * represented by this date. - */ - public static long getTime(LocalDateTime date) { - return getTime(date, TIME_ZONE.toZoneId()); - } - - public static long getTime(LocalDateTime date, ZoneId zoneId) { - return date.atZone(zoneId).toInstant().toEpochMilli(); - - } - - /** - * modify format to date - * - * @param date date - * @param normTimePattern PATTERN - * @return String - */ - public static String format(Date date, String normTimePattern) { - SimpleDateFormat zoneFormat = new SimpleDateFormat(normTimePattern); - return zoneFormat.format(date); - - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/GroupKey.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/GroupKey.java deleted file mode 100644 index f694c038..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/GroupKey.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.constant.Constants; - -import static cn.hippo4j.common.constant.Constants.GROUP_KEY_DELIMITER; - -/** - * Group key. - * Refer to com.alibaba.nacos.client.config.common.GroupKey:
- */ -public class GroupKey { - - public static String getKey(String dataId, String group) { - return getKey(dataId, group, ""); - } - - public static String getKey(String dataId, String group, String datumStr) { - return doGetKey(dataId, group, datumStr); - } - - public static String getKey(String... params) { - StringBuilder groupKey = new StringBuilder(); - groupKey.append(params[0]).append(GROUP_KEY_DELIMITER); - for (int i = 1; i < params.length - 1; i++) { - groupKey.append(params[i]).append(GROUP_KEY_DELIMITER); - } - groupKey.append(params[params.length - 1]); - return groupKey.toString(); - } - - public static String getKeyTenant(String dataId, String group, String tenant) { - return doGetKey(dataId, group, tenant); - } - - private static String doGetKey(String dataId, String group, String datumStr) { - StringBuilder sb = new StringBuilder(); - urlEncode(dataId, sb); - sb.append(GROUP_KEY_DELIMITER); - urlEncode(group, sb); - if (!StringUtil.isEmpty(datumStr)) { - sb.append(GROUP_KEY_DELIMITER); - urlEncode(datumStr, sb); - } - return sb.toString(); - } - - public static String[] parseKey(String groupKey) { - return groupKey.split(Constants.GROUP_KEY_DELIMITER_TRANSLATION); - } - - public static void urlEncode(String str, StringBuilder sb) { - for (int idx = 0; idx < str.length(); ++idx) { - char c = str.charAt(idx); - if ('+' == c) { - sb.append("%2B"); - } else if ('%' == c) { - sb.append("%25"); - } else { - sb.append(c); - } - } - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/IdUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/IdUtil.java deleted file mode 100644 index 60300777..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/IdUtil.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -/** - * id and uuid util,{@link UUID} - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class IdUtil { - - /** - * get a random UUID - * - * @return UUID - */ - public static String randomUUID() { - return toString(UUID.randomUUID(), false); - } - - /** - * get a simple random UUID - * - * @return a simple UUID - */ - public static String simpleUUID() { - return toString(UUID.randomUUID(), true); - } - - /** - * Returns a {@code String} object representing this {@code UUID}. - * - *

The UUID string representation is as described by this BNF: - *

-     * {@code
-     * UUID                   =  "-"  "-"
-     *                           "-"
-     *                           "-"
-     *                          
-     * time_low               = 4*
-     * time_mid               = 2*
-     * time_high_and_version  = 2*
-     * variant_and_sequence   = 2*
-     * node                   = 6*
-     * hexOctet               = 
-     * hexDigit               =
-     *       "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
-     *       | "a" | "b" | "c" | "d" | "e" | "f"
-     *       | "A" | "B" | "C" | "D" | "E" | "F"
-     * }
- * - * @return A string representation of this {@code UUID} - */ - public static String toString(UUID uuid, boolean isSimple) { - long mostSigBits = uuid.getMostSignificantBits(); - long leastSigBits = uuid.getLeastSignificantBits(); - if (isSimple) { - return (digits(mostSigBits >> 32, 8) - + digits(mostSigBits >> 16, 4) - + digits(mostSigBits, 4) - + digits(leastSigBits >> 48, 4) - + digits(leastSigBits, 12)); - } else { - return (digits(mostSigBits >> 32, 8) + "-" - + digits(mostSigBits >> 16, 4) + "-" - + digits(mostSigBits, 4) + "-" - + digits(leastSigBits >> 48, 4) + "-" - + digits(leastSigBits, 12)); - } - } - - /** - * Returns val represented by the specified number of hex digits.
- * {@link UUID#digits(long, int)} - * - * @param val value - * @param digits position - * @return hex value - */ - private static String digits(long val, int digits) { - long hi = 1L << (digits * 4); - return Long.toHexString(hi | (val & (hi - 1))).substring(1); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/IncrementalContentUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/IncrementalContentUtil.java deleted file mode 100644 index b433955b..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/IncrementalContentUtil.java +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.model.IncrementalFieldMetadataProvider; -import cn.hippo4j.common.model.ThreadPoolParameter; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import com.fasterxml.jackson.core.type.TypeReference; -import lombok.extern.slf4j.Slf4j; - -import java.util.*; - -/** - * Incremental content util for thread pool parameter comparison. - * Supports version compatibility and incremental updates. - */ -@Slf4j -public class IncrementalContentUtil { - - /** - * Core parameters that affect thread pool behavior - */ - private static final String[] CORE_PARAMETERS = { - "coreSize", "maxSize", "queueType", "capacity", - "keepAliveTime", "rejectedType", "allowCoreThreadTimeOut" - }; - - private static final List IDENTIFIER_FIELDS = Collections.unmodifiableList(Arrays.asList("tenantId", "itemId", "tpId")); - - private static final List CORE_PARAMETER_LIST = Collections.unmodifiableList(Arrays.asList(CORE_PARAMETERS)); - - private static final String FIELD_VERSION_METADATA_KEY = "fieldVersionMetadata"; - - private static final String FIELD_METADATA_VERSION_KEY = "fieldMetadataVersion"; - - /** - * Get core content for MD5 calculation (only essential parameters) - * - * @param parameter thread-pool parameter - * @return core content string for MD5 - */ - public static String getCoreContent(ThreadPoolParameter parameter) { - ThreadPoolParameterInfo threadPoolParameterInfo = new ThreadPoolParameterInfo(); - threadPoolParameterInfo.setTenantId(parameter.getTenantId()) - .setItemId(parameter.getItemId()) - .setTpId(parameter.getTpId()) - .setCorePoolSize(getCorePoolSize(parameter)) - .setMaximumPoolSize(getMaximumPoolSize(parameter)) - .setQueueType(parameter.getQueueType()) - .setCapacity(parameter.getCapacity()) - .setKeepAliveTime(parameter.getKeepAliveTime()) - .setRejectedType(parameter.getRejectedType()) - .setAllowCoreThreadTimeOut(parameter.getAllowCoreThreadTimeOut()); - return JSONUtil.toJSONString(threadPoolParameterInfo); - } - - /** - * Get full content for MD5 calculation (all parameters) - * - * @param parameter thread-pool parameter - * @return full content string for MD5 - */ - public static String getFullContent(ThreadPoolParameter parameter) { - return ContentUtil.getPoolContent(parameter); - } - - /** - * Build content string according to client protocol version. Fields introduced in newer protocol - * versions will be excluded automatically for older clients to avoid unnecessary refresh. - * - * @param parameter thread-pool parameter - * @param clientVersion semantic client version (optional, reserved for fine-grained rules) - * @return version-aware content string - */ - public static String getVersionedContent(ThreadPoolParameter parameter, String clientVersion) { - String fullContent = getFullContent(parameter); - LinkedHashMap raw = JSONUtil.parseObject(fullContent, new TypeReference>() { - }); - if (raw == null) { - return fullContent; - } - String normalizedClientVersion = StringUtil.isNotBlank(clientVersion) - ? clientVersion.trim() - : VersionUtil.UNKNOWN_VERSION; - Map fieldRules = resolveFieldRules(parameter, raw); - LinkedHashMap filtered = new LinkedHashMap<>(); - for (String field : IDENTIFIER_FIELDS) { - if (raw.containsKey(field)) { - filtered.put(field, raw.get(field)); - } - } - for (String field : CORE_PARAMETER_LIST) { - if (raw.containsKey(field)) { - filtered.put(field, raw.get(field)); - } - } - raw.forEach((field, value) -> { - if (!filtered.containsKey(field) && shouldIncludeField(field, normalizedClientVersion, fieldRules)) { - filtered.put(field, value); - } - }); - return JSONUtil.toJSONString(filtered); - } - - /** - * Get core pool size with version compatibility handling - * - * @param parameter thread pool parameter - * @return core pool size - */ - private static Integer getCorePoolSize(ThreadPoolParameter parameter) { - if (parameter instanceof ThreadPoolParameterInfo) { - return ((ThreadPoolParameterInfo) parameter).corePoolSizeAdapt(); - } - return parameter.getCoreSize(); - } - - /** - * Get maximum pool size with version compatibility handling - * - * @param parameter thread pool parameter - * @return maximum pool size - */ - private static Integer getMaximumPoolSize(ThreadPoolParameter parameter) { - if (parameter instanceof ThreadPoolParameterInfo) { - return ((ThreadPoolParameterInfo) parameter).maximumPoolSizeAdapt(); - } - return parameter.getMaxSize(); - } - - /** - * Check if parameters have core changes that require thread pool refresh - * - * @param oldParameter old parameter - * @param newParameter new parameter - * @return true if core parameters changed - */ - public static boolean hasCoreChanges(ThreadPoolParameter oldParameter, ThreadPoolParameter newParameter) { - if (oldParameter == null || newParameter == null) { - return true; - } - return !Objects.equals(getCorePoolSize(oldParameter), getCorePoolSize(newParameter)) || - !Objects.equals(getMaximumPoolSize(oldParameter), getMaximumPoolSize(newParameter)) || - !Objects.equals(oldParameter.getQueueType(), newParameter.getQueueType()) || - !Objects.equals(oldParameter.getCapacity(), newParameter.getCapacity()) || - !Objects.equals(oldParameter.getKeepAliveTime(), newParameter.getKeepAliveTime()) || - !Objects.equals(oldParameter.getRejectedType(), newParameter.getRejectedType()) || - !Objects.equals(oldParameter.getAllowCoreThreadTimeOut(), newParameter.getAllowCoreThreadTimeOut()); - } - - /** - * Check if parameters have extended changes (non-core) - * - * @param oldParameter old parameter - * @param newParameter new parameter - * @return true if extended parameters changed - */ - public static boolean hasExtendedChanges(ThreadPoolParameter oldParameter, ThreadPoolParameter newParameter) { - if (oldParameter == null || newParameter == null) { - return true; - } - return !Objects.equals(oldParameter.getExecuteTimeOut(), newParameter.getExecuteTimeOut()) || - !Objects.equals(oldParameter.getIsAlarm(), newParameter.getIsAlarm()) || - !Objects.equals(oldParameter.getCapacityAlarm(), newParameter.getCapacityAlarm()) || - !Objects.equals(oldParameter.getLivenessAlarm(), newParameter.getLivenessAlarm()); - } - - /** - * Get parameter changes summary - * - * @param oldParameter old parameter - * @param newParameter new parameter - * @return changes summary map - */ - public static Map getChangesSummary(ThreadPoolParameter oldParameter, ThreadPoolParameter newParameter) { - Map changes = new HashMap<>(); - if (oldParameter == null || newParameter == null) { - changes.put("type", "full"); - changes.put("reason", "initial_load"); - return changes; - } - boolean coreChanges = hasCoreChanges(oldParameter, newParameter); - boolean extendedChanges = hasExtendedChanges(oldParameter, newParameter); - if (coreChanges) { - changes.put("type", "core"); - changes.put("reason", "core_parameters_changed"); - } else if (extendedChanges) { - changes.put("type", "extended"); - changes.put("reason", "extended_parameters_changed"); - } else { - changes.put("type", "none"); - changes.put("reason", "no_changes"); - } - return changes; - } - - /** - * Decide whether the given field should be included when generating MD5 for a client that uses - * the specified protocol version. If the field requires a higher protocol, it will be ignored - * so older clients remain unaware of unsupported parameters. - */ - private static boolean shouldIncludeField(String field, String clientVersion, Map fieldRules) { - String minVersion = fieldRules.get(field); - if (StringUtil.isBlank(minVersion)) { - return false; - } - String effectiveClientVersion = StringUtil.isBlank(clientVersion) ? VersionUtil.UNKNOWN_VERSION : clientVersion; - return VersionUtil.isVersionGreaterOrEqual(effectiveClientVersion, minVersion); - } - - /** - * Resolve field-level version rules by combining default baseline, runtime metadata from the - * parameter object, and metadata embedded in the JSON payload. Fields without explicit metadata - * are assigned a default minimum version based on the current protocol. - * - * @param parameter thread pool parameter (may carry metadata) - * @param raw parsed JSON payload (may contain fieldVersionMetadata) - * @return mapping of field name to minimum semantic version - */ - private static Map resolveFieldRules(ThreadPoolParameter parameter, Map raw) { - Map fieldRules = new LinkedHashMap<>(); - // Identifier and core fields visible to all clients (since version 1.0.0) - IDENTIFIER_FIELDS.forEach(field -> fieldRules.put(field, VersionUtil.UNKNOWN_VERSION)); - CORE_PARAMETER_LIST.forEach(field -> fieldRules.put(field, VersionUtil.UNKNOWN_VERSION)); - - // Merge metadata from parameter object (e.g., Server-side configuration) - mergeFieldMetadata(fieldRules, extractMetadataFromParameter(parameter)); - // Merge metadata from JSON payload (e.g., Client receiving Server's dynamic metadata) - mergeFieldMetadata(fieldRules, extractMetadataFromPayload(raw)); - - // Assign default version to unconfigured fields (prevents old clients from seeing new fields) - // Default to "2.0.0" for new fields to maintain backward compatibility - raw.keySet().forEach(field -> { - if (!fieldRules.containsKey(field)) { - fieldRules.put(field, "2.0.0"); // Default: visible to clients >= 2.0 - } - }); - - return fieldRules; - } - - /** - * Extract field version metadata from the parameter object if it implements - * {@link IncrementalFieldMetadataProvider}. This is typically used on the Server side where - * configuration objects can dynamically declare which fields were introduced in which version. - * - * @param parameter thread pool parameter - * @return field-to-version mapping, or empty map if not available - */ - private static Map extractMetadataFromParameter(ThreadPoolParameter parameter) { - if (parameter instanceof IncrementalFieldMetadataProvider) { - Map metadata = ((IncrementalFieldMetadataProvider) parameter).getFieldVersionMetadata(); - if (metadata != null && !metadata.isEmpty()) { - Map copied = new LinkedHashMap<>(); - metadata.forEach((field, version) -> { - if (StringUtil.isNotBlank(field) && StringUtil.isNotBlank(version)) { - copied.put(field, version.trim()); - } - }); - return copied; - } - } - return Collections.emptyMap(); - } - - /** - * Extract field version metadata from the JSON payload and remove metadata keys from the raw map - * so they do not participate in MD5 calculation. This is typically used on the Client side to - * receive dynamic metadata from the Server. - * - * @param raw parsed JSON map (will be modified: metadata keys removed) - * @return field-to-version mapping extracted from the payload, or empty map if not present - */ - @SuppressWarnings("unchecked") - private static Map extractMetadataFromPayload(Map raw) { - Object metadataObject = raw.remove(FIELD_VERSION_METADATA_KEY); - raw.remove(FIELD_METADATA_VERSION_KEY); - if (metadataObject instanceof Map) { - Map metadata = new LinkedHashMap<>(); - ((Map) metadataObject).forEach((key, value) -> { - if (key == null || value == null) { - return; - } - String field = String.valueOf(key); - String version = String.valueOf(value).trim(); - if (StringUtil.isNotBlank(field) && StringUtil.isNotBlank(version)) { - metadata.put(field, version); - } - }); - return metadata; - } - return Collections.emptyMap(); - } - - /** - * Merge additional field version metadata into the target map. Existing entries in the target - * will be overwritten by additions. This enables layered metadata resolution (base → parameter → payload). - * - * @param target target map to merge into - * @param additions additional metadata to merge (may be null or empty) - */ - private static void mergeFieldMetadata(Map target, Map additions) { - if (additions == null || additions.isEmpty()) { - return; - } - additions.forEach((field, version) -> { - if (StringUtil.isNotBlank(field) && StringUtil.isNotBlank(version)) { - target.put(field, version.trim()); - } - }); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/IncrementalMd5Util.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/IncrementalMd5Util.java deleted file mode 100644 index c95a33d7..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/IncrementalMd5Util.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.model.ThreadPoolParameter; -import lombok.extern.slf4j.Slf4j; - -/** - * Incremental MD5 util for thread pool parameter comparison. - * Supports version compatibility and reduces unnecessary refreshes. - */ -@Slf4j -public class IncrementalMd5Util { - - /** - * Get core MD5 for essential parameters only - * - * @param config thread pool parameter - * @return core MD5 hash - */ - public static String getCoreMd5(ThreadPoolParameter config) { - String coreContent = IncrementalContentUtil.getCoreContent(config); - return Md5Util.md5Hex(coreContent, "UTF-8"); - } - - /** - * Get full MD5 for all parameters (legacy compatibility) - * - * @param config thread pool parameter - * @return full MD5 hash - */ - public static String getFullMd5(ThreadPoolParameter config) { - return Md5Util.getTpContentMd5(config); - } - - /** - * Get versioned MD5 based on client semantic version. - * - * @param config thread pool parameter - * @param clientVersion semantic client version string (can be blank) - * @return versioned MD5 hash - */ - public static String getVersionedMd5(ThreadPoolParameter config, String clientVersion) { - String normalizedVersion = StringUtil.isNotBlank(clientVersion) - ? clientVersion.trim() - : VersionUtil.UNKNOWN_VERSION; - String versionedContent = IncrementalContentUtil.getVersionedContent(config, normalizedVersion); - String md5 = Md5Util.md5Hex(versionedContent, "UTF-8"); - if (log.isDebugEnabled()) { - log.debug("ClientVersion={}: Using versioned MD5={}", normalizedVersion, md5); - } - return md5; - } - - /** - * Compare MD5 with version support using semantic version string. - */ - public static boolean isDifferent(ThreadPoolParameter oldConfig, ThreadPoolParameter newConfig, String clientVersion) { - if (oldConfig == null || newConfig == null) { - return true; - } - String oldMd5 = getVersionedMd5(oldConfig, clientVersion); - String newMd5 = getVersionedMd5(newConfig, clientVersion); - boolean different = !oldMd5.equals(newMd5); - if (different && log.isDebugEnabled()) { - log.debug("Configuration changed - Old MD5: {}, New MD5: {}, Client Version: {}", - oldMd5, newMd5, clientVersion); - } - return different; - } - - /** - * Check if only extended parameters changed (non-core) - * - * @param oldConfig old configuration - * @param newConfig new configuration - * @return true if only extended parameters changed - */ - public static boolean onlyExtendedChanged(ThreadPoolParameter oldConfig, ThreadPoolParameter newConfig) { - if (oldConfig == null || newConfig == null) { - return false; - } - boolean coreChanged = IncrementalContentUtil.hasCoreChanges(oldConfig, newConfig); - boolean extendedChanged = IncrementalContentUtil.hasExtendedChanges(oldConfig, newConfig); - return !coreChanged && extendedChanged; - } - - /** - * Get change type for logging and monitoring - * - * @param oldConfig old configuration - * @param newConfig new configuration - * @return change type string - */ - public static String getChangeType(ThreadPoolParameter oldConfig, ThreadPoolParameter newConfig) { - if (oldConfig == null || newConfig == null) { - return "INITIAL"; - } - boolean coreChanged = IncrementalContentUtil.hasCoreChanges(oldConfig, newConfig); - boolean extendedChanged = IncrementalContentUtil.hasExtendedChanges(oldConfig, newConfig); - if (coreChanged) { - return "CORE"; - } else if (extendedChanged) { - return "EXTENDED"; - } else { - return "NONE"; - } - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/IoUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/IoUtil.java deleted file mode 100644 index 6f45c9a3..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/IoUtil.java +++ /dev/null @@ -1,356 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.constant.Constants; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.CharArrayWriter; -import java.io.Closeable; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.Reader; -import java.io.Writer; -import java.net.HttpURLConnection; -import java.nio.channels.FileChannel; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; - -/** - * IO related tool methods. - * - * @author nacos - */ -@Slf4j -public class IoUtil { - - /** - * Try decompress by GZIP from stream. - * - * @param raw compress stream - * @return byte array after decompress - */ - public static byte[] tryDecompress(InputStream raw) throws IOException { - try ( - GZIPInputStream gis = new GZIPInputStream(raw); - ByteArrayOutputStream out = new ByteArrayOutputStream()) { - copy(gis, out); - return out.toByteArray(); - } - } - - /** - * Try decompress by GZIP from byte array. - * - * @param raw compressed byte array - * @return byte array after decompress - * @throws Exception exception - */ - public static byte[] tryDecompress(byte[] raw) throws Exception { - if (!isGzipStream(raw)) { - return raw; - } - try ( - GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(raw)); - ByteArrayOutputStream out = new ByteArrayOutputStream()) { - copy(gis, out); - return out.toByteArray(); - } - } - - /** - * Try compress by GZIP for string. - * - * @param str strings to be compressed. - * @param encoding encoding. - * @return byte[] - */ - public static byte[] tryCompress(String str, String encoding) { - if (str == null || str.length() == 0) { - return new byte[0]; - } - ByteArrayOutputStream out = new ByteArrayOutputStream(); - try (GZIPOutputStream gzip = new GZIPOutputStream(out)) { - gzip.write(str.getBytes(encoding)); - } catch (Exception e) { - log.error("gzip write is fail: {}", e.getMessage()); - } - return out.toByteArray(); - } - - private static BufferedReader toBufferedReader(Reader reader) { - return reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader); - } - - /** - * Write string to a file. - * - * @param file file - * @param data string - * @param encoding encoding of string - * @throws IOException io exception - */ - public static void writeStringToFile(File file, String data, String encoding) throws IOException { - try (OutputStream os = new FileOutputStream(file)) { - os.write(data.getBytes(encoding)); - os.flush(); - } - } - - /** - * Read lines. - * - * @param input reader - * @return list of line - * @throws IOException io exception - */ - public static List readLines(Reader input) throws IOException { - BufferedReader reader = toBufferedReader(input); - List list = new ArrayList<>(); - while (true) { - String line = reader.readLine(); - if (null != line) { - if (StringUtil.isNotEmpty(line)) { - list.add(line.trim()); - } - } else { - break; - } - } - return list; - } - - /** - * To string from stream. - * - * @param input stream - * @param encoding charset of stream - * @return string - * @throws IOException io exception - */ - @SneakyThrows - public static String toString(InputStream input, String encoding) { - if (input == null) { - return StringUtil.EMPTY; - } - return (null == encoding) ? toString(new InputStreamReader(input, Constants.ENCODE)) - : toString(new InputStreamReader(input, encoding)); - } - - /** - * To string from reader. - * - * @param reader reader - * @return string - * @throws IOException io exception - */ - public static String toString(Reader reader) throws IOException { - CharArrayWriter sw = new CharArrayWriter(); - copy(reader, sw); - return sw.toString(); - } - - /** - * Copy data. - * - * @param input source - * @param output target - * @return copy size - * @throws IOException io exception - */ - public static long copy(Reader input, Writer output) throws IOException { - char[] buffer = new char[1 << 12]; - long count = 0; - for (int n = 0; (n = input.read(buffer)) >= 0;) { - output.write(buffer, 0, n); - count += n; - } - return count; - } - - /** - * Copy data. - * - * @param input source - * @param output target - * @return copy size - * @throws IOException io exception - */ - public static long copy(InputStream input, OutputStream output) throws IOException { - byte[] buffer = new byte[1024]; - int bytesRead; - int totalBytes = 0; - while ((bytesRead = input.read(buffer)) != -1) { - output.write(buffer, 0, bytesRead); - - totalBytes += bytesRead; - } - - return totalBytes; - } - - /** - * Delete file or dir. - * - *

If is dir, clean directory, do not delete dir. - * - *

If is file, delete file. - * - * @param fileOrDir file or dir - * @throws IOException io exception - */ - public static void delete(File fileOrDir) throws IOException { - if (fileOrDir == null) { - return; - } - - if (fileOrDir.isDirectory()) { - cleanDirectory(fileOrDir); - } else { - if (fileOrDir.exists()) { - boolean isDeleteOk = fileOrDir.delete(); - if (!isDeleteOk) { - throw new IOException("delete fail"); - } - } - } - } - - /** - * 清理目录下的内容. Clean content under directory. - * - * @param directory directory - * @throws IOException io exception - */ - public static void cleanDirectory(File directory) throws IOException { - if (!directory.exists()) { - String message = directory + " does not exist"; - throw new IllegalArgumentException(message); - } - - if (!directory.isDirectory()) { - String message = directory + " is not a directory"; - throw new IllegalArgumentException(message); - } - - File[] files = directory.listFiles(); - // null if security restricted - if (files == null) { - throw new IOException("Failed to list contents of " + directory); - } - - IOException exception = null; - for (File file : files) { - try { - delete(file); - } catch (IOException ioe) { - exception = ioe; - } - } - - if (null != exception) { - throw exception; - } - } - - /** - * Copy File. - * - * @param source source file path - * @param target target file path - * @throws IOException io exception - */ - public static void copyFile(String source, String target) throws IOException { - File sf = new File(source); - if (!sf.exists()) { - throw new IllegalArgumentException("source file does not exist."); - } - File tf = new File(target); - if (!tf.getParentFile().mkdirs()) { - throw new RuntimeException("failed to create parent directory."); - } - if (!tf.exists() && !tf.createNewFile()) { - throw new RuntimeException("failed to create target file."); - } - try ( - FileChannel sc = new FileInputStream(sf).getChannel(); - FileChannel tc = new FileOutputStream(tf).getChannel()) { - sc.transferTo(0, sc.size(), tc); - } - } - - /** - * Judge whether is Gzip stream. - * - * @param bytes byte array - * @return true if is gzip, otherwise false - */ - public static boolean isGzipStream(byte[] bytes) { - - int minByteArraySize = 2; - if (bytes == null || bytes.length < minByteArraySize) { - return false; - } - - return GZIPInputStream.GZIP_MAGIC == ((bytes[1] << 8 | bytes[0]) & 0xFFFF); - } - - /** - * Close http connection quietly. - * - * @param connection http connection - */ - public static void closeQuietly(HttpURLConnection connection) { - if (connection != null) { - try { - closeQuietly(connection.getInputStream()); - } catch (Exception ignore) { - } - } - } - - /** - * Close closable object quietly. - * - * @param closeable http connection - */ - public static void closeQuietly(Closeable closeable) { - try { - if (closeable != null) { - closeable.close(); - } - } catch (IOException ignored) { - } - } - - public static void closeQuietly(Closeable... closeable) { - Arrays.stream(closeable).forEach(IoUtil::closeQuietly); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/JSONUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/JSONUtil.java deleted file mode 100644 index fd6d9131..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/JSONUtil.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.api.JsonFacade; -import com.fasterxml.jackson.core.type.TypeReference; - -import java.util.Collections; -import java.util.List; - -/** - * JSON util. - */ -public class JSONUtil { - - private static final JsonFacade JSON_FACADE = new JacksonHandler(); - - public static String toJSONString(Object object) { - if (object == null) { - return null; - } - return JSON_FACADE.toJSONString(object); - } - - public static T parseObject(String text, Class clazz) { - if (StringUtil.isBlank(text)) { - return null; - } - return JSON_FACADE.parseObject(text, clazz); - } - - public static T parseObject(String text, TypeReference valueTypeRef) { - if (StringUtil.isBlank(text)) { - return null; - } - return JSON_FACADE.parseObject(text, valueTypeRef); - } - - public static List parseArray(String text, Class clazz) { - if (StringUtil.isBlank(text)) { - return Collections.emptyList(); - } - return JSON_FACADE.parseArray(text, clazz); - } - - public static boolean isJson(String json) { - if (StringUtil.isBlank(json)) { - return false; - } - return JSON_FACADE.isJson(json); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/JacksonHandler.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/JacksonHandler.java deleted file mode 100644 index 5148c5a3..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/JacksonHandler.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.api.JsonFacade; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.type.CollectionType; -import lombok.SneakyThrows; - -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.List; - -/** - * Jackson util. - */ -public class JacksonHandler implements JsonFacade { - - private static ObjectMapper MAPPER = new ObjectMapper(); - - static { - MAPPER.enable(JsonGenerator.Feature.IGNORE_UNKNOWN); - String dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; - MAPPER.setDateFormat(new SimpleDateFormat(dateTimeFormat)); - MAPPER.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); - MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL); - MAPPER.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); - } - - @Override - @SneakyThrows - public String toJSONString(Object object) { - return MAPPER.writeValueAsString(object); - } - - @Override - @SneakyThrows - public T parseObject(String text, Class clazz) { - JavaType javaType = MAPPER.getTypeFactory().constructType(clazz); - return MAPPER.readValue(text, javaType); - } - - @Override - @SneakyThrows - public T parseObject(String text, TypeReference valueTypeRef) { - return MAPPER.readValue(text, valueTypeRef); - } - - @Override - @SneakyThrows - public List parseArray(String text, Class clazz) { - CollectionType collectionType = MAPPER.getTypeFactory().constructCollectionType(ArrayList.class, clazz); - return MAPPER.readValue(text, collectionType); - } - - @Override - public boolean isJson(String text) { - try { - MAPPER.readTree(text); - return true; - } catch (JsonProcessingException ignored) { - } - return false; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/Joiner.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/Joiner.java deleted file mode 100644 index b6130d94..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/Joiner.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Iterator; -import java.util.Objects; - -/** - * reference google guava
- * com.google.common.base.Joiner - */ -public final class Joiner { - - private final String separator; - - private Joiner(String separator) { - this.separator = Objects.requireNonNull(separator); - } - - /** - * Returns a joiner which automatically places {@code separator} between consecutive elements. - */ - public static Joiner on(String separator) { - return new Joiner(separator); - } - - /** - * Returns a string containing the string representation of each of {@code parts}, using the - * previously configured separator between each. - */ - public String join(Object[] parts) { - return join(Arrays.asList(parts)); - } - - public String join(Iterable parts) { - return join(parts.iterator()); - } - - /** - * Returns a string containing the string representation of each of {@code parts}, using the - * previously configured separator between each. - */ - public String join(Iterator parts) { - return appendTo(new StringBuilder(), parts).toString(); - } - - public StringBuilder appendTo(StringBuilder builder, Iterator parts) { - try { - appendTo((Appendable) builder, parts); - } catch (IOException impossible) { - throw new AssertionError(impossible); - } - return builder; - } - - public A appendTo(A appendable, Iterator parts) throws IOException { - Objects.requireNonNull(appendable); - if (parts.hasNext()) { - appendable.append(toString(parts.next())); - while (parts.hasNext()) { - appendable.append(separator); - appendable.append(toString(parts.next())); - } - } - return appendable; - } - - CharSequence toString(Object part) { - Objects.requireNonNull(part); - return (part instanceof CharSequence) ? (CharSequence) part : part.toString(); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/MapUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/MapUtil.java deleted file mode 100644 index 3d2c3fef..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/MapUtil.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Dictionary; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.BiFunction; -import java.util.function.Predicate; - -/** - * Map util. - */ -public class MapUtil { - - /** - * Null-safe check if the specified Dictionary is empty. - * - *

Null returns true. - * - * @param map the collection to check, may be null - * @return true if empty or null - */ - public static boolean isEmpty(Map map) { - return (map == null || map.isEmpty()); - } - - /** - * Null-safe check if the specified Dictionary is empty. - * - *

Null returns true. - * - * @param coll the collection to check, may be null - * @return true if empty or null - */ - public static boolean isEmpty(Dictionary coll) { - return (coll == null || coll.isEmpty()); - } - - /** - * Null-safe check if the specified Dictionary is not empty. - * - *

Null returns false. - * - * @param map the collection to check, may be null - * @return true if non-null and non-empty - */ - public static boolean isNotEmpty(Map map) { - return !isEmpty(map); - } - - /** - * Null-safe check if the specified Dictionary is not empty. - * - *

Null returns false. - * - * @param coll the collection to check, may be null - * @return true if non-null and non-empty - */ - public static boolean isNotEmpty(Dictionary coll) { - return !isEmpty(coll); - } - - /** - * Put into map if value is not null. - * - * @param target target map - * @param key key - * @param value value - */ - public static void putIfValNoNull(Map target, Object key, Object value) { - Objects.requireNonNull(key, "key"); - if (value != null) { - target.put(key, value); - } - } - - /** - * Put into map if value is not empty. - * - * @param target target map - * @param key key - * @param value value - */ - public static void putIfValNoEmpty(Map target, Object key, Object value) { - Objects.requireNonNull(key, "key"); - if (value instanceof String) { - if (StringUtil.isNotEmpty((String) value)) { - target.put(key, value); - } - return; - } - if (value instanceof Collection) { - if (CollectionUtil.isNotEmpty((Collection) value)) { - target.put(key, value); - } - return; - } - if (value instanceof Map) { - if (isNotEmpty((Map) value)) { - target.put(key, value); - } - return; - } - if (value instanceof Dictionary) { - if (isNotEmpty((Dictionary) value)) { - target.put(key, value); - } - } - } - - /** - * ComputeIfAbsent lazy load. - * - * @param target target Map data. - * @param key map key. - * @param mappingFunction function which is need to be executed. - * @param param1 function's parameter value1. - * @param param2 function's parameter value1. - * @return - */ - public static V computeIfAbsent(Map target, K key, BiFunction mappingFunction, C param1, - T param2) { - Objects.requireNonNull(target, "target"); - Objects.requireNonNull(key, "key"); - Objects.requireNonNull(mappingFunction, "mappingFunction"); - Objects.requireNonNull(param1, "param1"); - Objects.requireNonNull(param2, "param2"); - V val = target.get(key); - if (val == null) { - V ret = mappingFunction.apply(param1, param2); - target.put(key, ret); - return ret; - } - return val; - } - - /** - * Fuzzy matching based on Key. - * - * @param sourceMap - * @param filters - * @return - */ - public static List parseMapForFilter(Map sourceMap, String filters) { - List resultList = new ArrayList<>(); - if (CollectionUtil.isEmpty(sourceMap)) { - return resultList; - } - sourceMap.forEach((key, val) -> { - if (checkKey(key, filters)) { - resultList.add(key); - } - }); - return resultList; - } - - /** - * Match the characters you want to query. - * - * @param key - * @param filters - * @return - */ - private static boolean checkKey(String key, String filters) { - return key.contains(filters); - } - - /** - * remove value, Thread safety depends on whether the Map is a thread-safe Map. - * - * @param map map - * @param key key - * @param removeJudge judge this key can be remove - * @param key type - * @param value type - * @return value - */ - public static V removeKey(Map map, K key, Predicate removeJudge) { - return map.computeIfPresent(key, (k, v) -> removeJudge.test(v) ? null : v); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/Md5Util.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/Md5Util.java deleted file mode 100644 index 1e410b02..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/Md5Util.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.common.model.ThreadPoolParameter; - -import java.io.IOException; -import java.net.URLEncoder; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.List; - -/** - * MD5 util. - * Refer to com.alibaba.nacos.common.util.Md5Utils:
- */ -public class Md5Util { - - private static final char[] DIGITS_LOWER = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; - - private static final char XF0 = 0xF0; - - private static final char XF = 0x0F; - - private static final int DATA_ID_GROUP_ID_THREE_LEN = 3; - - private static final int DATA_ID_GROUP_ID_FOUR_LEN = 4; - - private static final int DISPLACEMENT = 4; - - private static final ThreadLocal MESSAGE_DIGEST_LOCAL = ThreadLocal.withInitial(() -> { - try { - return MessageDigest.getInstance("MD5"); - } catch (NoSuchAlgorithmException e) { - return null; - } - }); - - public static String md5Hex(byte[] bytes) throws NoSuchAlgorithmException { - try { - MessageDigest messageDigest = MESSAGE_DIGEST_LOCAL.get(); - if (messageDigest != null) { - return encodeHexString(messageDigest.digest(bytes)); - } - throw new NoSuchAlgorithmException("MessageDigest get MD5 instance error"); - } finally { - MESSAGE_DIGEST_LOCAL.remove(); - } - } - - public static String md5Hex(String value, String encode) { - try { - return md5Hex(value.getBytes(encode)); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public static String encodeHexString(byte[] bytes) { - int l = bytes.length; - char[] out = new char[l << 1]; - for (int i = 0, j = 0; i < l; i++) { - out[j++] = DIGITS_LOWER[(XF0 & bytes[i]) >>> DISPLACEMENT]; - out[j++] = DIGITS_LOWER[XF & bytes[i]]; - } - return new String(out); - } - - public static String getTpContentMd5(ThreadPoolParameter config) { - return Md5Util.md5Hex(ContentUtil.getPoolContent(config), "UTF-8"); - } - - public static String compareMd5ResultString(List changedGroupKeys) throws IOException { - if (null == changedGroupKeys) { - return ""; - } - StringBuilder sb = new StringBuilder(); - for (String groupKey : changedGroupKeys) { - String[] dataIdGroupId = GroupKey.parseKey(groupKey); - sb.append(dataIdGroupId[0]); - sb.append(Constants.WORD_SEPARATOR); - sb.append(dataIdGroupId[1]); - // if have tenant, then set it - boolean b = (dataIdGroupId.length == DATA_ID_GROUP_ID_THREE_LEN - || dataIdGroupId.length == DATA_ID_GROUP_ID_FOUR_LEN) - && StringUtil.isNotBlank(dataIdGroupId[2]); - if (b) { - sb.append(Constants.WORD_SEPARATOR); - sb.append(dataIdGroupId[2]); - } - sb.append(Constants.LINE_SEPARATOR); - } - // To encode WORD_SEPARATOR and LINE_SEPARATOR invisible characters, encoded value is %02 and %01 - return URLEncoder.encode(sb.toString(), "UTF-8"); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/MemoryUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/MemoryUtil.java deleted file mode 100644 index ad2b0678..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/MemoryUtil.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.lang.management.ManagementFactory; -import java.lang.management.MemoryMXBean; -import java.lang.management.MemoryUsage; - -/** - * memory util
- * the obtained information is not real time effective, after a long wait, please get it again - * - * @author liuwenhao - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class MemoryUtil { - - static MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); - static MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage(); - static MemoryUsage noHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage(); - - /** - * get used memory in heap - * - * @return long bytes - */ - public static long heapMemoryUsed() { - return heapMemoryUsage.getUsed(); - } - - /** - * get max memory in heap - * - * @return long bytes - */ - public static long heapMemoryMax() { - return heapMemoryUsage.getMax(); - } - - /** - * get free memory in heap - * - * @return long bytes - */ - public static long heapMemoryFree() { - return Math.subtractExact(heapMemoryMax(), heapMemoryUsed()); - } - - /** - * get used memory in no-heap - * - * @return long bytes - */ - public static long noHeapMemoryUsed() { - return noHeapMemoryUsage.getUsed(); - } - - /** - * get max memory in no-heap - * - * @return long bytes - */ - public static long noHeapMemoryMax() { - return noHeapMemoryUsage.getMax(); - } - - /** - * get free memory in no-heap - * - * @return long bytes - */ - public static long noHeapMemoryFree() { - return Math.subtractExact(noHeapMemoryMax(), noHeapMemoryUsed()); - } - -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/MessageConvert.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/MessageConvert.java deleted file mode 100644 index fe8f0d3c..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/MessageConvert.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import cn.hippo4j.common.monitor.AbstractMessage; -import cn.hippo4j.common.monitor.Message; -import cn.hippo4j.common.monitor.MessageWrapper; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.SneakyThrows; - -/** - * Message convert. - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class MessageConvert { - - /** - * {@link Message} to {@link MessageWrapper}. - */ - public static MessageWrapper convert(Message message) { - MessageWrapper wrapper = new MessageWrapper(); - wrapper.setResponseClass(message.getClass()); - wrapper.setMessageType(message.getMessageType()); - List> messageMapList = new ArrayList<>(); - List messages = message.getMessages(); - messages.forEach(each -> { - String eachVal = JSONUtil.toJSONString(each); - Map mapObj = JSONUtil.parseObject(eachVal, Map.class); - messageMapList.add(mapObj); - }); - wrapper.setContentParams(messageMapList); - return wrapper; - } - - /** - * {@link MessageWrapper} to {@link Message}. - */ - @SneakyThrows - public static Message convert(MessageWrapper messageWrapper) { - AbstractMessage message = (AbstractMessage) messageWrapper.getResponseClass().getDeclaredConstructor().newInstance(); - List> contentParams = messageWrapper.getContentParams(); - List messages = new ArrayList(); - contentParams.forEach(each -> { - String eachVal = JSONUtil.toJSONString(each); - Message messageObj = JSONUtil.parseObject(eachVal, messageWrapper.getResponseClass()); - messages.add(messageObj); - }); - message.setMessages(messages); - message.setMessageType(messageWrapper.getMessageType()); - return message; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ReflectUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/ReflectUtil.java deleted file mode 100644 index 25ed782c..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ReflectUtil.java +++ /dev/null @@ -1,325 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.lang.reflect.AccessibleObject; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Reflect util.
- * Refer to cn.hutool.core.util.ReflectUtil:
- * {@link this#getFieldsDirectly(Class, boolean)}
- * {@link this#setFieldValue(Object, Field, Object)}
- * {@link this#getDefaultValue(Class)}
- */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ReflectUtil { - - private static final Map, Field[]> FIELDS_CACHE = new ConcurrentHashMap<>(); - - public static Object getFieldValue(Object obj, String fieldName) { - if (null == obj || StringUtil.isBlank(fieldName)) { - return null; - } - Field field = getField(obj instanceof Class ? (Class) obj : obj.getClass(), fieldName); - return getFieldValue(obj, field); - } - - public static Object getFieldValue(Object obj, Field field) { - if (null == field) { - return null; - } - if (obj instanceof Class) { - obj = null; - } - setAccessible(field); - Object result; - try { - result = field.get(obj); - } catch (IllegalAccessException e) { - String exceptionMsg = String.format("IllegalAccess for %s.%s", field.getDeclaringClass(), field.getName()); - throw new RuntimeException(exceptionMsg, e); - } - return result; - } - - public static T setAccessible(T accessibleObject) { - if (null != accessibleObject && !accessibleObject.isAccessible()) { - accessibleObject.setAccessible(true); - } - return accessibleObject; - } - - public static Field getField(Class beanClass, String name) throws SecurityException { - final Field[] fields = getFields(beanClass); - return ArrayUtil.firstMatch(field -> name.equals(getFieldName(field)), fields); - } - - public static Field[] getFields(Class beanClass) throws SecurityException { - Field[] allFields = FIELDS_CACHE.get(beanClass); - if (null != allFields) { - return allFields; - } - allFields = getFieldsDirectly(beanClass, true); - FIELDS_CACHE.put(beanClass, allFields); - return allFields; - } - - public static Field[] getFieldsDirectly(Class beanClass, boolean withSuperClassFields) throws SecurityException { - Assert.notNull(beanClass); - Field[] allFields = null; - Class searchType = beanClass; - Field[] declaredFields; - while (searchType != null) { - declaredFields = searchType.getDeclaredFields(); - if (null == allFields) { - allFields = declaredFields; - } else { - int length = allFields.length; - allFields = Arrays.copyOf(allFields, length + declaredFields.length); - System.arraycopy(declaredFields, 0, allFields, length, declaredFields.length); - } - searchType = withSuperClassFields ? searchType.getSuperclass() : null; - } - - return allFields; - } - - public static String getFieldName(Field field) { - if (null == field) { - return null; - } - return field.getName(); - } - - public static void setFieldValue(Object obj, String fieldName, Object value) throws RuntimeException { - Assert.notNull(obj); - Assert.notBlank(fieldName); - final Field field = getField((obj instanceof Class) ? (Class) obj : obj.getClass(), fieldName); - Assert.notNull(field, "Field [" + fieldName + "] is not exist in [" + obj.getClass().getName() + "]"); - setFieldValue(obj, field, value); - } - - public static void setFieldValue(Object obj, Field field, Object value) throws RuntimeException { - Assert.notNull(field, "Field in [" + obj + "] not exist !"); - final Class fieldType = field.getType(); - if (null != value) { - if (!fieldType.isAssignableFrom(value.getClass())) { - final Object targetValue = cast(fieldType, value); - if (null != targetValue) { - value = targetValue; - } - } - } else { - value = getDefaultValue(fieldType); - } - setAccessible(field); - try { - field.set(obj instanceof Class ? null : obj, value); - } catch (IllegalAccessException e) { - throw new RuntimeException("IllegalAccess for " + obj + "." + field.getName(), e); - } - } - - /** - * Find the method associated with the method name
- * if find multiple, return the first, parameter is equivocal. - * - * @param clazz the class - * @param methodName retrieves the method name - * @return find method - */ - public static Method getMethodByName(Class clazz, String methodName) { - if (Objects.nonNull(clazz) && Objects.nonNull(methodName)) { - Method method = Arrays.stream(clazz.getMethods()) - .filter(m -> Objects.equals(m.getName(), methodName)) - .findFirst().orElse(null); - if (method != null) { - return method; - } - return Arrays.stream(clazz.getDeclaredMethods()) - .filter(m -> Objects.equals(m.getName(), methodName)) - .findFirst().orElse(null); - } - return null; - } - - /** - * Find the method associated with the method name. - * - * @param clazz the class - * @param methodName retrieves the method name - * @param arguments matched parameters class - * @return find method - */ - public static Method getMethodByName(Class clazz, String methodName, Class... arguments) { - try { - if (Objects.nonNull(clazz) && Objects.nonNull(methodName)) { - return clazz.getMethod(methodName, arguments); - } - } catch (NoSuchMethodException e) { - throw new RuntimeException(e); - } - return null; - } - - /** - * Cast the value to the type
- * If a ClassCastException occurs, return null. - * - * @param clazz Cast class - * @param value The cast value - * @return The value after the cast is completed - */ - public static Object cast(Class clazz, Object value) { - try { - return clazz.cast(value); - } catch (ClassCastException e) { - return null; - } - } - - /** - * The default value is obtained if it is a primitive type, and NULL if it is not. - * - * @param clazz clazz - * @return default value - */ - public static Object getDefaultValue(Class clazz) { - if (Objects.isNull(clazz) || !clazz.isPrimitive()) { - return null; - } - if (long.class.isAssignableFrom(clazz)) { - return 0L; - } else if (int.class.isAssignableFrom(clazz)) { - return 0; - } else if (short.class.isAssignableFrom(clazz)) { - return (short) 0; - } else if (char.class.isAssignableFrom(clazz)) { - return (char) 0; - } else if (byte.class.isAssignableFrom(clazz)) { - return (byte) 0; - } else if (double.class.isAssignableFrom(clazz)) { - return 0D; - } else if (float.class.isAssignableFrom(clazz)) { - return 0f; - } else if (boolean.class.isAssignableFrom(clazz)) { - return false; - } - return null; - } - - /** - * Invoke. - * - * @param obj the obj - * @param methodName the method Name - * @param arguments parameters - * @return result for zhe method - */ - @SuppressWarnings("unchecked") - public static T invoke(Object obj, String methodName, Object... arguments) { - try { - Method method = ReflectUtil.getMethodByName(obj.getClass(), methodName); - if (method == null) { - throw new RuntimeException(methodName + "method not exists"); - } - ReflectUtil.setAccessible(method); - return (T) method.invoke(obj, arguments); - } catch (IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); - } - } - - /** - * Invoke. - * - * @param obj the obj - * @param method the method - * @param arguments parameters - * @return result for zhe method - */ - @SuppressWarnings("unchecked") - public static T invoke(Object obj, Method method, Object... arguments) { - try { - return (T) method.invoke(obj, arguments); - } catch (IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); - } - } - - /** - * Get instance. - * - * @param cls the class - * @return new Instance - */ - public static Object createInstance(Class cls) { - try { - return cls.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - /** - * Find field by fieldName and field-type. - * - * @param obj target obj - * @param filedName filedName - * @param fieldType fieldType - * @return target field or null - */ - public static Field findField(Object obj, String filedName, String fieldType) { - Field[] fields = ReflectUtil.getFields(obj.getClass()); - for (Field field : fields) { - if (field.getName().contains(filedName) - && (field.getType().getName().contains(fieldType))) { - return field; - } - } - return null; - } - - /** - * @param clazz - * @param methodName - * @param parameterTypes - * @return - */ - public static Method findDeclaredMethod(Class clazz, String methodName, Class[] parameterTypes) throws NoSuchMethodException { - Class cl = clazz; - while (cl != null) { - try { - return cl.getDeclaredMethod(methodName, parameterTypes); - } catch (NoSuchMethodException e) { - cl = cl.getSuperclass(); - } - } - throw new NoSuchMethodException(methodName); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/Singleton.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/Singleton.java deleted file mode 100644 index 03633e46..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/Singleton.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Supplier; - -/** - * Singleton object container. - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class Singleton { - - private static final ConcurrentHashMap SINGLE_OBJECT_POOL = new ConcurrentHashMap<>(); - - /** - * Get a singleton object by key. - * - * @param key - * @param - * @return - */ - public static T get(String key) { - Object result = SINGLE_OBJECT_POOL.get(key); - return result == null ? null : (T) result; - } - - /** - * Get a singleton object by key. - * - *

When empty, build a singleton object through supplier and put it into the container. - * - * @param key - * @param supplier - * @param - * @return - */ - public static T get(String key, Supplier supplier) { - Object result = SINGLE_OBJECT_POOL.get(key); - if (result == null) { - result = supplier.get(); - if (result != null) { - SINGLE_OBJECT_POOL.put(key, result); - } - } - return result != null ? (T) result : null; - } - - /** - * Object into container. - * - * @param value - */ - public static void put(Object value) { - put(value.getClass().getName(), value); - } - - /** - * Object into container. - * - * @param key - * @param value - */ - public static void put(String key, Object value) { - SINGLE_OBJECT_POOL.put(key, value); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/StringUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/StringUtil.java deleted file mode 100644 index d8506506..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/StringUtil.java +++ /dev/null @@ -1,458 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.constant.MagicNumberConstants; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * String util.
- * Refer to cn.hutool.core.util.StrUtil:
- * {@link this#toSymbolCase(CharSequence, char)}
- * {@link this#toCamelCase(CharSequence, char)}
- * {@link this#subBefore(String, String)}
- */ -public class StringUtil { - - public static final String EMPTY = ""; - - public static final char UNDERLINE = '_'; - - public static final String[] EMPTY_ARRAY = new String[0]; - - /** - * Returns the given string if it is nonempty; {@code null} otherwise. - * - * @param str - * @return - */ - public static String emptyToNull(String str) { - return (str == null || str.isEmpty()) ? null : str; - } - - /** - * Returns the given string if it is non-null; the empty string otherwise. - * - * @param str - * @return - */ - public static String nullToEmpty(String str) { - return str == null ? "" : str; - } - - /** - * Returns {@code true} if the given string is null or is the empty string. - *

- * this method has been deprecated, use isEmpty() instead. - * - * @param str - * @return - */ - @Deprecated - public static boolean isNullOrEmpty(String str) { - return str == null || str.isEmpty(); - } - - /** - * Is blank. - * - * @param str - * @return - */ - public static boolean isBlank(CharSequence str) { - if ((str == null)) { - return true; - } - int length = str.length(); - if (length == 0) { - return true; - } - for (int i = 0; i < length; i++) { - char c = str.charAt(i); - boolean charNotBlank = Character.isWhitespace(c) || Character.isSpaceChar(c) || c == '\ufeff' || c == '\u202a'; - if (!charNotBlank) { - return false; - } - } - return true; - } - - /** - * Is empty. - * - * @param str - * @return - */ - public static boolean isEmpty(CharSequence str) { - return str == null || str.length() == 0; - } - - /** - * Is not empty. - * - * @param str - * @return - */ - public static boolean isNotEmpty(CharSequence str) { - return !isEmpty(str); - } - - /** - * Is not blank. - * - * @param str - * @return - */ - public static boolean isNotBlank(CharSequence str) { - return !isBlank(str); - } - - /** - * Is all not empty. - * - * @param args - * @return - */ - public static boolean isAllNotEmpty(CharSequence... args) { - return !hasEmpty(args); - } - - /** - * Has empty. - * - * @param strList - * @return - */ - public static boolean hasEmpty(CharSequence... strList) { - if (ArrayUtil.isEmpty(strList)) { - return true; - } - - for (CharSequence str : strList) { - if (isEmpty(str)) { - return true; - } - } - return false; - } - - /** - * To underline case. - * - * @param str - * @return - */ - public static String toUnderlineCase(CharSequence str) { - return toSymbolCase(str, UNDERLINE); - } - - /** - * To symbol case. - * - * @param str - * @param symbol - * @return - */ - public static String toSymbolCase(CharSequence str, char symbol) { - if (str == null) { - return null; - } - - final int length = str.length(); - final StringBuilder sb = new StringBuilder(); - char c; - for (int i = 0; i < length; i++) { - c = str.charAt(i); - final Character preChar = (i > 0) ? str.charAt(i - 1) : null; - if (Character.isUpperCase(c)) { - final Character nextChar = (i < str.length() - 1) ? str.charAt(i + 1) : null; - if (null != preChar && Character.isUpperCase(preChar)) { - sb.append(c); - } else if (null != nextChar && Character.isUpperCase(nextChar)) { - if (null != preChar && symbol != preChar) { - sb.append(symbol); - } - sb.append(c); - } else { - if (null != preChar && symbol != preChar) { - sb.append(symbol); - } - sb.append(Character.toLowerCase(c)); - } - } else { - if (sb.length() > 0 && Character.isUpperCase(sb.charAt(sb.length() - 1)) && symbol != c) { - sb.append(symbol); - } - sb.append(c); - } - } - return sb.toString(); - } - - /** - * to camel case - * - * @param str CharSequence - * @param symbol symbol - * @return toCamelCase String - */ - public static String toCamelCase(CharSequence str, char symbol) { - if (null == str || str.length() == 0) { - return null; - } - int length = str.length(); - StringBuilder sb = new StringBuilder(length); - boolean upperCase = false; - for (int i = 0; i < length; ++i) { - char c = str.charAt(i); - if (c == symbol) { - upperCase = true; - } else if (upperCase) { - sb.append(Character.toUpperCase(c)); - upperCase = false; - } else { - sb.append(c); - } - } - return sb.toString(); - } - - /** - * combination CharSequence, get a String - * - * @param charSequences CharSequence, if null or empty, get {@link StringUtil#EMPTY} - * @return String - */ - public static String newBuilder(CharSequence... charSequences) { - if (charSequences == null || charSequences.length == 0) { - return StringUtil.EMPTY; - } - return createBuilder(charSequences).toString(); - } - - /** - * combination CharSequence, get a StringBuilder - * - * @param charSequences CharSequence - * @return StringBuilder - */ - public static StringBuilder createBuilder(CharSequence... charSequences) { - StringBuilder builder = new StringBuilder(); - if (charSequences == null || charSequences.length == 0) { - return builder; - } - for (CharSequence sequence : charSequences) { - builder.append(sequence); - } - return builder; - } - - /** - * combination CharSequence, to StringBuilder - * - * @param builder StringBuilder, if null create a new - * @param charSequences CharSequence - * @return StringBuilder - */ - public static StringBuilder appends(StringBuilder builder, CharSequence... charSequences) { - if (builder == null) { - return createBuilder(charSequences); - } - if (charSequences == null || charSequences.length == 0) { - return builder; - } - for (CharSequence sequence : charSequences) { - builder.append(sequence); - } - return builder; - } - - /** - * Replace a portion of the string, replacing all found - * - * @param str A string to operate on - * @param searchStr The replaced string - * @param replaceStr The replaced string - * @return Replace the result - */ - public static String replace(String str, String searchStr, String replaceStr) { - return Pattern - .compile(searchStr, Pattern.LITERAL) - .matcher(str) - .replaceAll(Matcher.quoteReplacement(replaceStr)); - } - - /** - *

Splits the provided text into an array, separators specified. - * - *

-     * StringUtils.split(null, *)         = null
-     * StringUtils.split("", *)           = []
-     * StringUtils.split("abc def", null) = ["abc", "def"]
-     * StringUtils.split("abc def", " ")  = ["abc", "def"]
-     * StringUtils.split("ab:cd:ef", ":") = ["ab", "cd", "ef"]
-     * 
- * - * @param str the String to parse, may be null - * @param separatorChars the characters used as the delimiters, - * @return an array of parsed Strings - */ - public static String[] split(final String str, final String separatorChars) { - if (str == null) { - return null; - } - if (isBlank(str)) { - return EMPTY_ARRAY; - } - if (isBlank(separatorChars)) { - return str.split(" "); - } - return str.split(separatorChars); - } - - /** - * Tests if this string starts with the specified prefix. - * - * @param str this str - * @param prefix the suffix - * @return Whether the prefix exists - */ - public static boolean startWith(String str, String prefix) { - if (isEmpty(str)) { - return false; - } - return str.startsWith(prefix); - } - - /** - * get the string before the delimiter - * - * @param str string - * @param symbol separator - * @return String - */ - public static String subBefore(String str, String symbol) { - if (isEmpty(str) || symbol == null) { - return str; - } - if (symbol.isEmpty()) { - return EMPTY; - } - int pos = str.indexOf(symbol); - if (MagicNumberConstants.INDEX_NEGATIVE_1 == pos) { - return str; - } - if (MagicNumberConstants.INDEX_0 == pos) { - return EMPTY; - } - return str.substring(0, pos); - } - - /** - * Determine whether it is a string. - * - * @param str string - * @return String returns true, non-string returns false - */ - public static boolean hasText(String str) { - return (str != null && !str.isEmpty() && containsText(str)); - } - - /** - * Whether to contain a string. - * - * @param str str - * @return String returns true, non-string returns false - */ - private static boolean containsText(CharSequence str) { - int strLen = str.length(); - for (int i = 0; i < strLen; i++) { - if (!Character.isWhitespace(str.charAt(i))) { - return true; - } - } - return false; - } - - public static String join(final char delimiter, final String... strings) { - if (strings.length == 0) { - return null; - } - if (strings.length == 1) { - return strings[0]; - } - int length = strings.length - 1; - for (final String s : strings) { - if (s == null) { - continue; - } - length += s.length(); - } - final StringBuilder sb = new StringBuilder(length); - if (strings[0] != null) { - sb.append(strings[0]); - } - for (int i = 1; i < strings.length; ++i) { - if (!isEmpty(strings[i])) { - sb.append(delimiter).append(strings[i]); - } else { - sb.append(delimiter); - } - } - return sb.toString(); - } - - public static boolean substringMatch(CharSequence str, int index, CharSequence substring) { - if (index + substring.length() > str.length()) { - return false; - } - for (int i = 0; i < substring.length(); i++) { - if (str.charAt(index + i) != substring.charAt(i)) { - return false; - } - } - return true; - } - - public static String cut(String str, int threshold) { - if (isEmpty(str) || str.length() <= threshold) { - return str; - } - return str.substring(0, threshold); - } - - public static String trim(final String str, final char ch) { - if (isEmpty(str)) { - return null; - } - - final char[] chars = str.toCharArray(); - - int i = 0, j = chars.length - 1; - // noinspection StatementWithEmptyBody - for (; i < chars.length && chars[i] == ch; i++) { - } - // noinspection StatementWithEmptyBody - for (; j > 0 && chars[j] == ch; j--) { - } - - return new String(chars, i, j - i + 1); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ThreadPoolExecutorUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/ThreadPoolExecutorUtil.java deleted file mode 100644 index ae600924..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ThreadPoolExecutorUtil.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.util.concurrent.ThreadPoolExecutor; - -/** - * Thread pool util - * - * @author yangjie - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class ThreadPoolExecutorUtil { - - /** - * Set the thread pool size in a safe way. - *

- * see https://github.com/opengoofy/hippo4j/issues/1072 - */ - public static void safeSetPoolSize(ThreadPoolExecutor executor, int newCorePoolSize, int newMaximumPoolSize) { - Assert.isTrue(newCorePoolSize <= newMaximumPoolSize, "newCorePoolSize must be smaller than newMaximumPoolSize"); - int originalMaximumPoolSize = executor.getMaximumPoolSize(); - if (newCorePoolSize > originalMaximumPoolSize) { - executor.setMaximumPoolSize(newMaximumPoolSize); - executor.setCorePoolSize(newCorePoolSize); - } else { - executor.setCorePoolSize(newCorePoolSize); - executor.setMaximumPoolSize(newMaximumPoolSize); - } - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ThreadUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/ThreadUtil.java deleted file mode 100644 index faf39c49..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/ThreadUtil.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -/** - * Thread util. - */ -public class ThreadUtil { - - /** - * New thread. - * - * @param runnable - * @param name - * @param isDaemon - * @return {@link Thread} - */ - public static Thread newThread(Runnable runnable, String name, boolean isDaemon) { - Thread t = new Thread(null, runnable, name); - t.setDaemon(isDaemon); - return t; - } - - /** - * Suspend the current thread. - * - * @param millis - * @return - */ - public static boolean sleep(long millis) { - if (millis > 0) { - try { - Thread.sleep(millis); - } catch (InterruptedException e) { - return false; - } - } - return true; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/UserContext.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/UserContext.java deleted file mode 100644 index 22c1a286..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/UserContext.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.Optional; - -/** - * User context (Transition scheme). - */ -public class UserContext { - - private static final ThreadLocal USER_THREAD_LOCAL = new ThreadLocal<>(); - - public static void setUserInfo(String username, String userRole) { - USER_THREAD_LOCAL.set(new User(username, userRole)); - } - - public static String getUserName() { - return Optional.ofNullable(USER_THREAD_LOCAL.get()).map(User::getUsername).orElse(""); - } - - public static String getUserRole() { - return Optional.ofNullable(USER_THREAD_LOCAL.get()).map(User::getUserRole).orElse(""); - } - - public static void clear() { - USER_THREAD_LOCAL.remove(); - } - - /** - * User info. - */ - @Data - @NoArgsConstructor - @AllArgsConstructor - static class User { - - private String username; - - private String userRole; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/VersionUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/VersionUtil.java deleted file mode 100644 index 3284924d..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/VersionUtil.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import java.util.Map; -import java.util.NavigableMap; -import java.util.Objects; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Version related utility methods. - * - *

This utility centralises how Hippo4j resolves client versions from - * different sources (pom, manifest) and how those versions map to the - * incremental protocol version used for MD5 comparison.

- */ -public final class VersionUtil { - - public static final String UNKNOWN_VERSION = "0.0.0"; - - private static final Pattern VERSION_PATTERN = Pattern.compile("(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?.*"); - - private VersionUtil() { - } - - /** - * Resolve the client version string. First non blank candidate will be returned; - * if all candidates are blank the method falls back to the Implementation-Version - * from the provided class' package, and finally to {@code 0.0.0}. - * - * @param explicitVersion explicit version string provided by caller (can be null) - * @param fallbackClass class whose package can provide an Implementation-Version - * @return resolved version string, never {@code null} - */ - public static String resolveClientVersion(String explicitVersion, Class fallbackClass) { - String candidate = firstNonBlank(explicitVersion); - if (StringUtil.isBlank(candidate) && fallbackClass != null) { - Package pkg = fallbackClass.getPackage(); - if (pkg != null) { - candidate = pkg.getImplementationVersion(); - } - } - if (StringUtil.isBlank(candidate)) { - return UNKNOWN_VERSION; - } - return candidate.trim(); - } - - /** - * Compare two semantic versions using {@link SemanticVersion}. Returns {@code true} if - * {@code version1} is greater than or equal to {@code version2}. Blank or unparsable versions - * are treated conservatively and will return {@code false}. - * - * @param version1 the client version - * @param version2 the minimum version requirement - * @return {@code true} if version1 >= version2 - */ - public static boolean isVersionGreaterOrEqual(String version1, String version2) { - if (StringUtil.isBlank(version1) || StringUtil.isBlank(version2)) { - return false; - } - SemanticVersion v1 = SemanticVersion.parse(version1); - SemanticVersion v2 = SemanticVersion.parse(version2); - if (v1 == null || v2 == null) { - return false; - } - return v1.compareTo(v2) >= 0; - } - - /** - * Return the first non-blank value from the provided arguments. - * - * @param values variable arguments to check - * @return first non-blank value, or {@code null} if all are blank - */ - private static String firstNonBlank(String... values) { - if (values == null) { - return null; - } - for (String value : values) { - if (StringUtil.isNotBlank(value)) { - return value; - } - } - return null; - } - - /** - * Lightweight immutable semantic version implementation (major.minor.patch). - */ - private static final class SemanticVersion implements Comparable { - - private final int major; - private final int minor; - private final int patch; - - private SemanticVersion(int major, int minor, int patch) { - this.major = major; - this.minor = minor; - this.patch = patch; - } - - /** - * Parse a semantic version string into a SemanticVersion instance. - * - * @param version version string (e.g., "2.1.5", "2.0.0-SNAPSHOT") - * @return parsed SemanticVersion, or {@code null} if format is invalid - */ - private static SemanticVersion parse(String version) { - Matcher matcher = VERSION_PATTERN.matcher(version.trim()); - if (!matcher.matches()) { - return null; - } - int major = parseOrDefault(matcher.group(1)); - int minor = parseOrDefault(matcher.group(2)); - int patch = parseOrDefault(matcher.group(3)); - return new SemanticVersion(major, minor, patch); - } - - /** - * Parse a version component string to integer, defaulting to 0 if blank. - * - * @param value version component string - * @return parsed integer, or 0 if blank - */ - private static int parseOrDefault(String value) { - if (StringUtil.isBlank(value)) { - return 0; - } - return Integer.parseInt(value); - } - - @Override - public int compareTo(SemanticVersion other) { - if (other == null) { - return 1; - } - if (major != other.major) { - return Integer.compare(major, other.major); - } - if (minor != other.minor) { - return Integer.compare(minor, other.minor); - } - return Integer.compare(patch, other.patch); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof SemanticVersion)) { - return false; - } - SemanticVersion that = (SemanticVersion) obj; - return major == that.major && minor == that.minor && patch == that.patch; - } - - @Override - public int hashCode() { - return Objects.hash(major, minor, patch); - } - - @Override - public String toString() { - return major + "." + minor + "." + patch; - } - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/agent/ConfigInitializer.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/agent/ConfigInitializer.java deleted file mode 100644 index d1b250e9..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/agent/ConfigInitializer.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit.agent; - -import cn.hippo4j.common.toolkit.StringUtil; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.*; - -/** - * Init a class's static fields by a {@link Properties}, including static fields and static inner classes. - *

- */ -public class ConfigInitializer { - - public static void initialize(Properties properties, Class rootConfigType) throws IllegalAccessException { - initNextLevel(properties, rootConfigType, new ConfigDesc(), false); - } - - public static void initialize(Properties properties, Class rootConfigType, boolean isSpringProperties) throws IllegalAccessException { - initNextLevel(properties, rootConfigType, new ConfigDesc(), isSpringProperties); - } - - private static void initNextLevel(Properties properties, Class recentConfigType, - ConfigDesc parentDesc, boolean isSpringProperties) throws IllegalArgumentException, IllegalAccessException { - for (Field field : recentConfigType.getFields()) { - if (Modifier.isPublic(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) { - String configKey = (parentDesc + "." + (isSpringProperties ? field.getName().replace("_", "-") : field.getName())).toLowerCase(); - Class type = field.getType(); - - if (type.equals(Map.class)) { - /* - * Map config format is, config_key[map_key]=map_value Such as plugin.opgroup.resttemplate.rule[abc]=/url/path - */ - // Deduct two generic types of the map - ParameterizedType genericType = (ParameterizedType) field.getGenericType(); - Type[] argumentTypes = genericType.getActualTypeArguments(); - - Type keyType = null; - Type valueType = null; - if (argumentTypes != null && argumentTypes.length == 2) { - // Get key type and value type of the map - keyType = argumentTypes[0]; - valueType = argumentTypes[1]; - } - Map map = (Map) field.get(null); - // Set the map from config key and properties - setForMapType(configKey, map, properties, keyType, valueType); - } else { - /* - * Others typical field type - */ - String value = properties.getProperty(configKey); - // Convert the value into real type - final Length lengthDefine = field.getAnnotation(Length.class); - if (lengthDefine != null) { - if (value != null && value.length() > lengthDefine.value()) { - value = value.substring(0, lengthDefine.value()); - } - } - Object convertedValue = convertToTypicalType(type, value); - if (convertedValue != null) { - field.set(null, convertedValue); - } - } - } - } - for (Class innerConfiguration : recentConfigType.getClasses()) { - String simpleName = innerConfiguration.getSimpleName(); - String description = isSpringProperties ? simpleName.replace("_", "-") : simpleName; - parentDesc.append(description); - initNextLevel(properties, innerConfiguration, parentDesc, isSpringProperties); - parentDesc.removeLastDesc(); - } - } - - /** - * Convert string value to typical type. - * - * @param type type to convert - * @param value string value to be converted - * @return converted value or null - */ - private static Object convertToTypicalType(Type type, String value) { - if (value == null || type == null) { - return null; - } - - Object result = null; - if (String.class.equals(type)) { - result = value; - } else if (int.class.equals(type) || Integer.class.equals(type)) { - result = Integer.valueOf(value); - } else if (long.class.equals(type) || Long.class.equals(type)) { - result = Long.valueOf(value); - } else if (boolean.class.equals(type) || Boolean.class.equals(type)) { - result = Boolean.valueOf(value); - } else if (float.class.equals(type) || Float.class.equals(type)) { - result = Float.valueOf(value); - } else if (double.class.equals(type) || Double.class.equals(type)) { - result = Double.valueOf(value); - } else if (List.class.equals(type)) { - result = convert2List(value); - } else if (type instanceof Class) { - Class clazz = (Class) type; - if (clazz.isEnum()) { - result = Enum.valueOf((Class) type, value.toUpperCase()); - } - } - return result; - } - - /** - * Set map items. - * - * @param configKey config key must not be null - * @param map map to set must not be null - * @param properties properties must not be null - * @param keyType key type of the map - * @param valueType value type of the map - */ - private static void setForMapType(String configKey, Map map, Properties properties, - final Type keyType, final Type valueType) { - - Objects.requireNonNull(configKey); - Objects.requireNonNull(map); - Objects.requireNonNull(properties); - - String prefix = configKey + "["; - String suffix = "]"; - - properties.forEach((propertyKey, propertyValue) -> { - String propertyStringKey = propertyKey.toString(); - if (propertyStringKey.startsWith(prefix) && propertyStringKey.endsWith(suffix)) { - String itemKey = propertyStringKey.substring( - prefix.length(), propertyStringKey.length() - suffix.length()); - Object keyObj; - Object valueObj; - - keyObj = convertToTypicalType(keyType, itemKey); - valueObj = convertToTypicalType(valueType, propertyValue.toString()); - - if (keyObj == null) { - keyObj = itemKey; - } - - if (valueObj == null) { - valueObj = propertyValue; - } - - map.put(keyObj, valueObj); - } - }); - } - - private static List convert2List(String value) { - if (StringUtil.isEmpty(value)) { - return Collections.emptyList(); - } - List result = new LinkedList<>(); - - String[] segments = value.split(","); - for (String segment : segments) { - String trimmedSegment = segment.trim(); - if (StringUtil.isNotEmpty(trimmedSegment)) { - result.add(trimmedSegment); - } - } - return result; - } - -} - -class ConfigDesc { - - private LinkedList descs = new LinkedList<>(); - - void append(String currentDesc) { - if (StringUtil.isNotEmpty(currentDesc)) { - descs.addLast(currentDesc); - } - } - - void removeLastDesc() { - descs.removeLast(); - } - - @Override - public String toString() { - return String.join(".", descs); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/agent/Length.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/agent/Length.java deleted file mode 100644 index f926a9da..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/agent/Length.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit.agent; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * The length rule of the target field. - */ -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface Length { - - int value(); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/agent/PlaceholderConfigurerSupport.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/agent/PlaceholderConfigurerSupport.java deleted file mode 100644 index df6d59ec..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/agent/PlaceholderConfigurerSupport.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit.agent; - -public class PlaceholderConfigurerSupport { - - /** - * Default placeholder prefix: {@value} - */ - public static final String DEFAULT_PLACEHOLDER_PREFIX = "${"; - - /** - * Default placeholder suffix: {@value} - */ - public static final String DEFAULT_PLACEHOLDER_SUFFIX = "}"; - - /** - * Default value separator: {@value} - */ - public static final String DEFAULT_VALUE_SEPARATOR = ":"; - -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/agent/PropertyPlaceholderHelper.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/agent/PropertyPlaceholderHelper.java deleted file mode 100644 index 8d945584..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/agent/PropertyPlaceholderHelper.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit.agent; - -import cn.hippo4j.common.toolkit.StringUtil; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - -/** - * Utility class for working with Strings that have placeholder values in them. A placeholder takes the form {@code - * ${name}}. Using {@code PropertyPlaceholderHelper} these placeholders can be substituted for user-supplied values.

- * Values for substitution can be supplied using a {@link Properties} instance or using a {@link PlaceholderResolver}. - */ -public enum PropertyPlaceholderHelper { - - INSTANCE( - PlaceholderConfigurerSupport.DEFAULT_PLACEHOLDER_PREFIX, - PlaceholderConfigurerSupport.DEFAULT_PLACEHOLDER_SUFFIX, PlaceholderConfigurerSupport.DEFAULT_VALUE_SEPARATOR, - true); - - private final String placeholderPrefix; - - private final String placeholderSuffix; - - private final String simplePrefix; - - private final String valueSeparator; - - private final boolean ignoreUnresolvablePlaceholders; - - /** - * Creates a new {@code PropertyPlaceholderHelper} that uses the supplied prefix and suffix. - * - * @param placeholderPrefix the prefix that denotes the start of a placeholder - * @param placeholderSuffix the suffix that denotes the end of a placeholder - * @param valueSeparator the separating character between the placeholder variable and the - * associated default value, if any - * @param ignoreUnresolvablePlaceholders indicates whether unresolvable placeholders should be ignored ({@code - * true}) or cause an exception ({@code false}) - */ - PropertyPlaceholderHelper(String placeholderPrefix, String placeholderSuffix, String valueSeparator, - boolean ignoreUnresolvablePlaceholders) { - if (StringUtil.isEmpty(placeholderPrefix) || StringUtil.isEmpty(placeholderSuffix)) { - throw new UnsupportedOperationException("'placeholderPrefix or placeholderSuffix' must not be null"); - } - - final Map wellKnownSimplePrefixes = new HashMap(4); - - wellKnownSimplePrefixes.put("}", "{"); - wellKnownSimplePrefixes.put("]", "["); - wellKnownSimplePrefixes.put(")", "("); - - this.placeholderPrefix = placeholderPrefix; - this.placeholderSuffix = placeholderSuffix; - String simplePrefixForSuffix = wellKnownSimplePrefixes.get(this.placeholderSuffix); - if (simplePrefixForSuffix != null && this.placeholderPrefix.endsWith(simplePrefixForSuffix)) { - this.simplePrefix = simplePrefixForSuffix; - } else { - this.simplePrefix = this.placeholderPrefix; - } - this.valueSeparator = valueSeparator; - this.ignoreUnresolvablePlaceholders = ignoreUnresolvablePlaceholders; - } - - /** - * Replaces all placeholders of format {@code ${name}} with the corresponding property from the supplied {@link - * Properties}. - * - * @param value the value containing the placeholders to be replaced - * @param properties the {@code Properties} to use for replacement - * @return the supplied value with placeholders replaced inline - */ - public String replacePlaceholders(String value, final Properties properties) { - return replacePlaceholders(value, new PlaceholderResolver() { - - @Override - public String resolvePlaceholder(String placeholderName) { - return getConfigValue(placeholderName, properties); - } - }); - } - - private String getConfigValue(String key, final Properties properties) { - String value = System.getProperty(key); - if (value == null) { - value = System.getenv(key); - } - if (value == null) { - value = properties.getProperty(key); - } - return value; - } - - /** - * Replaces all placeholders of format {@code ${name}} with the value returned from the supplied {@link - * PlaceholderResolver}. - * - * @param value the value containing the placeholders to be replaced - * @param placeholderResolver the {@code PlaceholderResolver} to use for replacement - * @return the supplied value with placeholders replaced inline - */ - public String replacePlaceholders(String value, PlaceholderResolver placeholderResolver) { - return parseStringValue(value, placeholderResolver, new HashSet()); - } - - protected String parseStringValue(String value, PlaceholderResolver placeholderResolver, - Set visitedPlaceholders) { - - StringBuilder result = new StringBuilder(value); - - int startIndex = value.indexOf(this.placeholderPrefix); - while (startIndex != -1) { - int endIndex = findPlaceholderEndIndex(result, startIndex); - if (endIndex != -1) { - String placeholder = result.substring(startIndex + this.placeholderPrefix.length(), endIndex); - String originalPlaceholder = placeholder; - if (!visitedPlaceholders.add(originalPlaceholder)) { - throw new IllegalArgumentException( - "Circular placeholder reference '" + originalPlaceholder + "' in property definitions"); - } - // Recursive invocation, parsing placeholders contained in the placeholder key. - placeholder = parseStringValue(placeholder, placeholderResolver, visitedPlaceholders); - // Now obtain the value for the fully resolved key... - String propVal = placeholderResolver.resolvePlaceholder(placeholder); - if (propVal == null && this.valueSeparator != null) { - int separatorIndex = placeholder.indexOf(this.valueSeparator); - if (separatorIndex != -1) { - String actualPlaceholder = placeholder.substring(0, separatorIndex); - String defaultValue = placeholder.substring(separatorIndex + this.valueSeparator.length()); - propVal = placeholderResolver.resolvePlaceholder(actualPlaceholder); - if (propVal == null) { - propVal = defaultValue; - } - } - } - if (propVal != null) { - // Recursive invocation, parsing placeholders contained in the - // previously resolved placeholder value. - propVal = parseStringValue(propVal, placeholderResolver, visitedPlaceholders); - result.replace(startIndex, endIndex + this.placeholderSuffix.length(), propVal); - startIndex = result.indexOf(this.placeholderPrefix, startIndex + propVal.length()); - } else if (this.ignoreUnresolvablePlaceholders) { - // Proceed with unprocessed value. - startIndex = result.indexOf(this.placeholderPrefix, endIndex + this.placeholderSuffix.length()); - } else { - throw new IllegalArgumentException( - "Could not resolve placeholder '" + placeholder + "'" + " in value \"" + value + "\""); - } - visitedPlaceholders.remove(originalPlaceholder); - } else { - startIndex = -1; - } - } - return result.toString(); - } - - private int findPlaceholderEndIndex(CharSequence buf, int startIndex) { - int index = startIndex + this.placeholderPrefix.length(); - int withinNestedPlaceholder = 0; - while (index < buf.length()) { - if (StringUtil.substringMatch(buf, index, this.placeholderSuffix)) { - if (withinNestedPlaceholder > 0) { - withinNestedPlaceholder--; - index = index + this.placeholderSuffix.length(); - } else { - return index; - } - } else if (StringUtil.substringMatch(buf, index, this.simplePrefix)) { - withinNestedPlaceholder++; - index = index + this.simplePrefix.length(); - } else { - index++; - } - } - return -1; - } - - /** - * Strategy interface used to resolve replacement values for placeholders contained in Strings. - */ - public interface PlaceholderResolver { - - /** - * Resolve the supplied placeholder name to the replacement value. - * - * @param placeholderName the name of the placeholder to resolve - * @return the replacement value, or {@code null} if no replacement is to be made - */ - String resolvePlaceholder(String placeholderName); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/agent/RunnableWithExceptionProtection.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/agent/RunnableWithExceptionProtection.java deleted file mode 100644 index f4179cf1..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/agent/RunnableWithExceptionProtection.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit.agent; - -public class RunnableWithExceptionProtection implements Runnable { - - private Runnable run; - private CallbackWhenException callback; - - public RunnableWithExceptionProtection(Runnable run, CallbackWhenException callback) { - this.run = run; - this.callback = callback; - } - - @Override - public void run() { - try { - run.run(); - } catch (Throwable t) { - callback.handle(t); - } - } - - public interface CallbackWhenException { - - void handle(Throwable t); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/http/Header.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/http/Header.java deleted file mode 100644 index 79d315d5..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/http/Header.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit.http; - -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.common.constant.HttpHeaderConstants; -import cn.hippo4j.common.constant.HttpMediaType; -import cn.hippo4j.common.toolkit.MapUtil; -import cn.hippo4j.common.toolkit.StringUtil; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -/** - * Http header. - * - * @author liaochuntao - */ -public final class Header { - - public static final Header EMPTY = Header.newInstance(); - - private final Map header; - - private final Map> originalResponseHeader; - - private static final String DEFAULT_CHARSET = "UTF-8"; - - private static final String DEFAULT_ENCODING = "gzip"; - - private Header() { - header = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - originalResponseHeader = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - addParam(HttpHeaderConstants.CONTENT_TYPE, HttpMediaType.APPLICATION_JSON); - addParam(HttpHeaderConstants.ACCEPT_CHARSET, DEFAULT_CHARSET); - } - - public static Header newInstance() { - return new Header(); - } - - /** - * Add the key and value to the header. - * - * @param key the key - * @param value the value - * @return header - */ - public Header addParam(String key, String value) { - if (StringUtil.isNotEmpty(key)) { - header.put(key, value); - } - return this; - } - - public Header setContentType(String contentType) { - if (contentType == null) { - contentType = HttpMediaType.APPLICATION_JSON; - } - return addParam(HttpHeaderConstants.CONTENT_TYPE, contentType); - } - - public Header build() { - return this; - } - - public String getValue(String key) { - return header.get(key); - } - - public Map getHeader() { - return header; - } - - public Iterator> iterator() { - return header.entrySet().iterator(); - } - - /** - * Transfer to KV part list. The odd index is key and the even index is value. - * - * @return KV string list - */ - public List toList() { - List list = new ArrayList<>(header.size() * 2); - Iterator> iterator = iterator(); - while (iterator.hasNext()) { - Map.Entry entry = iterator.next(); - list.add(entry.getKey()); - list.add(entry.getValue()); - } - return list; - } - - /** - * Add all KV list to header. The odd index is key and the even index is value. - * - * @param list KV list - * @return header - */ - public Header addAll(List list) { - if ((list.size() & 1) != 0) { - throw new IllegalArgumentException("list size must be a multiple of 2"); - } - for (int i = 0; i < list.size();) { - String key = list.get(i++); - if (StringUtil.isNotEmpty(key)) { - header.put(key, list.get(i++)); - } - } - return this; - } - - /** - * Add all parameters to header. - * - * @param params parameters - */ - public void addAll(Map params) { - if (MapUtil.isNotEmpty(params)) { - for (Map.Entry entry : params.entrySet()) { - addParam(entry.getKey(), entry.getValue()); - } - } - } - - /** - * set original format response header. - * - *

Currently only corresponds to the response header of JDK. - * - * @param key original response header key - * @param values original response header values - */ - public void addOriginalResponseHeader(String key, List values) { - if (StringUtil.isNotEmpty(key)) { - this.originalResponseHeader.put(key, values); - addParam(key, values.get(0)); - } - } - - /** - * get original format response header. - * - *

Currently only corresponds to the response header of JDK. - * - * @return Map original response header - */ - public Map> getOriginalResponseHeader() { - return this.originalResponseHeader; - } - - public String getCharset() { - String acceptCharset = getValue(HttpHeaderConstants.ACCEPT_CHARSET); - if (acceptCharset == null) { - String contentType = getValue(HttpHeaderConstants.CONTENT_TYPE); - acceptCharset = StringUtil.isNotBlank(contentType) ? analysisCharset(contentType) : Constants.ENCODE; - } - return acceptCharset; - } - - private String analysisCharset(String contentType) { - String[] values = contentType.split(";"); - String charset = Constants.ENCODE; - if (values.length == 0) { - return charset; - } - for (String value : values) { - if (value.startsWith("charset=")) { - charset = value.substring("charset=".length()); - } - } - return charset; - } - - public void clear() { - header.clear(); - originalResponseHeader.clear(); - } - - @Override - public String toString() { - return "Header{" + "headerToMap=" + header + '}'; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/http/HttpClientResponse.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/http/HttpClientResponse.java deleted file mode 100644 index e3cc8ce4..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/http/HttpClientResponse.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit.http; - -import java.io.Closeable; -import java.io.InputStream; - -/** - * Represents a client-side HTTP response. - * - * @author mai.jh - */ -public interface HttpClientResponse extends Closeable { - - /** - * Return the headers of this message. - * - * @return a corresponding HttpHeaders object (never {@code null}) - */ - Header getHeaders(); - - /** - * Return the body of the message as an input stream. - * - * @return String response body - */ - InputStream getBody(); - - /** - * Return the HTTP status code. - * - * @return the HTTP status as an integer - */ - int getStatusCode(); - - /** - * Return the HTTP status text of the response. - * - * @return the HTTP status text - */ - String getStatusText(); - - /** - * Return the body As string. - * - * @return - */ - String getBodyString(); - - /** - * close response InputStream. - */ - @Override - void close(); -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/http/HttpUtil.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/http/HttpUtil.java deleted file mode 100644 index fdd14c9b..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/http/HttpUtil.java +++ /dev/null @@ -1,374 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit.http; - -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.common.constant.HttpMediaType; -import cn.hippo4j.common.constant.HttpMethod; -import cn.hippo4j.common.constant.HttpResponseCode; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.common.toolkit.IoUtil; -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.common.toolkit.logtracing.LogMessage; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -import java.io.BufferedWriter; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.Map; -import java.util.Optional; - -import static cn.hippo4j.common.constant.HttpHeaderConstants.CONTENT_LENGTH; - -/** - * Http request utilities. - */ -@Slf4j -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class HttpUtil { - - /** - * Default connect timeout - */ - private static final int DEFAULT_CONNECT_TIMEOUT = 10000; - - /** - * Default read timeout - */ - private static final int DEFAULT_READ_TIMEOUT = 30000; - - /** - * Send a get network request. - * - * @param url target url - * @param headers headers - * @param params form data - * @param timeout request timeout - * @param clazz return the target data type - * @param return the target data type - * @return - */ - public static T get(String url, Map headers, Map params, long timeout, Class clazz) { - return execute(buildUrl(url, params), HttpMethod.GET, null, headers, timeout, clazz); - } - - /** - * Send a get network request. - * - * @param url target url - * @param params form data - * @return - */ - public static String get(String url, Map params) { - return execute(buildUrl(url, params), HttpMethod.GET, null, null); - } - - /** - * Send a get network request. - * - * @param url target url - * @return - */ - public static String get(String url) { - return execute(url, HttpMethod.GET, null, null); - } - - /** - * Send a get network request. - * - * @param url target url - * @param clazz return the target data type - * @param return the target data type - * @return - */ - public static T get(String url, Class clazz) { - return JSONUtil.parseObject(get(url), clazz); - } - - /** - * Send a post network request. - * - * @param url target url - * @param body request body - * @param clazz return the target data type - * @param return the target data type - * @return - */ - public static T post(String url, Object body, Class clazz) { - String result = post(url, body); - return JSONUtil.parseObject(result, clazz); - } - - /** - * Send a post network request. - * - * @param url target url - * @param body request body - * @param timeout request timeout - * @param clazz return the target data type - * @param return the target data type - * @return - */ - public static T post(String url, Object body, long timeout, Class clazz) { - String result = post(url, body, timeout); - return JSONUtil.parseObject(result, clazz); - } - - /** - * Send a post network request. - * - * @param url target url - * @param headers headers - * @param params form data - * @param timeout request timeout - * @param clazz return the target data type - * @param return the target data type - * @return - */ - public static T post(String url, Map headers, Map params, long timeout, Class clazz) { - return execute(buildUrl(url, params), HttpMethod.POST, null, headers, timeout, clazz); - } - - /** - * Send a post network request. - * - * @param url target url - * @param headers headers - * @param body request body - * @param timeout request timeout - * @param clazz return the target data type - * @param return the target data type - * @return - */ - public static T post(String url, Map headers, Object body, long timeout, Class clazz) { - return execute(url, HttpMethod.POST, body, headers, timeout, clazz); - } - - /** - * Send a post network request. - * - * @param url target url - * @param body request body - * @return - */ - public static String post(String url, Object body) { - return execute(url, HttpMethod.POST, body, null); - } - - /** - * Send a post network request. - * - * @param url target url - * @param body request body - * @param timeout request timeout - * @return - */ - public static String post(String url, Object body, long timeout) { - return execute(url, HttpMethod.POST, body, null, timeout, String.class); - } - - /** - * Send a post network request. - * - * @param url target url - * @param json json data - * @return - */ - public static String postJson(String url, String json) { - return executeJson(url, HttpMethod.POST, json, null); - } - - /** - * Send a post network request. - * - * @param url target url - * @param json json data - * @param headers headers - * @return - */ - public static String postJson(String url, String json, Map headers) { - return executeJson(url, HttpMethod.POST, json, headers); - } - - /** - * Send a put network request. - * - * @param url target url - * @param body request body - * @return - */ - public static String put(String url, Object body) { - return execute(url, HttpMethod.PUT, body, null); - } - - /** - * Send a put network request. - * - * @param url target url - * @param body request body - * @param headers headers - * @return - */ - public static String put(String url, Object body, Map headers) { - return execute(url, HttpMethod.PUT, body, headers); - } - - /** - * Constructs a complete Url from the query string. - * - * @param url target url - * @param queryParams query params - * @return - */ - @SneakyThrows - public static String buildUrl(String url, Map queryParams) { - if (CollectionUtil.isEmpty(queryParams)) { - return url; - } - boolean isFirst = true; - StringBuilder builder = new StringBuilder(url); - for (Map.Entry entry : queryParams.entrySet()) { - String key = entry.getKey(); - if (key != null && entry.getValue() != null) { - if (isFirst) { - isFirst = false; - builder.append("?"); - } else { - builder.append("&"); - } - String value = URLEncoder.encode(queryParams.get(key), Constants.ENCODE) - .replaceAll("\\+", "%20"); - builder.append(key) - .append("=") - .append(value); - } - } - return builder.toString(); - } - - private static String executeJson(String url, String method, String json, Map headers) { - if (!JSONUtil.isJson(json)) { - log.error(LogMessage.getInstance().setMsg("Http Call error.") - .kv("url", url) - .kv("method", method) - .kv("json", json) - .kv2String("headers", JSONUtil.toJSONString(headers))); - throw new RuntimeException("Invalid http json body, please check it again."); - } - return execute(url, method, json, headers); - } - - private static String execute(String url, String method, Object param, Map headers) { - HttpURLConnection connection = createConnection(url, method); - HttpClientResponse response = null; - try { - response = doExecute(connection, param, headers); - return response.getBodyString(); - } finally { - Optional.ofNullable(response).ifPresent(each -> each.close()); - } - } - - private static T execute(String url, String method, Object body, Map headers, long timeout, Class clazz) { - HttpURLConnection connection = createConnection(url, method, timeout); - HttpClientResponse response = null; - try { - response = doExecute(connection, body, headers); - if (clazz == String.class) { - return (T) response.getBodyString(); - } - return JSONUtil.parseObject(response.getBodyString(), clazz); - } finally { - Optional.ofNullable(response).ifPresent(each -> each.close()); - } - } - - @SneakyThrows - private static HttpClientResponse doExecute(HttpURLConnection connection, Object body, Map headers) { - try { - if (headers != null && headers.size() > 0) { - for (Map.Entry entry : headers.entrySet()) { - connection.setRequestProperty(entry.getKey(), entry.getValue()); - } - } - String bodyString; - if (body instanceof String) { - bodyString = (String) body; - } else { - bodyString = JSONUtil.toJSONString(body); - } - if (!StringUtil.isEmpty(bodyString)) { - connection.setDoOutput(true); - byte[] b = bodyString.getBytes(); - connection.setRequestProperty(CONTENT_LENGTH, String.valueOf(b.length)); - OutputStream outputStream = connection.getOutputStream(); - OutputStreamWriter osw = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8); - BufferedWriter writer = new BufferedWriter(osw); - writer.write(bodyString); - writer.flush(); - IoUtil.closeQuietly(outputStream); - } - connection.connect(); - JdkHttpClientResponse response = new JdkHttpClientResponse(connection); - if (!HttpResponseCode.isOk(response.getStatusCode())) { - String msg = String.format("HttpPost response code error. [code] %s [url] %s [body] %s", response.getStatusCode(), connection.getURL(), response.getBodyString()); - throw new RuntimeException(msg); - } - return response; - } catch (Throwable ex) { - log.error(LogMessage.getInstance().setMsg("Http call error. ") - .kv("url", connection.getURL()) - .kv("method", connection.getRequestMethod()) - .kv("body", JSONUtil.toJSONString(body)) - .kv2String("headers", JSONUtil.toJSONString(headers)), ex); - throw ex; - } - } - - @SneakyThrows - private static HttpURLConnection createConnection(String url, String method) { - HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); - connection.setDoInput(true); - connection.setDoOutput(true); - connection.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT); - connection.setReadTimeout(DEFAULT_READ_TIMEOUT); - connection.setRequestMethod(method); - connection.setRequestProperty(Constants.CONTENT_TYPE, HttpMediaType.APPLICATION_JSON); - return connection; - } - - @SneakyThrows - private static HttpURLConnection createConnection(String url, String method, long timeout) { - HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); - connection.setDoInput(true); - connection.setDoOutput(true); - connection.setConnectTimeout(Integer.parseInt(String.valueOf(timeout))); - connection.setReadTimeout(Integer.parseInt(String.valueOf(timeout))); - connection.setRequestMethod(method); - connection.setRequestProperty(Constants.CONTENT_TYPE, HttpMediaType.APPLICATION_JSON); - return connection; - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/http/JdkHttpClientResponse.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/http/JdkHttpClientResponse.java deleted file mode 100644 index c6671aaa..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/http/JdkHttpClientResponse.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit.http; - -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.common.constant.HttpHeaderConstants; -import cn.hippo4j.common.toolkit.IoUtil; -import lombok.SneakyThrows; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.util.List; -import java.util.Map; - -/** - * Represents a client-side HTTP response with JDK implementation - */ -public class JdkHttpClientResponse implements HttpClientResponse { - - private final HttpURLConnection conn; - - private InputStream responseStream; - - private Header responseHeader; - - private static final String CONTENT_ENCODING = "gzip"; - - public JdkHttpClientResponse(HttpURLConnection conn) { - this.conn = conn; - } - - @Override - public Header getHeaders() { - if (this.responseHeader == null) { - this.responseHeader = Header.newInstance(); - } - for (Map.Entry> entry : conn.getHeaderFields().entrySet()) { - this.responseHeader.addOriginalResponseHeader(entry.getKey(), entry.getValue()); - } - return this.responseHeader; - } - - @Override - @SneakyThrows - public InputStream getBody() { - Header headers = getHeaders(); - InputStream errorStream = this.conn.getErrorStream(); - this.responseStream = (errorStream != null ? errorStream : this.conn.getInputStream()); - String contentEncoding = headers.getValue(HttpHeaderConstants.CONTENT_ENCODING); - // Used to process http content_encoding, when content_encoding is GZIP, use GZIPInputStream - if (CONTENT_ENCODING.equals(contentEncoding)) { - byte[] bytes = IoUtil.tryDecompress(this.responseStream); - return new ByteArrayInputStream(bytes); - } - return this.responseStream; - } - - @Override - @SneakyThrows - public int getStatusCode() { - return this.conn.getResponseCode(); - } - - @Override - @SneakyThrows - public String getStatusText() { - return this.conn.getResponseMessage(); - } - - @Override - public String getBodyString() { - return IoUtil.toString(this.getBody(), Constants.ENCODE); - } - - @Override - public void close() { - IoUtil.closeQuietly(this.responseStream); - } -} diff --git a/infra/common/src/main/java/cn/hippo4j/common/toolkit/logtracing/LogMessage.java b/infra/common/src/main/java/cn/hippo4j/common/toolkit/logtracing/LogMessage.java deleted file mode 100644 index b961a4b2..00000000 --- a/infra/common/src/main/java/cn/hippo4j/common/toolkit/logtracing/LogMessage.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit.logtracing; - -import cn.hippo4j.common.toolkit.StringUtil; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.slf4j.helpers.FormattingTuple; -import org.slf4j.helpers.MessageFormatter; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Log message. - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class LogMessage { - - private Map kvs = new ConcurrentHashMap<>(); - - private String msg = ""; - - public static LogMessage getInstance() { - return new LogMessage(); - } - - public LogMessage setMsg(String msg) { - this.msg = msg; - return this; - } - - public String msg(String msg, Object... args) { - LogMessage l = new LogMessage(); - l.kvs = this.kvs; - return l.setMsgString(msg, args); - } - - public LogMessage setMsg(String msg, Object... args) { - FormattingTuple ft = MessageFormatter.arrayFormat(msg, args); - this.msg = ft.getThrowable() == null ? ft.getMessage() : ft.getMessage() + "||_fmt_throw=" + ft.getThrowable(); - return this; - } - - public String setMsgString(String msg, Object... args) { - FormattingTuple ft = MessageFormatter.arrayFormat(msg, args); - this.msg = ft.getThrowable() == null ? ft.getMessage() : ft.getMessage() + "||_fmt_throw=" + ft.getThrowable(); - return toString(); - } - - public LogMessage kv(String k, Object v) { - this.kvs.put(k, v == null ? "" : v); - return this; - } - - public String kv2String(String k, Object v) { - this.kvs.put(k, v == null ? "" : v); - return toString(); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - if (StringUtil.isNotEmpty(msg)) { - sb.append(msg); - } - int tempCount = 0; - for (Map.Entry kv : kvs.entrySet()) { - tempCount++; - Object value = kv.getValue(); - if (value != null) { - if (value instanceof String && StringUtil.isEmpty((String) value)) { - continue; - } - sb.append(kv.getKey() + "=").append(kv.getValue()); - if (tempCount != kvs.size()) { - sb.append("||"); - } - } - } - return sb.toString(); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/MockitoTests.java b/infra/common/src/test/java/cn/hippo4j/common/MockitoTests.java deleted file mode 100644 index c86d5054..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/MockitoTests.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common; - -import java.util.List; - -import org.apache.commons.lang3.StringUtils; -import org.junit.Test; -import org.junit.jupiter.api.Assertions; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockedStatic; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; - -@RunWith(MockitoJUnitRunner.class) -public class MockitoTests { - - @Mock - List list; - - @Test - public void mockTests() { - Mockito.when(list.get(1)).thenReturn("mock success."); - Assertions.assertEquals("mock success.", list.get(1)); - try (final MockedStatic mockStatic = Mockito.mockStatic(StringUtils.class)) { - mockStatic.when(() -> StringUtils.trim("")).thenReturn("测试"); - Assertions.assertEquals("测试", StringUtils.trim("")); - } - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/executor/ExecutorFactoryTest.java b/infra/common/src/test/java/cn/hippo4j/common/executor/ExecutorFactoryTest.java deleted file mode 100644 index 4fdd4dfc..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/executor/ExecutorFactoryTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor; - -import cn.hippo4j.common.toolkit.MapUtil; -import cn.hippo4j.common.toolkit.ReflectUtil; -import org.junit.Assert; -import org.junit.Test; - -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ThreadFactory; -import java.util.stream.IntStream; - -public final class ExecutorFactoryTest { - - ThreadFactory threadFactory = new ThreadFactoryBuilder().prefix("test").build(); - - /** - * data range min - */ - Integer rangeMin = 1; - /** - * data range max - */ - Integer rangeMax = 10; - /** - * default test index - */ - Integer defaultIndex = 0; - - @Test - public void assertNewSingleScheduledExecutorService() { - // init data snapshot - ThreadPoolManager poolManager = (ThreadPoolManager) ReflectUtil.getFieldValue(ExecutorFactory.Managed.class, "THREAD_POOL_MANAGER"); - String poolName = (String) ReflectUtil.getFieldValue(ExecutorFactory.Managed.class, "DEFAULT_NAMESPACE"); - Map>> manager = (Map>>) ReflectUtil.getFieldValue(poolManager, "resourcesManager"); - Map> initRelationMap = manager.get(poolName); - int defaultManagerSize = manager.size(); - int defaultRelationSize = MapUtil.isEmpty(initRelationMap) ? 0 : initRelationMap.size(); - - // test begin - ScheduledExecutorService executorService = ExecutorFactory.Managed.newSingleScheduledExecutorService(String.format("test-group-%s", defaultIndex), threadFactory); - - Assert.assertNotNull(executorService); - - // check default init - Assert.assertEquals(1, manager.size() - defaultManagerSize); - - // check multiple registrations and check to see if it is still an instance - IntStream.rangeClosed(rangeMin, rangeMax).forEach(index -> ExecutorFactory.Managed.newSingleScheduledExecutorService(String.format("test-group-%s", index), threadFactory)); - Assert.assertEquals(1, manager.size() - defaultManagerSize); - - // check group size - Map> relationMap = manager.get(poolName); - Assert.assertEquals(11, relationMap.size() - defaultRelationSize); - // check the number of threads between the group and the thread pool - IntStream.rangeClosed(rangeMin, rangeMax).forEach(index -> { - String relationKey = String.format("test-group-%s", index); - Assert.assertNotNull(relationMap.get(relationKey)); - Assert.assertEquals(1, relationMap.get(relationKey).size()); - }); - - // instantiate the same group a second time and check the corresponding quantitative relationship - IntStream.rangeClosed(defaultIndex, rangeMax).forEach(index -> ExecutorFactory.Managed.newSingleScheduledExecutorService(String.format("test-group-%s", index), threadFactory)); - // chek group size - Assert.assertEquals(11, manager.get(poolName).size() - defaultRelationSize); - // check the number of threads between the group and the thread pool - IntStream.rangeClosed(rangeMin, rangeMax).forEach(index -> Assert.assertEquals(2, relationMap.get(String.format("test-group-%s", index)).size())); - } - -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/executor/ThreadFactoryBuilderTest b/infra/common/src/test/java/cn/hippo4j/common/executor/ThreadFactoryBuilderTest deleted file mode 100644 index e1344100..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/executor/ThreadFactoryBuilderTest +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.hippo4j.common.design.builder; - -import cn.hippo4j.common.design.builder.ThreadFactoryBuilder; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import java.util.concurrent.ThreadFactory; -import java.lang.Thread.UncaughtExceptionHandler; - -public class ThreadFactoryBuilderTest { - - ThreadFactoryBuilder builder; - TestUncaughtExceptionHandler uncaughtExceptionHandler; - Thread thread; - - @Before - public void buildThread() { - builder = ThreadFactoryBuilder.builder(); - uncaughtExceptionHandler = new TestUncaughtExceptionHandler(); - builder.uncaughtExceptionHandler(uncaughtExceptionHandler); - builder.prefix("my-thread-factory"); - builder.daemon(true); - builder.priority(Thread.MAX_PRIORITY); - ThreadFactory threadFactory = builder.build(); - thread = threadFactory.newThread(() -> { - System.out.println("Create a new thread."); - }); - thread.start(); - } - - @Test - public void testName() { - Assert.assertEquals("my-thread-factory_0", thread.getName()); - } - - @Test - public void testIsDaemon() { - Assert.assertTrue(thread.isDaemon()); - } - - @Test - public void testExceptionHandler() { - Assert.assertEquals(uncaughtExceptionHandler, thread.getUncaughtExceptionHandler()); - } - - @Test - public void testPriority() { - Assert.assertEquals(Thread.MAX_PRIORITY, thread.getPriority()); - } -} - -class TestUncaughtExceptionHandler implements UncaughtExceptionHandler { - - private volatile boolean exceptionCaught = false; - - @Override - public void uncaughtException(Thread t, Throwable e) { - System.out.println("Exception caught by " + t.getName()); - exceptionCaught = true; - } - - public boolean isExceptionCaught() { - return exceptionCaught; - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/executor/ThreadPoolExecutorUtilTest b/infra/common/src/test/java/cn/hippo4j/common/executor/ThreadPoolExecutorUtilTest deleted file mode 100644 index c3459d03..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/executor/ThreadPoolExecutorUtilTest +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor; - -import cn.hippo4j.common.toolkit.ThreadPoolExecutorUtil; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -public class ThreadPoolExecutorUtilTest { - - private ThreadPoolExecutor executor; - private int corePoolSize; - private int maxPoolSize; - - @Before - public void testSafeSetPoolSize() { - corePoolSize = 2; - maxPoolSize = 4; - executor = new ThreadPoolExecutor( - corePoolSize, - maxPoolSize, - 1L, - TimeUnit.SECONDS, - new ArrayBlockingQueue<>(10) - ); - } - - @Test - public void testEquals(){ - // Test when the new core pool size equals the original maximum pool size. - int newCorePoolSize1 = maxPoolSize; - int newMaxPoolSize1 = 6; - ThreadPoolExecutorUtil.safeSetPoolSize(executor, newCorePoolSize1, newMaxPoolSize1); - Assert.assertEquals(newCorePoolSize1, executor.getCorePoolSize()); - Assert.assertEquals(newMaxPoolSize1, executor.getMaximumPoolSize()); - } - - @Test - public void testGreater(){ - // Test when the new core pool size is greater than the original maximum pool size. - int newCorePoolSize2 = 8; - int newMaxPoolSize2 = 10; - ThreadPoolExecutorUtil.safeSetPoolSize(executor, newCorePoolSize2, newMaxPoolSize2); - Assert.assertEquals(newCorePoolSize2, executor.getCorePoolSize()); - Assert.assertEquals(newMaxPoolSize2, executor.getMaximumPoolSize()); - } - - @Test - public void testLess(){ - // Test when the new core pool size is less than the original maximum pool size. - int newCorePoolSize3 = 3; - int newMaxPoolSize3 = 5; - ThreadPoolExecutorUtil.safeSetPoolSize(executor, newCorePoolSize3, newMaxPoolSize3); - Assert.assertEquals(newCorePoolSize3, executor.getCorePoolSize()); - Assert.assertEquals(newMaxPoolSize3, executor.getMaximumPoolSize()); - } - - @Test - public void testException(){ - // Test when the new core pool size is greater than the new maximum pool size, which should throw an IllegalArgumentException. - int newCorePoolSize4 = 6; - int newMaxPoolSize4 = 4; - try { - ThreadPoolExecutorUtil.safeSetPoolSize(executor, newCorePoolSize4, newMaxPoolSize4); - } catch (IllegalArgumentException e) { - // Expected to throw an exception. - Assert.assertEquals("newCorePoolSize must be smaller than newMaximumPoolSize", e.getMessage()); - } - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/executor/ThreadPoolManagerTest.java b/infra/common/src/test/java/cn/hippo4j/common/executor/ThreadPoolManagerTest.java deleted file mode 100644 index 94cf6964..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/executor/ThreadPoolManagerTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor; - -import cn.hippo4j.common.toolkit.ReflectUtil; -import org.junit.Assert; -import org.junit.Test; - -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; - -public class ThreadPoolManagerTest { - - // tenantId = schedule,group = schedule - ScheduledExecutorService executorService1 = Executors.newScheduledThreadPool(1); - - // tenantId = schedule,group = schedule - ScheduledExecutorService executorService2 = Executors.newScheduledThreadPool(10); - - // tenantId = executor,group = executor - ExecutorService executorService3 = Executors.newFixedThreadPool(8); - - // tenantId = executor,group = executor - ExecutorService executorService4 = Executors.newFixedThreadPool(16); - - static final String schedule = "schedule"; - - static final String executor = "executor"; - - @Test - public void getInstance() { - ThreadPoolManager poolManager = ThreadPoolManager.getInstance(); - Assert.assertNotNull(poolManager); - } - - @Test - public void register() { - ThreadPoolManager poolManager = ThreadPoolManager.getInstance(); - poolManager.register(schedule, schedule, executorService1); - poolManager.register(schedule, schedule, executorService2); - poolManager.register(executor, executor, executorService3); - poolManager.register(executor, executor, executorService4); - - Map>> manager = (Map>>) ReflectUtil.getFieldValue(poolManager, "resourcesManager"); - - Map> scheduleMap = manager.get(schedule); - Assert.assertEquals(1, scheduleMap.size()); - Set scheduleSet = scheduleMap.get(schedule); - Assert.assertEquals(2, scheduleSet.size()); - - Map> executorMap = manager.get(executor); - Assert.assertEquals(1, executorMap.size()); - Set executorSet = executorMap.get(executor); - Assert.assertEquals(2, executorSet.size()); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/executor/integration/QueueSpiIntegrationTest.java b/infra/common/src/test/java/cn/hippo4j/common/executor/integration/QueueSpiIntegrationTest.java deleted file mode 100644 index b2b39c6b..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/executor/integration/QueueSpiIntegrationTest.java +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.integration; - -import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum; -import cn.hippo4j.common.executor.support.CustomBlockingQueue; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import org.junit.Assert; -import org.junit.Test; - -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * Queue SPI Integration Test: Verifies the full flow from parameters to queue creation - * This test simulates a real scenario: - * 1. Config center pushes queue configuration (queueType, capacity) - * 2. Thread pool is created with the specified queue type - * 3. BlockingQueueTypeEnum.createBlockingQueue() calls SPI loader - * 4. Custom queues can be used via SPI mechanism - */ -public class QueueSpiIntegrationTest { - - /** - * Custom queue for SPI testing - */ - public static class IntegrationTestQueue implements CustomBlockingQueue { - - private static final AtomicInteger LAST_REQUESTED_CAPACITY = new AtomicInteger(); - - @Override - public Integer getType() { - return 20001; // Integration test specific type ID - } - - @Override - public String getName() { - return "IntegrationTestQueue"; - } - - @Override - public BlockingQueue generateBlockingQueue() { - return generateBlockingQueue(256); - } - - @Override - public BlockingQueue generateBlockingQueue(Integer capacity) { - int effectiveCapacity = capacity == null || capacity <= 0 ? 1024 : capacity; - LAST_REQUESTED_CAPACITY.set(effectiveCapacity); - return new ArrayBlockingQueue<>(effectiveCapacity); - } - - public static int getLastRequestedCapacity() { - return LAST_REQUESTED_CAPACITY.get(); - } - - public static void resetLastRequestedCapacity() { - LAST_REQUESTED_CAPACITY.set(0); - } - } - - /** - * Scenario 1: Verify that ThreadPoolParameterInfo can carry queueType - */ - @Test - public void testParameterCarriesQueueType() { - System.out.println("========== Integration Test Scenario 1: Parameter carries queueType =========="); - - ThreadPoolParameterInfo parameter = new ThreadPoolParameterInfo(); - parameter.setTenantId("default"); - parameter.setItemId("item-001"); - parameter.setTpId("test-pool"); - parameter.setQueueType(2); // LinkedBlockingQueue - parameter.setCapacity(1024); - - Assert.assertNotNull("queueType should be set", parameter.getQueueType()); - Assert.assertEquals("queueType should be 2", Integer.valueOf(2), parameter.getQueueType()); - Assert.assertEquals("capacity should be 1024", Integer.valueOf(1024), parameter.getCapacity()); - - System.out.println("ThreadPoolParameterInfo can carry queueType and capacity"); - System.out.println(" queueType: " + parameter.getQueueType()); - System.out.println(" capacity: " + parameter.getCapacity()); - } - - /** - * Scenario 2: Verify built-in queues can be created via type ID - */ - @Test - public void testBuiltInQueueCreationViaTypeId() { - System.out.println("\n========== Integration Test Scenario 2: Built-in queue creation =========="); - - BlockingQueue arrayQueue = BlockingQueueTypeEnum.createBlockingQueue(1, 512); - Assert.assertNotNull("ArrayBlockingQueue should be created", arrayQueue); - Assert.assertTrue("Should be instance of ArrayBlockingQueue", arrayQueue instanceof ArrayBlockingQueue); - - BlockingQueue linkedQueue = BlockingQueueTypeEnum.createBlockingQueue(2, 1024); - Assert.assertNotNull("LinkedBlockingQueue should be created", linkedQueue); - Assert.assertTrue("Should be instance of LinkedBlockingQueue", linkedQueue instanceof LinkedBlockingQueue); - - System.out.println("Built-in queue types can be created by type ID"); - System.out.println(" Type 1 (ArrayBlockingQueue): " + arrayQueue.getClass().getSimpleName()); - System.out.println(" Type 2 (LinkedBlockingQueue): " + linkedQueue.getClass().getSimpleName()); - } - - /** - * Scenario 3: Verify SPI queues can be created via type ID - */ - @Test - public void testSpiQueueCreationViaTypeId() { - System.out.println("\n========== Integration Test Scenario 3: SPI queue creation =========="); - - BlockingQueue spiQueue = BlockingQueueTypeEnum.createBlockingQueue(10001, 512); - Assert.assertNotNull("SPI custom queue should be created", spiQueue); - Assert.assertTrue("Should be instance of ArrayBlockingQueue (TestCustomQueue implementation)", - spiQueue instanceof ArrayBlockingQueue); - Assert.assertEquals("Custom queue capacity should match server value", 512, spiQueue.remainingCapacity()); - - QueueSpiIntegrationTest.IntegrationTestQueue.resetLastRequestedCapacity(); - BlockingQueue integrationQueue = BlockingQueueTypeEnum.createBlockingQueue(20001, 2048); - Assert.assertNotNull("Integration test custom queue should be created", integrationQueue); - Assert.assertTrue("Integration queue should be ArrayBlockingQueue", integrationQueue instanceof ArrayBlockingQueue); - Assert.assertEquals("Integration queue capacity should honor config", 2048, integrationQueue.remainingCapacity()); - Assert.assertEquals("Integration custom queue should receive normalized capacity", 2048, - QueueSpiIntegrationTest.IntegrationTestQueue.getLastRequestedCapacity()); - - System.out.println("SPI queue can be created via type ID"); - System.out.println(" Type 10001 (TestCustomQueue): " + spiQueue.getClass().getSimpleName()); - System.out.println(" Queue capacity: " + spiQueue.remainingCapacity()); - System.out.println(" Type 20001 (IntegrationTestQueue): " + integrationQueue.getClass().getSimpleName()); - System.out.println(" Queue capacity: " + integrationQueue.remainingCapacity()); - } - - /** - * Scenario 4: Simulate the complete queue switch flow - */ - @Test - public void testCompleteQueueSwitchFlow() { - System.out.println("\n========== Integration Test Scenario 4: Complete queue switch flow =========="); - - ThreadPoolParameterInfo newParameter = new ThreadPoolParameterInfo(); - newParameter.setTenantId("default"); - newParameter.setItemId("item-001"); - newParameter.setTpId("test-pool"); - newParameter.setQueueType(20001); // Switch to IntegrationTestQueue - newParameter.setCapacity(768); - - System.out.println("Step 1: Config pushed - queueType=" + newParameter.getQueueType()); - - boolean queueTypeChanged = newParameter.getQueueType() != null; - Assert.assertTrue("Should detect queue type change", queueTypeChanged); - System.out.println("Step 2: Detected queue type change"); - - IntegrationTestQueue.resetLastRequestedCapacity(); - BlockingQueue newQueue = BlockingQueueTypeEnum.createBlockingQueue( - newParameter.getQueueType(), - newParameter.getCapacity()); - Assert.assertNotNull("New queue should be created", newQueue); - System.out.println("Step 3: New queue created - " + newQueue.getClass().getSimpleName()); - - Assert.assertTrue("New queue should be SPI custom implementation (ArrayBlockingQueue)", - newQueue instanceof ArrayBlockingQueue); - Assert.assertEquals("New queue capacity should be 768", 768, newQueue.remainingCapacity()); - Assert.assertEquals("Custom queue should see normalized capacity", 768, - IntegrationTestQueue.getLastRequestedCapacity()); - System.out.println("Step 4: Verified new queue - Type: ArrayBlockingQueue, Capacity: 768"); - - System.out.println("Complete queue creation flow verified"); - System.out.println("Proves: Config → BlockingQueueTypeEnum → SPI → Custom Queue"); - } - - /** - * Scenario 5: Verify queue switching does not depend on hardcoded logic - */ - @Test - public void testQueueSwitchNotHardcoded() { - System.out.println("\n========== Integration Test Scenario 5: Queue switch not hardcoded =========="); - - int[] queueTypes = {1, 2, 3, 9, 10001, 20001}; - for (int queueType : queueTypes) { - BlockingQueue queue = BlockingQueueTypeEnum.createBlockingQueue(queueType, 512); - Assert.assertNotNull("Queue type " + queueType + " should be created", queue); - System.out.println("Queue type " + queueType + " created: " + queue.getClass().getSimpleName()); - } - - System.out.println("Queue switching is not hardcoded, supports any type (built-in + SPI)"); - System.out.println("Proves: ServerThreadPoolDynamicRefresh.handleQueueChanges() removed hardcoded restriction"); - } - - /** - * Scenario 6: Verify consistency with rejection policy - */ - @Test - public void testConsistencyWithRejectedPolicy() { - System.out.println("\n========== Integration Test Scenario 6: Consistency with rejected policy =========="); - - ThreadPoolParameterInfo parameter = new ThreadPoolParameterInfo(); - parameter.setRejectedType(1); // AbortPolicy - parameter.setQueueType(20001); // SPI custom queue (IntegrationTestQueue) - parameter.setCapacity(640); - - BlockingQueue queue = BlockingQueueTypeEnum.createBlockingQueue( - parameter.getQueueType(), - parameter.getCapacity()); - Assert.assertNotNull("Queue should be created", queue); - Assert.assertEquals("Queue should reflect configured capacity", 640, queue.remainingCapacity()); - Assert.assertEquals("Integration queue should receive normalized capacity", 640, - IntegrationTestQueue.getLastRequestedCapacity()); - - System.out.println("Rejected policy and blocking queue design are consistent:"); - System.out.println(" - Rejected policy: created dynamically via type ID (rejectedType)"); - System.out.println(" - Blocking queue: created dynamically via type ID (queueType)"); - System.out.println(" - Both support SPI extensions"); - System.out.println("Verified: ServerThreadPoolDynamicRefresh supports SPI extension for both rejection policy and queues"); - } -} \ No newline at end of file diff --git a/infra/common/src/test/java/cn/hippo4j/common/executor/support/BlockingQueueSpiTest.java b/infra/common/src/test/java/cn/hippo4j/common/executor/support/BlockingQueueSpiTest.java deleted file mode 100644 index c7432f15..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/executor/support/BlockingQueueSpiTest.java +++ /dev/null @@ -1,363 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.support; - -import org.junit.Assert; -import org.junit.Test; - -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.atomic.AtomicReference; - -/** - * Blocking Queue SPI Test: Verify that custom queues can be supported via SPI just like rejection policies - */ -public class BlockingQueueSpiTest { - - /** - * Test custom queue SPI implementation - * Note: SPI mechanism creates instances via no-arg constructor, - * capacity is dynamically passed in generateBlockingQueue - */ - public static class TestCustomQueue implements CustomBlockingQueue { - - private static final int DEFAULT_CAPACITY = 512; - - private static final AtomicReference LAST_REQUESTED_CAPACITY = new AtomicReference<>(); - - @Override - public Integer getType() { - return 10001; // Custom type ID - } - - @Override - public String getName() { - return "TestCustomQueue"; - } - - @Override - public BlockingQueue generateBlockingQueue() { - return generateBlockingQueue(DEFAULT_CAPACITY); - } - - @Override - public BlockingQueue generateBlockingQueue(Integer capacity) { - int effectiveCapacity = capacity == null || capacity <= 0 ? DEFAULT_CAPACITY : capacity; - LAST_REQUESTED_CAPACITY.set(effectiveCapacity); - return new ArrayBlockingQueue<>(effectiveCapacity); - } - - public static Integer getLastRequestedCapacity() { - return LAST_REQUESTED_CAPACITY.get(); - } - } - - /** - * Test Case 1: SPI interface definition integrity - */ - @Test - public void testSpiInterfaceDefinition() { - System.out.println("========== Test Case 1: SPI interface definition integrity =========="); - - TestCustomQueue customQueue = new TestCustomQueue(); - - // Verify interface methods - Assert.assertNotNull("getType() should return non-null type ID", customQueue.getType()); - Assert.assertEquals("Type ID should be 10001", Integer.valueOf(10001), customQueue.getType()); - Assert.assertEquals("getName() should return queue name", "TestCustomQueue", customQueue.getName()); - - BlockingQueue queue = customQueue.generateBlockingQueue(); - Assert.assertNotNull("generateBlockingQueue() should return non-null queue", queue); - Assert.assertTrue("Should return ArrayBlockingQueue instance", queue instanceof ArrayBlockingQueue); - Assert.assertEquals("Queue capacity should be 512", 512, queue.remainingCapacity()); - - System.out.println("Custom queue type ID: " + customQueue.getType()); - System.out.println("Custom queue name: " + customQueue.getName()); - System.out.println("Generated queue type: " + queue.getClass().getSimpleName()); - System.out.println("Queue capacity: " + queue.remainingCapacity()); - System.out.println("Passed: SPI interface definition is complete"); - } - - /** - * Test Case 1.5: SPI configuration file registration validation - * Verify custom queue is correctly registered via SPI config file - */ - @Test - public void testSpiConfigurationRegistration() { - System.out.println("\n========== Test Case 1.5: SPI configuration file registration validation =========="); - - System.out.println("SPI config file location: src/test/resources/META-INF/services/cn.hippo4j.common.executor.support.CustomBlockingQueue"); - System.out.println("SPI config content: cn.hippo4j.common.executor.support.BlockingQueueSpiTest$TestCustomQueue"); - - // Create custom queue via SPI mechanism (type ID 10001) - BlockingQueue spiQueue = BlockingQueueTypeEnum.createBlockingQueue(10001, 512); - Assert.assertNotNull("Should successfully create custom queue via SPI", spiQueue); - - // Verify it's created by SPI TestCustomQueue implementation - Assert.assertTrue("Should create ArrayBlockingQueue instance (TestCustomQueue implementation)", - spiQueue instanceof ArrayBlockingQueue); - Assert.assertEquals("Queue capacity should be 512", 512, spiQueue.remainingCapacity()); - Assert.assertEquals("Custom queue should receive requested capacity", Integer.valueOf(512), TestCustomQueue.getLastRequestedCapacity()); - - System.out.println("Successfully created custom queue via SPI type ID 10001"); - System.out.println("Queue type: " + spiQueue.getClass().getSimpleName()); - System.out.println("Queue capacity: " + spiQueue.remainingCapacity()); - System.out.println("Passed: SPI configuration registration works"); - } - - /** - * Test Case 2: Built-in queue type creation - */ - @Test - public void testBuiltInQueueCreation() { - System.out.println("\n========== Test Case 2: Built-in queue type creation =========="); - - // Test all built-in queue types - BlockingQueue arrayQueue = BlockingQueueTypeEnum.createBlockingQueue(1, 1024); - Assert.assertTrue("Type 1 should create ArrayBlockingQueue", arrayQueue instanceof ArrayBlockingQueue); - System.out.println("Type 1 (ArrayBlockingQueue): " + arrayQueue.getClass().getSimpleName()); - - BlockingQueue linkedQueue = BlockingQueueTypeEnum.createBlockingQueue(2, 1024); - Assert.assertTrue("Type 2 should create LinkedBlockingQueue", linkedQueue instanceof LinkedBlockingQueue); - System.out.println("Type 2 (LinkedBlockingQueue): " + linkedQueue.getClass().getSimpleName()); - - BlockingQueue deque = BlockingQueueTypeEnum.createBlockingQueue(3, 1024); - Assert.assertNotNull("Type 3 should create LinkedBlockingDeque", deque); - System.out.println("Type 3 (LinkedBlockingDeque): " + deque.getClass().getSimpleName()); - - BlockingQueue syncQueue = BlockingQueueTypeEnum.createBlockingQueue(4, null); - Assert.assertNotNull("Type 4 should create SynchronousQueue", syncQueue); - System.out.println("Type 4 (SynchronousQueue): " + syncQueue.getClass().getSimpleName()); - - BlockingQueue priorityQueue = BlockingQueueTypeEnum.createBlockingQueue(5, 1024); - Assert.assertNotNull("Type 5 should create PriorityBlockingQueue", priorityQueue); - System.out.println("Type 5 (PriorityBlockingQueue): " + priorityQueue.getClass().getSimpleName()); - - BlockingQueue resizableQueue = BlockingQueueTypeEnum.createBlockingQueue(9, 1024); - Assert.assertNotNull("Type 9 should create ResizableCapacityLinkedBlockingQueue", resizableQueue); - System.out.println("Type 9 (ResizableCapacityLinkedBlockingQueue): " + resizableQueue.getClass().getSimpleName()); - - System.out.println("Passed: All built-in queue types created successfully"); - } - - /** - * Test Case 3: Queue creation via BlockingQueueTypeEnum - */ - @Test - public void testBlockingQueueCreation() { - System.out.println("\n========== Test Case 3: Queue creation via BlockingQueueTypeEnum =========="); - - // Create built-in queue via BlockingQueueTypeEnum - BlockingQueue queue1 = BlockingQueueTypeEnum.createBlockingQueue(1, 512); - Assert.assertNotNull("Should successfully create queue", queue1); - Assert.assertTrue("Should create ArrayBlockingQueue", queue1 instanceof ArrayBlockingQueue); - - // Create by type name - BlockingQueue queue2 = BlockingQueueTypeEnum.createBlockingQueue("ArrayBlockingQueue", 1024); - Assert.assertNotNull("Should successfully create queue by name", queue2); - Assert.assertTrue("Should create ArrayBlockingQueue", queue2 instanceof ArrayBlockingQueue); - - // Test default queue with null type - falls back to LinkedBlockingQueue - BlockingQueue defaultQueue = BlockingQueueTypeEnum.createBlockingQueue("", 1024); - Assert.assertNotNull("Empty name should create default queue", defaultQueue); - System.out.println("Default queue type: " + defaultQueue.getClass().getSimpleName()); - - System.out.println("Passed: BlockingQueueTypeEnum queue creation works"); - } - - /** - * Test Case 3.5: SPI queue default capacity when config missing - */ - @Test - public void testSpiQueueDefaultCapacity() { - System.out.println("\n========== Test Case 3.5: SPI queue default capacity =========="); - - BlockingQueue queue = BlockingQueueTypeEnum.createBlockingQueue(10001, null); - Assert.assertNotNull("Should create custom queue when capacity missing", queue); - Assert.assertTrue("Should still be ArrayBlockingQueue", queue instanceof ArrayBlockingQueue); - Assert.assertEquals("Default capacity should fallback to 1024", 1024, queue.remainingCapacity()); - Assert.assertEquals("Custom queue should receive normalized capacity", Integer.valueOf(1024), TestCustomQueue.getLastRequestedCapacity()); - - System.out.println("SPI queue default capacity -> " + queue.remainingCapacity()); - System.out.println("Passed: Custom queue receives normalized capacity"); - } - - /** - * Test Case 4: Queue type recognition - */ - @Test - public void testQueueTypeRecognition() { - System.out.println("\n========== Test Case 4: Queue type recognition =========="); - - BlockingQueue arrayQueue = new ArrayBlockingQueue<>(256); - Integer type1 = BlockingQueueManager.getQueueType(arrayQueue); - System.out.println("ArrayBlockingQueue recognized type: " + type1); - Assert.assertEquals("Should be recognized as type 1", Integer.valueOf(1), type1); - - BlockingQueue linkedQueue = new LinkedBlockingQueue<>(512); - Integer type2 = BlockingQueueManager.getQueueType(linkedQueue); - System.out.println("LinkedBlockingQueue recognized type: " + type2); - Assert.assertEquals("Should be recognized as type 2", Integer.valueOf(2), type2); - - String name1 = BlockingQueueManager.getQueueName(arrayQueue); - System.out.println("ArrayBlockingQueue queue name: " + name1); - Assert.assertEquals("Should return correct name", "ArrayBlockingQueue", name1); - - System.out.println("Passed: Queue type recognition works"); - } - - /** - * Test Case 5: Queue config validation - */ - @Test - public void testQueueConfigValidation() { - System.out.println("\n========== Test Case 5: Queue config validation =========="); - - // Valid config - boolean valid1 = BlockingQueueManager.validateQueueConfig(1, 1024); - Assert.assertTrue("ArrayBlockingQueue config should be valid", valid1); - System.out.println("ArrayBlockingQueue (type=1, capacity=1024): " + (valid1 ? "valid" : "invalid")); - - // SynchronousQueue does not need capacity - boolean valid2 = BlockingQueueManager.validateQueueConfig(4, null); - Assert.assertTrue("SynchronousQueue without capacity should be valid", valid2); - System.out.println("SynchronousQueue (type=4, capacity=null): " + (valid2 ? "valid" : "invalid")); - - // Invalid capacity - boolean invalid1 = BlockingQueueManager.validateQueueConfig(1, -1); - Assert.assertFalse("Negative capacity should be invalid", invalid1); - System.out.println("ArrayBlockingQueue (type=1, capacity=-1): " + (invalid1 ? "valid" : "invalid")); - - // Invalid type - boolean invalid2 = BlockingQueueManager.validateQueueConfig(null, 1024); - Assert.assertFalse("Null type should be invalid", invalid2); - System.out.println("null type: " + (invalid2 ? "valid" : "invalid")); - - System.out.println("Passed: Queue config validation works"); - } - - /** - * Test Case 6: Queue capacity change capability - */ - @Test - public void testQueueCapacityChange() { - System.out.println("\n========== Test Case 6: Queue capacity change capability =========="); - - // ResizableCapacityLinkedBlockingQueue supports dynamic resizing - BlockingQueue resizableQueue = BlockingQueueTypeEnum.createBlockingQueue(9, 512); - boolean canResize = BlockingQueueManager.canChangeCapacity(resizableQueue); - System.out.println("ResizableCapacityLinkedBlockingQueue resizable: " + canResize); - Assert.assertTrue("ResizableCapacityLinkedBlockingQueue should be resizable", canResize); - - // ArrayBlockingQueue does not support dynamic resizing - BlockingQueue arrayQueue = new ArrayBlockingQueue<>(256); - boolean cannotResize = BlockingQueueManager.canChangeCapacity(arrayQueue); - System.out.println("ArrayBlockingQueue resizable: " + cannotResize); - Assert.assertFalse("ArrayBlockingQueue should not be resizable", cannotResize); - - System.out.println("Passed: Queue capacity change capability recognized correctly"); - } - - /** - * Test Case 7: Queue type-name conversion - */ - @Test - public void testQueueTypeNameConversion() { - System.out.println("\n========== Test Case 7: Queue type-name conversion =========="); - - // Type to name - String name1 = BlockingQueueTypeEnum.getBlockingQueueNameByType(1); - Assert.assertEquals("Type 1 should be converted to ArrayBlockingQueue", "ArrayBlockingQueue", name1); - System.out.println("Type 1 -> " + name1); - - String name2 = BlockingQueueTypeEnum.getBlockingQueueNameByType(2); - Assert.assertEquals("Type 2 should be converted to LinkedBlockingQueue", "LinkedBlockingQueue", name2); - System.out.println("Type 2 -> " + name2); - - // Name to type - Integer type1 = BlockingQueueTypeEnum.getBlockingQueueTypeEnumByName("ArrayBlockingQueue").getType(); - Assert.assertEquals("ArrayBlockingQueue should be converted to type 1", Integer.valueOf(1), type1); - System.out.println("ArrayBlockingQueue -> " + type1); - - Integer type2 = BlockingQueueTypeEnum.getBlockingQueueTypeEnumByName("LinkedBlockingQueue").getType(); - Assert.assertEquals("LinkedBlockingQueue should be converted to type 2", Integer.valueOf(2), type2); - System.out.println("LinkedBlockingQueue -> " + type2); - - System.out.println("Passed: Queue type-name conversion works"); - } - - /** - * Test Case 8: Queue type comparison (simulate change detection) - */ - @Test - public void testQueueTypeComparison() { - System.out.println("\n========== Test Case 8: Queue type change detection =========="); - - BlockingQueue currentQueue = new LinkedBlockingQueue<>(1024); - Integer currentType = BlockingQueueManager.getQueueType(currentQueue); - - // Case 1: No change - Integer requestedType1 = 2; // LinkedBlockingQueue - boolean typeChanged1 = !currentType.equals(requestedType1); - System.out.println("Current type: " + currentType + ", Requested: " + requestedType1 + ", Changed: " + typeChanged1); - Assert.assertFalse("Same type should not be detected as change", typeChanged1); - - // Case 2: Type changed - Integer requestedType2 = 1; // ArrayBlockingQueue - boolean typeChanged2 = !currentType.equals(requestedType2); - System.out.println("Current type: " + currentType + ", Requested: " + requestedType2 + ", Changed: " + typeChanged2); - Assert.assertTrue("Different type should be detected as change", typeChanged2); - - System.out.println("Passed: Queue type change detection works"); - } - - /** - * Test Case 9: Verify queue SPI support consistent with rejection policy SPI - */ - @Test - public void testQueueSpiConsistencyWithRejectedPolicy() { - System.out.println("\n========== Test Case 9: Queue SPI consistency with rejection policy =========="); - - // Queue SPI feature validation - System.out.println("Queue SPI supported features:"); - System.out.println("1.SPI interface definition: CustomBlockingQueue"); - System.out.println("2.Type ID identification: getType() returns unique int ID"); - System.out.println("3.Name identification: getName() returns queue name"); - System.out.println("4.Instance creation: generateBlockingQueue() creates queue instance"); - System.out.println("5.Unified creation entry: BlockingQueueManager.createQueue()"); - System.out.println("6.Built-in type support: BlockingQueueTypeEnum provides 6 built-in queues"); - System.out.println("7.SPI extension support: loaded via ServiceLoaderRegistry"); - System.out.println("8.Type recognition: BlockingQueueManager.getQueueType()"); - System.out.println("9.Config validation: BlockingQueueManager.validateQueueConfig()"); - System.out.println("10.Dynamic switching: ServerThreadPoolDynamicRefresh.handleQueueChanges()"); - - // Compare with rejection policy - System.out.println("\nComparison with Rejection Policy SPI:"); - System.out.println("Rejection Policy SPI: RejectedExecutionHandler + RejectedPolicyTypeEnum"); - System.out.println("Queue SPI: CustomBlockingQueue + BlockingQueueTypeEnum"); - System.out.println("Common features:"); - System.out.println(" - Unified SPI interface definition"); - System.out.println(" - Type ID based identification"); - System.out.println(" - Enum managing built-in types"); - System.out.println(" - ServiceLoader loading mechanism"); - System.out.println(" - Unified creation entry"); - - System.out.println("Passed: Queue SPI design pattern is consistent with rejection policy"); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/executor/support/BlockingQueueTypeEnumTest.java b/infra/common/src/test/java/cn/hippo4j/common/executor/support/BlockingQueueTypeEnumTest.java deleted file mode 100644 index e208165f..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/executor/support/BlockingQueueTypeEnumTest.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.support; - -import org.junit.Assert; -import org.junit.Test; - -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.BlockingQueue; -import java.util.stream.Collectors; - -/** - * BlockingQueueTypeEnum test class - */ -public final class BlockingQueueTypeEnumTest { - - // get all blocking queue names - private static final List BLOCKING_QUEUE_NAMES = Arrays.stream(BlockingQueueTypeEnum.values()).map(BlockingQueueTypeEnum::getName).collect(Collectors.toList()); - - @Test - public void testAssertCreateBlockingQueueNormal() { - // check legal param: name and capacity - for (String name : BLOCKING_QUEUE_NAMES) { - BlockingQueue blockingQueueByName = BlockingQueueTypeEnum.createBlockingQueue(name, 10); - Assert.assertNotNull(blockingQueueByName); - } - } - - @Test - public void testAssertCreateBlockingQueueWithIllegalName() { - // check illegal null name - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue(null, 10)); - // check unexistent name - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue("ABC", 10)); - } - - @Test - public void testAssertCreateBlockingQueueWithIllegalCapacity() { - // check illegal null capacity - for (String name : BLOCKING_QUEUE_NAMES) { - BlockingQueue blockingQueueWithNullCapacity = BlockingQueueTypeEnum.createBlockingQueue(name, null); - Assert.assertNotNull(blockingQueueWithNullCapacity); - } - // check illegal negatives capacity - final String arrayBlockingQueueName = BlockingQueueTypeEnum.ARRAY_BLOCKING_QUEUE.getName(); - Assert.assertThrows(IllegalArgumentException.class, () -> BlockingQueueTypeEnum.createBlockingQueue(arrayBlockingQueueName, -100)); - - final String linkedBlockingQueueName = BlockingQueueTypeEnum.LINKED_BLOCKING_QUEUE.getName(); - Assert.assertThrows(IllegalArgumentException.class, () -> BlockingQueueTypeEnum.createBlockingQueue(linkedBlockingQueueName, -100)); - - final String linkedBlockingDequeName = BlockingQueueTypeEnum.LINKED_BLOCKING_DEQUE.getName(); - Assert.assertThrows(IllegalArgumentException.class, () -> BlockingQueueTypeEnum.createBlockingQueue(linkedBlockingDequeName, -100)); - - final String synchronousQueueName = BlockingQueueTypeEnum.SYNCHRONOUS_QUEUE.getName(); - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue(synchronousQueueName, -99)); - - final String linkedTransferQueueName = BlockingQueueTypeEnum.LINKED_TRANSFER_QUEUE.getName(); - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue(linkedTransferQueueName, -0)); - - final String priorityBlockingQueueName = BlockingQueueTypeEnum.PRIORITY_BLOCKING_QUEUE.getName(); - Assert.assertThrows(IllegalArgumentException.class, () -> BlockingQueueTypeEnum.createBlockingQueue(priorityBlockingQueueName, -100)); - - final String resizableLinkedBlockingQueueName = BlockingQueueTypeEnum.RESIZABLE_LINKED_BLOCKING_QUEUE.getName(); - Assert.assertThrows(IllegalArgumentException.class, () -> BlockingQueueTypeEnum.createBlockingQueue(resizableLinkedBlockingQueueName, -100)); - } - - @Test - public void testAssertCreateBlockingQueueWithIllegalParams() { - // check illegal name and capacity - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue("HelloWorld", null)); - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue(null, null)); - } - - @Test - public void testAssertCreateBlockingQueueWithType() { - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue(1, null)); - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue(2, null)); - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue(3, null)); - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue(4, null)); - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue(5, null)); - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue(6, null)); - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue(9, null)); - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue(100, null)); - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue(-1, null)); - Assert.assertNotNull(BlockingQueueTypeEnum.createBlockingQueue(0, null)); - } - - @Test - public void testAssertGetBlockingQueueNameByType() { - // check legal range of type - Assert.assertEquals("ArrayBlockingQueue", BlockingQueueTypeEnum.getBlockingQueueNameByType(1)); - Assert.assertEquals("LinkedBlockingQueue", BlockingQueueTypeEnum.getBlockingQueueNameByType(2)); - Assert.assertEquals("LinkedBlockingDeque", BlockingQueueTypeEnum.getBlockingQueueNameByType(3)); - Assert.assertEquals("SynchronousQueue", BlockingQueueTypeEnum.getBlockingQueueNameByType(4)); - Assert.assertEquals("LinkedTransferQueue", BlockingQueueTypeEnum.getBlockingQueueNameByType(5)); - Assert.assertEquals("PriorityBlockingQueue", BlockingQueueTypeEnum.getBlockingQueueNameByType(6)); - Assert.assertEquals("ResizableCapacityLinkedBlockingQueue", BlockingQueueTypeEnum.getBlockingQueueNameByType(9)); - // check illegal range of type - Assert.assertEquals("", BlockingQueueTypeEnum.getBlockingQueueNameByType(0)); - Assert.assertEquals("", BlockingQueueTypeEnum.getBlockingQueueNameByType(-1)); - Assert.assertEquals("", BlockingQueueTypeEnum.getBlockingQueueNameByType(100)); - } - - @Test - public void testAssertGetBlockingQueueTypeEnumByName() { - // check legal range of name - Assert.assertEquals(BlockingQueueTypeEnum.ARRAY_BLOCKING_QUEUE, BlockingQueueTypeEnum.getBlockingQueueTypeEnumByName("ArrayBlockingQueue")); - Assert.assertEquals(BlockingQueueTypeEnum.LINKED_BLOCKING_QUEUE, BlockingQueueTypeEnum.getBlockingQueueTypeEnumByName("LinkedBlockingQueue")); - Assert.assertEquals(BlockingQueueTypeEnum.LINKED_BLOCKING_DEQUE, BlockingQueueTypeEnum.getBlockingQueueTypeEnumByName("LinkedBlockingDeque")); - Assert.assertEquals(BlockingQueueTypeEnum.SYNCHRONOUS_QUEUE, BlockingQueueTypeEnum.getBlockingQueueTypeEnumByName("SynchronousQueue")); - Assert.assertEquals(BlockingQueueTypeEnum.LINKED_TRANSFER_QUEUE, BlockingQueueTypeEnum.getBlockingQueueTypeEnumByName("LinkedTransferQueue")); - Assert.assertEquals(BlockingQueueTypeEnum.PRIORITY_BLOCKING_QUEUE, BlockingQueueTypeEnum.getBlockingQueueTypeEnumByName("PriorityBlockingQueue")); - Assert.assertEquals(BlockingQueueTypeEnum.RESIZABLE_LINKED_BLOCKING_QUEUE, BlockingQueueTypeEnum.getBlockingQueueTypeEnumByName("ResizableCapacityLinkedBlockingQueue")); - // check illegal range of name - Assert.assertEquals(BlockingQueueTypeEnum.LINKED_BLOCKING_QUEUE, BlockingQueueTypeEnum.getBlockingQueueTypeEnumByName("Hello")); - Assert.assertEquals(BlockingQueueTypeEnum.LINKED_BLOCKING_QUEUE, BlockingQueueTypeEnum.getBlockingQueueTypeEnumByName(null)); - } -} \ No newline at end of file diff --git a/infra/common/src/test/java/cn/hippo4j/common/executor/support/RejectedPolicyTypeEnumTest.java b/infra/common/src/test/java/cn/hippo4j/common/executor/support/RejectedPolicyTypeEnumTest.java deleted file mode 100644 index b0ce5b02..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/executor/support/RejectedPolicyTypeEnumTest.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.support; - -import org.junit.Test; -import org.junit.jupiter.api.Assertions; - -import java.util.Arrays; - -/** - * test for {@link RejectedPolicyTypeEnum} - */ -public class RejectedPolicyTypeEnumTest { - - @Test - public void testGetType() { - Assertions.assertEquals(1, RejectedPolicyTypeEnum.CALLER_RUNS_POLICY.getType()); - Assertions.assertEquals(2, RejectedPolicyTypeEnum.ABORT_POLICY.getType()); - Assertions.assertEquals(3, RejectedPolicyTypeEnum.DISCARD_POLICY.getType()); - Assertions.assertEquals(4, RejectedPolicyTypeEnum.DISCARD_OLDEST_POLICY.getType()); - Assertions.assertEquals(5, RejectedPolicyTypeEnum.RUNS_OLDEST_TASK_POLICY.getType()); - Assertions.assertEquals(6, RejectedPolicyTypeEnum.SYNC_PUT_QUEUE_POLICY.getType()); - } - - @Test - public void testGetName() { - Assertions.assertEquals("CallerRunsPolicy", RejectedPolicyTypeEnum.CALLER_RUNS_POLICY.getName()); - Assertions.assertEquals("AbortPolicy", RejectedPolicyTypeEnum.ABORT_POLICY.getName()); - Assertions.assertEquals("DiscardPolicy", RejectedPolicyTypeEnum.DISCARD_POLICY.getName()); - Assertions.assertEquals("DiscardOldestPolicy", RejectedPolicyTypeEnum.DISCARD_OLDEST_POLICY.getName()); - Assertions.assertEquals("RunsOldestTaskPolicy", RejectedPolicyTypeEnum.RUNS_OLDEST_TASK_POLICY.getName()); - Assertions.assertEquals("SyncPutQueuePolicy", RejectedPolicyTypeEnum.SYNC_PUT_QUEUE_POLICY.getName()); - } - - @Test - public void testValues() { - Assertions.assertNotNull(RejectedPolicyTypeEnum.values()); - } - - @Test - public void testValueOf() { - Assertions.assertEquals(RejectedPolicyTypeEnum.CALLER_RUNS_POLICY, RejectedPolicyTypeEnum.valueOf("CALLER_RUNS_POLICY")); - Assertions.assertEquals(RejectedPolicyTypeEnum.ABORT_POLICY, RejectedPolicyTypeEnum.valueOf("ABORT_POLICY")); - Assertions.assertEquals(RejectedPolicyTypeEnum.DISCARD_POLICY, RejectedPolicyTypeEnum.valueOf("DISCARD_POLICY")); - Assertions.assertEquals(RejectedPolicyTypeEnum.DISCARD_OLDEST_POLICY, RejectedPolicyTypeEnum.valueOf("DISCARD_OLDEST_POLICY")); - Assertions.assertEquals(RejectedPolicyTypeEnum.RUNS_OLDEST_TASK_POLICY, RejectedPolicyTypeEnum.valueOf("RUNS_OLDEST_TASK_POLICY")); - Assertions.assertEquals(RejectedPolicyTypeEnum.SYNC_PUT_QUEUE_POLICY, RejectedPolicyTypeEnum.valueOf("SYNC_PUT_QUEUE_POLICY")); - } - - @Test - public void testCreatePolicy() { - // check legal param: name and type - Arrays.stream(RejectedPolicyTypeEnum.values()).forEach(each -> { - Assertions.assertNotNull(RejectedPolicyTypeEnum.createPolicy(each.getName())); - Assertions.assertNotNull(RejectedPolicyTypeEnum.createPolicy(each.getType())); - }); - // check illegal null name - Assertions.assertNotNull(RejectedPolicyTypeEnum.createPolicy(null)); - // check nonexistent name - Assertions.assertNotNull(RejectedPolicyTypeEnum.createPolicy("ABC")); - // check nonexistent type - Assertions.assertNotNull(RejectedPolicyTypeEnum.createPolicy(-1)); - } - - @Test - public void testGetRejectedNameByType() { - // check legal range of type - Arrays.stream(RejectedPolicyTypeEnum.values()).forEach(each -> Assertions.assertEquals(each.getName(), RejectedPolicyTypeEnum.getRejectedNameByType(each.getType()))); - // check illegal range of type - Assertions.assertEquals("AbortPolicy", RejectedPolicyTypeEnum.getRejectedNameByType(-1)); - } - - @Test - public void testGetRejectedPolicyTypeEnumByName() { - // check legal range of name - Arrays.stream(RejectedPolicyTypeEnum.values()).forEach(each -> Assertions.assertEquals(each, RejectedPolicyTypeEnum.getRejectedPolicyTypeEnumByName(each.getName()))); - // check illegal name - Assertions.assertEquals(RejectedPolicyTypeEnum.ABORT_POLICY, - RejectedPolicyTypeEnum.getRejectedPolicyTypeEnumByName("XXX")); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/executor/support/ResizableCapacityLinkedBlockingQueueTest.java b/infra/common/src/test/java/cn/hippo4j/common/executor/support/ResizableCapacityLinkedBlockingQueueTest.java deleted file mode 100644 index c1ebee89..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/executor/support/ResizableCapacityLinkedBlockingQueueTest.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.support; - -import cn.hippo4j.common.toolkit.ThreadUtil; -import lombok.extern.slf4j.Slf4j; -import org.junit.Assert; -import org.junit.Test; - -import java.util.Arrays; -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.IntStream; - -@Slf4j -public class ResizableCapacityLinkedBlockingQueueTest { - - @Test - public void testResizableCapacityLinkedBlockingQueueSize() throws InterruptedException { - ResizableCapacityLinkedBlockingQueue queue1 = new ResizableCapacityLinkedBlockingQueue(10); - queue1.setCapacity(20); - Assert.assertEquals(20, queue1.remainingCapacity()); - queue1.add(1); - Assert.assertEquals(19, queue1.remainingCapacity()); - ResizableCapacityLinkedBlockingQueue queue2 = new ResizableCapacityLinkedBlockingQueue(Arrays.asList(1, 2, 3, 4)); - queue2.setCapacity(5); - Assert.assertEquals(1, queue2.remainingCapacity()); - } - - @Test - public void testIncreaseResizableCapacityLinkedBlockingQueue() throws InterruptedException { - MyRejectedExecutionHandler myRejectedExecutionHandler = new MyRejectedExecutionHandler(); - ResizableCapacityLinkedBlockingQueue queue = new ResizableCapacityLinkedBlockingQueue(); - - ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, - 60, TimeUnit.SECONDS, queue, myRejectedExecutionHandler); - Assert.assertSame(queue, threadPoolExecutor.getQueue()); - threadPoolExecutor.prestartAllCoreThreads(); - queue.setCapacity(6); - IntStream.range(0, 4).forEach(s -> { - threadPoolExecutor.execute(() -> ThreadUtil.sleep(0L)); - }); - threadPoolExecutor.shutdown(); - while (!threadPoolExecutor.isTerminated()) { - } - Assert.assertEquals(4, threadPoolExecutor.getCompletedTaskCount()); - Assert.assertEquals(0, myRejectedExecutionHandler.getCount()); - - } - - @Test - public void testDecreaseResizableCapacityLinkedBlockingQueue() throws InterruptedException { - MyRejectedExecutionHandler myRejectedExecutionHandler = new MyRejectedExecutionHandler(); - ResizableCapacityLinkedBlockingQueue queue = new ResizableCapacityLinkedBlockingQueue<>(4); - - ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, - 60, TimeUnit.SECONDS, queue, myRejectedExecutionHandler); - Assert.assertSame(queue, threadPoolExecutor.getQueue()); - threadPoolExecutor.prestartAllCoreThreads(); - queue.setCapacity(0); - IntStream.range(0, 4).forEach(s -> { - threadPoolExecutor.execute(() -> ThreadUtil.sleep(0L)); - }); - threadPoolExecutor.shutdown(); - while (!threadPoolExecutor.isTerminated()) { - } - Assert.assertEquals(0, threadPoolExecutor.getCompletedTaskCount()); - Assert.assertEquals(4, myRejectedExecutionHandler.getCount()); - - } -} - -class MyRejectedExecutionHandler implements RejectedExecutionHandler { - - public AtomicInteger count = new AtomicInteger(0); - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (executor.isShutdown()) { - return; - } - if (!executor.getQueue().offer(r)) { - count.incrementAndGet(); - } - } - - public int getCount() { - return count.get(); - } -} \ No newline at end of file diff --git a/infra/common/src/test/java/cn/hippo4j/common/executor/support/RunsOldestTaskPolicyTest.java b/infra/common/src/test/java/cn/hippo4j/common/executor/support/RunsOldestTaskPolicyTest.java deleted file mode 100644 index 0b59807a..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/executor/support/RunsOldestTaskPolicyTest.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.support; - -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; - -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class RunsOldestTaskPolicyTest { - - private final RunsOldestTaskPolicy runsOldestTaskPolicy = new RunsOldestTaskPolicy(); - - @Mock - private Runnable runnable; - - @Mock - private Runnable runnableInTheQueue; - - @Mock - private ThreadPoolExecutor threadPoolExecutor; - - @Mock - private BlockingQueue workQueue; - - @Test - public void testRejectedExecutionWhenExecutorIsShutDown() { - when(threadPoolExecutor.isShutdown()).thenReturn(true); - - runsOldestTaskPolicy.rejectedExecution(runnable, threadPoolExecutor); - - verify(threadPoolExecutor, never()).execute(runnable); - verify(runnable, never()).run(); - } - - @Test - public void testRejectedExecutionWhenATaskIsInTheQueueTheExecutorShouldNotExecute() { - when(threadPoolExecutor.isShutdown()).thenReturn(false); - when(threadPoolExecutor.getQueue()).thenReturn(workQueue); - when(workQueue.poll()).thenReturn(runnableInTheQueue); - when(workQueue.offer(runnable)).thenReturn(true); - - runsOldestTaskPolicy.rejectedExecution(runnable, threadPoolExecutor); - - verify(runnableInTheQueue).run(); - verify(threadPoolExecutor, never()).execute(runnable); - verify(runnable, never()).run(); - } - - @Test - public void testRejectedExecutionWhenATaskIsInTheQueueTheExecutorShouldExecute() { - when(threadPoolExecutor.isShutdown()).thenReturn(false); - when(threadPoolExecutor.getQueue()).thenReturn(workQueue); - when(workQueue.poll()).thenReturn(runnableInTheQueue); - when(workQueue.offer(runnable)).thenReturn(false); - - runsOldestTaskPolicy.rejectedExecution(runnable, threadPoolExecutor); - - verify(runnableInTheQueue).run(); - verify(threadPoolExecutor).execute(runnable); - verify(runnable, never()).run(); - } - - @Test - public void testRejectedExecutionWhenATaskIsInTheQueueAndThePollReturnANullValue() { - when(threadPoolExecutor.isShutdown()).thenReturn(false); - when(threadPoolExecutor.getQueue()).thenReturn(workQueue); - when(workQueue.poll()).thenReturn(null); - when(workQueue.offer(runnable)).thenReturn(false); - - runsOldestTaskPolicy.rejectedExecution(runnable, threadPoolExecutor); - - verify(runnableInTheQueue, never()).run(); - verify(threadPoolExecutor).execute(runnable); - verify(runnable, never()).run(); - } -} \ No newline at end of file diff --git a/infra/common/src/test/java/cn/hippo4j/common/executor/support/SyncPutQueuePolicyTest.java b/infra/common/src/test/java/cn/hippo4j/common/executor/support/SyncPutQueuePolicyTest.java deleted file mode 100644 index c2f0a359..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/executor/support/SyncPutQueuePolicyTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.support; - -import cn.hippo4j.common.toolkit.ThreadUtil; -import org.junit.Assert; -import org.junit.Test; - -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; - -/** - * Synchronous placement queue policy implementation test - */ -public class SyncPutQueuePolicyTest { - - /** - * test thread pool rejected execution - */ - @Test - public void testRejectedExecution() { - SyncPutQueuePolicy syncPutQueuePolicy = new SyncPutQueuePolicy(); - ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 2, - 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1), syncPutQueuePolicy); - threadPoolExecutor.prestartAllCoreThreads(); - - Assert.assertSame(syncPutQueuePolicy, threadPoolExecutor.getRejectedExecutionHandler()); - IntStream.range(0, 4).forEach(s -> { - threadPoolExecutor.execute(() -> ThreadUtil.sleep(200L)); - }); - threadPoolExecutor.shutdown(); - while (!threadPoolExecutor.isTerminated()) { - } - Assert.assertEquals(4, threadPoolExecutor.getCompletedTaskCount()); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/executor/support/ThreadPoolExecutorUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/executor/support/ThreadPoolExecutorUtilTest.java deleted file mode 100644 index 88f523bb..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/executor/support/ThreadPoolExecutorUtilTest.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.executor.support; - -import cn.hippo4j.common.toolkit.ThreadPoolExecutorUtil; -import lombok.extern.slf4j.Slf4j; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * Thread pool executor util test - */ -@Slf4j -public class ThreadPoolExecutorUtilTest { - - private ThreadPoolExecutor executor; - private int corePoolSize; - private int maxPoolSize; - - @Before - public void testSafeSetPoolSize() { - corePoolSize = 2; - maxPoolSize = 4; - executor = new ThreadPoolExecutor( - corePoolSize, - maxPoolSize, - 1L, - TimeUnit.SECONDS, - new ArrayBlockingQueue<>(10)); - } - - @Test - public void testEquals() { - // Test when the new core pool size equals the original maximum pool size. - int newCorePoolSize1 = maxPoolSize; - int newMaxPoolSize1 = 6; - ThreadPoolExecutorUtil.safeSetPoolSize(executor, newCorePoolSize1, newMaxPoolSize1); - Assert.assertEquals(newCorePoolSize1, executor.getCorePoolSize()); - Assert.assertEquals(newMaxPoolSize1, executor.getMaximumPoolSize()); - } - - @Test - public void testGreater() { - // Test when the new core pool size is greater than the original maximum pool size. - int newCorePoolSize2 = 8; - int newMaxPoolSize2 = 10; - ThreadPoolExecutorUtil.safeSetPoolSize(executor, newCorePoolSize2, newMaxPoolSize2); - Assert.assertEquals(newCorePoolSize2, executor.getCorePoolSize()); - Assert.assertEquals(newMaxPoolSize2, executor.getMaximumPoolSize()); - } - - @Test - public void testLess() { - // Test when the new core pool size is less than the original maximum pool size. - int newCorePoolSize3 = 3; - int newMaxPoolSize3 = 5; - ThreadPoolExecutorUtil.safeSetPoolSize(executor, newCorePoolSize3, newMaxPoolSize3); - Assert.assertEquals(newCorePoolSize3, executor.getCorePoolSize()); - Assert.assertEquals(newMaxPoolSize3, executor.getMaximumPoolSize()); - } - - @Test - public void testException() { - // Test when the new core pool size is greater than the new maximum pool size, which should throw an IllegalArgumentException. - int newCorePoolSize4 = 6; - int newMaxPoolSize4 = 4; - try { - ThreadPoolExecutorUtil.safeSetPoolSize(executor, newCorePoolSize4, newMaxPoolSize4); - } catch (IllegalArgumentException e) { - // Expected to throw an exception. - Assert.assertEquals("newCorePoolSize must be smaller than newMaximumPoolSize", e.getMessage()); - log.error("newCorePoolSize must be smaller than newMaximumPoolSize;{}", e.getMessage()); - } - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/extension/design/AbstractSubjectCenterTest.java b/infra/common/src/test/java/cn/hippo4j/common/extension/design/AbstractSubjectCenterTest.java deleted file mode 100644 index 74bf2eac..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/extension/design/AbstractSubjectCenterTest.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.extension.design; - -import lombok.Getter; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.lang.reflect.Field; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; - -public class AbstractSubjectCenterTest { - - private Map> OBSERVERS_MAP; - - private SubjectNotifyListener subjectNotifyListener; - - @Before - public void setUp() throws NoSuchFieldException, IllegalAccessException { - subjectNotifyListener = new SubjectNotifyListener(); - - Field field = AbstractSubjectCenter.class.getDeclaredField("OBSERVERS_MAP"); - field.setAccessible(true); - OBSERVERS_MAP = (Map>) field.get(AbstractSubjectCenter.class); - } - - /** - * test register listener - */ - @Test - public void testDefaultRegister() { - AbstractSubjectCenter.register(subjectNotifyListener); - List list = OBSERVERS_MAP.get(AbstractSubjectCenter.SubjectType.SPRING_CONTENT_REFRESHED.name()); - Assert.assertNotNull(list); - Assert.assertEquals(1, list.size()); - Assert.assertSame(subjectNotifyListener, list.get(0)); - OBSERVERS_MAP.clear(); - } - - /** - * test register listener - */ - @Test - public void testSubjectTypeEnumRegister() { - AbstractSubjectCenter.register(AbstractSubjectCenter.SubjectType.THREAD_POOL_DYNAMIC_REFRESH, subjectNotifyListener); - List list = OBSERVERS_MAP.get(AbstractSubjectCenter.SubjectType.THREAD_POOL_DYNAMIC_REFRESH.name()); - Assert.assertNotNull(list); - Assert.assertEquals(1, list.size()); - Assert.assertSame(subjectNotifyListener, list.get(0)); - OBSERVERS_MAP.clear(); - } - - /** - * test register listener - */ - @Test - public void testSubjectTypeNameRegister() { - AbstractSubjectCenter.register(AbstractSubjectCenter.SubjectType.THREAD_POOL_DYNAMIC_REFRESH.name(), subjectNotifyListener); - List list = OBSERVERS_MAP.get(AbstractSubjectCenter.SubjectType.THREAD_POOL_DYNAMIC_REFRESH.name()); - Assert.assertNotNull(list); - Assert.assertEquals(1, list.size()); - Assert.assertSame(subjectNotifyListener, list.get(0)); - OBSERVERS_MAP.clear(); - } - - /** - * test remove listener - */ - @Test - public void testDefaultRemoveListener() { - AbstractSubjectCenter.register(subjectNotifyListener); - List list = OBSERVERS_MAP.get(AbstractSubjectCenter.SubjectType.SPRING_CONTENT_REFRESHED.name()); - Assert.assertNotNull(list); - Assert.assertEquals(1, list.size()); - Assert.assertSame(subjectNotifyListener, list.get(0)); - - AbstractSubjectCenter.remove(subjectNotifyListener); - Assert.assertEquals(0, list.size()); - } - - /** - * test remove listener - */ - @Test - public void testRemoveSubjectTypeNameListener() { - AbstractSubjectCenter.register(AbstractSubjectCenter.SubjectType.THREAD_POOL_DYNAMIC_REFRESH, subjectNotifyListener); - List list = OBSERVERS_MAP.get(AbstractSubjectCenter.SubjectType.THREAD_POOL_DYNAMIC_REFRESH.name()); - Assert.assertNotNull(list); - Assert.assertEquals(1, list.size()); - Assert.assertSame(subjectNotifyListener, list.get(0)); - - AbstractSubjectCenter.remove(AbstractSubjectCenter.SubjectType.THREAD_POOL_DYNAMIC_REFRESH.name(), subjectNotifyListener); - Assert.assertEquals(0, list.size()); - } - - /** - * test notify - */ - @Test - public void testNotifyBySubjectType() { - AbstractSubjectCenter.register(subjectNotifyListener); - List list = OBSERVERS_MAP.get(AbstractSubjectCenter.SubjectType.SPRING_CONTENT_REFRESHED.name()); - Assert.assertNotNull(list); - - NotifyMessage notifyMessage = new NotifyMessage(); - Assert.assertEquals(0, notifyMessage.getCount().get()); - AbstractSubjectCenter.notify(AbstractSubjectCenter.SubjectType.SPRING_CONTENT_REFRESHED, () -> notifyMessage); - Assert.assertEquals(1, notifyMessage.getCount().get()); - OBSERVERS_MAP.clear(); - } - - /** - * test notify - */ - @Test - public void testNotifyBySubjectTypeName() { - AbstractSubjectCenter.register(subjectNotifyListener); - List list = OBSERVERS_MAP.get(AbstractSubjectCenter.SubjectType.SPRING_CONTENT_REFRESHED.name()); - Assert.assertNotNull(list); - - NotifyMessage notifyMessage = new NotifyMessage(); - Assert.assertEquals(0, notifyMessage.getCount().get()); - AbstractSubjectCenter.notify(AbstractSubjectCenter.SubjectType.SPRING_CONTENT_REFRESHED.name(), () -> notifyMessage); - Assert.assertEquals(1, notifyMessage.getCount().get()); - OBSERVERS_MAP.clear(); - } - - @Getter - private static final class NotifyMessage { - - private final AtomicInteger count = new AtomicInteger(0); - } - - /** - * Subject Response Listener - */ - private static final class SubjectNotifyListener implements Observer { - - @Override - public void accept(ObserverMessage observerMessage) { - observerMessage.message().getCount().incrementAndGet(); - } - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/function/MatcherFunctionTest.java b/infra/common/src/test/java/cn/hippo4j/common/function/MatcherFunctionTest.java deleted file mode 100644 index 0b701222..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/function/MatcherFunctionTest.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.function; - -import cn.hippo4j.common.extension.function.Matcher; -import cn.hippo4j.common.toolkit.Assert; -import org.junit.Test; - -import java.math.BigDecimal; - -public final class MatcherFunctionTest { - - public static boolean matchTest(Matcher matcher, T value) { - return matcher.match(value); - } - - @Test - public void assertMatch() { - Assert.isTrue(matchTest(Boolean.TRUE::equals, true)); - Assert.isTrue(matchTest(BigDecimal.ZERO::equals, BigDecimal.ZERO)); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/function/NoArgsConsumerTest.java b/infra/common/src/test/java/cn/hippo4j/common/function/NoArgsConsumerTest.java deleted file mode 100644 index 553dda98..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/function/NoArgsConsumerTest.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.function; - -import cn.hippo4j.common.extension.function.NoArgsConsumer; -import cn.hippo4j.common.toolkit.Assert; -import org.junit.Test; - -import java.util.concurrent.atomic.AtomicBoolean; - -public final class NoArgsConsumerTest { - - @Test - public void accept() { - AtomicBoolean checkValue = new AtomicBoolean(false); - NoArgsConsumer noArgsConsumer = () -> checkValue.set(true); - noArgsConsumer.accept(); - Assert.isTrue(checkValue.get()); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ArrayUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/ArrayUtilTest.java deleted file mode 100644 index 17f010f3..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ArrayUtilTest.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.extension.function.Matcher; -import org.junit.Test; -import org.springframework.util.StringUtils; - -/** - * test {@link ArrayUtil} - */ -public class ArrayUtilTest { - - @Test - public void assertIsEmpty() { - String[] array = new String[0]; - Assert.isTrue(ArrayUtil.isEmpty(array)); - } - - @Test - public void assertIsNotEmpty() { - String[] array = new String[0]; - Assert.isTrue(!ArrayUtil.isNotEmpty(array)); - } - - @Test - public void assertFirstMatch() { - Matcher matcher = (str) -> "1".equalsIgnoreCase(str); - String[] array = new String[0]; - Assert.isTrue(StringUtils.isEmpty(ArrayUtil.firstMatch(matcher, array))); - array = new String[]{"0"}; - Assert.isTrue(StringUtils.isEmpty(ArrayUtil.firstMatch(matcher, array))); - array = new String[]{"1"}; - Assert.isTrue(!StringUtils.isEmpty(ArrayUtil.firstMatch(matcher, array))); - } - - @Test - public void assertAddAll() { - String[] array = new String[]{"1"}; - Assert.isTrue(ArrayUtil.addAll(array, null).length == 1); - Assert.isTrue(ArrayUtil.addAll(null, array).length == 1); - Assert.isTrue(ArrayUtil.addAll(array, new String[]{"1"}).length == 2); - } - - @Test - public void assertClone() { - Assert.isNull(ArrayUtil.clone(null)); - String[] array = new String[0]; - Assert.isTrue(array != ArrayUtil.clone(array)); - Assert.isTrue(array.length == ArrayUtil.clone(array).length); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/AssertTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/AssertTest.java deleted file mode 100644 index ce291c61..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/AssertTest.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import java.util.Collections; - -import org.junit.Test; - -/** - * test {@link Assert} - */ -public final class AssertTest { - - @Test(expected = IllegalArgumentException.class) - public void assertIsTrue() { - Assert.isTrue(false, "test message"); - } - - @Test(expected = IllegalArgumentException.class) - public void assertIsTrueAndMessageIsNull() { - Assert.isTrue(false); - } - - @Test(expected = IllegalArgumentException.class) - public void assertIsNullAndMessageIsNull() { - Assert.isNull(""); - } - - @Test(expected = IllegalArgumentException.class) - public void assertIsNull() { - Assert.isNull("", "object is null"); - } - - @Test(expected = IllegalArgumentException.class) - public void assertNotNull() { - Assert.notNull(null, "object is null"); - } - - @Test(expected = IllegalArgumentException.class) - public void assertNotNullAndMessageIsNull() { - Assert.notNull(null); - } - - @Test(expected = IllegalArgumentException.class) - public void assertNotEmptyByList() { - Assert.notEmpty(Collections.emptyList(), "object is null"); - } - - @Test(expected = IllegalArgumentException.class) - public void assertNotEmptyByListAndMessageIsNull() { - Assert.notEmpty(Collections.emptyList()); - } - - @Test(expected = IllegalArgumentException.class) - public void assertNotEmptyByMap() { - Assert.notEmpty(Collections.emptyMap(), "map is null"); - } - - @Test(expected = IllegalArgumentException.class) - public void assertNotEmptyByMapAndMessageIsNull() { - Assert.notEmpty(Collections.emptyMap()); - } - - @Test(expected = IllegalArgumentException.class) - public void assertNotEmptyByString() { - Assert.notEmpty("", "string is null"); - } - - @Test(expected = IllegalArgumentException.class) - public void assertNotEmptyByStringAndMessageIsNull() { - Assert.notEmpty(""); - } - - @Test(expected = IllegalArgumentException.class) - public void assertNotBlankByString() { - Assert.notBlank(" ", "string is null"); - } - - @Test(expected = IllegalArgumentException.class) - public void assertNotBlankByStringAndMessageIsNull() { - Assert.notBlank(" "); - } - - @Test(expected = IllegalArgumentException.class) - public void assertHasText() { - Assert.hasText(" ", "text is null"); - } - - @Test(expected = IllegalArgumentException.class) - public void assertHasTextAndMessageIsNull() { - Assert.hasText(" "); - } - -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/BeanUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/BeanUtilTest.java deleted file mode 100644 index 2e43cb29..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/BeanUtilTest.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import com.github.dozermapper.core.converters.ConversionException; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.junit.Assert; -import org.junit.Test; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -public class BeanUtilTest { - - @Test - public void beanToBeanConvertTest() { - final Person person = new Person(); - person.setName("Hippo4j"); - person.setAge(1); - person.setAddress("hippo4j.cn"); - person.setSize(999); - GoodPerson goodPerson = BeanUtil.convert(person, GoodPerson.class); - Assert.assertSame(goodPerson.getClass(), GoodPerson.class); - Assert.assertEquals("Hippo4j", person.getName()); - Assert.assertEquals(1, person.getAge()); - Assert.assertEquals("hippo4j.cn", person.getAddress()); - Assert.assertEquals(999, person.getSize().intValue()); - } - - @Test - public void beanToMapConvertTest() { - final Person person = new Person(); - person.setName("Hippo4j"); - person.setAge(1); - person.setAddress("hippo4j.cn"); - person.setSize(999); - final Map convert = BeanUtil.convert(person, Map.class); - Assert.assertEquals("Hippo4j", convert.get("name")); - Assert.assertEquals(1, convert.get("age")); - Assert.assertEquals("hippo4j.cn", convert.get("address")); - Assert.assertEquals(999, convert.get("size")); - } - - @Test - public void mapToBeanConvertTest() { - final HashMap map = new HashMap<>(); - map.put("name", "Hippo4j"); - map.put("age", 1); - map.put("address", "hippo4j.cn"); - map.put("size", 999); - final Person person = BeanUtil.convert(map, Person.class); - Assert.assertEquals("Hippo4j", person.getName()); - Assert.assertEquals(1, person.getAge()); - Assert.assertEquals("hippo4j.cn", person.getAddress()); - Assert.assertEquals(999, (int) person.getSize()); - } - - @Test - public void ListToListConvertTest() { - final List list = new ArrayList<>(); - list.add(Person.builder().name("one").age(1).build()); - list.add(Person.builder().name("two").age(2).build()); - list.add(Person.builder().name("three").age(3).build()); - - final List persons = BeanUtil.convert(list, PersonVo.class); - Assert.assertEquals(list.size(), persons.size()); - } - - @Test - public void SetToSetConvertTest() { - final Set sets = new HashSet<>(); - sets.add(Person.builder().name("one").age(1).build()); - sets.add(Person.builder().name("two").age(2).build()); - sets.add(Person.builder().name("three").age(3).build()); - - final Set persons = BeanUtil.convert(sets, PersonVo.class); - Assert.assertEquals(sets.size(), persons.size()); - } - - @Test - public void copyPropertiesBeanToMapTest() { - final Person person = new Person(); - person.setName("Hippo4j"); - - final Map convert = BeanUtil.convert(person, Map.class); - Assert.assertEquals("Hippo4j", convert.get("name")); - - Assert.assertFalse(convert.containsKey("STATIC_NAME")); - } - - @Test(expected = ConversionException.class) - public void mapToBeanWinErrorTest() { - final Map map = new HashMap<>(); - map.put("age", "Hippo4j"); - BeanUtil.convert(map, Person.class); - } - - // ----------------------------------------------------------------------------------------------------------------- - - @Test - public void testMapToBean() { - Map map = new HashMap<>(); - map.put("name", "Test"); - map.put("status_code", 12); - Customer customer = BeanUtil.mapToBean(map, Customer.class, true); - Assert.assertEquals("Test", customer.getName()); - Assert.assertEquals(Integer.valueOf(12), customer.getStatusCode()); - } - - @Test - public void testGetter() { - Method name = BeanUtil.getter(Customer.class, "name"); - Assert.assertEquals("getName", name.getName()); - } - - @Test - public void testSetter() { - Method name = BeanUtil.setter(Customer.class, "name"); - Assert.assertEquals("setName", name.getName()); - } - - @Getter - @Setter - @Builder - @AllArgsConstructor - @NoArgsConstructor - public static class Person { - - /** - * STATIC_NAME - */ - public static final String STATIC_NAME = "STATIC_NAME"; - - /** - * name - */ - private String name; - - /** - * age - */ - private int age; - - /** - * address - */ - private String address; - - /** - * size - */ - private Integer size; - } - - @Setter - public static class PersonVo { - - /** - * name - */ - private String name; - - /** - * age - */ - private int age; - } - - @Getter - @Setter - static class Customer { - - /** - * name - */ - String name; - - /** - * statusCode - */ - Integer statusCode; - } - - @Getter - @Setter - static class PreCustomer { - - /** - * name - */ - String name; - - /** - * statusCode - */ - Integer statusCode; - } - - @Getter - @Setter - static class GoodPerson extends Person { - - /** - * gender - */ - private String gender; - - /** - * nature - */ - private String nature; - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/BooleanUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/BooleanUtilTest.java deleted file mode 100644 index 85ff30f5..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/BooleanUtilTest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import org.junit.Assert; -import org.junit.Test; - -public class BooleanUtilTest { - - @Test - public void assertToBoolean() { - Assert.assertTrue(BooleanUtil.toBoolean("true")); - Assert.assertTrue(BooleanUtil.toBoolean("yes")); - Assert.assertTrue(BooleanUtil.toBoolean("1")); - } - - @Test - public void assertIsTrue() { - Assert.assertTrue(BooleanUtil.isTrue(true)); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ByteConvertUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/ByteConvertUtilTest.java deleted file mode 100644 index a23e4a4c..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ByteConvertUtilTest.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import org.junit.Test; - -import java.util.Objects; - -public class ByteConvertUtilTest { - - @Test - public void assertGetPrintSize() { - Assert.isTrue(Objects.equals(ByteConvertUtil.getPrintSize(220), "220B")); - Assert.isTrue(Objects.equals(ByteConvertUtil.getPrintSize(2200), "2.15KB")); - Assert.isTrue(Objects.equals(ByteConvertUtil.getPrintSize(2200000), "2.10MB")); - Assert.isTrue(Objects.equals(ByteConvertUtil.getPrintSize(2200000000L), "2.05GB")); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/CalculateUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/CalculateUtilTest.java deleted file mode 100644 index 715c71c6..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/CalculateUtilTest.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import org.junit.Test; - -public class CalculateUtilTest { - - @Test - public void assertDivide() { - Assert.isTrue(CalculateUtil.divide(200, 100) == 200); - Assert.isTrue(CalculateUtil.divide(100, 200) == 50); - Assert.isTrue(CalculateUtil.divide(100, 100) == 100); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ClassUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/ClassUtilTest.java deleted file mode 100644 index ec6f25dc..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ClassUtilTest.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import org.junit.Assert; -import org.junit.Test; - -/** - * test for {@link ClassUtil} - */ -public class ClassUtilTest { - - @Test - public void testGetClassLoader() { - ClassLoader expectedClassLoader = Thread.currentThread().getContextClassLoader(); - ClassLoader actualClassLoader = ClassUtil.getClassLoader(ClassUtilTest.class); - Assert.assertEquals(expectedClassLoader, actualClassLoader); - - expectedClassLoader = ClassUtilTest.class.getClassLoader(); - actualClassLoader = ClassUtil.getClassLoader(null); - Assert.assertEquals(expectedClassLoader, actualClassLoader); - - expectedClassLoader = ClassLoader.getSystemClassLoader(); - actualClassLoader = ClassUtil.getClassLoader(String.class); - Assert.assertEquals(expectedClassLoader, actualClassLoader); - } - -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/CollectionUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/CollectionUtilTest.java deleted file mode 100644 index 04e011dd..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/CollectionUtilTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import org.assertj.core.util.Lists; -import org.junit.Test; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -public class CollectionUtilTest { - - @Test - public void assertGetFirst() { - Assert.isNull(CollectionUtil.getFirst(null)); - String first = CollectionUtil.getFirst(Lists.newArrayList("1", "2")); - Assert.notEmpty(first); - } - - @Test - public void assertIsEmpty() { - List list = null; - Assert.isTrue(CollectionUtil.isEmpty(list)); - list = Lists.newArrayList(); - Assert.isTrue(CollectionUtil.isEmpty(list)); - list = Lists.newArrayList("1"); - Assert.isTrue(!CollectionUtil.isEmpty(list)); - Map map = null; - Assert.isTrue(CollectionUtil.isEmpty(map)); - map = new HashMap<>(); - Assert.isTrue(CollectionUtil.isEmpty(map)); - map.put("key", "value"); - Assert.isTrue(!CollectionUtil.isEmpty(map)); - Iterator iterator = null; - Assert.isTrue(CollectionUtil.isEmpty(iterator)); - iterator = Lists.emptyList().iterator(); - Assert.isTrue(CollectionUtil.isEmpty(iterator)); - iterator = Lists.newArrayList("1").iterator(); - Assert.isTrue(!CollectionUtil.isEmpty(iterator)); - } - - @Test - public void assertIsNotEmpty() { - List list = null; - Assert.isTrue(!CollectionUtil.isNotEmpty(list)); - list = Lists.newArrayList(); - Assert.isTrue(!CollectionUtil.isNotEmpty(list)); - list = Lists.newArrayList("1"); - Assert.isTrue(CollectionUtil.isNotEmpty(list)); - Map map = null; - Assert.isTrue(!CollectionUtil.isNotEmpty(map)); - map = new HashMap<>(); - Assert.isTrue(!CollectionUtil.isNotEmpty(map)); - map.put("key", "value"); - Assert.isTrue(CollectionUtil.isNotEmpty(map)); - Iterator iterator = null; - Assert.isTrue(!CollectionUtil.isNotEmpty(iterator)); - iterator = Lists.emptyList().iterator(); - Assert.isTrue(!CollectionUtil.isNotEmpty(iterator)); - iterator = Lists.newArrayList("1").iterator(); - Assert.isTrue(CollectionUtil.isNotEmpty(iterator)); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ConditionUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/ConditionUtilTest.java deleted file mode 100644 index 99846d9e..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ConditionUtilTest.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.extension.function.NoArgsConsumer; -import org.junit.Test; - -import java.util.concurrent.atomic.AtomicBoolean; - -public class ConditionUtilTest { - - @Test - public void assertCondition() { - // init consumer - AtomicBoolean checkValue = new AtomicBoolean(false); - NoArgsConsumer trueConsumer = () -> checkValue.set(true); - NoArgsConsumer falseConsumer = () -> checkValue.set(false); - // test trueConsumer run - ConditionUtil.condition(true, trueConsumer, falseConsumer); - Assert.isTrue(checkValue.get()); - // test falseConsumer run - ConditionUtil.condition(false, trueConsumer, falseConsumer); - Assert.isTrue(!checkValue.get()); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ContentUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/ContentUtilTest.java deleted file mode 100644 index a0897193..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ContentUtilTest.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import org.junit.Test; - -public class ContentUtilTest { - - @Test - public void assertGetPoolContent() { - // Since field adapter is used, ContentUtil.getPoolContent() converts new fields to old fields for JSON generation - // This ensures backward compatibility (v1 protocol uses old field names) - ThreadPoolParameterInfo threadPoolParameterInfo = ThreadPoolParameterInfo.builder().tenantId("prescription") - .itemId("dynamic-threadpool-example").tpId("message-consume").content("description").corePoolSize(1) - .maximumPoolSize(2).queueType(1).capacity(4).keepAliveTime(513L).executeTimeOut(null).rejectedType(4) - .isAlarm(1).capacityAlarm(80).livenessAlarm(80).allowCoreThreadTimeOut(1).build(); - - String actualContent = ContentUtil.getPoolContent(threadPoolParameterInfo); - - // Verify generated JSON contains required fields - Assert.isTrue(actualContent.contains("\"tenantId\":\"prescription\""), "Should contain tenantId"); - Assert.isTrue(actualContent.contains("\"itemId\":\"dynamic-threadpool-example\""), "Should contain itemId"); - Assert.isTrue(actualContent.contains("\"tpId\":\"message-consume\""), "Should contain tpId"); - Assert.isTrue(actualContent.contains("\"coreSize\":1"), "Should contain coreSize (via adapter)"); - Assert.isTrue(actualContent.contains("\"maxSize\":2"), "Should contain maxSize (via adapter)"); - Assert.isTrue(actualContent.contains("\"queueType\":1"), "Should contain queueType"); - Assert.isTrue(actualContent.contains("\"capacity\":4"), "Should contain capacity"); - - System.out.println("ContentUtil.getPoolContent() test passed"); - System.out.println("Generated content: " + actualContent); - } - - @Test - public void assertGetGroupKey() { - String testText = "message-consume+dynamic-threadpool-example+prescription"; - ThreadPoolParameterInfo parameter = ThreadPoolParameterInfo.builder() - .tenantId("prescription").itemId("dynamic-threadpool-example").tpId("message-consume").build(); - Assert.isTrue(testText.equals(ContentUtil.getGroupKey(parameter))); - } - - @Test - public void assertGetGroupKeys() { - String testText = "message-consume+dynamic-threadpool-example+prescription"; - String groupKey = ContentUtil.getGroupKey("message-consume", "dynamic-threadpool-example", "prescription"); - Assert.isTrue(testText.equals(groupKey)); - } - - /** - * Test field adapter: generate content using old field names - * Verify ContentUtil.getPoolContent() correctly handles coreSize/maxSize - */ - @Test - public void testFieldAdapterWithOldFields() { - ThreadPoolParameterInfo oldFieldConfig = new ThreadPoolParameterInfo(); - oldFieldConfig.setTenantId("tenant-001"); - oldFieldConfig.setItemId("item-001"); - oldFieldConfig.setTpId("test-pool"); - oldFieldConfig.setCoreSize(10); // Use old field name - oldFieldConfig.setMaxSize(20); // Use old field name - oldFieldConfig.setQueueType(2); - oldFieldConfig.setCapacity(1024); - - ThreadPoolParameterInfo newFieldConfig = new ThreadPoolParameterInfo(); - newFieldConfig.setTenantId("tenant-001"); - newFieldConfig.setItemId("item-001"); - newFieldConfig.setTpId("test-pool"); - newFieldConfig.setCorePoolSize(10); // Use new field name - newFieldConfig.setMaximumPoolSize(20); // Use new field name - newFieldConfig.setQueueType(2); - newFieldConfig.setCapacity(1024); - - String oldContent = ContentUtil.getPoolContent(oldFieldConfig); - String newContent = ContentUtil.getPoolContent(newFieldConfig); - - // Assert: content generated from old and new field names should be the same (via adapter) - Assert.isTrue(oldContent.equals(newContent), "Field adapter should generate same content for old and new fields"); - System.out.println("ContentUtil field adapter test passed"); - System.out.println("Old field content: " + oldContent); - System.out.println("New field content: " + newContent); - } -} \ No newline at end of file diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ExtensibilityTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/ExtensibilityTest.java deleted file mode 100644 index 2865a74a..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ExtensibilityTest.java +++ /dev/null @@ -1,285 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import org.junit.Assert; -import org.junit.Test; - -import java.util.Map; - -/** - * Extensibility issue test: verify that adding new extended parameters does not trigger invalid refresh. - */ -public class ExtensibilityTest { - - /** - * Scenario 1: Server adds an extended parameter (executeTimeOut), Client does not have this parameter. - * Expected result: Under v2 protocol, MD5 remains the same, no refresh triggered. - */ - @Test - public void testExtendedParameterAddition_ExecuteTimeOut() { - System.out.println("========== Scenario 1: Server adds executeTimeOut extended parameter =========="); - - // Client configuration (without executeTimeOut) - ThreadPoolParameterInfo clientConfig = new ThreadPoolParameterInfo(); - clientConfig.setTenantId("default"); - clientConfig.setItemId("item-001"); - clientConfig.setTpId("test-pool"); - clientConfig.setCorePoolSize(10); - clientConfig.setMaximumPoolSize(20); - clientConfig.setQueueType(2); - clientConfig.setCapacity(1024); - clientConfig.setKeepAliveTime(60L); - clientConfig.setRejectedType(1); - clientConfig.setAllowCoreThreadTimeOut(0); - // Note: executeTimeOut not set - - // Server configuration (with executeTimeOut added) - ThreadPoolParameterInfo serverConfig = new ThreadPoolParameterInfo(); - serverConfig.setTenantId("default"); - serverConfig.setItemId("item-001"); - serverConfig.setTpId("test-pool"); - serverConfig.setCorePoolSize(10); - serverConfig.setMaximumPoolSize(20); - serverConfig.setQueueType(2); - serverConfig.setCapacity(1024); - serverConfig.setKeepAliveTime(60L); - serverConfig.setRejectedType(1); - serverConfig.setAllowCoreThreadTimeOut(0); - serverConfig.setExecuteTimeOut(5000L); // new extended parameter - - // v2 protocol: only core parameters are included in MD5 calculation - String clientContent = IncrementalContentUtil.getCoreContent(clientConfig); - String clientMd5 = Md5Util.md5Hex(clientContent, "UTF-8"); - - String serverContent = IncrementalContentUtil.getCoreContent(serverConfig); - String serverMd5 = Md5Util.md5Hex(serverContent, "UTF-8"); - - System.out.println("Client config: executeTimeOut=" + clientConfig.getExecuteTimeOut()); - System.out.println("Server config: executeTimeOut=" + serverConfig.getExecuteTimeOut()); - System.out.println("Client incremental content: " + clientContent); - System.out.println("Server incremental content: " + serverContent); - System.out.println("Client MD5: " + clientMd5); - System.out.println("Server MD5: " + serverMd5); - System.out.println("Does server incremental content contain executeTimeOut: " + serverContent.contains("executeTimeOut")); - - Assert.assertFalse("Incremental content should not contain extended parameter executeTimeOut", serverContent.contains("executeTimeOut")); - Assert.assertEquals("Adding extended parameter should not affect incremental MD5 and should not trigger refresh", serverMd5, clientMd5); - System.out.println("Test passed: Adding executeTimeOut does not trigger invalid refresh"); - } - - /** - * Scenario 2: Server adds multiple extended parameters (executeTimeOut, isAlarm, capacityAlarm). - * Expected result: Under v2 protocol, MD5 remains the same, no refresh triggered. - */ - @Test - public void testMultipleExtendedParametersAddition() { - System.out.println("\n========== Scenario 2: Server adds multiple extended parameters =========="); - - // Client configuration (without extended parameters) - ThreadPoolParameterInfo clientConfig = new ThreadPoolParameterInfo(); - clientConfig.setTenantId("default"); - clientConfig.setItemId("item-001"); - clientConfig.setTpId("test-pool"); - clientConfig.setCorePoolSize(10); - clientConfig.setMaximumPoolSize(20); - clientConfig.setQueueType(2); - clientConfig.setCapacity(1024); - - // Server configuration (with multiple extended parameters) - ThreadPoolParameterInfo serverConfig = new ThreadPoolParameterInfo(); - serverConfig.setTenantId("default"); - serverConfig.setItemId("item-001"); - serverConfig.setTpId("test-pool"); - serverConfig.setCorePoolSize(10); - serverConfig.setMaximumPoolSize(20); - serverConfig.setQueueType(2); - serverConfig.setCapacity(1024); - serverConfig.setExecuteTimeOut(5000L); // extended parameter 1 - serverConfig.setIsAlarm(1); // extended parameter 2 - serverConfig.setCapacityAlarm(80); // extended parameter 3 - serverConfig.setLivenessAlarm(90); // extended parameter 4 - - String clientMd5 = Md5Util.md5Hex(IncrementalContentUtil.getCoreContent(clientConfig), "UTF-8"); - String serverMd5 = Md5Util.md5Hex(IncrementalContentUtil.getCoreContent(serverConfig), "UTF-8"); - - System.out.println("Server added extended parameters: executeTimeOut=" + serverConfig.getExecuteTimeOut() - + ", isAlarm=" + serverConfig.getIsAlarm() - + ", capacityAlarm=" + serverConfig.getCapacityAlarm() - + ", livenessAlarm=" + serverConfig.getLivenessAlarm()); - System.out.println("Client MD5: " + clientMd5); - System.out.println("Server MD5: " + serverMd5); - - Assert.assertEquals("Adding multiple extended parameters should not trigger refresh", serverMd5, clientMd5); - System.out.println("Test passed: Adding multiple extended parameters does not trigger invalid refresh"); - } - - /** - * Scenario 3: Only extended parameters changed, core parameters remain unchanged. - * Expected result: hasCoreChanges returns false, hasExtendedChanges returns true. - */ - @Test - public void testOnlyExtendedParametersChanged() { - System.out.println("\n========== Scenario 3: Only extended parameters changed =========="); - - ThreadPoolParameterInfo oldConfig = new ThreadPoolParameterInfo(); - oldConfig.setTenantId("default"); - oldConfig.setItemId("item-001"); - oldConfig.setTpId("test-pool"); - oldConfig.setCorePoolSize(10); - oldConfig.setMaximumPoolSize(20); - oldConfig.setQueueType(2); - oldConfig.setCapacity(1024); - oldConfig.setExecuteTimeOut(3000L); - oldConfig.setIsAlarm(0); - - ThreadPoolParameterInfo newConfig = new ThreadPoolParameterInfo(); - newConfig.setTenantId("default"); - newConfig.setItemId("item-001"); - newConfig.setTpId("test-pool"); - newConfig.setCorePoolSize(10); - newConfig.setMaximumPoolSize(20); - newConfig.setQueueType(2); - newConfig.setCapacity(1024); - newConfig.setExecuteTimeOut(5000L); - newConfig.setIsAlarm(1); - - boolean hasCoreChanges = IncrementalContentUtil.hasCoreChanges(oldConfig, newConfig); - boolean hasExtendedChanges = IncrementalContentUtil.hasExtendedChanges(oldConfig, newConfig); - - System.out.println("Core parameter changes: " + hasCoreChanges); - System.out.println("Extended parameter changes: " + hasExtendedChanges); - - Assert.assertFalse("Core parameters should not change", hasCoreChanges); - Assert.assertTrue("Extended parameters should change", hasExtendedChanges); - System.out.println("Test passed: Correctly identifies only extended parameters changed"); - } - - /** - * Scenario 4: Both core and extended parameters changed. - * Expected result: hasCoreChanges returns true, hasExtendedChanges returns true. - */ - @Test - public void testBothCoreAndExtendedParametersChanged() { - System.out.println("\n========== Scenario 4: Both core and extended parameters changed =========="); - - ThreadPoolParameterInfo oldConfig = new ThreadPoolParameterInfo(); - oldConfig.setCorePoolSize(10); - oldConfig.setMaximumPoolSize(20); - oldConfig.setQueueType(2); - oldConfig.setExecuteTimeOut(3000L); - - ThreadPoolParameterInfo newConfig = new ThreadPoolParameterInfo(); - newConfig.setCorePoolSize(15); - newConfig.setMaximumPoolSize(30); - newConfig.setQueueType(2); - newConfig.setExecuteTimeOut(5000L); - - boolean hasCoreChanges = IncrementalContentUtil.hasCoreChanges(oldConfig, newConfig); - boolean hasExtendedChanges = IncrementalContentUtil.hasExtendedChanges(oldConfig, newConfig); - - System.out.println("Core parameter changes: " + hasCoreChanges); - System.out.println("Extended parameter changes: " + hasExtendedChanges); - - Assert.assertTrue("Core parameters should change", hasCoreChanges); - Assert.assertTrue("Extended parameters should change", hasExtendedChanges); - System.out.println("Test passed: Correctly identifies both core and extended parameters changed"); - } - - /** - * Scenario 5: v1 client refreshes due to extended parameter changes, v2 client does not. - * Expected result: v1 MD5 differs, v2 MD5 remains the same. - */ - @Test - public void testProtocolVersionBehaviorDifference() { - System.out.println("\n========== Scenario 5: v1 and v2 protocol differences in handling extended parameters =========="); - - ThreadPoolParameterInfo oldConfig = new ThreadPoolParameterInfo(); - oldConfig.setTenantId("default"); - oldConfig.setItemId("item-001"); - oldConfig.setTpId("test-pool"); - oldConfig.setCorePoolSize(10); - oldConfig.setMaximumPoolSize(20); - oldConfig.setQueueType(2); - oldConfig.setExecuteTimeOut(3000L); - - ThreadPoolParameterInfo newConfig = new ThreadPoolParameterInfo(); - newConfig.setTenantId("default"); - newConfig.setItemId("item-001"); - newConfig.setTpId("test-pool"); - newConfig.setCorePoolSize(10); - newConfig.setMaximumPoolSize(20); - newConfig.setQueueType(2); - newConfig.setExecuteTimeOut(5000L); - - // v1 protocol: full MD5 - String oldV1Md5 = Md5Util.md5Hex(IncrementalContentUtil.getFullContent(oldConfig), "UTF-8"); - String newV1Md5 = Md5Util.md5Hex(IncrementalContentUtil.getFullContent(newConfig), "UTF-8"); - - // v2 protocol: incremental MD5 (only core parameters) - String oldV2Md5 = Md5Util.md5Hex(IncrementalContentUtil.getCoreContent(oldConfig), "UTF-8"); - String newV2Md5 = Md5Util.md5Hex(IncrementalContentUtil.getCoreContent(newConfig), "UTF-8"); - - System.out.println("Extended parameter changed: executeTimeOut " + oldConfig.getExecuteTimeOut() + " -> " + newConfig.getExecuteTimeOut()); - System.out.println("v1 protocol: oldMd5=" + oldV1Md5 + ", newMd5=" + newV1Md5 + ", equal=" + oldV1Md5.equals(newV1Md5)); - System.out.println("v2 protocol: oldMd5=" + oldV2Md5 + ", newMd5=" + newV2Md5 + ", equal=" + oldV2Md5.equals(newV2Md5)); - - Assert.assertNotEquals("v1 protocol: extended parameter changes should trigger refresh (MD5 differs)", oldV1Md5, newV1Md5); - Assert.assertEquals("v2 protocol: extended parameter changes should not trigger refresh (MD5 same)", oldV2Md5, newV2Md5); - System.out.println("Test passed: v2 protocol correctly isolates extended parameter changes"); - } - - /** - * Scenario 6: getChangesSummary correctly identifies change types. - */ - @Test - public void testChangesSummary() { - System.out.println("\n========== Scenario 6: Change summary identification =========="); - - ThreadPoolParameterInfo baseConfig = new ThreadPoolParameterInfo(); - baseConfig.setCorePoolSize(10); - baseConfig.setMaximumPoolSize(20); - baseConfig.setQueueType(2); - baseConfig.setExecuteTimeOut(3000L); - - // Case 1: Only extended parameter changed - ThreadPoolParameterInfo extendedOnlyConfig = new ThreadPoolParameterInfo(); - extendedOnlyConfig.setCorePoolSize(10); - extendedOnlyConfig.setMaximumPoolSize(20); - extendedOnlyConfig.setQueueType(2); - extendedOnlyConfig.setExecuteTimeOut(5000L); - - Map extendedOnlySummary = IncrementalContentUtil.getChangesSummary(baseConfig, extendedOnlyConfig); - System.out.println("Only extended parameter change summary: " + extendedOnlySummary); - Assert.assertEquals("extended", extendedOnlySummary.get("type")); - - // Case 2: Core parameters changed - ThreadPoolParameterInfo coreChangedConfig = new ThreadPoolParameterInfo(); - coreChangedConfig.setCorePoolSize(15); - coreChangedConfig.setMaximumPoolSize(20); - coreChangedConfig.setQueueType(2); - coreChangedConfig.setExecuteTimeOut(3000L); - - Map coreChangedSummary = IncrementalContentUtil.getChangesSummary(baseConfig, coreChangedConfig); - System.out.println("Core parameter change summary: " + coreChangedSummary); - Assert.assertEquals("core", coreChangedSummary.get("type")); - - System.out.println("Test passed: Change summary correctly identified"); - } -} \ No newline at end of file diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/FieldVersionControlTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/FieldVersionControlTest.java deleted file mode 100644 index df64e6a5..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/FieldVersionControlTest.java +++ /dev/null @@ -1,443 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import com.fasterxml.jackson.core.type.TypeReference; -import org.junit.Assert; -import org.junit.Test; - -import java.util.Collections; -import java.util.LinkedHashMap; - -/** - * Field Version Control Test: Validates that fields introduced in newer versions - * are automatically excluded for older protocol clients to prevent unnecessary refreshes. - * - * This directly addresses the mentor's requirement: - * "If server version 2.0 introduces a new parameter xxx, and the client version is lower than 2.0, - * then this parameter should not be included in the refresh check." - */ -public class FieldVersionControlTest { - - /** - * Scenario 1: Server 2.0 introduces a new field, client with protocol v1 should skip it. - * This simulates the mentor's example: server adds field 'xxx' in v2.0, client v1.9 should ignore it. - */ - @Test - public void testNewFieldInV2_ProtocolV1ClientSkips() { - System.out.println("========== Scenario 1: Server 2.0 adds new field, Protocol v1 client skips =========="); - - // Server configuration (v2.0) with a hypothetical new field 'executeTimeOut' - // Explicitly mark that the field is only recognized by clients from protocol v3 onward - ThreadPoolParameterInfo serverConfig = new ThreadPoolParameterInfo(); - serverConfig.setTenantId("tenant-001"); - serverConfig.setItemId("item-001"); - serverConfig.setTpId("test-pool"); - serverConfig.setCorePoolSize(10); - serverConfig.setMaximumPoolSize(20); - serverConfig.setQueueType(2); - serverConfig.setCapacity(1024); - serverConfig.setKeepAliveTime(60L); - serverConfig.setRejectedType(1); - serverConfig.setAllowCoreThreadTimeOut(0); - serverConfig.setExecuteTimeOut(5000L); // New field introduced in v2.0 (minimum version = 2.1.0) - serverConfig.setFieldVersionMetadata(Collections.singletonMap("executeTimeOut", "2.1.0")); - - // Protocol v1 client content generation - String v1Content = IncrementalContentUtil.getVersionedContent(serverConfig, "1.9.0"); - LinkedHashMap v1Fields = JSONUtil.parseObject(v1Content, new TypeReference>() { - }); - - // Protocol v2 client content generation - String v2Content = IncrementalContentUtil.getVersionedContent(serverConfig, "2.0.0"); - LinkedHashMap v2Fields = JSONUtil.parseObject(v2Content, new TypeReference>() { - }); - - // Protocol v3 client content generation - String v3Content = IncrementalContentUtil.getVersionedContent(serverConfig, "2.1.0"); - LinkedHashMap v3Fields = JSONUtil.parseObject(v3Content, new TypeReference>() { - }); - - System.out.println("Server config has executeTimeOut: " + serverConfig.getExecuteTimeOut()); - System.out.println("Protocol v1 content: " + v1Content); - System.out.println("Protocol v2 content: " + v2Content); - System.out.println("Protocol v3 content: " + v3Content); - System.out.println("Protocol v1 contains executeTimeOut: " + v1Fields.containsKey("executeTimeOut")); - System.out.println("Protocol v2 contains executeTimeOut: " + v2Fields.containsKey("executeTimeOut")); - System.out.println("Protocol v3 contains executeTimeOut: " + v3Fields.containsKey("executeTimeOut")); - - // Assertions - Assert.assertFalse("Protocol v1 should skip executeTimeOut (min protocol = 3)", v1Fields.containsKey("executeTimeOut")); - Assert.assertFalse("Protocol v2 should skip executeTimeOut (min protocol = 3)", v2Fields.containsKey("executeTimeOut")); - Assert.assertTrue("Protocol v3 should include executeTimeOut", v3Fields.containsKey("executeTimeOut")); - System.out.println("Test passed: Protocol v1/v2 clients skip new field, v3 client observes it"); - } - - /** - * Scenario 2: Server 2.1 introduces another new field, only protocol v3+ clients should see it. - * This validates the mentor's second example: incremental field rollout across versions. - */ - @Test - public void testNewFieldInV21_RequiresProtocolV3() { - System.out.println("\n========== Scenario 2: Server 2.1 adds field requiring protocol v3 =========="); - - // Simulate a field that requires protocol v3 (e.g., a new alarm type) - ThreadPoolParameterInfo config = new ThreadPoolParameterInfo(); - config.setTenantId("tenant-001"); - config.setItemId("item-001"); - config.setTpId("test-pool"); - config.setCorePoolSize(10); - config.setMaximumPoolSize(20); - config.setQueueType(2); - config.setCapacity(1024); - config.setIsAlarm(1); // Extended field, minimum version = 2.1.0 - config.setFieldVersionMetadata(Collections.singletonMap("isAlarm", "2.1.0")); - - String v1Content = IncrementalContentUtil.getVersionedContent(config, "1.9.0"); - String v2Content = IncrementalContentUtil.getVersionedContent(config, "2.0.0"); - String v3Content = IncrementalContentUtil.getVersionedContent(config, "2.1.0"); - - LinkedHashMap v1Fields = JSONUtil.parseObject(v1Content, new TypeReference>() { - }); - LinkedHashMap v2Fields = JSONUtil.parseObject(v2Content, new TypeReference>() { - }); - LinkedHashMap v3Fields = JSONUtil.parseObject(v3Content, new TypeReference>() { - }); - - System.out.println("Protocol v1 content: " + v1Content); - System.out.println("Protocol v2 content: " + v2Content); - System.out.println("Protocol v3 content: " + v3Content); - System.out.println("v1 contains isAlarm: " + v1Fields.containsKey("isAlarm")); - System.out.println("v2 contains isAlarm: " + v2Fields.containsKey("isAlarm")); - System.out.println("v3 contains isAlarm: " + v3Fields.containsKey("isAlarm")); - - Assert.assertFalse("Protocol v1 should skip isAlarm (min protocol = 3)", v1Fields.containsKey("isAlarm")); - Assert.assertFalse("Protocol v2 should skip isAlarm (min protocol = 3)", v2Fields.containsKey("isAlarm")); - Assert.assertTrue("Protocol v3 should include isAlarm", v3Fields.containsKey("isAlarm")); - System.out.println("Test passed: Field visibility controlled by minimum protocol version"); - } - - /** - * Scenario 3: Verify that MD5 remains stable when only invisible fields change. - * This is the core benefit: preventing unnecessary refreshes. - */ - @Test - public void testMd5StabilityWhenInvisibleFieldChanges() { - System.out.println("\n========== Scenario 3: MD5 stability when invisible field changes =========="); - - // Old config without extended field - ThreadPoolParameterInfo oldConfig = new ThreadPoolParameterInfo(); - oldConfig.setTenantId("tenant-001"); - oldConfig.setItemId("item-001"); - oldConfig.setTpId("test-pool"); - oldConfig.setCorePoolSize(10); - oldConfig.setMaximumPoolSize(20); - oldConfig.setQueueType(2); - oldConfig.setCapacity(1024); - - // New config with extended field added (invisible to protocol v2) - ThreadPoolParameterInfo newConfig = new ThreadPoolParameterInfo(); - newConfig.setTenantId("tenant-001"); - newConfig.setItemId("item-001"); - newConfig.setTpId("test-pool"); - newConfig.setCorePoolSize(10); - newConfig.setMaximumPoolSize(20); - newConfig.setQueueType(2); - newConfig.setCapacity(1024); - newConfig.setExecuteTimeOut(5000L); // Added field (min version = 2.1.0) - newConfig.setFieldVersionMetadata(Collections.singletonMap("executeTimeOut", "2.1.0")); - - String oldV2Md5 = IncrementalMd5Util.getVersionedMd5(oldConfig, "2.0.0"); - String newV2Md5 = IncrementalMd5Util.getVersionedMd5(newConfig, "2.0.0"); - - System.out.println("Old config executeTimeOut: " + oldConfig.getExecuteTimeOut()); - System.out.println("New config executeTimeOut: " + newConfig.getExecuteTimeOut()); - System.out.println("Protocol v2 old MD5: " + oldV2Md5); - System.out.println("Protocol v2 new MD5: " + newV2Md5); - - Assert.assertEquals("MD5 should remain same when only invisible fields change", oldV2Md5, newV2Md5); - System.out.println("Test passed: Protocol v2 client does not refresh when server adds executeTimeOut"); - } - - /** - * Scenario 4: Core field changes should always trigger refresh regardless of protocol. - * This ensures critical updates are never missed. - */ - @Test - public void testCoreFieldChangesAlwaysTriggerRefresh() { - System.out.println("\n========== Scenario 4: Core field changes trigger refresh for all protocols =========="); - - ThreadPoolParameterInfo oldConfig = new ThreadPoolParameterInfo(); - oldConfig.setTenantId("tenant-001"); - oldConfig.setItemId("item-001"); - oldConfig.setTpId("test-pool"); - oldConfig.setCorePoolSize(10); - oldConfig.setMaximumPoolSize(20); - - ThreadPoolParameterInfo newConfig = new ThreadPoolParameterInfo(); - newConfig.setTenantId("tenant-001"); - newConfig.setItemId("item-001"); - newConfig.setTpId("test-pool"); - newConfig.setCorePoolSize(15); // Core field changed - newConfig.setMaximumPoolSize(20); - - String oldV1Md5 = IncrementalMd5Util.getVersionedMd5(oldConfig, "1.9.0"); - String newV1Md5 = IncrementalMd5Util.getVersionedMd5(newConfig, "1.9.0"); - String oldV2Md5 = IncrementalMd5Util.getVersionedMd5(oldConfig, "2.0.0"); - String newV2Md5 = IncrementalMd5Util.getVersionedMd5(newConfig, "2.0.0"); - - System.out.println("Core field changed: corePoolSize 10 -> 15"); - System.out.println("Protocol v1: " + (oldV1Md5.equals(newV1Md5) ? "same" : "different")); - System.out.println("Protocol v2: " + (oldV2Md5.equals(newV2Md5) ? "same" : "different")); - - Assert.assertNotEquals("Protocol v1 should detect core field change", oldV1Md5, newV1Md5); - Assert.assertNotEquals("Protocol v2 should detect core field change", oldV2Md5, newV2Md5); - System.out.println("Test passed: Core field changes always trigger refresh"); - } - - /** - * Scenario 5: Simulate exact mentor's requirement - adding field 'xxx' in server 2.0. - * Demonstrates the complete workflow of field version control. - */ - @Test - public void testMentorScenario_ServerV20AddsFieldXxx() { - System.out.println("\n========== Scenario 5: Mentor's exact requirement - Server 2.0 adds 'xxx' =========="); - - // Step 1: Simulate registering a new field 'xxx' with minimum protocol 2 - // (In real implementation, this would be done in FIELD_MIN_PROTOCOL_VERSION initialization) - // For testing, we use 'isAlarm' as a proxy since it's configured with min protocol = 3 - - // Client v1.9 (protocol 1) - before 'xxx' was introduced - ThreadPoolParameterInfo clientV19Config = new ThreadPoolParameterInfo(); - clientV19Config.setTenantId("tenant-001"); - clientV19Config.setItemId("item-001"); - clientV19Config.setTpId("test-pool"); - clientV19Config.setCorePoolSize(10); - clientV19Config.setMaximumPoolSize(20); - clientV19Config.setQueueType(2); - clientV19Config.setCapacity(1024); - - // Server v2.0 - has field 'xxx' (using 'isAlarm' as proxy, min protocol = 3) - ThreadPoolParameterInfo serverV20Config = new ThreadPoolParameterInfo(); - serverV20Config.setTenantId("tenant-001"); - serverV20Config.setItemId("item-001"); - serverV20Config.setTpId("test-pool"); - serverV20Config.setCorePoolSize(10); - serverV20Config.setMaximumPoolSize(20); - serverV20Config.setQueueType(2); - serverV20Config.setCapacity(1024); - serverV20Config.setIsAlarm(1); // New field 'xxx' introduced in v2.0 (but min version = 2.1.0) - serverV20Config.setFieldVersionMetadata(Collections.singletonMap("isAlarm", "2.1.0")); - - // Client v2.0 (protocol 2) - should see 'xxx' if it's marked for protocol 2 - // But since isAlarm is marked protocol 3, even v2 clients skip it - ThreadPoolParameterInfo clientV20Config = new ThreadPoolParameterInfo(); - clientV20Config.setTenantId("tenant-001"); - clientV20Config.setItemId("item-001"); - clientV20Config.setTpId("test-pool"); - clientV20Config.setCorePoolSize(10); - clientV20Config.setMaximumPoolSize(20); - clientV20Config.setQueueType(2); - clientV20Config.setCapacity(1024); - clientV20Config.setIsAlarm(1); - - // Generate MD5 for different protocol versions - String v1ClientMd5 = IncrementalMd5Util.getVersionedMd5(clientV19Config, "1.9.0"); - String v2ClientWithoutFieldMd5 = IncrementalMd5Util.getVersionedMd5(clientV19Config, "2.0.0"); - String v2ServerWithFieldMd5 = IncrementalMd5Util.getVersionedMd5(serverV20Config, "2.0.0"); - - System.out.println("Client v1.9 (protocol 1) MD5: " + v1ClientMd5); - System.out.println("Client v2.0 without 'xxx' (protocol 2) MD5: " + v2ClientWithoutFieldMd5); - System.out.println("Server v2.0 with 'xxx' (protocol 2) MD5: " + v2ServerWithFieldMd5); - - // Key assertion: Protocol v2 clients should have same MD5 regardless of isAlarm - // because isAlarm requires protocol 3 - Assert.assertEquals( - "Server v2.0 adding field 'xxx' (isAlarm) should NOT affect protocol v2 client MD5", - v2ClientWithoutFieldMd5, - v2ServerWithFieldMd5); - - System.out.println("Test passed: Field 'xxx' invisible to protocol v2, no refresh triggered"); - System.out.println("Mentor's requirement validated: Client < v2.0 does not refresh on new field"); - } - - /** - * Scenario 6: Server 2.1 introduces field 'yyy', protocol v3 clients see it, v2 clients skip it. - */ - @Test - public void testMentorScenario_ServerV21AddsFieldYyy() { - System.out.println("\n========== Scenario 6: Server 2.1 adds 'yyy', only protocol v3+ sees it =========="); - - // Server v2.1 with new field 'yyy' (using 'capacityAlarm' as proxy, min protocol = 3) - ThreadPoolParameterInfo serverV21Config = new ThreadPoolParameterInfo(); - serverV21Config.setTenantId("tenant-001"); - serverV21Config.setItemId("item-001"); - serverV21Config.setTpId("test-pool"); - serverV21Config.setCorePoolSize(10); - serverV21Config.setMaximumPoolSize(20); - serverV21Config.setQueueType(2); - serverV21Config.setCapacity(1024); - serverV21Config.setCapacityAlarm(80); // New field 'yyy' introduced in v2.1 (min version = 2.1.0) - serverV21Config.setFieldVersionMetadata(Collections.singletonMap("capacityAlarm", "2.1.0")); - - String v1Content = IncrementalContentUtil.getVersionedContent(serverV21Config, "1.9.0"); - String v2Content = IncrementalContentUtil.getVersionedContent(serverV21Config, "2.0.0"); - String v3Content = IncrementalContentUtil.getVersionedContent(serverV21Config, "2.1.0"); - - LinkedHashMap v1Fields = JSONUtil.parseObject(v1Content, new TypeReference>() { - }); - LinkedHashMap v2Fields = JSONUtil.parseObject(v2Content, new TypeReference>() { - }); - LinkedHashMap v3Fields = JSONUtil.parseObject(v3Content, new TypeReference>() { - }); - - System.out.println("Server v2.1 has field 'yyy' (capacityAlarm): " + serverV21Config.getCapacityAlarm()); - System.out.println("Protocol v1 contains capacityAlarm: " + v1Fields.containsKey("capacityAlarm")); - System.out.println("Protocol v2 contains capacityAlarm: " + v2Fields.containsKey("capacityAlarm")); - System.out.println("Protocol v3 contains capacityAlarm: " + v3Fields.containsKey("capacityAlarm")); - - Assert.assertFalse("Protocol v1 should skip 'yyy' (capacityAlarm)", v1Fields.containsKey("capacityAlarm")); - Assert.assertFalse("Protocol v2 should skip 'yyy' (capacityAlarm)", v2Fields.containsKey("capacityAlarm")); - Assert.assertTrue("Protocol v3 should include 'yyy' (capacityAlarm)", v3Fields.containsKey("capacityAlarm")); - - System.out.println("Test passed: Field 'yyy' only visible to protocol v3+"); - System.out.println("Mentor's requirement validated: Incremental field rollout works correctly"); - } - - /** - * Scenario 7: Verify that changing an invisible field does not change MD5 for lower protocol clients. - * This is the key to preventing "invalid refresh" mentioned by the mentor. - */ - @Test - public void testInvisibleFieldChangeDoesNotAffectMd5() { - System.out.println("\n========== Scenario 7: Invisible field change does not affect MD5 =========="); - - // Config 1: without extended field - ThreadPoolParameterInfo config1 = new ThreadPoolParameterInfo(); - config1.setTenantId("tenant-001"); - config1.setItemId("item-001"); - config1.setTpId("test-pool"); - config1.setCorePoolSize(10); - config1.setMaximumPoolSize(20); - config1.setQueueType(2); - config1.setCapacity(1024); - - // Config 2: extended field changed from null to 5000 - ThreadPoolParameterInfo config2 = new ThreadPoolParameterInfo(); - config2.setTenantId("tenant-001"); - config2.setItemId("item-001"); - config2.setTpId("test-pool"); - config2.setCorePoolSize(10); - config2.setMaximumPoolSize(20); - config2.setQueueType(2); - config2.setCapacity(1024); - config2.setExecuteTimeOut(5000L); // Changed from null to 5000 - config2.setFieldVersionMetadata(Collections.singletonMap("executeTimeOut", "2.1.0")); - - // Config 3: extended field changed from 5000 to 8000 - ThreadPoolParameterInfo config3 = new ThreadPoolParameterInfo(); - config3.setTenantId("tenant-001"); - config3.setItemId("item-001"); - config3.setTpId("test-pool"); - config3.setCorePoolSize(10); - config3.setMaximumPoolSize(20); - config3.setQueueType(2); - config3.setCapacity(1024); - config3.setExecuteTimeOut(8000L); // Changed from 5000 to 8000 - config3.setFieldVersionMetadata(Collections.singletonMap("executeTimeOut", "2.1.0")); - - String md51 = IncrementalMd5Util.getVersionedMd5(config1, "2.0.0"); - String md52 = IncrementalMd5Util.getVersionedMd5(config2, "2.0.0"); - String md53 = IncrementalMd5Util.getVersionedMd5(config3, "2.0.0"); - - System.out.println("Config 1 executeTimeOut: null"); - System.out.println("Config 2 executeTimeOut: 5000"); - System.out.println("Config 3 executeTimeOut: 8000"); - System.out.println("Protocol v2 MD5 config1: " + md51); - System.out.println("Protocol v2 MD5 config2: " + md52); - System.out.println("Protocol v2 MD5 config3: " + md53); - - Assert.assertEquals("MD5 should be same (null -> 5000)", md51, md52); - Assert.assertEquals("MD5 should be same (5000 -> 8000)", md52, md53); - Assert.assertEquals("MD5 should be same (null -> 8000)", md51, md53); - - System.out.println("Test passed: Invisible field changes do not trigger refresh"); - System.out.println("This prevents the 'invalid refresh' issue mentioned by the mentor"); - } - - /** - * Scenario 8: Demonstrate field visibility matrix across protocol versions. - */ - @Test - public void testFieldVisibilityMatrix() { - System.out.println("\n========== Scenario 8: Field visibility matrix =========="); - - ThreadPoolParameterInfo fullConfig = new ThreadPoolParameterInfo(); - fullConfig.setTenantId("tenant-001"); - fullConfig.setItemId("item-001"); - fullConfig.setTpId("test-pool"); - fullConfig.setCorePoolSize(10); - fullConfig.setMaximumPoolSize(20); - fullConfig.setQueueType(2); - fullConfig.setCapacity(1024); - fullConfig.setKeepAliveTime(60L); - fullConfig.setRejectedType(1); - fullConfig.setAllowCoreThreadTimeOut(0); - fullConfig.setExecuteTimeOut(5000L); - fullConfig.setIsAlarm(1); - fullConfig.setCapacityAlarm(80); - fullConfig.setLivenessAlarm(90); - LinkedHashMap metadata = new LinkedHashMap<>(); - metadata.put("executeTimeOut", "2.1.0"); - metadata.put("isAlarm", "2.1.0"); - metadata.put("capacityAlarm", "2.1.0"); - metadata.put("livenessAlarm", "2.1.0"); - fullConfig.setFieldVersionMetadata(metadata); - - String v1Content = IncrementalContentUtil.getVersionedContent(fullConfig, "1.9.0"); - String v2Content = IncrementalContentUtil.getVersionedContent(fullConfig, "2.0.0"); - String v3Content = IncrementalContentUtil.getVersionedContent(fullConfig, "2.1.0"); - - LinkedHashMap v1Fields = JSONUtil.parseObject(v1Content, new TypeReference>() { - }); - LinkedHashMap v2Fields = JSONUtil.parseObject(v2Content, new TypeReference>() { - }); - LinkedHashMap v3Fields = JSONUtil.parseObject(v3Content, new TypeReference>() { - }); - - System.out.println("\nField Visibility Matrix:"); - System.out.println("Field | Protocol v1 | Protocol v2 | Protocol v3"); - System.out.println("------------------+-------------+-------------+------------"); - System.out.println("tenantId | " + v1Fields.containsKey("tenantId") + " | " + v2Fields.containsKey("tenantId") + " | " + v3Fields.containsKey("tenantId")); - System.out.println("coreSize | " + v1Fields.containsKey("coreSize") + " | " + v2Fields.containsKey("coreSize") + " | " + v3Fields.containsKey("coreSize")); - System.out.println( - "executeTimeOut | " + v1Fields.containsKey("executeTimeOut") + " | " + v2Fields.containsKey("executeTimeOut") + " | " + v3Fields.containsKey("executeTimeOut")); - System.out.println("isAlarm | " + v1Fields.containsKey("isAlarm") + " | " + v2Fields.containsKey("isAlarm") + " | " + v3Fields.containsKey("isAlarm")); - System.out.println("capacityAlarm | " + v1Fields.containsKey("capacityAlarm") + " | " + v2Fields.containsKey("capacityAlarm") + " | " + v3Fields.containsKey("capacityAlarm")); - - // Core assertions - Assert.assertTrue("All protocols see core fields", v1Fields.containsKey("coreSize") && v2Fields.containsKey("coreSize") && v3Fields.containsKey("coreSize")); - Assert.assertFalse("Protocol v1 (1.9.0) should skip executeTimeOut", v1Fields.containsKey("executeTimeOut")); - Assert.assertFalse("Protocol v2 (2.0.0) should skip executeTimeOut", v2Fields.containsKey("executeTimeOut")); - Assert.assertTrue("Protocol v3 (2.1.0) should include executeTimeOut", v3Fields.containsKey("executeTimeOut")); - - System.out.println("\nTest passed: Field visibility correctly controlled by semantic version"); - System.out.println("This is the foundation for mentor's requirement: version-aware field filtering"); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/GroupKeyTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/GroupKeyTest.java deleted file mode 100644 index 6d6c4009..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/GroupKeyTest.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import org.junit.Test; - -public class GroupKeyTest { - - @Test - public void getKey() { - String dataId = "dataId"; - String group = "group"; - String datumStr = "datumStr"; - String expected = "dataId+group+datumStr"; - String key = GroupKey.getKey(dataId, group, datumStr); - Assert.isTrue(key.equals(expected)); - } - - @Test - public void testGetKey() { - String dataId = "dataId"; - String group = "group"; - String expected = "dataId+group"; - String key = GroupKey.getKey(dataId, group); - Assert.isTrue(key.equals(expected)); - } - - @Test - public void testGetKey1() { - String[] strings = {"dataId", "group", "datumStr"}; - String expected = "dataId+group+datumStr"; - String key = GroupKey.getKey(strings); - Assert.isTrue(key.equals(expected)); - } - - @Test - public void getKeyTenant() { - String dataId = "dataId"; - String group = "group"; - String datumStr = "datumStr"; - String expected = "dataId+group+datumStr"; - - String keyTenant = GroupKey.getKeyTenant(dataId, group, datumStr); - Assert.isTrue(keyTenant.equals(expected)); - } - - @Test - public void parseKey() { - String groupKey = "prescription+dynamic-threadpool-example+message-consume+12"; - String[] strings = GroupKey.parseKey(groupKey); - Assert.isTrue(strings.length == 4); - } - - @Test - public void urlEncode() { - String str = "hello+World%"; - String expected = "hello%2BWorld%25"; - StringBuilder stringBuilder = new StringBuilder(); - GroupKey.urlEncode(str, stringBuilder); - Assert.isTrue(stringBuilder.toString().contains(expected)); - } -} \ No newline at end of file diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/IdUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/IdUtilTest.java deleted file mode 100644 index 79700086..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/IdUtilTest.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import org.junit.Assert; -import org.junit.Test; - -public class IdUtilTest { - - @Test - public void randomUUIDTest() { - String randomUUID = IdUtil.randomUUID(); - Assert.assertNotNull(randomUUID); - } - - @Test - public void simpleUUIDTest() { - String simpleUUID = IdUtil.simpleUUID(); - Assert.assertNotNull(simpleUUID); - Assert.assertFalse(simpleUUID.contains("-")); - } -} \ No newline at end of file diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/IoUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/IoUtilTest.java deleted file mode 100644 index c9091285..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/IoUtilTest.java +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import org.apache.commons.io.input.BrokenInputStream; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.jupiter.api.Assertions; -import java.io.BufferedReader; -import java.io.PrintWriter; -import java.io.Reader; -import java.io.Writer; -import java.io.File; -import java.io.StringReader; -import java.io.StringWriter; -import java.io.Closeable; -import java.io.FileReader; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.ByteArrayOutputStream; -import java.io.ByteArrayInputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; - -/** - * test for {@link IoUtil} - */ -public class IoUtilTest { - - private Path tempDir; - private File sourceFile; - - @Before - public void setUp() throws IOException { - tempDir = Files.createTempDirectory("test"); - sourceFile = new File(tempDir.toFile(), "source.txt"); - try (FileOutputStream fos = new FileOutputStream(sourceFile)) { - fos.write("Hello, World!".getBytes()); - } - } - - @After - public void tearDown() throws IOException { - Files.walk(tempDir) - .sorted((a, b) -> -a.compareTo(b)) - .forEach(path -> { - try { - Files.deleteIfExists(path); - } catch (IOException e) { - e.printStackTrace(); - } - }); - } - - @Test - public void testTryDecompressInputStream() throws IOException { - byte[] inputBytes = "This is a test string.".getBytes("UTF-8"); - ByteArrayOutputStream compressedOutput = new ByteArrayOutputStream(); - try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(compressedOutput)) { - gzipOutputStream.write(inputBytes); - } - byte[] compressedBytes = compressedOutput.toByteArray(); - ByteArrayInputStream compressedInput = new ByteArrayInputStream(compressedBytes); - byte[] decompressedBytes = IoUtil.tryDecompress(compressedInput); - Assert.assertNotNull(decompressedBytes); - Assert.assertTrue(decompressedBytes.length > 0); - Assert.assertArrayEquals(inputBytes, decompressedBytes); - } - - @Test - public void testTryDecompressByteArray() throws Exception { - byte[] inputBytes = "This is a test string.".getBytes("UTF-8"); - ByteArrayOutputStream compressedOutput = new ByteArrayOutputStream(); - try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(compressedOutput)) { - gzipOutputStream.write(inputBytes); - } - byte[] compressedBytes = compressedOutput.toByteArray(); - byte[] decompressedBytes = IoUtil.tryDecompress(compressedBytes); - Assert.assertNotNull(decompressedBytes); - Assert.assertTrue(decompressedBytes.length > 0); - Assert.assertArrayEquals(inputBytes, decompressedBytes); - } - - @Test - public void testTryCompress() throws IOException { - String inputString = "This is a test string."; - String encoding = "UTF-8"; - byte[] compressedBytes = IoUtil.tryCompress(inputString, encoding); - Assert.assertNotNull(compressedBytes); - Assert.assertTrue(compressedBytes.length > 0); - try ( - GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(compressedBytes))) { - byte[] decompressedBytes = new byte[1024]; - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - int readBytes; - while ((readBytes = gzipInputStream.read(decompressedBytes)) > 0) { - outputStream.write(decompressedBytes, 0, readBytes); - } - String decompressedString = outputStream.toString(encoding); - Assert.assertEquals(inputString, decompressedString); - } - } - - @Test - public void testWriteStringToFile() throws IOException { - File tempFile = new File(tempDir.toFile(), "testWriteStringToFile.txt"); - String testString = "test string"; - IoUtil.writeStringToFile(tempFile, testString, "UTF-8"); - BufferedReader reader = new BufferedReader(new FileReader(tempFile)); - String fileContent = reader.readLine(); - reader.close(); - Assert.assertEquals(testString, fileContent); - } - - @Test - public void testReadLines() throws IOException { - File tempFile = new File(tempDir.toFile(), "testReadLines.txt"); - try ( - PrintWriter writer = new PrintWriter(tempFile)) { - writer.println("test string 1"); - writer.println("test string 2"); - writer.println("test string 3"); - } - FileReader fileReader = new FileReader(tempFile); - List lines = IoUtil.readLines(fileReader); - fileReader.close(); - Assert.assertEquals(3, lines.size()); - Assert.assertEquals("test string 1", lines.get(0)); - Assert.assertEquals("test string 2", lines.get(1)); - Assert.assertEquals("test string 3", lines.get(2)); - } - - @Test - public void testToStringInputStream() { - String testString = "test string"; - InputStream inputStream = new ByteArrayInputStream(testString.getBytes()); - String result = IoUtil.toString(inputStream, "UTF-8"); - Assert.assertEquals(testString, result); - } - - @Test - public void testToStringReader() throws IOException { - String testString = "test string"; - Reader reader = new StringReader(testString); - String result = IoUtil.toString(reader); - Assert.assertEquals(testString, result); - } - - @Test - public void testCopyReaderWriter() throws IOException { - String inputString = "testCopyReaderWriter"; - Reader reader = new StringReader(inputString); - Writer writer = new StringWriter(); - IoUtil.copy(reader, writer); - Assert.assertEquals(inputString, writer.toString()); - } - - @Test - public void testCopyInputStreamOutputStream() throws IOException { - String inputString = "testCopyInputStreamOutputStream"; - InputStream inputStream = new ByteArrayInputStream(inputString.getBytes()); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - IoUtil.copy(inputStream, outputStream); - Assert.assertEquals(inputString, outputStream.toString()); - } - - @Test - public void testDelete() throws IOException { - File deleteFile = new File(tempDir.toFile(), "delete.txt"); - deleteFile.createNewFile(); - Assert.assertTrue(deleteFile.exists()); - IoUtil.delete(deleteFile); - Assert.assertFalse(deleteFile.exists()); - File deleteDir = new File(tempDir.toFile(), "delete"); - deleteDir.mkdirs(); - Assert.assertTrue(deleteDir.exists()); - File deleteDirFile = new File(deleteDir, "delete.txt"); - deleteDirFile.createNewFile(); - Assert.assertTrue(deleteDirFile.exists()); - IoUtil.delete(deleteDir); - Assert.assertTrue(deleteDir.exists()); - Assert.assertFalse(deleteDirFile.exists()); - } - - @Test - public void testCleanDirectory() throws IOException { - File cleanDir = new File(tempDir.toFile(), "clean"); - cleanDir.mkdirs(); - File cleanFile1 = new File(cleanDir, "clean1.txt"); - File cleanFile2 = new File(cleanDir, "clean2.txt"); - Assert.assertTrue(cleanDir.exists()); - Assert.assertTrue(cleanFile1.createNewFile()); - Assert.assertTrue(cleanFile2.createNewFile()); - IoUtil.cleanDirectory(cleanDir); - Assert.assertFalse(cleanFile1.exists()); - Assert.assertFalse(cleanFile2.exists()); - } - - @Test - public void testCopyFile() throws Exception { - String sourcePath = sourceFile.getAbsolutePath(); - String targetPath = sourceFile.getParent() + File.separator + "copy" + File.separator + "target.txt"; - IoUtil.copyFile(sourcePath, targetPath); - File targetFile = new File(targetPath); - Assert.assertTrue(targetFile.exists()); - Assert.assertEquals(sourceFile.length(), targetFile.length()); - byte[] sourceBytes = Files.readAllBytes(sourceFile.toPath()); - byte[] targetBytes = Files.readAllBytes(targetFile.toPath()); - Assert.assertArrayEquals(sourceBytes, targetBytes); - } - - @Test - public void testIsGzipStream() { - byte[] gzipBytes = new byte[2]; - gzipBytes[0] = (byte) GZIPInputStream.GZIP_MAGIC; - gzipBytes[1] = (byte) (GZIPInputStream.GZIP_MAGIC >> 8); - byte[] invalidGzipBytes = new byte[2]; - invalidGzipBytes[0] = (byte) (GZIPInputStream.GZIP_MAGIC + 1); - invalidGzipBytes[1] = (byte) ((GZIPInputStream.GZIP_MAGIC >> 8) + 1); - byte[] invalidGzipBytes2 = new byte[1]; - byte[] normalBytes = new byte[2]; - Assert.assertTrue(IoUtil.isGzipStream(gzipBytes)); - Assert.assertFalse(IoUtil.isGzipStream(invalidGzipBytes)); - Assert.assertFalse(IoUtil.isGzipStream(invalidGzipBytes2)); - Assert.assertFalse(IoUtil.isGzipStream(null)); - Assert.assertFalse(IoUtil.isGzipStream(normalBytes)); - } - - @Test - public void testCloseQuietly() throws IOException { - Closeable closeable = new BrokenInputStream(); - URL url = new URL("https://www.baidu.com"); - HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); - Assertions.assertDoesNotThrow(() -> IoUtil.closeQuietly(closeable)); - Assertions.assertDoesNotThrow(() -> IoUtil.closeQuietly(closeable, closeable, closeable)); - Assertions.assertDoesNotThrow(() -> IoUtil.closeQuietly(httpURLConnection)); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/JSONUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/JSONUtilTest.java deleted file mode 100644 index 05faebf1..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/JSONUtilTest.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import com.fasterxml.jackson.core.type.TypeReference; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import org.junit.Assert; -import org.junit.Test; -import org.json.JSONException; -import org.skyscreamer.jsonassert.JSONAssert; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class JSONUtilTest { - - private static final Foo EXPECTED_FOO = new Foo(1, "foo1", new Foo(2, "foo2", null)); - - private static final List EXPECTED_FOO_ARRAY = Arrays.asList(EXPECTED_FOO, EXPECTED_FOO); - - private static final String EXPECTED_FOO_JSON = "{\"id\":1,\"name\":\"foo1\",\"foo\":{\"id\":2,\"name\":\"foo2\"}}"; - - private static final String EXPECTED_FOO_JSON_ARRAY = "[" + EXPECTED_FOO_JSON + "," + EXPECTED_FOO_JSON + "]"; - - @Test - public void assertToJSONString() { - Assert.assertNull(JSONUtil.toJSONString(null)); - try { - JSONAssert.assertEquals(EXPECTED_FOO_JSON, JSONUtil.toJSONString(EXPECTED_FOO), false); - } catch (JSONException jse) { - throw new RuntimeException(jse); - } - } - - @Test - public void assertParseObject() { - Assert.assertNull(JSONUtil.parseObject(null, Foo.class)); - Assert.assertNull(JSONUtil.parseObject(" ", Foo.class)); - Assert.assertEquals(EXPECTED_FOO, JSONUtil.parseObject(EXPECTED_FOO_JSON, Foo.class)); - } - - @Test - public void assertParseObjectTypeReference() { - Assert.assertNull(JSONUtil.parseObject(null, new TypeReference>() { - })); - Assert.assertNull(JSONUtil.parseObject(" ", new TypeReference>() { - })); - Assert.assertEquals( - EXPECTED_FOO_ARRAY, - JSONUtil.parseObject(EXPECTED_FOO_JSON_ARRAY, new TypeReference>() { - })); - } - - @Test - public void assertParseArray() { - Assert.assertEquals(Collections.emptyList(), JSONUtil.parseArray(null, Foo.class)); - Assert.assertEquals(Collections.emptyList(), JSONUtil.parseArray(" ", Foo.class)); - Assert.assertEquals( - EXPECTED_FOO_ARRAY, - JSONUtil.parseArray(EXPECTED_FOO_JSON_ARRAY, Foo.class)); - } - - @EqualsAndHashCode - @AllArgsConstructor - @NoArgsConstructor - @Data - private static class Foo { - - private Integer id; - - private String name; - - private Foo foo; - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/JacksonHandlerTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/JacksonHandlerTest.java deleted file mode 100644 index 3acec9fa..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/JacksonHandlerTest.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.exc.MismatchedInputException; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -/** - * test for {@link JacksonHandler} - */ -public class JacksonHandlerTest { - - private final static JacksonHandler JACKSON_HANDLER = new JacksonHandler(); - - private static final Entity EXPECTED_ENTITY = - new Entity(1, "entity1", new Entity(2, "entity2", null)); - - private static final List EXPECTED_ENTITY_ARRAY = Arrays.asList(EXPECTED_ENTITY, EXPECTED_ENTITY); - - private static final String EXPECTED_ENTITY_JSON = "{" + - "\"id\":1," + - "\"name\":\"entity1\"," + - "\"entity\":{" + - "\"id\":2," + - "\"name\":\"entity2\"" + - "}}"; - - private static final String EXPECTED_ENTITY_ARRAY_JSON = "[" + - EXPECTED_ENTITY_JSON + "," + - EXPECTED_ENTITY_JSON + - "]"; - - @Test - public void testToJSONString() { - // boolean to json - Assertions.assertEquals("true", JACKSON_HANDLER.toJSONString(true)); - // double to json - Assertions.assertEquals("0.01", JACKSON_HANDLER.toJSONString(0.01)); - // integer to json - Assertions.assertEquals("1", JACKSON_HANDLER.toJSONString(1)); - // string to json - Assertions.assertEquals("\"hello world\"", JACKSON_HANDLER.toJSONString("hello world")); - // array to json - Assertions.assertEquals("[0,1,2,3,4]", JACKSON_HANDLER.toJSONString(new int[]{0, 1, 2, 3, 4})); - // object to json - Assertions.assertEquals(EXPECTED_ENTITY_JSON, JACKSON_HANDLER.toJSONString(EXPECTED_ENTITY)); - } - - @Test - public void testParseObject() { - // normal json to boolean - Assertions.assertEquals(true, JACKSON_HANDLER.parseObject("true", Boolean.class)); - // normal json to double - Assertions.assertEquals(0.01, JACKSON_HANDLER.parseObject("0.01", Double.class)); - // normal json to integer - Assertions.assertEquals(1, JACKSON_HANDLER.parseObject("1", Integer.class)); - // normal json to string - Assertions.assertEquals("hello world", - JACKSON_HANDLER.parseObject("\"hello world\"", String.class)); - // normal json to object - Assertions.assertEquals(EXPECTED_ENTITY, JACKSON_HANDLER.parseObject(EXPECTED_ENTITY_JSON, Entity.class)); - Assertions.assertEquals( - EXPECTED_ENTITY, - JACKSON_HANDLER.parseObject(EXPECTED_ENTITY_JSON, new TypeReference() { - })); - // illegal json - Assertions.assertThrows(MismatchedInputException.class, - () -> JACKSON_HANDLER.parseObject(" ", Entity.class)); - // null json - Assertions.assertThrows(IllegalArgumentException.class, - () -> JACKSON_HANDLER.parseObject(null, Entity.class)); - // illegal type - Assertions.assertThrows(MismatchedInputException.class, - () -> JACKSON_HANDLER.parseObject(EXPECTED_ENTITY_JSON, String.class)); - } - - @Test - public void testParseArray() { - // normal json to array - Assertions.assertEquals(EXPECTED_ENTITY_ARRAY, JSONUtil.parseArray(EXPECTED_ENTITY_ARRAY_JSON, Entity.class)); - // null json - Assertions.assertEquals(Collections.emptyList(), JSONUtil.parseArray(null, Entity.class)); - // illegal json - Assertions.assertEquals(Collections.emptyList(), JSONUtil.parseArray(" ", Entity.class)); - } - - @Test - public void testIsJson() { - // normal json - Assertions.assertTrue(JACKSON_HANDLER.isJson(EXPECTED_ENTITY_JSON)); - Assertions.assertTrue(JACKSON_HANDLER.isJson(EXPECTED_ENTITY_ARRAY_JSON)); - Assertions.assertTrue(JACKSON_HANDLER.isJson(" ")); - // illegal json - Assertions.assertFalse(JACKSON_HANDLER.isJson("{" + - "\"id\":1," + - "\"name\":\"entity1\"," + - "\"entity\":{\"id\":2,\"name\":\"entity2\"}")); - // null json - Assertions.assertThrows(IllegalArgumentException.class, () -> JACKSON_HANDLER.isJson(null)); - } - - @EqualsAndHashCode - @AllArgsConstructor - @NoArgsConstructor - @Data - private static class Entity { - - private Integer id; - - private String name; - - private Entity entity; - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/MapUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/MapUtilTest.java deleted file mode 100644 index b0c00d04..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/MapUtilTest.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import org.junit.Test; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.BiFunction; - -/** - * MapUtil Test - */ -public class MapUtilTest { - - @Test - public void parseMapForFilterRetIsEmptyTest() { - HashMap map = new HashMap<>(); - map.put("abc", "123"); - map.put("bcd", "456"); - map.put("cde", "789"); - List ret = MapUtil.parseMapForFilter(map, "x"); - Assert.isTrue(CollectionUtil.isEmpty(ret)); - } - - @Test - public void parseMapForFilterRetIsNotEmptyTest() { - HashMap map = new HashMap<>(); - map.put("abc", "123"); - map.put("bcd", "456"); - map.put("cde", "789"); - List ret = MapUtil.parseMapForFilter(map, "b"); - Assert.isTrue(CollectionUtil.isNotEmpty(ret)); - } - - @Test - public void computeIfAbsentNotExistTargetTest() { - BiFunction mappingFunction = (a, b) -> a + b; - try { - MapUtil.computeIfAbsent(null, "key", mappingFunction, "param1", "param2"); - } catch (Exception e) { - if (e instanceof NullPointerException) { - Assert.isTrue(Objects.equals("target", e.getMessage())); - } - } - } - - @Test - public void computeIfAbsentNotExistKeyTest() { - Map map = new HashMap<>(); - map.put("abc", "123"); - BiFunction mappingFunction = (a, b) -> a + b; - try { - MapUtil.computeIfAbsent(map, null, mappingFunction, "param1", "param2"); - } catch (Exception e) { - if (e instanceof NullPointerException) { - Assert.isTrue(Objects.equals("key", e.getMessage())); - } - } - } - - @Test - public void computeIfAbsentNotExistMappingFunctionTest() { - Map map = new HashMap<>(); - map.put("abc", "123"); - try { - MapUtil.computeIfAbsent(map, "abc", null, "param1", "param2"); - } catch (Exception e) { - if (e instanceof NullPointerException) { - Assert.isTrue(Objects.equals("mappingFunction", e.getMessage())); - } - } - } - - @Test - public void computeIfAbsentNotExistParam1Test() { - Map map = new HashMap<>(); - map.put("abc", "123"); - BiFunction mappingFunction = (a, b) -> a + b; - try { - MapUtil.computeIfAbsent(map, "abc", mappingFunction, null, "param2"); - } catch (Exception e) { - if (e instanceof NullPointerException) { - Assert.isTrue(Objects.equals("param1", e.getMessage())); - } - } - } - - @Test - public void computeIfAbsentNotExistParam2Test() { - Map map = new HashMap<>(); - map.put("abc", "123"); - BiFunction mappingFunction = (a, b) -> a + b; - try { - MapUtil.computeIfAbsent(map, "abc", mappingFunction, "param1", null); - } catch (Exception e) { - if (e instanceof NullPointerException) { - Assert.isTrue(Objects.equals("param2", e.getMessage())); - } - } - } - - @Test - public void computeIfAbsentValNotNullTest() { - Map map = new HashMap<>(); - map.put("abc", "123"); - BiFunction mappingFunction = (a, b) -> a + b; - Object ret = MapUtil.computeIfAbsent(map, "abc", mappingFunction, "param1", "param2"); - Assert.isTrue(Objects.equals("123", String.valueOf(ret))); - } - - @Test - public void computeIfAbsentValIsNullTest() { - Map map = new HashMap<>(); - map.put("abc", "123"); - BiFunction mappingFunction = (a, b) -> a + b; - Object ret = MapUtil.computeIfAbsent(map, "xyz", mappingFunction, "param1", "param2"); - Assert.isTrue(Objects.equals("param1param2", String.valueOf(ret))); - } - -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/Md5UtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/Md5UtilTest.java deleted file mode 100644 index 1004e9d3..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/Md5UtilTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import org.junit.Test; -import org.mockito.MockedStatic; - -import java.io.IOException; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.List; - -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.mockStatic; - -public class Md5UtilTest { - - @Test - public void assertMd5Hex() throws NoSuchAlgorithmException { - String md5 = "3cdefff74dcf7a5d60893865b84b62c8"; - String message = "message-consume"; - Assert.isTrue(md5.equals(Md5Util.md5Hex(message.getBytes()))); - } - - @Test - public void assertMd5Hex2() { - String md5 = "503840dc3af3cdb39749cd099e4dfeff"; - String message = "dynamic-threadpool-example"; - Assert.isTrue(md5.equals(Md5Util.md5Hex(message, "UTF-8"))); - } - - @Test - public void assetEncodeHexString() { - String encodeHexString = "00010f107f80203040506070"; - byte[] bytes = {0, 1, 15, 16, 127, -128, 32, 48, 64, 80, 96, 112}; - Assert.isTrue(encodeHexString.equals(Md5Util.encodeHexString(bytes))); - } - - @Test - public void assetGetTpContentMd5() { - final ThreadPoolParameterInfo threadPoolParameterInfo = new ThreadPoolParameterInfo(); - final String mockContent = "mockContent"; - final String mockContentMd5 = "34cf17bc632ece6e4c81a4ce8aa97d5e"; - try (final MockedStatic mockedContentUtil = mockStatic(ContentUtil.class)) { - mockedContentUtil.when(() -> ContentUtil.getPoolContent(threadPoolParameterInfo)).thenReturn(mockContent); - final String result = Md5Util.getTpContentMd5(threadPoolParameterInfo); - Assert.isTrue(result.equals(mockContentMd5)); - mockedContentUtil.verify(() -> ContentUtil.getPoolContent(threadPoolParameterInfo), times(1)); - } - } - - @Test - public void assetCompareMd5ResultString() throws IOException { - Assert.isTrue("".equals(Md5Util.compareMd5ResultString(null))); - String result = "prescription%02dynamic-threadpool-example%02message-consume%01" + - "prescription%02dynamic-threadpool-example%02message-produce%01"; - List changedGroupKeys = new ArrayList<>(2); - changedGroupKeys.add("prescription+dynamic-threadpool-example+message-consume+12"); - changedGroupKeys.add("prescription+dynamic-threadpool-example+message-produce+11"); - Assert.isTrue(result.equals(Md5Util.compareMd5ResultString(changedGroupKeys))); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/MemoryUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/MemoryUtilTest.java deleted file mode 100644 index 3009804e..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/MemoryUtilTest.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import org.junit.Assert; -import org.junit.Test; - -public class MemoryUtilTest { - - @Test - public void heapMemoryUsed() { - long memoryUsed = MemoryUtil.heapMemoryUsed(); - Assert.assertNotEquals(0, memoryUsed); - } - - @Test - public void heapMemoryMax() { - long memoryUsed = MemoryUtil.heapMemoryMax(); - Assert.assertNotEquals(0, memoryUsed); - } - - @Test - public void heapMemoryFree() { - long memoryUsed = MemoryUtil.heapMemoryFree(); - Assert.assertNotEquals(0, memoryUsed); - } - - @Test - public void noHeapMemoryUsed() { - long memoryUsed = MemoryUtil.noHeapMemoryUsed(); - Assert.assertNotEquals(0, memoryUsed); - } - - @Test - public void noHeapMemoryMax() { - long memoryUsed = MemoryUtil.noHeapMemoryMax(); - Assert.assertNotEquals(0, memoryUsed); - } - - @Test - public void noHeapMemoryFree() { - long memoryUsed = MemoryUtil.noHeapMemoryFree(); - Assert.assertNotEquals(0, memoryUsed); - } -} \ No newline at end of file diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/MessageConvertTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/MessageConvertTest.java deleted file mode 100644 index 4d834dcf..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/MessageConvertTest.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.model.ThreadPoolRunStateInfo; -import cn.hippo4j.common.monitor.AbstractMessage; -import cn.hippo4j.common.monitor.Message; -import cn.hippo4j.common.monitor.MessageTypeEnum; -import cn.hippo4j.common.monitor.MessageWrapper; -import cn.hippo4j.common.monitor.RuntimeMessage; -import org.junit.Test; -import org.junit.jupiter.api.Assertions; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/*** - * @description : Todo - * @author : DDDreame - * @date : 2023/5/27 23:24 - */ -public class MessageConvertTest { - - @Test - public void testConvert() { - AbstractMessage message = new RuntimeMessage(); - List runtimeMessages = new ArrayList<>(); - ThreadPoolRunStateInfo poolRunState = ThreadPoolRunStateInfo.builder() - .tpId("testTPid") - .activeSize(4) - .poolSize(12) - .completedTaskCount(8L) - .largestPoolSize(12) - .currentLoad("6") - .clientLastRefreshTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))) - .peakLoad("20") - .queueSize(0) - .queueRemainingCapacity(512) - .rejectCount(0L) - .timestamp(System.currentTimeMillis()) - .build(); - RuntimeMessage runtimeMessage = BeanUtil.convert(poolRunState, RuntimeMessage.class); - runtimeMessage.setGroupKey("test-groupKeys"); - runtimeMessages.add(runtimeMessage); - - message.setMessageType(MessageTypeEnum.RUNTIME); - message.setMessages(runtimeMessages); - MessageWrapper messageWrapper = MessageConvert.convert(message); - Assertions.assertNotNull(messageWrapper); - } - - @Test - public void testMessageWrapperConvert() { - AbstractMessage message = new RuntimeMessage(); - List runtimeMessages = new ArrayList<>(); - ThreadPoolRunStateInfo poolRunState = ThreadPoolRunStateInfo.builder() - .tpId("testTPid") - .activeSize(4) - .poolSize(12) - .completedTaskCount(8L) - .largestPoolSize(12) - .currentLoad("6") - .clientLastRefreshTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))) - .peakLoad("20") - .queueSize(0) - .queueRemainingCapacity(512) - .rejectCount(0L) - .timestamp(System.currentTimeMillis()) - .build(); - RuntimeMessage runtimeMessage = BeanUtil.convert(poolRunState, RuntimeMessage.class); - runtimeMessage.setGroupKey("test-groupKeys"); - runtimeMessages.add(runtimeMessage); - - message.setMessageType(MessageTypeEnum.RUNTIME); - message.setMessages(runtimeMessages); - MessageWrapper messageWrapper = MessageConvert.convert(message); - Message messageResult = MessageConvert.convert(messageWrapper); - Assertions.assertNotNull(messageResult); - Assertions.assertEquals(message, messageResult); - } - - @Test - public void testMessageWrapperConvertException() { - Assertions.assertThrows(Exception.class, () -> { - Map data1 = new HashMap<>(); - data1.put("key1", "value1"); - data1.put("key2", 123); - Map data2 = new HashMap<>(); - data2.put("key3", true); - data2.put("key4", 3.14); - List> contentParams = Arrays.asList(data1, data2); - Class responseClass = String.class; - MessageTypeEnum messageType = MessageTypeEnum.DEFAULT; - MessageWrapper messageWrapper = new MessageWrapper(contentParams, responseClass, messageType); - MessageConvert.convert(messageWrapper); - }); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/MessageWrapperTest b/infra/common/src/test/java/cn/hippo4j/common/toolkit/MessageWrapperTest deleted file mode 100644 index 7a18ea75..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/MessageWrapperTest +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.monitor; - -import cn.hippo4j.common.monitor.MessageTypeEnum; -import cn.hippo4j.common.monitor.MessageWrapper; -import org.junit.Assert; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import java.util.HashMap; -import java.util.Map; -import java.util.Arrays; -import java.util.List; -import java.util.Collections; - -public class MessageWrapperTest { - - private static List> contentParams; - private static Class responseClass; - private static MessageTypeEnum messageType; - private static MessageWrapper messageWrapper; - - @BeforeAll - static void setUp() { - // init data - Map data1 = new HashMap<>(); - data1.put("key1", "value1"); - data1.put("key2", 123); - Map data2 = new HashMap<>(); - data2.put("key3", true); - data2.put("key4", 3.14); - contentParams = Arrays.asList(data1, data2); - responseClass = String.class; - messageType = MessageTypeEnum.DEFAULT; - messageWrapper = new MessageWrapper(contentParams, responseClass, messageType); - } - - @Test - void testGetContentParams() { - Assert.assertEquals(contentParams, messageWrapper.getContentParams()); - } - - @Test - void testGetResponseClass() { - Assert.assertEquals(responseClass, messageWrapper.getResponseClass()); - } - - @Test - void testGetMessageType() { - Assert.assertEquals(messageType, messageWrapper.getMessageType()); - } - - @Test - void testSettersAndGetters() { - List> newContentParams = Collections.singletonList(Collections.emptyMap()); - Class newResponseClass = Integer.class; - MessageTypeEnum newMessageType = MessageTypeEnum.DEFAULT; - messageWrapper.setContentParams(newContentParams); - messageWrapper.setResponseClass(newResponseClass); - messageWrapper.setMessageType(newMessageType); - Assert.assertEquals(newContentParams, messageWrapper.getContentParams()); - Assert.assertEquals(newResponseClass, messageWrapper.getResponseClass()); - Assert.assertEquals(newMessageType, messageWrapper.getMessageType()); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ProtocolRigidityTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/ProtocolRigidityTest.java deleted file mode 100644 index ec7e502d..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ProtocolRigidityTest.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import org.junit.Assert; -import org.junit.Test; - -/** - * Protocol Rigidity Test: Verifies that field renaming does not trigger unnecessary refreshes. - */ -public class ProtocolRigidityTest { - - /** - * Scenario 1: Client uses old field names (coreSize/maxSize), Server uses new field names (corePoolSize/maximumPoolSize). - * Expected Result: MD5 should be the same, no refresh triggered. - */ - @Test - public void testFieldRenamingCompatibility_OldClientNewServer() { - System.out.println("========== Scenario 1: Field Renaming Compatibility (Old Client vs New Server) =========="); - - // Simulate Client configuration (using old field names) - ThreadPoolParameterInfo clientConfig = new ThreadPoolParameterInfo(); - clientConfig.setTenantId("default"); - clientConfig.setItemId("item-001"); - clientConfig.setTpId("test-pool"); - clientConfig.setCoreSize(10); // old field - clientConfig.setMaxSize(20); // old field - clientConfig.setQueueType(2); - clientConfig.setCapacity(1024); - clientConfig.setKeepAliveTime(60L); - clientConfig.setRejectedType(1); - clientConfig.setAllowCoreThreadTimeOut(0); - - // Simulate Server configuration (using new field names) - ThreadPoolParameterInfo serverConfig = new ThreadPoolParameterInfo(); - serverConfig.setTenantId("default"); - serverConfig.setItemId("item-001"); - serverConfig.setTpId("test-pool"); - serverConfig.setCorePoolSize(10); // new field - serverConfig.setMaximumPoolSize(20); // new field - serverConfig.setQueueType(2); - serverConfig.setCapacity(1024); - serverConfig.setKeepAliveTime(60L); - serverConfig.setRejectedType(1); - serverConfig.setAllowCoreThreadTimeOut(0); - - // Client-side (v2 protocol) incremental MD5 - String clientContent = IncrementalContentUtil.getCoreContent(clientConfig); - String clientMd5 = Md5Util.md5Hex(clientContent, "UTF-8"); - - // Server-side (v2 protocol) incremental MD5 - String serverContent = IncrementalContentUtil.getCoreContent(serverConfig); - String serverMd5 = Md5Util.md5Hex(serverContent, "UTF-8"); - - System.out.println("Client config (old fields): coreSize=" + clientConfig.getCoreSize() + ", maxSize=" + clientConfig.getMaxSize()); - System.out.println("Server config (new fields): corePoolSize=" + serverConfig.getCorePoolSize() + ", maximumPoolSize=" + serverConfig.getMaximumPoolSize()); - System.out.println("Client incremental content: " + clientContent); - System.out.println("Server incremental content: " + serverContent); - System.out.println("Client MD5: " + clientMd5); - System.out.println("Server MD5: " + serverMd5); - - // Assertion: Even with different field names, MD5 should be the same (adapter unifies fields) - Assert.assertEquals("MD5 should be the same after field renaming, no refresh triggered", serverMd5, clientMd5); - System.out.println("Test passed: Field renaming does not trigger unnecessary refresh"); - } - - /** - * Scenario 2: Client and Server both use new field names. - * Expected Result: MD5 should be the same. - */ - @Test - public void testNewFieldNamesConsistency() { - System.out.println("\n========== Scenario 2: New Field Name Consistency =========="); - - // Both Client and Server use new field names - ThreadPoolParameterInfo clientConfig = new ThreadPoolParameterInfo(); - clientConfig.setTenantId("default"); - clientConfig.setItemId("item-001"); - clientConfig.setTpId("test-pool"); - clientConfig.setCorePoolSize(15); - clientConfig.setMaximumPoolSize(30); - clientConfig.setQueueType(3); - clientConfig.setCapacity(2048); - - ThreadPoolParameterInfo serverConfig = new ThreadPoolParameterInfo(); - serverConfig.setTenantId("default"); - serverConfig.setItemId("item-001"); - serverConfig.setTpId("test-pool"); - serverConfig.setCorePoolSize(15); - serverConfig.setMaximumPoolSize(30); - serverConfig.setQueueType(3); - serverConfig.setCapacity(2048); - - String clientMd5 = Md5Util.md5Hex(IncrementalContentUtil.getCoreContent(clientConfig), "UTF-8"); - String serverMd5 = Md5Util.md5Hex(IncrementalContentUtil.getCoreContent(serverConfig), "UTF-8"); - - System.out.println("Client MD5: " + clientMd5); - System.out.println("Server MD5: " + serverMd5); - - Assert.assertEquals("MD5 should be the same when new field names are consistent", serverMd5, clientMd5); - System.out.println("Test passed: New field names produce consistent MD5"); - } - - /** - * Scenario 3: Both old and new fields exist, new fields should take priority. - * Expected Result: Adapter returns new field values. - */ - @Test - public void testFieldAdapterPriority() { - System.out.println("\n========== Scenario 3: Field Adapter Priority =========="); - - ThreadPoolParameterInfo config = new ThreadPoolParameterInfo(); - config.setCoreSize(10); // old field - config.setMaxSize(20); // old field - config.setCorePoolSize(15); // new field (should take priority) - config.setMaximumPoolSize(30); // new field (should take priority) - - Integer adaptedCore = config.corePoolSizeAdapt(); - Integer adaptedMax = config.maximumPoolSizeAdapt(); - - System.out.println("Old field values: coreSize=" + config.getCoreSize() + ", maxSize=" + config.getMaxSize()); - System.out.println("New field values: corePoolSize=" + config.getCorePoolSize() + ", maximumPoolSize=" + config.getMaximumPoolSize()); - System.out.println("Adapter returned values: core=" + adaptedCore + ", max=" + adaptedMax); - - Assert.assertEquals("Adapter should return new field value first", Integer.valueOf(15), adaptedCore); - Assert.assertEquals("Adapter should return new field value first", Integer.valueOf(30), adaptedMax); - System.out.println("Test passed: Adapter correctly prioritizes new fields"); - } - - /** - * Scenario 4: Only old fields exist, adapter should correctly return old values. - */ - @Test - public void testFieldAdapterFallback() { - System.out.println("\n========== Scenario 4: Field Adapter Fallback =========="); - - ThreadPoolParameterInfo config = new ThreadPoolParameterInfo(); - config.setCoreSize(10); // only old fields - config.setMaxSize(20); - - Integer adaptedCore = config.corePoolSizeAdapt(); - Integer adaptedMax = config.maximumPoolSizeAdapt(); - - System.out.println("Old field values: coreSize=" + config.getCoreSize() + ", maxSize=" + config.getMaxSize()); - System.out.println("New field values: corePoolSize=" + config.getCorePoolSize() + ", maximumPoolSize=" + config.getMaximumPoolSize()); - System.out.println("Adapter returned values: core=" + adaptedCore + ", max=" + adaptedMax); - - Assert.assertEquals("Adapter should fall back to old field value", Integer.valueOf(10), adaptedCore); - Assert.assertEquals("Adapter should fall back to old field value", Integer.valueOf(20), adaptedMax); - System.out.println("Test passed: Adapter correctly falls back to old fields"); - } - - /** - * Scenario 5: v1 client (full MD5) vs v2 client (incremental MD5). - * Expected Result: v1 and v2 use different comparison strategies. - */ - @Test - public void testProtocolVersionDifference() { - System.out.println("\n========== Scenario 5: Protocol Version Difference =========="); - - ThreadPoolParameterInfo config = new ThreadPoolParameterInfo(); - config.setTenantId("default"); - config.setItemId("item-001"); - config.setTpId("test-pool"); - config.setCorePoolSize(10); - config.setMaximumPoolSize(20); - config.setQueueType(2); - config.setCapacity(1024); - config.setExecuteTimeOut(5000L); // extended parameter - config.setIsAlarm(1); // extended parameter - - // v1 protocol: full MD5 - String v1Content = IncrementalContentUtil.getFullContent(config); - String v1Md5 = Md5Util.md5Hex(v1Content, "UTF-8"); - - // v2 protocol: incremental MD5 (core parameters only) - String v2Content = IncrementalContentUtil.getCoreContent(config); - String v2Md5 = Md5Util.md5Hex(v2Content, "UTF-8"); - - System.out.println("v1 protocol (full) content length: " + v1Content.length()); - System.out.println("v2 protocol (incremental) content length: " + v2Content.length()); - System.out.println("v1 MD5: " + v1Md5); - System.out.println("v2 MD5: " + v2Md5); - System.out.println("Does v2 content contain executeTimeOut: " + v2Content.contains("executeTimeOut")); - - Assert.assertNotEquals("MD5 should differ between v1 and v2 protocols", v1Md5, v2Md5); - Assert.assertFalse("v2 incremental content should not include extended parameters", v2Content.contains("executeTimeOut")); - System.out.println("Test passed: v1 and v2 protocols use different strategies"); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ReflectUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/ReflectUtilTest.java deleted file mode 100644 index fa32cc3c..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ReflectUtilTest.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import lombok.Getter; -import lombok.Setter; -import org.junit.Test; -import org.junit.Assert; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.concurrent.ThreadPoolExecutor; - -public class ReflectUtilTest { - - @Test - public void getFieldValueTest() { - TestSubClass testSubClass = new TestSubClass(); - Object privateField = ReflectUtil.getFieldValue(testSubClass, "privateField"); - Assert.assertEquals("privateField", privateField); - - Object field = ReflectUtil.getFieldValue(testSubClass, "field"); - Assert.assertEquals("field", field); - - } - - @Test - public void getFieldValueByFiledTest() { - TestSubClass testSubClass = new TestSubClass(); - Field privateField = ReflectUtil.getField(TestSubClass.class, "privateField"); - - Object privateFieldVal = ReflectUtil.getFieldValue(testSubClass, privateField); - Assert.assertEquals("privateField", privateFieldVal); - } - - @Test - public void getFieldTest() { - Field privateField = ReflectUtil.getField(TestSubClass.class, "privateField"); - Assert.assertNotNull(privateField); - - Field field = ReflectUtil.getField(TestSubClass.class, "field"); - Assert.assertNotNull(field); - } - - // @Test - public void getFieldsTest() { - Field[] fields = ReflectUtil.getFields(TestSubClass.class); - Assert.assertEquals(4, fields.length); - } - - // @Test - public void getFieldsDirectlyTest() { - Field[] fields = ReflectUtil.getFieldsDirectly(TestSubClass.class, false); - Assert.assertEquals(2, fields.length); - - fields = ReflectUtil.getFieldsDirectly(TestSubClass.class, true); - Assert.assertEquals(4, fields.length); - } - - @Test - public void getFieldNameTest() { - Field privateField = ReflectUtil.getField(TestSubClass.class, "privateField"); - String fieldName = ReflectUtil.getFieldName(privateField); - Assert.assertNotNull(fieldName); - - Field subField = ReflectUtil.getField(TestSubClass.class, "subField"); - String subfieldName = ReflectUtil.getFieldName(subField); - Assert.assertNotNull(subfieldName); - } - - @Test - public void setFieldValueTest() { - TestClass testClass = new TestClass(); - ReflectUtil.setFieldValue(testClass, "field", "fieldVal"); - Assert.assertEquals("fieldVal", testClass.getField()); - - Field privateField = ReflectUtil.getField(TestSubClass.class, "privateField"); - ReflectUtil.setFieldValue(testClass, privateField, "privateFieldVal"); - Assert.assertEquals("privateFieldVal", testClass.getPrivateField()); - - } - - @Test - public void castTest() { - TestClass testClass = new TestSubClass(); - Object cast = ReflectUtil.cast(TestSubClass.class, testClass); - Assert.assertTrue(cast instanceof TestSubClass); - } - - @Test - public void getDefaultValueTest() { - Object defaultValue = ReflectUtil.getDefaultValue(Long.class); - Assert.assertNull(defaultValue); - Object primitiveValueLong = ReflectUtil.getDefaultValue(long.class); - Assert.assertEquals(0L, primitiveValueLong); - Object primitiveValueInt = ReflectUtil.getDefaultValue(int.class); - Assert.assertEquals(0, primitiveValueInt); - Object primitiveValueFloat = ReflectUtil.getDefaultValue(float.class); - Assert.assertEquals(0f, primitiveValueFloat); - Object primitiveValueShort = ReflectUtil.getDefaultValue(short.class); - Assert.assertEquals((short) 0, primitiveValueShort); - Object primitiveValueChar = ReflectUtil.getDefaultValue(char.class); - Assert.assertEquals((char) 0, primitiveValueChar); - Object primitiveValueDouble = ReflectUtil.getDefaultValue(double.class); - Assert.assertEquals(0D, primitiveValueDouble); - Object primitiveValueBoolean = ReflectUtil.getDefaultValue(boolean.class); - Assert.assertEquals(false, primitiveValueBoolean); - } - - @Test - public void getMethodByNameTest() { - // private method - Method runStateLessThan = ReflectUtil.getMethodByName(ThreadPoolExecutor.class, "runStateLessThan"); - Assert.assertNotNull(runStateLessThan); - // public method - Method field = ReflectUtil.getMethodByName(TestClass.class, "setPrivateField"); - Assert.assertNotNull(field); - // parameters - Method privateField = ReflectUtil.getMethodByName(TestClass.class, "setPrivateField", String.class); - Assert.assertNotNull(privateField); - } - - @Test - public void invokeTest() { - TestClass testClass = new TestClass(); - Method method = ReflectUtil.getMethodByName(TestClass.class, "getPrivateField"); - String invoke = ReflectUtil.invoke(testClass, method); - Assert.assertEquals(invoke, "privateField"); - } - - @Getter - @Setter - static class TestClass { - - private String privateField; - protected String field; - - public TestClass() { - this.privateField = "privateField"; - this.field = "field"; - } - } - - class TestSubClass extends TestClass { - - private String subField; - } - -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/SingletonTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/SingletonTest.java deleted file mode 100644 index 2e3c49c7..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/SingletonTest.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import org.junit.Assert; -import org.junit.Test; - -public class SingletonTest { - - @Test - public void assertSingletonGet() { - Assert.assertNull(Singleton.get("userName")); - Singleton.put("userName", "hippo4j"); - Assert.assertEquals("hippo4j", Singleton.get("userName")); - ThreadPoolParameterInfo threadPoolParameterInfo = ThreadPoolParameterInfo.builder().tenantId("prescription") - .itemId("dynamic-threadpool-example").tpId("message-consume").content("描述信息").corePoolSize(1) - .maximumPoolSize(2).queueType(1).capacity(4).keepAliveTime(513L).executeTimeOut(null).rejectedType(4) - .isAlarm(1).capacityAlarm(80).livenessAlarm(80).allowCoreThreadTimeOut(1).build(); - Singleton.put(threadPoolParameterInfo); - Assert.assertEquals(threadPoolParameterInfo, Singleton.get(ThreadPoolParameterInfo.class.getName())); - } - - @Test - public void assertSingletonGet2() { - Assert.assertNull(Singleton.get("userName1", () -> null)); - Assert.assertEquals("hippo4j", Singleton.get("userName1", () -> "hippo4j")); - Assert.assertEquals("123456", Singleton.get("pw", () -> "123456") + ""); - Assert.assertNotEquals("135790", Singleton.get("pw", () -> "135790") + ""); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/StringUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/StringUtilTest.java deleted file mode 100644 index a73b34c1..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/StringUtilTest.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import org.junit.Test; -import org.junit.Assert; - -public class StringUtilTest { - - @Test - public void replace() { - String url = "http://localhost:8088/hippo4j_manager?"; - String replace = StringUtil.replace(url, "/hippo4j_manager?", "?"); - Assert.assertEquals(replace, "http://localhost:8088?"); - } - - /** - *

Splits the provided text into an array, separators specified. - * - *

-     * StringUtils.split(null, *)         = null
-     * StringUtils.split("", *)           = []
-     * StringUtils.split("abc def", null) = ["abc", "def"]
-     * StringUtils.split("abc def", " ")  = ["abc", "def"]
-     * StringUtils.split("ab:cd:ef", ":") = ["ab", "cd", "ef"]
-     * 
- */ - @Test - public void split() { - String str1 = null; - String separator1 = "*"; - String[] res1 = StringUtil.split(str1, separator1); - assert res1 == null; - - String str2 = ""; - String separator2 = "*"; - String[] res2 = StringUtil.split(str2, separator2); - Assert.assertArrayEquals(res2, new String[0]); - - String str3 = "abc def"; - String separator3 = null; - String[] res3 = StringUtil.split(str3, separator3); - Assert.assertArrayEquals(res3, new String[]{"abc", "def"}); - - String str4 = "abc def"; - String separator4 = " "; - String[] res4 = StringUtil.split(str4, separator4); - Assert.assertArrayEquals(res4, new String[]{"abc", "def"}); - - String str5 = "ab:cd:ef"; - String separator5 = ":"; - String[] res5 = StringUtil.split(str5, separator5); - Assert.assertArrayEquals(res5, new String[]{"ab", "cd", "ef"}); - - } - - @Test - public void assertIsEmpty() { - String string = ""; - Assert.assertTrue(StringUtil.isEmpty(string)); - } - - @Test - public void assertIsNotEmpty() { - String string = "string"; - Assert.assertTrue(StringUtil.isNotEmpty(string)); - } - - @Test - public void emptyToNull() { - String string = ""; - Assert.assertNull(StringUtil.emptyToNull(string)); - } - - @Test - public void nullToEmpty() { - String string = "null"; - Assert.assertEquals("null", StringUtil.nullToEmpty(string)); - } - - @Test - public void isNullOrEmpty() { - String string = "null"; - Assert.assertFalse(StringUtil.isEmpty(string)); - } - - @Test - public void isBlank() { - String string = ""; - Assert.assertTrue(StringUtil.isBlank(string)); - } - - @Test - public void isNotBlank() { - String string = "null"; - Assert.assertTrue(StringUtil.isNotBlank(string)); - } - - @Test - public void isAllNotEmpty() { - String strings = "str"; - Assert.assertTrue(StringUtil.isAllNotEmpty(strings)); - } - - @Test - public void hasEmpty() { - String strings = ""; - Assert.assertTrue(StringUtil.hasEmpty(strings)); - } - - @Test - public void toUnderlineCase() { - String string = "str"; - String s = StringUtil.toUnderlineCase(string); - Assert.assertEquals("str", s); - } - - @Test - public void toSymbolCase() { - String string = "str"; - String s = StringUtil.toSymbolCase(string, StringUtil.UNDERLINE); - Assert.assertEquals("str", s); - } - - @Test - public void toCamelCase() { - String string = "str_str"; - String s = StringUtil.toCamelCase(string, StringUtil.UNDERLINE); - Assert.assertEquals("strStr", s); - } - - @Test - public void newBuilder() { - String s1 = StringUtil.newBuilder(null); - Assert.assertEquals("", s1); - String s2 = StringUtil.newBuilder("H", "ippo", "4j"); - Assert.assertEquals("Hippo4j", s2); - } - - @Test - public void createBuilder() { - StringBuilder s1 = StringUtil.createBuilder(null); - Assert.assertEquals("", s1.toString()); - StringBuilder s2 = StringUtil.createBuilder("H", "ippo", "4j"); - Assert.assertEquals("Hippo4j", s2.toString()); - } - - @Test - public void appends() { - StringBuilder sb1 = StringUtil.appends(null, "H", "ippo", "4j"); - Assert.assertEquals("Hippo4j", sb1.toString()); - StringBuilder sb2 = StringUtil.appends(StringUtil.createBuilder("To "), null); - Assert.assertEquals("To ", sb2.toString()); - StringBuilder sb3 = StringUtil.appends(StringUtil.createBuilder("To "), "H", "ippo", "4j"); - Assert.assertEquals("To Hippo4j", sb3.toString()); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ThreadUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/ThreadUtilTest.java deleted file mode 100644 index 88c2890a..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/ThreadUtilTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import org.junit.Test; -import org.junit.Assert; - -public class ThreadUtilTest { - - @Test - public void testNewThread() { - // Setup - final Runnable runnable = null; - - // Run the test - final Thread result = ThreadUtil.newThread(runnable, "name", false); - - // Verify the results - Assert.assertNotNull(result); - } - - @Test - public void testSleep() { - Assert.assertTrue(ThreadUtil.sleep(0L)); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/UserContextTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/UserContextTest.java deleted file mode 100644 index ffbc5a83..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/UserContextTest.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit; - -import org.junit.Test; - -public class UserContextTest { - - private static final String USERNAME = "test"; - - private static final String USER_ROLE = "role1"; - - @Test - public void testSetUserInfo() { - UserContext.setUserInfo(USERNAME, USER_ROLE); - ThreadLocal userThreadLocal = (ThreadLocal) ReflectUtil.getFieldValue(UserContext.class, "USER_THREAD_LOCAL"); - Assert.notNull(userThreadLocal.get()); - } - - @Test - public void testGetUserName() { - UserContext.setUserInfo(USERNAME, USER_ROLE); - String userName = UserContext.getUserName(); - Assert.isTrue(USERNAME.equals(userName)); - } - - @Test - public void testGetUserRole() { - UserContext.setUserInfo(USERNAME, USER_ROLE); - String userRole = UserContext.getUserRole(); - Assert.isTrue(USER_ROLE.equals(userRole)); - } - - @Test - public void testClear() { - UserContext.setUserInfo(USERNAME, USER_ROLE); - ThreadLocal userThreadLocal = (ThreadLocal) ReflectUtil.getFieldValue(UserContext.class, "USER_THREAD_LOCAL"); - Assert.notNull(userThreadLocal.get()); - UserContext.clear(); - Assert.isNull(userThreadLocal.get()); - } - -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/http/HomeServlet.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/http/HomeServlet.java deleted file mode 100644 index 1f377b0b..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/http/HomeServlet.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit.http; - -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; - -/** - * Implement HttpServlet and receive post and get requests
- * This HttpServlet represents the home page - */ -public class HomeServlet extends HttpServlet { - - int status = 200; - String result = "success"; - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { - resp.setStatus(status); - PrintWriter writer = resp.getWriter(); - writer.println(result); - } - -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/http/HttpUtilsTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/http/HttpUtilsTest.java deleted file mode 100644 index 06b55f44..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/http/HttpUtilsTest.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit.http; - -import cn.hippo4j.common.toolkit.JSONUtil; -import lombok.Getter; -import lombok.Setter; -import org.apache.catalina.Context; -import org.apache.catalina.LifecycleException; -import org.apache.catalina.connector.Connector; -import org.apache.catalina.startup.Tomcat; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.io.File; -import java.io.IOException; -import java.net.ServerSocket; -import java.nio.file.FileVisitResult; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.LinkedHashMap; -import java.util.Map; - -public class HttpUtilsTest { - - static int PORT = 8080; - static Tomcat tomcat; - static final String PROTOCOL = "org.apache.coyote.http11.Http11NioProtocol"; - static final String HOME_PAGE_URL = "/home"; - static final String HOME_PAGE_NAME = "homeServlet"; - static final String LOGIN_URL = "/login"; - static final String LOGIN_NAME = "loginServlet"; - static final String CONTEXT_PATH = "/"; - static final String USER_DIR = "user.dir"; - static final String BASE_DIR = System.getProperty(USER_DIR) + "/target/tomcat"; - - @BeforeClass - public static void startWeb() throws IOException, LifecycleException { - tomcat = new Tomcat(); - // clear historical files that may be left behind - deleteBaseDir(); - // set base dir - tomcat.setBaseDir(BASE_DIR); - // get a random port - ServerSocket socket = new ServerSocket(0); - PORT = socket.getLocalPort(); - socket.close(); - tomcat.setPort(PORT); - // set a connector - Connector connector = new Connector(PROTOCOL); - connector.setThrowOnFailure(true); - connector.setPort(PORT); - tomcat.setConnector(connector); - // set a context - Context context = tomcat.addContext(CONTEXT_PATH, BASE_DIR); - Tomcat.addServlet(context, HOME_PAGE_NAME, new HomeServlet()).setAsyncSupported(true); - context.addServletMappingDecoded(HOME_PAGE_URL, HOME_PAGE_NAME); - Tomcat.addServlet(context, LOGIN_NAME, new LoginServlet()).setAsyncSupported(true); - context.addServletMappingDecoded(LOGIN_URL, LOGIN_NAME); - // start tomcat - tomcat.start(); - } - - @AfterClass - public static void stopWeb() throws LifecycleException, IOException { - // stop tomcat - tomcat.stop(); - // del dir - deleteBaseDir(); - } - - /** - * forcibly delete the tomcat's base dir and its sub files - */ - private static void deleteBaseDir() throws IOException { - File file = new File(BASE_DIR); - // fail fast - if (!file.exists()) { - return; - } - Files.walkFileTree(file.toPath(), new SimpleFileVisitor() { - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - Files.delete(file); - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { - Files.delete(dir); - return FileVisitResult.CONTINUE; - } - }); - } - - /** - * test url - */ - String url = "http://localhost:"; - - String passwordValue = "hippo4jtest"; - String usernameValue = "hippo4j"; - String password = "password"; - String username = "username"; - String suffix = "?password=hippo4jtest&username=hippo4j"; - - @Test - public void get() { - String s = HttpUtil.get(url + PORT + HOME_PAGE_URL); - Assert.assertNotNull(s); - } - - @Test - public void restApiPost() { - String loginUrl = url + PORT + LOGIN_URL; - LoginInfo loginInfo = new LoginInfo(); - loginInfo.setPassword(passwordValue); - loginInfo.setUsername(usernameValue); - loginInfo.setRememberMe(1); - String s = HttpUtil.post(loginUrl, loginInfo); - Result result = JSONUtil.parseObject(s, Result.class); - Assert.assertNotNull(result); - String data = result.getData().getData(); - Assert.assertNotNull(data); - } - - @Test - public void testRestApiPost() { - String loginUrl = url + PORT + LOGIN_URL; - LoginInfo loginInfo = new LoginInfo(); - loginInfo.setPassword(passwordValue); - loginInfo.setUsername(usernameValue); - loginInfo.setRememberMe(1); - Result result = HttpUtil.post(loginUrl, loginInfo, Result.class); - Assert.assertNotNull(result); - String data = result.getData().getData(); - Assert.assertNotNull(data); - } - - // @Test(expected = SocketTimeoutException.class) - public void testRestApiPostTimeout() { - String loginUrl = url + PORT + LOGIN_URL; - LoginInfo loginInfo = new LoginInfo(); - loginInfo.setPassword(passwordValue); - loginInfo.setUsername(usernameValue); - loginInfo.setRememberMe(1); - HttpUtil.post(loginUrl, loginInfo, 1, Result.class); - } - - @Test - public void buildUrl() { - Map map = new LinkedHashMap<>(); - map.put(password, passwordValue); - map.put(username, usernameValue); - String s = HttpUtil.buildUrl(url + PORT, map); - Assert.assertEquals(url + PORT + suffix, s); - } - - @Getter - @Setter - protected static class LoginInfo { - - private String username; - - private String password; - - private Integer rememberMe; - } - - @Getter - @Setter - protected static class Result { - - private String code; - - private ResultData data; - } - - @Getter - @Setter - protected static class ResultData { - - private String data; - - private String[] roles; - } -} \ No newline at end of file diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/http/LoginServlet.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/http/LoginServlet.java deleted file mode 100644 index 9c085fd4..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/http/LoginServlet.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit.http; - -import cn.hippo4j.common.toolkit.JSONUtil; - -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; - -/** - * his HttpServlet represents the login request - */ -public class LoginServlet extends HttpServlet { - - String passwordAttr = "password"; - String usernameAttr = "username"; - String status = "200"; - - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { - String password = (String) req.getAttribute(passwordAttr); - String username = (String) req.getAttribute(usernameAttr); - HttpUtilsTest.ResultData resultData = new HttpUtilsTest.ResultData(); - resultData.setData(username + password); - HttpUtilsTest.Result result = new HttpUtilsTest.Result(); - result.setCode(status); - result.setData(resultData); - String s = JSONUtil.toJSONString(result); - PrintWriter writer = resp.getWriter(); - writer.println(s); - } -} diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/logtracing/LogMessageTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/logtracing/LogMessageTest.java deleted file mode 100644 index b9d55ea8..00000000 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/logtracing/LogMessageTest.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.common.toolkit.logtracing; - -import org.apache.logging.log4j.util.Strings; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNotSame; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class LogMessageTest { - - private final static String MESSAGE = "message"; - private final static String THROWABLE_MESSAGE = "throwable message"; - private LogMessage logMessage; - - @Before - public void init() { - logMessage = LogMessage.getInstance(); - } - - @Test - public void testGetInstanceShouldReturnANewLogMessageInstance() { - final LogMessage newInstance = LogMessage.getInstance(); - assertNotNull(newInstance); - assertNotSame(logMessage, newInstance); - } - - @Test - public void testToStringShouldHaveAnEmptyMessage() { - assertEquals(Strings.EMPTY, logMessage.toString()); - } - - @Test - public void testSetMsgShouldSetAnewMessageInLogMessage() { - logMessage.setMsg(MESSAGE); - assertEquals(MESSAGE, logMessage.toString()); - } - - @Test - public void testMsgShouldContainsMessageAndThrowableMessage() { - final String message = logMessage.msg(MESSAGE, new Throwable(THROWABLE_MESSAGE)); - assertNotNull(message); - assertTrue(message.contains(MESSAGE)); - assertTrue(message.contains(THROWABLE_MESSAGE)); - } - - @Test - public void testKvShouldPutKeyAndValue() { - logMessage.kv("key", "value"); - assertEquals("key=value", logMessage.toString()); - } - - @Test - public void testKvShouldPutAllKeyAndValuePairs() { - logMessage.kv("key1", "value1"); - logMessage.kv("key2", "value2"); - String output = logMessage.toString(); - assertTrue(output.equals("key1=value1||key2=value2") || output.equals("key2=value2||key1=value1")); - } - - @Test - public void testToStringShouldPrintMessageAndAllKeyAndValuePairs() { - logMessage.setMsg(MESSAGE); - logMessage.kv("key1", "value1"); - logMessage.kv("key2", "value2"); - String output = logMessage.toString(); - assertTrue(output.equals("messagekey1=value1||key2=value2") || output.equals("messagekey2=value2||key1=value1")); - } - - @Test - public void testKv2StringShouldPrintMessageAndAllKeyAndValuePairs() { - String result = logMessage.kv2String("key", "value"); - assertEquals("key=value", result); - } -} \ No newline at end of file diff --git a/infra/common/src/test/resources/META-INF/services/cn.hippo4j.common.executor.support.CustomBlockingQueue b/infra/common/src/test/resources/META-INF/services/cn.hippo4j.common.executor.support.CustomBlockingQueue deleted file mode 100644 index 0226d460..00000000 --- a/infra/common/src/test/resources/META-INF/services/cn.hippo4j.common.executor.support.CustomBlockingQueue +++ /dev/null @@ -1,2 +0,0 @@ -cn.hippo4j.common.executor.support.BlockingQueueSpiTest$TestCustomQueue -cn.hippo4j.common.executor.integration.QueueSpiIntegrationTest$IntegrationTestQueue diff --git a/infra/pom.xml b/infra/pom.xml deleted file mode 100644 index 17518798..00000000 --- a/infra/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-all - ${revision} - - - hippo4j-infra - pom - - - common - toolkit - - \ No newline at end of file diff --git a/infra/toolkit/pom.xml b/infra/toolkit/pom.xml deleted file mode 100644 index 8784aa5e..00000000 --- a/infra/toolkit/pom.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-infra - ${revision} - - - hippo4j-threadpool-infra-toolkit - \ No newline at end of file diff --git a/kernel/alarm/pom.xml b/kernel/alarm/pom.xml deleted file mode 100644 index ea871060..00000000 --- a/kernel/alarm/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-kernel - ${revision} - - - hippo4j-threadpool-kernel-alarm - - - - org.projectlombok - lombok - - - - cn.hippo4j - hippo4j-threadpool-message-core - ${project.version} - - - \ No newline at end of file diff --git a/kernel/alarm/src/main/java/cn/hippo4j/threadpool/alarm/api/ThreadPoolCheckAlarm.java b/kernel/alarm/src/main/java/cn/hippo4j/threadpool/alarm/api/ThreadPoolCheckAlarm.java deleted file mode 100644 index e48c47d6..00000000 --- a/kernel/alarm/src/main/java/cn/hippo4j/threadpool/alarm/api/ThreadPoolCheckAlarm.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.alarm.api; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ThreadPoolExecutor; - -/** - * Thread-pol check alarm. - * - *

Dynamic thread pool check and send logic wait for refactoring, - * Try not to rely on this component for custom extensions, because it is undefined. - */ -public interface ThreadPoolCheckAlarm { - - /** - * Get a none thread pool check alarm. - * - * @return {@link ThreadPoolCheckAlarm} - * @see NoneThreadPoolCheckAlarm - */ - static ThreadPoolCheckAlarm none() { - return NoneThreadPoolCheckAlarm.INSTANCE; - } - - /** - * Execute scheduled tasks to scan the running status of the thread pool. - */ - default void scheduleExecute() { - } - - /** - * Check pool capacity alarm. - * - * @param threadPoolId thread-pool id - * @param threadPoolExecutor thread-pool executor - */ - void checkPoolCapacityAlarm(String threadPoolId, ThreadPoolExecutor threadPoolExecutor); - - /** - * Check pool activity alarm. - * - * @param threadPoolId thread-pool id - * @param threadPoolExecutor thread-pool executor - */ - void checkPoolActivityAlarm(String threadPoolId, ThreadPoolExecutor threadPoolExecutor); - - /** - * Async send rejected alarm. - * - * @param threadPoolId thread-pool id - */ - void asyncSendRejectedAlarm(String threadPoolId); - - /** - * Async send execute time-out alarm. - * - * @param threadPoolId thread-pool id - * @param executeTime execute time - * @param executeTimeOut execute time-out - * @param threadPoolExecutor thread-pool executor - */ - void asyncSendExecuteTimeOutAlarm(String threadPoolId, long executeTime, long executeTimeOut, ThreadPoolExecutor threadPoolExecutor); - - /** - * None implementation of {@link ThreadPoolCheckAlarm}. - * - * @see #none() - */ - @Slf4j - @NoArgsConstructor(access = AccessLevel.PRIVATE) - class NoneThreadPoolCheckAlarm implements ThreadPoolCheckAlarm { - - /** - * Default singleton. - */ - private static final NoneThreadPoolCheckAlarm INSTANCE = new NoneThreadPoolCheckAlarm(); - - /** - * Check pool capacity alarm. - * - * @param threadPoolId thread-pool id - * @param threadPoolExecutor thread-pool executor - */ - @Override - public void checkPoolCapacityAlarm(String threadPoolId, ThreadPoolExecutor threadPoolExecutor) { - log.info("Ignore check pool capacity alarm for ExecuteService '{}'", threadPoolId); - } - - /** - * Check pool activity alarm. - * - * @param threadPoolId thread-pool id - * @param threadPoolExecutor thread-pool executor - */ - @Override - public void checkPoolActivityAlarm(String threadPoolId, ThreadPoolExecutor threadPoolExecutor) { - log.info("Ignore check pool activity alarm for ExecuteService '{}'", threadPoolId); - } - - /** - * Async send rejected alarm. - * - * @param threadPoolId thread-pool id - */ - @Override - public void asyncSendRejectedAlarm(String threadPoolId) { - log.debug("Ignore async send rejected alarm for ExecuteService '{}'", threadPoolId); - } - - /** - * Async send execute time-out alarm. - * - * @param threadPoolId thread-pool id - * @param executeTime execute time - * @param executeTimeOut execute time-out - * @param threadPoolExecutor thread-pool executor - */ - @Override - public void asyncSendExecuteTimeOutAlarm(String threadPoolId, long executeTime, long executeTimeOut, ThreadPoolExecutor threadPoolExecutor) { - log.debug("Ignore async send execute time out alarm for ExecuteService '{}'", threadPoolId); - } - } -} diff --git a/kernel/alarm/src/main/java/cn/hippo4j/threadpool/alarm/handler/DefaultThreadPoolCheckAlarmHandler.java b/kernel/alarm/src/main/java/cn/hippo4j/threadpool/alarm/handler/DefaultThreadPoolCheckAlarmHandler.java deleted file mode 100644 index 98947939..00000000 --- a/kernel/alarm/src/main/java/cn/hippo4j/threadpool/alarm/handler/DefaultThreadPoolCheckAlarmHandler.java +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.alarm.handler; - -import cn.hippo4j.common.executor.ThreadPoolExecutorHolder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.toolkit.CalculateUtil; -import cn.hippo4j.common.toolkit.ReflectUtil; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.threadpool.alarm.api.ThreadPoolCheckAlarm; -import cn.hippo4j.threadpool.alarm.toolkit.ExecutorTraceContextUtil; -import cn.hippo4j.threadpool.message.core.request.AlarmNotifyRequest; -import cn.hippo4j.threadpool.message.api.NotifyTypeEnum; -import cn.hippo4j.threadpool.message.core.service.GlobalNotifyAlarmManage; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolNotifyAlarm; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolSendMessageService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; -import java.util.Objects; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - -import static cn.hippo4j.common.propertie.EnvironmentProperties.active; -import static cn.hippo4j.common.propertie.EnvironmentProperties.applicationName; -import static cn.hippo4j.common.propertie.EnvironmentProperties.checkStateInterval; -import static cn.hippo4j.common.propertie.EnvironmentProperties.itemId; -import static cn.hippo4j.common.propertie.IdentifyProperties.IDENTIFY; - -/** - * Default thread-pool check alarm handler. - */ -@Slf4j -@RequiredArgsConstructor -public class DefaultThreadPoolCheckAlarmHandler implements Runnable, ThreadPoolCheckAlarm { - - private final ThreadPoolSendMessageService threadPoolSendMessageService; - - private final ScheduledExecutorService alarmNotifyExecutor = new ScheduledThreadPoolExecutor( - 1, - r -> new Thread(r, "client.alarm.notify")); - - private final ExecutorService asyncAlarmNotifyExecutor = new ThreadPoolExecutor( - 2, - 4, - 60L, - TimeUnit.SECONDS, - new LinkedBlockingQueue<>(4096), - new ThreadFactory() { - - private final AtomicInteger count = new AtomicInteger(); - - @Override - public Thread newThread(Runnable runnable) { - Thread thread = new Thread(runnable, "client.execute.timeout.alarm_" + count.incrementAndGet()); - thread.setDaemon(true); - return thread; - } - }, - new ThreadPoolExecutor.AbortPolicy()); - - @Override - public void scheduleExecute() { - alarmNotifyExecutor.scheduleWithFixedDelay(this, 0, checkStateInterval, TimeUnit.SECONDS); - } - - @Override - public void run() { - List listThreadPoolId = ThreadPoolExecutorRegistry.listThreadPoolExecutorId(); - listThreadPoolId.forEach(threadPoolId -> { - ThreadPoolNotifyAlarm threadPoolNotifyAlarm = GlobalNotifyAlarmManage.get(threadPoolId); - if (threadPoolNotifyAlarm != null && threadPoolNotifyAlarm.getAlarm()) { - ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(threadPoolId); - ThreadPoolExecutor executor = executorHolder.getExecutor(); - checkPoolCapacityAlarm(threadPoolId, executor); - checkPoolActivityAlarm(threadPoolId, executor); - } - }); - } - - /** - * Check thread pool capacity alarm. - * - * @param threadPoolId thread-pool id - * @param threadPoolExecutor thread-pool executor - */ - @Override - public void checkPoolCapacityAlarm(String threadPoolId, ThreadPoolExecutor threadPoolExecutor) { - ThreadPoolNotifyAlarm alarmConfig = GlobalNotifyAlarmManage.get(threadPoolId); - if (Objects.isNull(alarmConfig) || !alarmConfig.getAlarm() || alarmConfig.getCapacityAlarm() <= 0) { - return; - } - BlockingQueue blockingQueue = threadPoolExecutor.getQueue(); - int queueSize = blockingQueue.size(); - int capacity = queueSize + blockingQueue.remainingCapacity(); - int divide = CalculateUtil.divide(queueSize, capacity); - boolean isSend = alarmConfig.getAlarm() && divide > alarmConfig.getCapacityAlarm(); - if (isSend) { - AlarmNotifyRequest alarmNotifyRequest = buildAlarmNotifyRequest(threadPoolExecutor); - alarmNotifyRequest.setThreadPoolId(threadPoolId); - threadPoolSendMessageService.sendAlarmMessage(NotifyTypeEnum.CAPACITY, alarmNotifyRequest); - } - } - - /** - * Check thread pool activity alarm. - * - * @param threadPoolId thread-pool id - * @param threadPoolExecutor thread-pool executor - */ - @Override - public void checkPoolActivityAlarm(String threadPoolId, ThreadPoolExecutor threadPoolExecutor) { - ThreadPoolNotifyAlarm alarmConfig = GlobalNotifyAlarmManage.get(threadPoolId); - if (Objects.isNull(alarmConfig) || !alarmConfig.getAlarm() || alarmConfig.getActiveAlarm() <= 0) { - return; - } - int activeCount = threadPoolExecutor.getActiveCount(); - int maximumPoolSize = threadPoolExecutor.getMaximumPoolSize(); - int divide = CalculateUtil.divide(activeCount, maximumPoolSize); - boolean isSend = alarmConfig.getAlarm() && divide > alarmConfig.getActiveAlarm(); - if (isSend) { - AlarmNotifyRequest alarmNotifyRequest = buildAlarmNotifyRequest(threadPoolExecutor); - alarmNotifyRequest.setThreadPoolId(threadPoolId); - threadPoolSendMessageService.sendAlarmMessage(NotifyTypeEnum.ACTIVITY, alarmNotifyRequest); - } - } - - /** - * Async send rejected alarm. - * - * @param threadPoolId thread-pool id - */ - @Override - public void asyncSendRejectedAlarm(String threadPoolId) { - Runnable checkPoolRejectedAlarmTask = () -> { - ThreadPoolNotifyAlarm alarmConfig = GlobalNotifyAlarmManage.get(threadPoolId); - if (Objects.isNull(alarmConfig) || !alarmConfig.getAlarm()) { - return; - } - ThreadPoolExecutor threadPoolExecutor = ThreadPoolExecutorRegistry.getHolder(threadPoolId).getExecutor(); - if (Objects.equals(threadPoolExecutor.getClass().getName(), "cn.hippo4j.core.executor.DynamicThreadPoolExecutor")) { - AlarmNotifyRequest alarmNotifyRequest = buildAlarmNotifyRequest(threadPoolExecutor); - alarmNotifyRequest.setThreadPoolId(threadPoolId); - threadPoolSendMessageService.sendAlarmMessage(NotifyTypeEnum.REJECT, alarmNotifyRequest); - } - }; - asyncAlarmNotifyExecutor.execute(checkPoolRejectedAlarmTask); - } - - /** - * Async send execute time out alarm. - * - * @param threadPoolId thread-pool id - * @param executeTime execute time - * @param executeTimeOut execute time-out - * @param threadPoolExecutor thread-pool executor - */ - @Override - public void asyncSendExecuteTimeOutAlarm(String threadPoolId, long executeTime, long executeTimeOut, ThreadPoolExecutor threadPoolExecutor) { - ThreadPoolNotifyAlarm alarmConfig = GlobalNotifyAlarmManage.get(threadPoolId); - if (Objects.isNull(alarmConfig) || !alarmConfig.getAlarm()) { - return; - } - try { - AlarmNotifyRequest alarmNotifyRequest = buildAlarmNotifyRequest(threadPoolExecutor); - alarmNotifyRequest.setThreadPoolId(threadPoolId); - alarmNotifyRequest.setExecuteTime(executeTime); - alarmNotifyRequest.setExecuteTimeOut(executeTimeOut); - String executeTimeoutTrace = ExecutorTraceContextUtil.getAndRemoveTimeoutTrace(); - if (StringUtil.isNotBlank(executeTimeoutTrace)) { - alarmNotifyRequest.setExecuteTimeoutTrace(executeTimeoutTrace); - } - Runnable task = () -> threadPoolSendMessageService.sendAlarmMessage(NotifyTypeEnum.TIMEOUT, alarmNotifyRequest); - asyncAlarmNotifyExecutor.execute(task); - } catch (Throwable ex) { - log.error("Send thread pool execution timeout alarm error.", ex); - } - } - - /** - * Build alarm notify request. - * - * @param threadPoolExecutor thread-pool executor - * @return - */ - public AlarmNotifyRequest buildAlarmNotifyRequest(ThreadPoolExecutor threadPoolExecutor) { - BlockingQueue blockingQueue = threadPoolExecutor.getQueue(); - RejectedExecutionHandler rejectedExecutionHandler = threadPoolExecutor.getRejectedExecutionHandler(); - long rejectCount = -1L; - if (Objects.equals(threadPoolExecutor.getClass().getName(), "cn.hippo4j.core.executor.DynamicThreadPoolExecutor")) { - Object actualRejectCountNum = ReflectUtil.invoke(threadPoolExecutor, "getRejectCountNum"); - if (actualRejectCountNum != null) { - rejectCount = (long) actualRejectCountNum; - } - } - return AlarmNotifyRequest.builder() - .appName(StringUtil.isBlank(itemId) ? applicationName : itemId) - .active(active.toUpperCase()) - .identify(IDENTIFY) - .corePoolSize(threadPoolExecutor.getCorePoolSize()) - .maximumPoolSize(threadPoolExecutor.getMaximumPoolSize()) - .poolSize(threadPoolExecutor.getPoolSize()) - .activeCount(threadPoolExecutor.getActiveCount()) - .largestPoolSize(threadPoolExecutor.getLargestPoolSize()) - .completedTaskCount(threadPoolExecutor.getCompletedTaskCount()) - .queueName(blockingQueue.getClass().getSimpleName()) - .capacity(blockingQueue.size() + blockingQueue.remainingCapacity()) - .queueSize(blockingQueue.size()) - .remainingCapacity(blockingQueue.remainingCapacity()) - .rejectedExecutionHandlerName(rejectedExecutionHandler.getClass().getSimpleName()) - .rejectCountNum(rejectCount) - .build(); - } - - /** - * Terminates the scheduled tasks and asynchronous alarm notifications by - * forcefully shutting down the respective thread pools. - */ - public void destroyScheduleExecute() { - alarmNotifyExecutor.shutdownNow(); - asyncAlarmNotifyExecutor.shutdownNow(); - } - -} diff --git a/kernel/alarm/src/main/java/cn/hippo4j/threadpool/alarm/toolkit/ExecutorTraceContextUtil.java b/kernel/alarm/src/main/java/cn/hippo4j/threadpool/alarm/toolkit/ExecutorTraceContextUtil.java deleted file mode 100644 index e9cca2fb..00000000 --- a/kernel/alarm/src/main/java/cn/hippo4j/threadpool/alarm/toolkit/ExecutorTraceContextUtil.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.alarm.toolkit; - -import org.slf4j.MDC; - -import static cn.hippo4j.common.constant.Constants.EXECUTE_TIMEOUT_TRACE; - -/** - * Trace context util. - */ -public class ExecutorTraceContextUtil { - - /** - * Execute timeout trace key. - */ - private static String executeTimeoutTraceKey = EXECUTE_TIMEOUT_TRACE; - - /** - * Get and remove. - * - * @return timeout trace - */ - public static String getAndRemoveTimeoutTrace() { - String val = MDC.get(executeTimeoutTraceKey); - MDC.remove(executeTimeoutTraceKey); - return val; - } - - /** - * Put timeout trace. - * - * @param trace trace - */ - public static void putTimeoutTrace(String trace) { - MDC.put(EXECUTE_TIMEOUT_TRACE, trace); - } - - /** - * Set timeout trace key. - * - * @param key trace key - */ - public static void setTimeoutTraceKey(String key) { - executeTimeoutTraceKey = key; - } -} diff --git a/kernel/dynamic/api/pom.xml b/kernel/dynamic/api/pom.xml deleted file mode 100644 index 3f058feb..00000000 --- a/kernel/dynamic/api/pom.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-kernel-dynamic - ${revision} - - - hippo4j-threadpool-dynamic-api - - - - cn.hippo4j - hippo4j-threadpool-infra-common - ${project.version} - - - \ No newline at end of file diff --git a/kernel/dynamic/api/src/main/java/cn/hippo4j/threadpool/dynamic/api/BootstrapPropertiesInterface.java b/kernel/dynamic/api/src/main/java/cn/hippo4j/threadpool/dynamic/api/BootstrapPropertiesInterface.java deleted file mode 100644 index 4f7316da..00000000 --- a/kernel/dynamic/api/src/main/java/cn/hippo4j/threadpool/dynamic/api/BootstrapPropertiesInterface.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.api; - -import java.util.Map; - -/** - * Bootstrap properties interface. - */ -public interface BootstrapPropertiesInterface { - - /** - * Get enable. - */ - default Boolean getEnable() { - return null; - } - - /** - * Get username. - */ - default String getUsername() { - return null; - } - - /** - * Get password. - */ - default String getPassword() { - return null; - } - - /** - * Get namespace. - */ - default String getNamespace() { - return null; - } - - /** - * Get item id. - */ - default String getItemId() { - return null; - } - - /** - * Get server addr. - */ - default String getServerAddr() { - return null; - } - - /** - * Get banner. - */ - default Boolean getBanner() { - return null; - } - - /** - * Get nacos. - */ - default Map getNacos() { - return null; - } - - /** - * Get etcd. - */ - default Map getEtcd() { - return null; - } - - /** - * Get apollo. - */ - default Map getApollo() { - return null; - } - - /** - * Get Zookeeper. - */ - default Map getZookeeper() { - return null; - } - - /** - * Get Polaris. - */ - default Map getPolaris() { - return null; - } - -} diff --git a/kernel/dynamic/api/src/main/java/cn/hippo4j/threadpool/dynamic/api/ThreadPoolDynamicRefresh.java b/kernel/dynamic/api/src/main/java/cn/hippo4j/threadpool/dynamic/api/ThreadPoolDynamicRefresh.java deleted file mode 100644 index c1c571be..00000000 --- a/kernel/dynamic/api/src/main/java/cn/hippo4j/threadpool/dynamic/api/ThreadPoolDynamicRefresh.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.api; - -import java.util.Map; - -/** - * Thread-pool dynamic refresh. - */ -public interface ThreadPoolDynamicRefresh { - - /** - * Register configuration center event listener. - */ - default void registerListener() { - } - - /** - * Build thread-pool bootstrap properties. - * - * @param configInfo changed configuration properties - * @return bootstrap properties - */ - default BootstrapPropertiesInterface buildBootstrapProperties(Map configInfo) { - return null; - } - - /** - * Dynamic refresh of configuration center data changes. - * - * @param content changed data - */ - default void dynamicRefresh(String content) { - } - - /** - * Dynamic refresh of configuration center data changes. - * - * @param configFileType config file type - * @param content changed data - */ - default void dynamicRefresh(String configFileType, String content) { - } - - /** - * Dynamic refresh. - * - * @param content changed data - * @param newValueChangeMap new value change map - */ - default void dynamicRefresh(String content, Map newValueChangeMap) { - } - - /** - * Dynamic refresh. - * - * @param configFileType config file type - * @param content changed data - * @param newValueChangeMap new value change map - */ - default void dynamicRefresh(String configFileType, String content, Map newValueChangeMap) { - } -} diff --git a/kernel/dynamic/core/pom.xml b/kernel/dynamic/core/pom.xml deleted file mode 100644 index bdede701..00000000 --- a/kernel/dynamic/core/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-kernel-dynamic - ${revision} - - - hippo4j-threadpool-dynamic-core - - - - cn.hippo4j - hippo4j-threadpool-infra-common - ${project.version} - - - org.springframework - spring-context - true - - - \ No newline at end of file diff --git a/kernel/dynamic/mode/config/pom.xml b/kernel/dynamic/mode/config/pom.xml deleted file mode 100644 index c6e157a3..00000000 --- a/kernel/dynamic/mode/config/pom.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-dynamic-mode - ${revision} - - - hippo4j-threadpool-dynamic-mode-config - - - - cn.hippo4j - hippo4j-threadpool-dynamic-api - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-dynamic-core - ${project.version} - - - org.springframework - spring-beans - - - \ No newline at end of file diff --git a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/AbstractConfigParser.java b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/AbstractConfigParser.java deleted file mode 100644 index dd8c6b98..00000000 --- a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/AbstractConfigParser.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.mode.config.parser; - -/** - * Abstract config parser - */ -public abstract class AbstractConfigParser implements ConfigParser { - - @Override - public boolean supports(ConfigFileTypeEnum type) { - return getConfigFileTypes().contains(type); - } -} diff --git a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/ConfigFileTypeEnum.java b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/ConfigFileTypeEnum.java deleted file mode 100644 index 1bbe03c8..00000000 --- a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/ConfigFileTypeEnum.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.mode.config.parser; - -import lombok.Getter; - -/** - * Config file type enum - */ -@Getter -public enum ConfigFileTypeEnum { - - /** - * PROPERTIES - */ - PROPERTIES("properties"), - - /** - * XML - */ - XML("xml"), - - /** - * JSON - */ - JSON("json"), - - /** - * YML - */ - YML("yml"), - - /** - * YAML - */ - YAML("yaml"), - - /** - * TXT - */ - TXT("txt"); - - private final String value; - - ConfigFileTypeEnum(String value) { - this.value = value; - } - - public static ConfigFileTypeEnum of(String value) { - for (ConfigFileTypeEnum typeEnum : ConfigFileTypeEnum.values()) { - if (typeEnum.value.equals(value)) { - return typeEnum; - } - } - return PROPERTIES; - } -} diff --git a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/ConfigParser.java b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/ConfigParser.java deleted file mode 100644 index 35f373af..00000000 --- a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/ConfigParser.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.mode.config.parser; - -import java.io.IOException; -import java.util.List; -import java.util.Map; - -/** - * Config parser. - */ -public interface ConfigParser { - - /** - * Supports. - * - * @param type - * @return - */ - boolean supports(ConfigFileTypeEnum type); - - /** - * Do parse. - * - * @param content - * @return - * @throws IOException - */ - Map doParse(String content) throws IOException; - - /** - * Get config file types. - * - * @return - */ - List getConfigFileTypes(); -} diff --git a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/ConfigParserHandler.java b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/ConfigParserHandler.java deleted file mode 100644 index 60d1f752..00000000 --- a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/ConfigParserHandler.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.mode.config.parser; - -import java.io.IOException; -import java.util.*; - -/** - * Config parser handler. - */ -public final class ConfigParserHandler { - - private static final List PARSERS = new ArrayList<>(); - - private ConfigParserHandler() { - ServiceLoader loader = ServiceLoader.load(ConfigParser.class); - for (ConfigParser configParser : loader) { - PARSERS.add(configParser); - } - PARSERS.add(new PropertiesConfigParser()); - PARSERS.add(new YamlConfigParser()); - PARSERS.add(new JsonConfigParser()); - } - - public Map parseConfig(String content, String type) throws IOException { - return parseConfig(content, ConfigFileTypeEnum.of(type)); - } - - public Map parseConfig(String content, ConfigFileTypeEnum type) throws IOException { - for (ConfigParser parser : PARSERS) { - if (parser.supports(type)) { - return parser.doParse(content); - } - } - return Collections.emptyMap(); - } - - public static ConfigParserHandler getInstance() { - return ConfigParserHandlerHolder.INSTANCE; - } - - /** - * Config Parser Handler Holder - */ - private static class ConfigParserHandlerHolder { - - private static final ConfigParserHandler INSTANCE = new ConfigParserHandler(); - } -} diff --git a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/JsonConfigParser.java b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/JsonConfigParser.java deleted file mode 100644 index bb247068..00000000 --- a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/JsonConfigParser.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.mode.config.parser; - -import cn.hippo4j.common.toolkit.CollectionUtil; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; - -import java.io.IOException; -import java.util.Map; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -/** - * Json config parser. - */ -public class JsonConfigParser extends AbstractConfigParser { - - private static final ObjectMapper MAPPER; - private static final String DOT = "."; - private static final String LEFT_BRACE = "{"; - private static final String RIGHT_BRACE = "{"; - private static final String LEFT_BRACKET = "["; - private static final String RIGHT_BRACKET = "]"; - - static { - MAPPER = new ObjectMapper(); - } - - public Map doParse(String content, String prefix) throws IOException { - - Map originMap = MAPPER.readValue(content, LinkedHashMap.class); - Map result = new HashMap<>(); - - flatMap(result, originMap, prefix); - return result; - } - - private void flatMap(Map result, Map dataMap, String prefix) { - - if (MapUtils.isEmpty(dataMap)) { - return; - } - - dataMap.forEach((k, v) -> { - String fullKey = genFullKey(prefix, k); - if (v instanceof Map) { - flatMap(result, (Map) v, fullKey); - return; - } else if (v instanceof Collection) { - int count = 0; - for (Object obj : (Collection) v) { - String kk = LEFT_BRACKET + (count++) + RIGHT_BRACKET; - flatMap(result, Collections.singletonMap(kk, obj), fullKey); - } - return; - } - - result.put(fullKey, v); - }); - } - - private String genFullKey(String prefix, String key) { - if (StringUtils.isEmpty(prefix)) { - return key; - } - return key.startsWith(LEFT_BRACE) ? prefix.concat(key) : prefix.concat(DOT).concat(key); - } - - @Override - public Map doParse(String content) throws IOException { - if (StringUtils.isEmpty(content)) { - return new HashMap<>(1); - } - - return doParse(content, ""); - } - - @Override - public List getConfigFileTypes() { - return CollectionUtil.newArrayList(ConfigFileTypeEnum.JSON, ConfigFileTypeEnum.JSON); - } -} diff --git a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/PropertiesConfigParser.java b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/PropertiesConfigParser.java deleted file mode 100644 index 4edf0ac5..00000000 --- a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/PropertiesConfigParser.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.mode.config.parser; - -import cn.hippo4j.common.toolkit.CollectionUtil; - -import java.io.IOException; -import java.io.StringReader; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -/** - * Properties config parser. - */ -public class PropertiesConfigParser extends AbstractConfigParser { - - @Override - public Map doParse(String content) throws IOException { - Properties properties = new Properties(); - properties.load(new StringReader(content)); - return properties; - } - - @Override - public List getConfigFileTypes() { - return CollectionUtil.newArrayList(ConfigFileTypeEnum.PROPERTIES); - } -} diff --git a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/YamlConfigParser.java b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/YamlConfigParser.java deleted file mode 100644 index b929f309..00000000 --- a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/parser/YamlConfigParser.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.mode.config.parser; - -import cn.hippo4j.common.toolkit.CollectionUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; -import org.springframework.core.io.ByteArrayResource; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Yaml config parser. - */ -public class YamlConfigParser extends AbstractConfigParser { - - @Override - public Map doParse(String content) { - if (StringUtils.isEmpty(content)) { - return new HashMap<>(1); - } - YamlPropertiesFactoryBean yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean(); - yamlPropertiesFactoryBean.setResources(new ByteArrayResource(content.getBytes())); - return yamlPropertiesFactoryBean.getObject(); - } - - @Override - public List getConfigFileTypes() { - return CollectionUtil.newArrayList(ConfigFileTypeEnum.YML, ConfigFileTypeEnum.YAML); - } -} diff --git a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/AdapterExecutorProperties.java b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/AdapterExecutorProperties.java deleted file mode 100644 index 670b17d2..00000000 --- a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/AdapterExecutorProperties.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.mode.config.properties; - -import lombok.Data; - -/** - * Adapter executor properties. - */ -@Data -public class AdapterExecutorProperties { - - /** - * Mark - */ - private String mark; - - /** - * Thread-pool key - */ - private String threadPoolKey; - - /** - * Core pool size - */ - private Integer corePoolSize; - - /** - * Maximum pool size - */ - private Integer maximumPoolSize; - - /** - * Nodes, application startup is not affect, change properties is effect - */ - private String nodes; - - /** - * these propertied is enabled? - */ - private Boolean enable = true; -} diff --git a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/BootstrapConfigProperties.java b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/BootstrapConfigProperties.java deleted file mode 100644 index 1bc87dc0..00000000 --- a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/BootstrapConfigProperties.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.mode.config.properties; - -import cn.hippo4j.common.model.executor.ExecutorProperties; -import cn.hippo4j.threadpool.dynamic.api.BootstrapPropertiesInterface; -import cn.hippo4j.threadpool.dynamic.mode.config.parser.ConfigFileTypeEnum; -import lombok.Getter; -import lombok.Setter; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * Bootstrap core properties. - */ -@Getter -@Setter -public class BootstrapConfigProperties implements BootstrapPropertiesInterface { - - public static final String PREFIX = "spring.dynamic.thread-pool"; - - /** - * Enable dynamic thread pool. - */ - private Boolean enable = Boolean.TRUE; - - /** - * Enabled banner. - */ - private Boolean banner = Boolean.TRUE; - - /** - * Thread pool monitoring related configuration. - */ - private MonitorProperties monitor = new MonitorProperties(); - - /** - * Config file type. - */ - private ConfigFileTypeEnum configFileType; - - /** - * Nacos config. - */ - private Map nacos; - - /** - * Apollo config. - */ - private Map apollo; - - /** - * Zookeeper config. - */ - private Map zookeeper; - - /** - * etcd config - */ - private Map etcd; - - /** - * polaris config - */ - private Map polaris; - - /** - * Web config - * - * @since 1.5.0 - */ - private WebExecutorProperties web; - - /** - * Notify platforms. - */ - private List notifyPlatforms = new ArrayList<>(); - - /** - * Check thread pool running status interval. - */ - private Integer checkStateInterval; - - /** - * Default dynamic thread pool configuration. - */ - private ExecutorProperties defaultExecutor; - - /** - * Dynamic thread pool configuration collection. - */ - private List executors; - - /** - * Tripartite framework thread pool adaptation set. - */ - private List adapterExecutors; -} diff --git a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/MonitorProperties.java b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/MonitorProperties.java deleted file mode 100644 index db4db930..00000000 --- a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/MonitorProperties.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.mode.config.properties; - -import lombok.Data; - -/** - * Thread pool monitoring properties. - */ -@Data -public class MonitorProperties { - - /** - * Collect thread pool runtime indicators. - */ - private Boolean enable = Boolean.TRUE; - - /** - * Type of collection thread pool running data. eg: log,micrometer. Multiple can be used at the same time, default micrometer. - */ - // TODO - private String collectTypes = "micrometer"; - - /** - * Monitor the type of thread pool. eg: dynamic,web,adapter. Can be configured arbitrarily, default dynamic. - */ - // TODO - private String threadPoolTypes = "dynamic"; - - /** - * Delay starting data acquisition task. unit: ms - */ - private Long initialDelay = 10000L; - - /** - * Collect interval. unit: ms - */ - private Long collectInterval = 5000L; - - /** - * Agent micrometer exposed port - */ - private Integer agentMicrometerPort; -} diff --git a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/NotifyPlatformProperties.java b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/NotifyPlatformProperties.java deleted file mode 100644 index 16642130..00000000 --- a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/NotifyPlatformProperties.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.mode.config.properties; - -import lombok.Data; - -/** - * Notify platform properties. - */ -@Data -public class NotifyPlatformProperties { - - /** - * Platform - */ - private String platform; - - /** - * Secret key. {@link NotifyPlatformProperties#token} - */ - @Deprecated - private String secretKey; - - /** - * Token - */ - private String token; - - /** - * Secret - */ - private String secret; -} diff --git a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/WebExecutorProperties.java b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/WebExecutorProperties.java deleted file mode 100644 index ba4d7591..00000000 --- a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/WebExecutorProperties.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.mode.config.properties; - -import cn.hippo4j.common.model.executor.ExecutorNotifyProperties; -import cn.hippo4j.common.api.IExecutorProperties; -import lombok.Data; - -/** - * Web thread pool executor properties. - */ -@Data -public class WebExecutorProperties implements IExecutorProperties { - - /** - * Thread pool id - */ - private String threadPoolId; - - /** - * Core pool size - */ - private Integer corePoolSize; - - /** - * Maximum pool size - */ - private Integer maximumPoolSize; - - /** - * Keep alive time - */ - private Long keepAliveTime; - - /** - * Nodes, application startup is not affect, change properties is effect - */ - private String nodes; - - /** - * these propertied is enabled? - */ - private Boolean enable = true; - - /** - * Notify config - */ - private ExecutorNotifyProperties notify; -} diff --git a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/refresher/AbstractConfigThreadPoolDynamicRefresh.java b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/refresher/AbstractConfigThreadPoolDynamicRefresh.java deleted file mode 100644 index f27fc0a5..00000000 --- a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/refresher/AbstractConfigThreadPoolDynamicRefresh.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.mode.config.refresher; - -import cn.hippo4j.common.extension.design.AbstractSubjectCenter; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.threadpool.dynamic.api.BootstrapPropertiesInterface; -import cn.hippo4j.threadpool.dynamic.api.ThreadPoolDynamicRefresh; -import cn.hippo4j.threadpool.dynamic.mode.config.parser.ConfigParserHandler; -import lombok.extern.slf4j.Slf4j; - -import java.util.Map; -import java.util.Optional; - -/** - * Abstract config thread-pool dynamic refresh. - */ -@Slf4j -public abstract class AbstractConfigThreadPoolDynamicRefresh implements ThreadPoolDynamicRefresh { - - @Override - public void dynamicRefresh(String configFileType, String configContent) { - dynamicRefresh(configFileType, configContent, null); - } - - @Override - public void dynamicRefresh(String configFileType, String configContent, Map newValueChangeMap) { - try { - Map configInfo = ConfigParserHandler.getInstance().parseConfig(configContent, configFileType); - if (CollectionUtil.isNotEmpty(newValueChangeMap)) { - Optional.ofNullable(configInfo).ifPresent(each -> each.putAll(newValueChangeMap)); - } - BootstrapPropertiesInterface bootstrapProperties = buildBootstrapProperties(configInfo); - AbstractSubjectCenter.notify(AbstractSubjectCenter.SubjectType.THREAD_POOL_DYNAMIC_REFRESH, () -> bootstrapProperties); - } catch (Exception ex) { - log.error("Hippo4j config mode dynamic refresh failed.", ex); - } - } -} diff --git a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/refresher/BootstrapConfigPropertiesBinderAdapter.java b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/refresher/BootstrapConfigPropertiesBinderAdapter.java deleted file mode 100644 index bca7f1b9..00000000 --- a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/refresher/BootstrapConfigPropertiesBinderAdapter.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.dynamic.mode.config.refresher; - -import cn.hippo4j.threadpool.dynamic.api.BootstrapPropertiesInterface; - -import java.util.Map; - -/** - * Bootstrap config properties binder adapt. - */ -public interface BootstrapConfigPropertiesBinderAdapter { - - /** - * Bootstrap core properties binder. - * - * @param configInfo dynamic thread pool configuration - * @param bootstrapConfigProperties bootstrap config properties - * @return - */ - BootstrapPropertiesInterface bootstrapCorePropertiesBinder(Map configInfo, BootstrapPropertiesInterface bootstrapConfigProperties); -} diff --git a/kernel/dynamic/mode/pom.xml b/kernel/dynamic/mode/pom.xml deleted file mode 100644 index 021fb2d2..00000000 --- a/kernel/dynamic/mode/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-kernel-dynamic - ${revision} - - - hippo4j-threadpool-dynamic-mode - pom - - - config - server - - \ No newline at end of file diff --git a/kernel/dynamic/mode/server/pom.xml b/kernel/dynamic/mode/server/pom.xml deleted file mode 100644 index af4bcb6c..00000000 --- a/kernel/dynamic/mode/server/pom.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-dynamic-mode - ${revision} - - - hippo4j-threadpool-dynamic-mode-server - \ No newline at end of file diff --git a/kernel/dynamic/pom.xml b/kernel/dynamic/pom.xml deleted file mode 100644 index d3b2bea7..00000000 --- a/kernel/dynamic/pom.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-kernel - ${revision} - - - hippo4j-threadpool-kernel-dynamic - pom - - - api - core - mode - - \ No newline at end of file diff --git a/kernel/message/api/pom.xml b/kernel/message/api/pom.xml deleted file mode 100644 index 850a0036..00000000 --- a/kernel/message/api/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-kernel-message - ${revision} - - - hippo4j-threadpool-message-api - - - - org.projectlombok - lombok - - - diff --git a/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/AlarmControlDTO.java b/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/AlarmControlDTO.java deleted file mode 100644 index 6e4338d4..00000000 --- a/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/AlarmControlDTO.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.api; - -import cn.hippo4j.threadpool.message.api.NotifyTypeEnum; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; - -/** - * Alarm control DTO. - */ -@AllArgsConstructor -@Data -@Builder -public class AlarmControlDTO { - - /** - * Thread pool id - */ - private String threadPool; - - /** - * Push alarm platform - */ - private String platform; - - /** - * Push Alert Type - */ - private NotifyTypeEnum typeEnum; - - /** - * Build thread pool alarm id - * - * @return - */ - public String buildPk() { - return threadPool + "+" + platform; - } -} diff --git a/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/NotifyConfigBuilder.java b/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/NotifyConfigBuilder.java deleted file mode 100644 index 37943802..00000000 --- a/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/NotifyConfigBuilder.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.api; - -import java.util.List; -import java.util.Map; - -/** - * Notify config builder. - */ -public interface NotifyConfigBuilder { - - /** - * Build notify. - * - * @return notify info - */ - Map> buildNotify(); -} diff --git a/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/NotifyConfigDTO.java b/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/NotifyConfigDTO.java deleted file mode 100644 index b230769a..00000000 --- a/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/NotifyConfigDTO.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.api; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * Notify config DTO. - */ -@Data -@EqualsAndHashCode -@Accessors(chain = true) -public class NotifyConfigDTO { - - /** - * Tenant id - */ - private String tenantId; - - /** - * Item id - */ - private String itemId; - - /** - * Thread-pool id - */ - private String tpId; - - /** - * Platform - */ - private String platform; - - /** - * Type - */ - private String type; - - /** - * Secret key - */ - private String secretKey; - - /** - * Secret - */ - private String secret; - - /** - * Interval - */ - private Integer interval; - - /** - * Receives - */ - private String receives; - - /** - * Type enum - */ - private NotifyTypeEnum typeEnum; -} diff --git a/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/NotifyPlatformEnum.java b/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/NotifyPlatformEnum.java deleted file mode 100644 index 7ad1a6b5..00000000 --- a/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/NotifyPlatformEnum.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.api; - -/** - * Notify platform enum. - */ -public enum NotifyPlatformEnum { - - /** - * DING - */ - DING, - - /** - * LARK - */ - LARK, - - /** - * WECHAT - */ - WECHAT -} diff --git a/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/NotifyTypeEnum.java b/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/NotifyTypeEnum.java deleted file mode 100644 index 84b120b6..00000000 --- a/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/NotifyTypeEnum.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.api; - -/** - * Notify type enum. - */ -public enum NotifyTypeEnum { - - /** - * CHANGE - */ - CHANGE, - - /** - * CAPACITY - */ - CAPACITY, - - /** - * ACTIVITY - */ - ACTIVITY, - - /** - * REJECT - */ - REJECT, - - /** - * TIMEOUT - */ - TIMEOUT -} diff --git a/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/ThreadPoolNotifyDTO.java b/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/ThreadPoolNotifyDTO.java deleted file mode 100644 index 456e3564..00000000 --- a/kernel/message/api/src/main/java/cn/hippo4j/threadpool/message/api/ThreadPoolNotifyDTO.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.api; - -import cn.hippo4j.threadpool.message.api.NotifyConfigDTO; -import lombok.Data; - -import java.util.List; - -/** - * Thread pool notify DTO. - */ -@Data -public class ThreadPoolNotifyDTO { - - /** - * Notify key - */ - private String notifyKey; - - /** - * Notify list - */ - private List notifyList; -} diff --git a/kernel/message/core/pom.xml b/kernel/message/core/pom.xml deleted file mode 100644 index a93d702e..00000000 --- a/kernel/message/core/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-kernel-message - ${revision} - - - hippo4j-threadpool-message-core - - - - cn.hippo4j - hippo4j-threadpool-message-api - ${project.version} - - - commons-codec - commons-codec - - - cn.hippo4j - hippo4j-threadpool-infra-common - ${project.version} - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework - spring-core - - - - - - - src/main/resources - - **/*.txt - **/*.json - - - - - diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/constant/DingAlarmConstants.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/constant/DingAlarmConstants.java deleted file mode 100644 index 6a5ce14f..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/constant/DingAlarmConstants.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.constant; - -/** - * Ding alarm constants. - */ -public class DingAlarmConstants { - - /** - * DingTalk Robot Url - */ - public static final String DING_ROBOT_SERVER_URL = "https://oapi.dingtalk.com/robot/send?access_token="; - - /** - * Thread Pool Alert Notification Title - */ - public static final String DING_ALARM_TITLE = "动态线程池告警"; - - /** - * Thread pool parameter change notification title - */ - public static final String DING_NOTICE_TITLE = "动态线程池通知"; - - /** - * Trace info - */ - public static final String DING_ALARM_TIMEOUT_TRACE_REPLACE_TXT = "链路信息:%s \n\n "; - - /** - * Replace task timeout template - */ - public static final String DING_ALARM_TIMEOUT_REPLACE_TXT = - "任务执行时间:%d / ms \n\n " - + "超时时间:%d / ms \n\n " - + DING_ALARM_TIMEOUT_TRACE_REPLACE_TXT - + " --- \n\n "; -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/constant/LarkAlarmConstants.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/constant/LarkAlarmConstants.java deleted file mode 100644 index 5396e0a1..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/constant/LarkAlarmConstants.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.constant; - -/** - * Lark alarm constants. - */ -public class LarkAlarmConstants { - - /** - * Lark bot url - */ - public static final String LARK_BOT_URL = "https://open.feishu.cn/open-apis/bot/v2/hook/"; - - /** - * Lark at format. openid - * When openid is configured, the bot can @person - */ - public static final String LARK_AT_FORMAT_OPENID = ""; - - /** - * Lark at format. username - * When configuring username, only @username can be displayed in blue font, and it is reminded by @people without @ - */ - public static final String LARK_AT_FORMAT_USERNAME = "%s"; - - /** - * Lark openid prefix - */ - public static final String LARK_OPENID_PREFIX = "ou_"; -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/constant/WeChatAlarmConstants.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/constant/WeChatAlarmConstants.java deleted file mode 100644 index a6f6c53c..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/constant/WeChatAlarmConstants.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.constant; - -/** - * We chat alarm constants. - */ -public class WeChatAlarmConstants { - - /** - * Enterprise Micro Robot Url - */ - public static final String WE_CHAT_SERVER_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key="; - - /** - * Trace info - */ - public static final String WE_CHAT_ALARM_TIMOUT_TRACE_REPLACE_TXT = "\n> 链路信息:%s "; - - /** - * Replace task timeout template - */ - public static final String WE_CHAT_ALARM_TIMOUT_REPLACE_TXT = - "\n> 任务执行时间:%s / ms \n" - + "> 超时时间:%s / ms " - + WE_CHAT_ALARM_TIMOUT_TRACE_REPLACE_TXT; -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/DingSendMessageHandler.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/DingSendMessageHandler.java deleted file mode 100644 index 86c8072e..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/DingSendMessageHandler.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.platform; - -import cn.hippo4j.common.toolkit.Assert; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.common.toolkit.Singleton; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.common.toolkit.http.HttpUtil; -import cn.hippo4j.threadpool.message.core.platform.base.AbstractRobotSendMessageHandler; -import cn.hippo4j.threadpool.message.core.platform.base.RobotMessageActualContent; -import cn.hippo4j.threadpool.message.core.platform.base.RobotMessageExecuteDTO; -import cn.hippo4j.threadpool.message.core.constant.DingAlarmConstants; -import cn.hippo4j.threadpool.message.api.NotifyConfigDTO; -import cn.hippo4j.threadpool.message.api.NotifyPlatformEnum; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.codec.binary.Base64; - -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Objects; - -/** - * Send ding notification message. - */ -@Slf4j -public class DingSendMessageHandler extends AbstractRobotSendMessageHandler { - - @Override - public String getType() { - return NotifyPlatformEnum.DING.name(); - } - - @Override - protected RobotMessageActualContent buildMessageActualContent() { - String dingAlarmTxtKey = "message/robot/dynamic-thread-pool/ding-alarm.txt"; - String dingConfigTxtKey = "message/robot/dynamic-thread-pool/ding-config.txt"; - RobotMessageActualContent robotMessageActualContent = RobotMessageActualContent.builder() - .receiveSeparator(", @") - .changeSeparator(" -> ") - .replaceTxt(DingAlarmConstants.DING_ALARM_TIMEOUT_REPLACE_TXT) - .traceReplaceTxt(DingAlarmConstants.DING_ALARM_TIMEOUT_TRACE_REPLACE_TXT) - .alarmMessageContent(Singleton.get(dingAlarmTxtKey, () -> readUtf8String(dingAlarmTxtKey))) - .configMessageContent(Singleton.get(dingConfigTxtKey, () -> readUtf8String(dingConfigTxtKey))) - .build(); - return robotMessageActualContent; - } - - @Override - protected void execute(RobotMessageExecuteDTO robotMessageExecuteDTO) { - NotifyConfigDTO notifyConfig = robotMessageExecuteDTO.getNotifyConfig(); - String serverUrl = DingAlarmConstants.DING_ROBOT_SERVER_URL + notifyConfig.getSecretKey(); - String secret = notifyConfig.getSecret(); - if (StringUtil.isNotBlank(secret)) { - long timestamp = System.currentTimeMillis(); - String stringToSign = timestamp + "\n" + secret; - try { - Mac mac = Mac.getInstance("HmacSHA256"); - mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); - byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8)); - String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), StandardCharsets.UTF_8.name()); - serverUrl = serverUrl + "×tamp=" + timestamp + "&sign=" + sign; - } catch (Exception ex) { - log.error("Failed to sign the message sent by nailing.", ex); - } - } - String title = Objects.equals(notifyConfig.getType(), "CONFIG") ? DingAlarmConstants.DING_NOTICE_TITLE : DingAlarmConstants.DING_ALARM_TITLE; - String text = robotMessageExecuteDTO.getText(); - ArrayList atMobiles = CollectionUtil.newArrayList(notifyConfig.getReceives().split(",")); - HashMap markdown = new HashMap<>(); - markdown.put("title", title); - markdown.put("text", text); - HashMap at = new HashMap<>(); - at.put("atMobiles", atMobiles); - HashMap markdownJson = new HashMap<>(); - markdownJson.put("msgtype", "markdown"); - markdownJson.put("markdown", markdown); - markdownJson.put("at", at); - try { - String responseBody = HttpUtil.post(serverUrl, markdownJson); - DingRobotResponse response = JSONUtil.parseObject(responseBody, DingRobotResponse.class); - Assert.isTrue(response != null, "Response is null."); - if (response.getErrcode() != 0) { - log.error("Ding failed to send message, reason : {}", response.errmsg); - } - } catch (Exception ex) { - log.error("Ding failed to send message.", ex); - } - } - - /** - * Ding robot response. - */ - @Data - static class DingRobotResponse { - - /** - * Error code - */ - private Long errcode; - - /** - * Error message - */ - private String errmsg; - } -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/LarkSendMessageHandler.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/LarkSendMessageHandler.java deleted file mode 100644 index ff1e8a0b..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/LarkSendMessageHandler.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.platform; - -import cn.hippo4j.common.toolkit.Assert; -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.common.toolkit.Singleton; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.common.toolkit.http.HttpUtil; -import cn.hippo4j.threadpool.message.core.request.AlarmNotifyRequest; -import cn.hippo4j.threadpool.message.core.request.ChangeParameterNotifyRequest; -import cn.hippo4j.threadpool.message.core.service.SendMessageHandler; -import cn.hippo4j.threadpool.message.api.NotifyConfigDTO; -import cn.hippo4j.threadpool.message.api.NotifyPlatformEnum; -import cn.hippo4j.threadpool.message.api.NotifyTypeEnum; -import cn.hippo4j.threadpool.message.core.constant.LarkAlarmConstants; -import lombok.Data; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.codec.binary.Base64; - -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; -import java.nio.charset.StandardCharsets; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * Send lark notification message. - */ -@Slf4j -@RequiredArgsConstructor -public class LarkSendMessageHandler implements SendMessageHandler { - - @Override - public String getType() { - return NotifyPlatformEnum.LARK.name(); - } - - @Override - @SneakyThrows - public void sendAlarmMessage(NotifyConfigDTO notifyConfig, AlarmNotifyRequest alarmNotifyRequest) { - String afterReceives = getReceives(notifyConfig.getReceives()); - String larkAlarmTimeoutReplaceTxt; - String larkAlarmTxtKey = "message/robot/dynamic-thread-pool/lark-alarm.json"; - String larkAlarmTxt = Singleton.get(larkAlarmTxtKey, () -> readUtf8String(larkAlarmTxtKey)); - String larkAlarmTimeoutReplaceJsonKey = "message/robot/dynamic-thread-pool/lark-alarm-timeout-replace.json"; - String larkAlarmTimeoutReplaceJson = Singleton.get(larkAlarmTimeoutReplaceJsonKey, () -> readUtf8String(larkAlarmTimeoutReplaceJsonKey)); - if (Objects.equals(alarmNotifyRequest.getNotifyTypeEnum(), NotifyTypeEnum.TIMEOUT)) { - String executeTimeoutTrace = alarmNotifyRequest.getExecuteTimeoutTrace(); - String larkAlarmTimoutTraceReplaceJsonKey = "message/robot/dynamic-thread-pool/lark-alarm-trace-replace.json"; - String larkAlarmTimoutTraceReplaceJson = Singleton.get(larkAlarmTimoutTraceReplaceJsonKey, () -> readUtf8String(larkAlarmTimoutTraceReplaceJsonKey)); - if (StringUtil.isNotBlank(executeTimeoutTrace)) { - String larkAlarmTimoutTraceReplaceTxt = String.format(larkAlarmTimoutTraceReplaceJson, executeTimeoutTrace); - larkAlarmTimeoutReplaceTxt = StringUtil.replace(larkAlarmTimeoutReplaceJson, larkAlarmTimoutTraceReplaceJson, larkAlarmTimoutTraceReplaceTxt); - } else { - larkAlarmTimeoutReplaceTxt = StringUtil.replace(larkAlarmTimeoutReplaceJson, larkAlarmTimoutTraceReplaceJson, ""); - } - larkAlarmTimeoutReplaceTxt = String.format(larkAlarmTimeoutReplaceTxt, alarmNotifyRequest.getExecuteTime(), alarmNotifyRequest.getExecuteTimeOut()); - larkAlarmTxt = StringUtil.replace(larkAlarmTxt, larkAlarmTimeoutReplaceJson, larkAlarmTimeoutReplaceTxt); - } else { - larkAlarmTxt = StringUtil.replace(larkAlarmTxt, larkAlarmTimeoutReplaceJson, ""); - } - - String timestamp = String.valueOf(System.currentTimeMillis()).substring(0, 10); - String sign = ""; - if (notifyConfig.getSecret() != null) { - sign = genSign(notifyConfig.getSecret(), timestamp); - } - - String text = String.format(larkAlarmTxt, - timestamp, - sign, - alarmNotifyRequest.getActive(), - alarmNotifyRequest.getNotifyTypeEnum(), - alarmNotifyRequest.getThreadPoolId(), - alarmNotifyRequest.getAppName(), - alarmNotifyRequest.getIdentify(), - alarmNotifyRequest.getCorePoolSize(), - alarmNotifyRequest.getMaximumPoolSize(), - alarmNotifyRequest.getPoolSize(), - alarmNotifyRequest.getActiveCount(), - alarmNotifyRequest.getLargestPoolSize(), - alarmNotifyRequest.getCompletedTaskCount(), - alarmNotifyRequest.getQueueName(), - alarmNotifyRequest.getCapacity(), - alarmNotifyRequest.getQueueSize(), - alarmNotifyRequest.getRemainingCapacity(), - alarmNotifyRequest.getRejectedExecutionHandlerName(), - alarmNotifyRequest.getRejectCountNum(), - afterReceives, - LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), - notifyConfig.getInterval()); - execute(notifyConfig.getSecretKey(), text); - } - - @Override - @SneakyThrows - public void sendChangeMessage(NotifyConfigDTO notifyConfig, ChangeParameterNotifyRequest changeParameterNotifyRequest) { - String threadPoolId = changeParameterNotifyRequest.getThreadPoolId(); - String afterReceives = getReceives(notifyConfig.getReceives()); - String larkNoticeJsonKey = "message/robot/dynamic-thread-pool/lark-config.json"; - String larkNoticeJson = Singleton.get(larkNoticeJsonKey, () -> readUtf8String(larkNoticeJsonKey)); - String text = String.format(larkNoticeJson, - changeParameterNotifyRequest.getActive(), - threadPoolId, - changeParameterNotifyRequest.getAppName(), - changeParameterNotifyRequest.getIdentify(), - changeParameterNotifyRequest.getBeforeCorePoolSize() + " ➲ " + changeParameterNotifyRequest.getNowCorePoolSize(), - changeParameterNotifyRequest.getBeforeMaximumPoolSize() + " ➲ " + changeParameterNotifyRequest.getNowMaximumPoolSize(), - changeParameterNotifyRequest.getBeforeAllowsCoreThreadTimeOut() + " ➲ " + changeParameterNotifyRequest.getNowAllowsCoreThreadTimeOut(), - changeParameterNotifyRequest.getBeforeKeepAliveTime() + " ➲ " + changeParameterNotifyRequest.getNowKeepAliveTime(), - changeParameterNotifyRequest.getBlockingQueueName(), - changeParameterNotifyRequest.getBeforeQueueCapacity() + " ➲ " + changeParameterNotifyRequest.getNowQueueCapacity(), - changeParameterNotifyRequest.getBeforeExecuteTimeOut() + " ➲ " + changeParameterNotifyRequest.getNowExecuteTimeOut(), - changeParameterNotifyRequest.getBeforeRejectedName(), - changeParameterNotifyRequest.getNowRejectedName(), - afterReceives, - LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - execute(notifyConfig.getSecretKey(), text); - } - - private String getReceives(String receives) { - if (StringUtil.isBlank(receives)) { - return ""; - } - return Arrays.stream(receives.split(",")) - .map(receive -> StringUtil.startWith(receive, LarkAlarmConstants.LARK_OPENID_PREFIX) ? String.format(LarkAlarmConstants.LARK_AT_FORMAT_OPENID, receive) - : String.format(LarkAlarmConstants.LARK_AT_FORMAT_USERNAME, receive)) - .collect(Collectors.joining(" ")); - } - - private void execute(String secretKey, String text) { - String serverUrl = LarkAlarmConstants.LARK_BOT_URL + secretKey; - try { - Map headers = new HashMap<>(); - headers.put("Content-Type", "application/json; charset=UTF-8"); - String responseBody = HttpUtil.postJson(serverUrl, text, headers); - LarkRobotResponse response = JSONUtil.parseObject(responseBody, LarkRobotResponse.class); - Assert.isTrue(response != null, "Response is null."); - if (response.getCode() != 0) { - log.error("Lark failed to send message, reason : {}", response.msg); - } - } catch (Exception ex) { - log.error("Lark failed to send message", ex); - } - } - - /** - * generate Signature - */ - private String genSign(String secret, String timestamp) throws NoSuchAlgorithmException, InvalidKeyException { - String stringToSign = timestamp + "\n" + secret; - Mac mac = Mac.getInstance("HmacSHA256"); - mac.init(new SecretKeySpec(stringToSign.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); - byte[] signData = mac.doFinal(new byte[]{}); - return new String(Base64.encodeBase64(signData)); - } - - /** - * Lark robot response. - */ - @Data - static class LarkRobotResponse { - - /** - * code - */ - private Long code; - - /** - * message - */ - private String msg; - } -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/WeChatSendMessageHandler.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/WeChatSendMessageHandler.java deleted file mode 100644 index 440c56db..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/WeChatSendMessageHandler.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.platform; - -import cn.hippo4j.common.toolkit.Assert; -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.common.toolkit.Singleton; -import cn.hippo4j.common.toolkit.http.HttpUtil; -import cn.hippo4j.threadpool.message.core.platform.base.AbstractRobotSendMessageHandler; -import cn.hippo4j.threadpool.message.core.platform.base.RobotMessageActualContent; -import cn.hippo4j.threadpool.message.core.platform.base.RobotMessageExecuteDTO; -import cn.hippo4j.threadpool.message.api.NotifyPlatformEnum; -import cn.hippo4j.threadpool.message.core.constant.WeChatAlarmConstants; -import lombok.Data; -import lombok.experimental.Accessors; -import lombok.extern.slf4j.Slf4j; - -/** - * WeChat send message handler. - */ -@Slf4j -public class WeChatSendMessageHandler extends AbstractRobotSendMessageHandler { - - @Override - public String getType() { - return NotifyPlatformEnum.WECHAT.name(); - } - - @Override - protected RobotMessageActualContent buildMessageActualContent() { - String weChatAlarmTxtKey = "message/robot/dynamic-thread-pool/wechat-alarm.txt"; - String weChatConfigTxtKey = "message/robot/dynamic-thread-pool/wechat-config.txt"; - return RobotMessageActualContent.builder() - .receiveSeparator("><@") - .changeSeparator(" ➲ ") - .replaceTxt(WeChatAlarmConstants.WE_CHAT_ALARM_TIMOUT_REPLACE_TXT) - .traceReplaceTxt(WeChatAlarmConstants.WE_CHAT_ALARM_TIMOUT_TRACE_REPLACE_TXT) - .alarmMessageContent(Singleton.get(weChatAlarmTxtKey, () -> readUtf8String(weChatAlarmTxtKey))) - .configMessageContent(Singleton.get(weChatConfigTxtKey, () -> readUtf8String(weChatConfigTxtKey))) - .build(); - } - - @Override - protected void execute(RobotMessageExecuteDTO robotMessageExecuteDTO) { - String serverUrl = WeChatAlarmConstants.WE_CHAT_SERVER_URL + robotMessageExecuteDTO.getNotifyConfig().getSecretKey(); - try { - WeChatReqDTO weChatReq = new WeChatReqDTO(); - weChatReq.setMsgtype("markdown"); - Markdown markdown = new Markdown(); - markdown.setContent(robotMessageExecuteDTO.getText()); - weChatReq.setMarkdown(markdown); - String responseBody = HttpUtil.post(serverUrl, weChatReq); - WeChatRobotResponse response = JSONUtil.parseObject(responseBody, WeChatRobotResponse.class); - Assert.notNull(response, "Response is null."); - if (response.getErrcode() != 0) { - log.error("WeChat failed to send message, reason : {}", response.errmsg); - } - } catch (Exception ex) { - log.error("WeChat failed to send message", ex); - } - } - - /** - * WeChat - */ - @Data - @Accessors(chain = true) - public static class WeChatReqDTO { - - private String msgtype; - - private Markdown markdown; - } - - /** - * Markdown - */ - @Data - public static class Markdown { - - private String content; - } - - /** - * WeChat robot response. - */ - @Data - static class WeChatRobotResponse { - - /** - * Error code - */ - private Long errcode; - - /** - * Error message - */ - private String errmsg; - } -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/base/AbstractRobotSendMessageHandler.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/base/AbstractRobotSendMessageHandler.java deleted file mode 100644 index 36add5c0..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/base/AbstractRobotSendMessageHandler.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.platform.base; - -import cn.hippo4j.common.toolkit.Joiner; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.threadpool.message.api.NotifyConfigDTO; -import cn.hippo4j.threadpool.message.api.NotifyTypeEnum; -import cn.hippo4j.threadpool.message.core.request.AlarmNotifyRequest; -import cn.hippo4j.threadpool.message.core.request.ChangeParameterNotifyRequest; -import cn.hippo4j.threadpool.message.core.service.SendMessageHandler; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Objects; - -/** - * Abstract robot send message handler. - */ -public abstract class AbstractRobotSendMessageHandler implements SendMessageHandler { - - /** - * Build message actual content. - * - * @return robot message actual content - */ - protected abstract RobotMessageActualContent buildMessageActualContent(); - - /** - * Execute. - * - * @param robotMessageExecuteDTO robot message execute dto - */ - protected abstract void execute(RobotMessageExecuteDTO robotMessageExecuteDTO); - - /** - * Send alarm message. - * - * @param notifyConfig notify config - * @param alarmNotifyRequest alarm notify request - */ - public void sendAlarmMessage(NotifyConfigDTO notifyConfig, AlarmNotifyRequest alarmNotifyRequest) { - RobotMessageActualContent robotMessageActualContent = buildMessageActualContent(); - String replaceTxt = robotMessageActualContent.getReplaceTxt(); - String traceReplaceTxt = robotMessageActualContent.getTraceReplaceTxt(); - String alarmContentTxt = robotMessageActualContent.getAlarmMessageContent(); - String alarmTimoutReplaceTxt; - if (Objects.equals(alarmNotifyRequest.getNotifyTypeEnum(), NotifyTypeEnum.TIMEOUT)) { - String executeTimeoutTrace = alarmNotifyRequest.getExecuteTimeoutTrace(); - if (StringUtil.isNotBlank(executeTimeoutTrace)) { - String alarmTimoutTraceReplaceTxt = String.format(traceReplaceTxt, executeTimeoutTrace); - alarmTimoutReplaceTxt = StringUtil.replace(replaceTxt, traceReplaceTxt, alarmTimoutTraceReplaceTxt); - } else { - alarmTimoutReplaceTxt = StringUtil.replace(replaceTxt, traceReplaceTxt, ""); - } - replaceTxt = String.format(alarmTimoutReplaceTxt, alarmNotifyRequest.getExecuteTime(), alarmNotifyRequest.getExecuteTimeOut()); - } else { - replaceTxt = ""; - } - alarmContentTxt = StringUtil.replace(alarmContentTxt, "${timeout-content}", replaceTxt); - String text = String.format( - alarmContentTxt, - alarmNotifyRequest.getActive(), - alarmNotifyRequest.getNotifyTypeEnum(), - alarmNotifyRequest.getThreadPoolId(), - alarmNotifyRequest.getAppName(), - alarmNotifyRequest.getIdentify(), - alarmNotifyRequest.getCorePoolSize(), - alarmNotifyRequest.getMaximumPoolSize(), - alarmNotifyRequest.getPoolSize(), - alarmNotifyRequest.getActiveCount(), - alarmNotifyRequest.getLargestPoolSize(), - alarmNotifyRequest.getCompletedTaskCount(), - alarmNotifyRequest.getQueueName(), - alarmNotifyRequest.getCapacity(), - alarmNotifyRequest.getQueueSize(), - alarmNotifyRequest.getRemainingCapacity(), - alarmNotifyRequest.getRejectedExecutionHandlerName(), - alarmNotifyRequest.getRejectCountNum(), - Joiner.on(robotMessageActualContent.getReceiveSeparator()).join(notifyConfig.getReceives().split(",")), - notifyConfig.getInterval(), - LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - execute(RobotMessageExecuteDTO.builder().text(text).notifyConfig(notifyConfig).build()); - } - - /** - * Send change message. - * - * @param notifyConfig notify config - * @param changeParameterNotifyRequest change parameter notify request - */ - public void sendChangeMessage(NotifyConfigDTO notifyConfig, ChangeParameterNotifyRequest changeParameterNotifyRequest) { - RobotMessageActualContent robotMessageActualContent = buildMessageActualContent(); - String threadPoolId = changeParameterNotifyRequest.getThreadPoolId(); - String changeSeparator = robotMessageActualContent.getChangeSeparator(); - String text = String.format( - robotMessageActualContent.getConfigMessageContent(), - changeParameterNotifyRequest.getActive(), - threadPoolId, - changeParameterNotifyRequest.getAppName(), - changeParameterNotifyRequest.getIdentify(), - changeParameterNotifyRequest.getBeforeCorePoolSize() + changeSeparator + changeParameterNotifyRequest.getNowCorePoolSize(), - changeParameterNotifyRequest.getBeforeMaximumPoolSize() + changeSeparator + changeParameterNotifyRequest.getNowMaximumPoolSize(), - changeParameterNotifyRequest.getBeforeAllowsCoreThreadTimeOut() + changeSeparator + changeParameterNotifyRequest.getNowAllowsCoreThreadTimeOut(), - changeParameterNotifyRequest.getBeforeKeepAliveTime() + changeSeparator + changeParameterNotifyRequest.getNowKeepAliveTime(), - changeParameterNotifyRequest.getBeforeExecuteTimeOut() + changeSeparator + changeParameterNotifyRequest.getNowExecuteTimeOut(), - changeParameterNotifyRequest.getBlockingQueueName(), - changeParameterNotifyRequest.getBeforeQueueCapacity() + changeSeparator + changeParameterNotifyRequest.getNowQueueCapacity(), - changeParameterNotifyRequest.getBeforeRejectedName(), - changeParameterNotifyRequest.getNowRejectedName(), - Joiner.on(robotMessageActualContent.getReceiveSeparator()).join(notifyConfig.getReceives().split(",")), - LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - execute(RobotMessageExecuteDTO.builder().text(text).notifyConfig(notifyConfig).build()); - } -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/base/RobotMessageActualContent.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/base/RobotMessageActualContent.java deleted file mode 100644 index 5ecd1bce..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/base/RobotMessageActualContent.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.platform.base; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * Robot message actual content. - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class RobotMessageActualContent { - - /** - * Alarm message content - */ - private String alarmMessageContent; - - /** - * Config message content - */ - private String configMessageContent; - - /** - * Replace txt - */ - private String replaceTxt; - - /** - * Trace replace txt - */ - private String traceReplaceTxt; - - /** - * Receive separator - */ - private String receiveSeparator; - - /** - * Change separator - */ - private String changeSeparator; -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/base/RobotMessageExecuteDTO.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/base/RobotMessageExecuteDTO.java deleted file mode 100644 index 6bd05c57..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/base/RobotMessageExecuteDTO.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.platform.base; - -import cn.hippo4j.threadpool.message.api.NotifyConfigDTO; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * Robot message execute DTO. - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class RobotMessageExecuteDTO { - - /** - * Text - */ - private String text; - - /** - * Notify config - */ - private NotifyConfigDTO notifyConfig; -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/AlarmNotifyRequest.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/AlarmNotifyRequest.java deleted file mode 100644 index eca49cc3..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/AlarmNotifyRequest.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.request; - -import cn.hippo4j.threadpool.message.core.request.base.BaseNotifyRequest; -import cn.hippo4j.threadpool.message.api.NotifyTypeEnum; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * Alarm notify request. - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Accessors(chain = true) -public class AlarmNotifyRequest extends BaseNotifyRequest { - - /** - * Interval - */ - private Integer interval; - - /** - * Notify type enum - */ - private NotifyTypeEnum notifyTypeEnum; - - /** - * Active - */ - private String active; - - /** - * App name - */ - private String appName; - - /** - * Identify - */ - private String identify; - - /** - * Core pool size - */ - private Integer corePoolSize; - - /** - * Maximum pool size - */ - private Integer maximumPoolSize; - - /** - * Pool size - */ - private Integer poolSize; - - /** - * Active count - */ - private Integer activeCount; - - /** - * Largest pool size - */ - private Integer largestPoolSize; - - /** - * Completed task count - */ - private Long completedTaskCount; - - /** - * Queue name - */ - private String queueName; - - /** - * Capacity - */ - private Integer capacity; - - /** - * Queue size - */ - private Integer queueSize; - - /** - * Remaining capacity - */ - private Integer remainingCapacity; - - /** - * Rejected execution handler name - */ - private String rejectedExecutionHandlerName; - - /** - * Reject count num - */ - private Long rejectCountNum; - - /** - * Execute time - */ - private Long executeTime; - - /** - * Execute timeout - */ - private Long executeTimeOut; - - /** - * Execute timeout trace - */ - private String executeTimeoutTrace; -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/ChangeParameterNotifyRequest.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/ChangeParameterNotifyRequest.java deleted file mode 100644 index 3f96fe10..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/ChangeParameterNotifyRequest.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.request; - -import cn.hippo4j.threadpool.message.core.request.base.BaseNotifyRequest; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * Change parameter notify request. - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ChangeParameterNotifyRequest extends BaseNotifyRequest { - - private String active; - - private String appName; - - private String identify; - - private Integer beforeCorePoolSize; - - private Integer nowCorePoolSize; - - private Integer beforeMaximumPoolSize; - - private Integer nowMaximumPoolSize; - - private Boolean beforeAllowsCoreThreadTimeOut; - - private Boolean nowAllowsCoreThreadTimeOut; - - private Long beforeKeepAliveTime; - - private Long nowKeepAliveTime; - - private Long beforeExecuteTimeOut; - - private Long nowExecuteTimeOut; - - private String blockingQueueName; - - private Integer beforeQueueCapacity; - - private Integer nowQueueCapacity; - - private String beforeRejectedName; - - private String nowRejectedName; -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/RobotAlarmNotifyRequest.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/RobotAlarmNotifyRequest.java deleted file mode 100644 index d63dd7b1..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/RobotAlarmNotifyRequest.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.request; - -import lombok.Data; - -/** - * Robot alarm notify request. - */ -@Data -public class RobotAlarmNotifyRequest extends AlarmNotifyRequest { - - /** - * Secret key - */ - private String secretKey; -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/RobotChangeParameterNotifyRequest.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/RobotChangeParameterNotifyRequest.java deleted file mode 100644 index 6bf72c00..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/RobotChangeParameterNotifyRequest.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.request; - -import lombok.Data; - -/** - * Robot change parameter notify request. - */ -@Data -public class RobotChangeParameterNotifyRequest extends ChangeParameterNotifyRequest { - - /** - * Secret key - */ - private String secretKey; -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/ThreadPoolNotifyRequest.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/ThreadPoolNotifyRequest.java deleted file mode 100644 index c90ccde4..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/ThreadPoolNotifyRequest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.request; - -import lombok.AllArgsConstructor; -import lombok.Data; - -import java.util.List; - -/** - * Thread pool notify request. - */ -@Data -@AllArgsConstructor -public class ThreadPoolNotifyRequest { - - /** - * Group keys - */ - private List groupKeys; -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/WebChangeParameterNotifyRequest.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/WebChangeParameterNotifyRequest.java deleted file mode 100644 index 3a17986c..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/WebChangeParameterNotifyRequest.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.request; - -import cn.hippo4j.threadpool.message.core.request.base.BaseNotifyRequest; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * Change parameter notify request for web thread pool. - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class WebChangeParameterNotifyRequest extends BaseNotifyRequest { - - private String active; - - private String appName; - - private String identify; - - private Integer beforeCorePoolSize; - - private Integer nowCorePoolSize; - - private Integer beforeMaximumPoolSize; - - private Integer nowMaximumPoolSize; - - private Long beforeKeepAliveTime; - - private Long nowKeepAliveTime; -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/base/BaseNotifyRequest.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/base/BaseNotifyRequest.java deleted file mode 100644 index 14f83b30..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/request/base/BaseNotifyRequest.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.request.base; - -import cn.hippo4j.common.api.NotifyRequest; -import lombok.Data; - -/** - * Base notify request. - */ -@Data -public class BaseNotifyRequest implements NotifyRequest { - - /** - * Tenant id - */ - private String tenantId; - - /** - * Item id - */ - private String itemId; - - /** - * Thread pool id - */ - private String threadPoolId; - - /** - * Platform - */ - private String platform; - - /** - * Type - */ - private String type; - - /** - * Receives - */ - private String receives; -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/AlarmControlHandler.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/AlarmControlHandler.java deleted file mode 100644 index 9832be91..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/AlarmControlHandler.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.service; - -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.threadpool.message.api.AlarmControlDTO; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.ReentrantLock; - -/** - * Alarm control assembly. - */ -public class AlarmControlHandler { - - private final Map threadPoolLock = new HashMap<>(); - - private final Map> threadPoolAlarmCache = new ConcurrentHashMap<>(); - - /** - * Control message push alarm frequency. - * - * @param alarmControl alarm control - * @return is it possible to send - */ - public boolean isSendAlarm(AlarmControlDTO alarmControl) { - String threadPoolKey = alarmControl.buildPk(); - Cache cache = threadPoolAlarmCache.get(threadPoolKey); - if (cache == null) { - return false; - } - String pkId = cache.getIfPresent(alarmControl.getTypeEnum().name()); - if (StringUtil.isBlank(pkId)) { - ReentrantLock lock = threadPoolLock.get(threadPoolKey); - lock.lock(); - try { - pkId = cache.getIfPresent(alarmControl.getTypeEnum().name()); - if (StringUtil.isBlank(pkId)) { - cache.put(alarmControl.getTypeEnum().name(), "-"); - return true; - } - } finally { - lock.unlock(); - } - } - return false; - } - - /** - * Init cache and lock. - * - * @param threadPoolId thread-pool id - * @param platform platform - * @param interval interval - */ - public void initCacheAndLock(String threadPoolId, String platform, Integer interval) { - String threadPoolKey = threadPoolId + Constants.GROUP_KEY_DELIMITER + platform; - Cache cache = Caffeine.newBuilder() - .expireAfterWrite(interval, TimeUnit.MINUTES) - .build(); - threadPoolAlarmCache.put(threadPoolKey, cache); - // Set the lock to prevent false sending of alarm information. - ReentrantLock reentrantLock = new ReentrantLock(); - threadPoolLock.put(threadPoolKey, reentrantLock); - } -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/DefaultThreadPoolConfigChangeHandler.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/DefaultThreadPoolConfigChangeHandler.java deleted file mode 100644 index 6ce5dfd4..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/DefaultThreadPoolConfigChangeHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.service; - -import cn.hippo4j.common.api.ThreadPoolConfigChange; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.threadpool.message.core.request.ChangeParameterNotifyRequest; -import lombok.RequiredArgsConstructor; - -import static cn.hippo4j.common.propertie.EnvironmentProperties.active; -import static cn.hippo4j.common.propertie.EnvironmentProperties.applicationName; -import static cn.hippo4j.common.propertie.EnvironmentProperties.itemId; -import static cn.hippo4j.common.propertie.IdentifyProperties.IDENTIFY; - -/** - * Default thread-pool config change handler. - */ -@RequiredArgsConstructor -public class DefaultThreadPoolConfigChangeHandler implements ThreadPoolConfigChange { - - private final ThreadPoolSendMessageService hippo4jSendMessageService; - - /** - * Send pool config change. - * - * @param requestParam change parameter notify request - */ - @Override - public void sendPoolConfigChange(ChangeParameterNotifyRequest requestParam) { - requestParam.setActive(active.toUpperCase()); - String appName = StringUtil.isBlank(itemId) ? applicationName : itemId; - requestParam.setAppName(appName); - requestParam.setIdentify(IDENTIFY); - hippo4jSendMessageService.sendChangeMessage(requestParam); - } -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/GlobalNotifyAlarmManage.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/GlobalNotifyAlarmManage.java deleted file mode 100644 index ec7de73a..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/GlobalNotifyAlarmManage.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.service; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Global notify alarm manage. - */ -public class GlobalNotifyAlarmManage { - - /** - * Notify alarm map. - */ - private static final Map NOTIFY_ALARM_MAP = new ConcurrentHashMap(); - - /** - * Get thread-pool notify alarm. - * - * @param key thread-pool key - * @return thread-pool notify alarm - */ - public static ThreadPoolNotifyAlarm get(String key) { - return NOTIFY_ALARM_MAP.get(key); - } - - /** - * Put thread-pool notify alarm. - * - * @param key thread-pool key - * @param val thread-pool notify alarm - */ - public static void put(String key, ThreadPoolNotifyAlarm val) { - NOTIFY_ALARM_MAP.put(key, val); - } -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/SendMessageHandler.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/SendMessageHandler.java deleted file mode 100644 index d5619b9d..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/SendMessageHandler.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.service; - -import cn.hippo4j.threadpool.message.api.NotifyConfigDTO; -import cn.hippo4j.threadpool.message.core.request.AlarmNotifyRequest; -import cn.hippo4j.threadpool.message.core.request.ChangeParameterNotifyRequest; -import cn.hippo4j.threadpool.message.core.request.WebChangeParameterNotifyRequest; -import lombok.SneakyThrows; - -import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; - -/** - * Send message handler. - */ -public interface SendMessageHandler { - - /** - * Get the message send type. - * - * @return message type - */ - String getType(); - - /** - * Send alarm message. - * - * @param notifyConfig notify config - * @param alarmNotifyRequest alarm notify request - */ - void sendAlarmMessage(NotifyConfigDTO notifyConfig, AlarmNotifyRequest alarmNotifyRequest); - - /** - * Send change message. - * - * @param notifyConfig notify config - * @param changeParameterNotifyRequest change parameter notify request - */ - void sendChangeMessage(NotifyConfigDTO notifyConfig, ChangeParameterNotifyRequest changeParameterNotifyRequest); - - /** - * Send web change message. - * - * @param notifyConfig notify config - * @param changeParameterNotifyRequest parameter notify request - */ - default void sendWebChangeMessage(NotifyConfigDTO notifyConfig, WebChangeParameterNotifyRequest changeParameterNotifyRequest) throws IllegalAccessException { - throw new IllegalAccessException("Please implement this method before using it."); - } - - @SneakyThrows - default String readUtf8String(String path) { - int endFlagCode = -1; - String resultReadStr; - ClassLoader classLoader = this.getClass().getClassLoader(); - try ( - InputStream inputStream = classLoader.getResourceAsStream(path); - BufferedInputStream bis = new BufferedInputStream(inputStream); - ByteArrayOutputStream buf = new ByteArrayOutputStream()) { - int result = bis.read(); - while (result != endFlagCode) { - buf.write((byte) result); - result = bis.read(); - } - resultReadStr = buf.toString("UTF-8"); - } - return resultReadStr; - } -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/ThreadPoolBaseSendMessageService.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/ThreadPoolBaseSendMessageService.java deleted file mode 100644 index 0bf039a6..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/ThreadPoolBaseSendMessageService.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.service; - -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.threadpool.message.api.AlarmControlDTO; -import cn.hippo4j.threadpool.message.api.NotifyConfigDTO; -import cn.hippo4j.threadpool.message.api.NotifyTypeEnum; -import cn.hippo4j.threadpool.message.core.request.AlarmNotifyRequest; -import cn.hippo4j.threadpool.message.core.request.ChangeParameterNotifyRequest; -import cn.hippo4j.threadpool.message.core.request.WebChangeParameterNotifyRequest; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Hippo-4j base send message service. - */ -@Slf4j -@RequiredArgsConstructor -public class ThreadPoolBaseSendMessageService implements ThreadPoolSendMessageService { - - private final AlarmControlHandler alarmControlHandler; - - @Getter - private final Map> notifyConfigs = new HashMap<>(); - - @Getter - private final Map sendMessageHandlers = new HashMap<>(); - - @Override - public void sendAlarmMessage(NotifyTypeEnum typeEnum, AlarmNotifyRequest alarmNotifyRequest) { - String threadPoolId = alarmNotifyRequest.getThreadPoolId(); - String buildKey = generateAlarmKey(threadPoolId); - List notifyList = notifyConfigs.get(buildKey); - if (CollectionUtil.isEmpty(notifyList)) { - return; - } - notifyList.forEach(each -> { - try { - SendMessageHandler messageHandler = sendMessageHandlers.get(each.getPlatform()); - if (messageHandler == null) { - log.warn("[{}] Please configure alarm notification on the server.", threadPoolId); - return; - } - if (isSendAlarm(each.getTpId(), each.getPlatform(), typeEnum)) { - alarmNotifyRequest.setNotifyTypeEnum(typeEnum); - messageHandler.sendAlarmMessage(each, alarmNotifyRequest); - } - } catch (Exception ex) { - log.warn("Failed to send thread pool alarm notification. key: [{}]", threadPoolId, ex); - } - }); - } - - @Override - public void sendChangeMessage(ChangeParameterNotifyRequest changeParameterNotifyRequest) { - String threadPoolId = changeParameterNotifyRequest.getThreadPoolId(); - String buildKey = generateConfigKey(threadPoolId); - List notifyList = notifyConfigs.get(buildKey); - if (CollectionUtil.isEmpty(notifyList)) { - log.warn("[{}] Please configure alarm notification on the server.", threadPoolId); - return; - } - notifyList.forEach(each -> { - try { - SendMessageHandler messageHandler = sendMessageHandlers.get(each.getPlatform()); - if (messageHandler == null) { - log.warn("[{}] Please configure alarm notification on the server.", threadPoolId); - return; - } - messageHandler.sendChangeMessage(each, changeParameterNotifyRequest); - } catch (Exception ex) { - log.error("Failed to send thread pool change notification. key: [{}]", threadPoolId, ex); - } - }); - } - - @Override - public void sendChangeMessage(WebChangeParameterNotifyRequest webChangeParameterNotifyRequest) { - String threadPoolId = webChangeParameterNotifyRequest.getThreadPoolId(); - String buildKey = generateConfigKey(threadPoolId); - List notifyList = notifyConfigs.get(buildKey); - if (CollectionUtil.isEmpty(notifyList)) { - log.warn("[{}] Please configure alarm notification on the server.", threadPoolId); - return; - } - notifyList.forEach(each -> { - try { - SendMessageHandler messageHandler = sendMessageHandlers.get(each.getPlatform()); - if (messageHandler == null) { - log.warn("[{}] Please configure alarm notification on the server.", threadPoolId); - return; - } - messageHandler.sendWebChangeMessage(each, webChangeParameterNotifyRequest); - } catch (IllegalAccessException ex) { - log.warn("Failed to send thread pool change notification. key: [{}]", threadPoolId); - } catch (Exception ex) { - log.error("Failed to send thread pool change notification. key: [{}]", threadPoolId, ex); - } - }); - } - - private String generateConfigKey(String threadPoolId) { - return new StringBuilder() - .append(threadPoolId) - .append("+") - .append("CONFIG") - .toString(); - } - - private String generateAlarmKey(String threadPoolId) { - return new StringBuilder() - .append(threadPoolId) - .append("+") - .append("ALARM") - .toString(); - } - - /** - * Is send alarm. - * - * @param threadPoolId thread-pool id - * @param platform platform - * @param typeEnum type enum - * @return - */ - private boolean isSendAlarm(String threadPoolId, String platform, NotifyTypeEnum typeEnum) { - AlarmControlDTO alarmControl = AlarmControlDTO.builder() - .threadPool(threadPoolId) - .platform(platform) - .typeEnum(typeEnum) - .build(); - return alarmControlHandler.isSendAlarm(alarmControl); - } - - /** - * Put platform. - * - * @param notifyConfigs notify configs - */ - public synchronized void putPlatform(Map> notifyConfigs) { - this.notifyConfigs.putAll(notifyConfigs); - } -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/ThreadPoolNotifyAlarm.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/ThreadPoolNotifyAlarm.java deleted file mode 100644 index 5b6a3320..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/ThreadPoolNotifyAlarm.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.service; - -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; - -/** - * Thread pool notify alarm. - */ -@Data -@NoArgsConstructor -@RequiredArgsConstructor -public class ThreadPoolNotifyAlarm { - - /** - * Whether to enable thread pool running alarm - */ - @NonNull - private Boolean alarm; - - /** - * Active alarm - */ - @NonNull - private Integer activeAlarm; - - /** - * Capacity alarm - */ - @NonNull - private Integer capacityAlarm; - - /** - * Interval - */ - private Integer interval; - - /** - * Receives - */ - private String receives; -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/ThreadPoolSendMessageService.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/ThreadPoolSendMessageService.java deleted file mode 100644 index a92cea7f..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/ThreadPoolSendMessageService.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.service; - -import cn.hippo4j.threadpool.message.core.request.AlarmNotifyRequest; -import cn.hippo4j.threadpool.message.core.request.ChangeParameterNotifyRequest; -import cn.hippo4j.threadpool.message.core.request.WebChangeParameterNotifyRequest; -import cn.hippo4j.threadpool.message.api.NotifyTypeEnum; - -/** - * Hippo-4j send message service. - */ -public interface ThreadPoolSendMessageService { - - /** - * Send dynamic thread pool alert notifications. - * - * @param typeEnum type enum - * @param alarmNotifyRequest alarm notify request - */ - void sendAlarmMessage(NotifyTypeEnum typeEnum, AlarmNotifyRequest alarmNotifyRequest); - - /** - * Send dynamic thread pool parameter change notification. - * - * @param changeParameterNotifyRequest change parameter notify request - */ - void sendChangeMessage(ChangeParameterNotifyRequest changeParameterNotifyRequest); - - /** - * Send web thread pool parameter change notification. - * - * @param webChangeParameterNotifyRequest change parameter notify request - */ - void sendChangeMessage(WebChangeParameterNotifyRequest webChangeParameterNotifyRequest); -} diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/WebThreadPoolConfigChangeHandler.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/WebThreadPoolConfigChangeHandler.java deleted file mode 100644 index 3f68afa5..00000000 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/service/WebThreadPoolConfigChangeHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.message.core.service; - -import cn.hippo4j.common.api.ThreadPoolConfigChange; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.threadpool.message.core.request.WebChangeParameterNotifyRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import static cn.hippo4j.common.propertie.EnvironmentProperties.active; -import static cn.hippo4j.common.propertie.EnvironmentProperties.applicationName; -import static cn.hippo4j.common.propertie.EnvironmentProperties.itemId; -import static cn.hippo4j.common.propertie.IdentifyProperties.IDENTIFY; - -/** - * Web thread-pool config change handler. - */ -@RequiredArgsConstructor -@Slf4j -public class WebThreadPoolConfigChangeHandler implements ThreadPoolConfigChange { - - private final ThreadPoolSendMessageService hippo4jSendMessageService; - - /** - * Send pool config change message for web. - * - * @param requestParam change parameter notify request - */ - @Override - public void sendPoolConfigChange(WebChangeParameterNotifyRequest requestParam) { - try { - requestParam.setActive(active.toUpperCase()); - String appName = StringUtil.isBlank(itemId) ? applicationName : itemId; - requestParam.setAppName(appName); - requestParam.setIdentify(IDENTIFY); - hippo4jSendMessageService.sendChangeMessage(requestParam); - } catch (Throwable th) { - log.error("Send web thread pool config change message failed.", th); - } - } -} diff --git a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/ding-alarm.txt b/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/ding-alarm.txt deleted file mode 100644 index 094e4505..00000000 --- a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/ding-alarm.txt +++ /dev/null @@ -1,49 +0,0 @@ -**[告警] %s - 动态线程池运行告警(%s)** - - --- - -线程池ID:%s - -应用名称:%s - -应用实例:%s - - --- - -核心线程数:%d - -最大线程数:%d - -当前线程数:%d - -活跃线程数:%d - -同存最大线程数:%d - -线程池任务总量:%d - - --- - -队列类型:%s - -队列容量:%d - -队列元素个数:%d - -队列剩余个数:%d - - --- - - ${timeout-content} - -拒绝策略:%s - -拒绝策略执行次数:%d - -OWNER:@%s - -提示:%d 分钟内此线程池不会重复告警(可配置) - - --- - -**播报时间:%s** diff --git a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/ding-config.txt b/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/ding-config.txt deleted file mode 100644 index dd4a902f..00000000 --- a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/ding-config.txt +++ /dev/null @@ -1,41 +0,0 @@ -**[通知] %s - 动态线程池参数变更** - - --- - -线程池ID:%s - -应用名称:%s - -应用实例:%s - - --- - -核心线程数:%s - -最大线程数:%s - -核心线程超时:%s - -线程存活时间:%s - -执行超时时间:%s - - --- - -队列类型:%s - -队列容量:%s - -AGO 拒绝策略:%s - -NOW 拒绝策略:%s - - --- - -提示:动态线程池配置变更实时通知(无限制) - -OWNER:@%s - - --- - -**播报时间:%s** \ No newline at end of file diff --git a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/lark-alarm-timeout-replace.json b/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/lark-alarm-timeout-replace.json deleted file mode 100644 index fcc575fc..00000000 --- a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/lark-alarm-timeout-replace.json +++ /dev/null @@ -1,30 +0,0 @@ - - { - "fields": [ - { - "is_short": true, - "text": { - "content": "** 任务执行时间:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 超时时间:** %s", - "tag": "lark_md" - } - } - ,{ - "is_short": true, - "text": { - "content": "** 链路信息:** %s", - "tag": "lark_md" - } - } - ], - "tag": "div" - }, - { - "tag": "hr" - }, diff --git a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/lark-alarm-trace-replace.json b/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/lark-alarm-trace-replace.json deleted file mode 100644 index 55223916..00000000 --- a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/lark-alarm-trace-replace.json +++ /dev/null @@ -1,8 +0,0 @@ - - ,{ - "is_short": true, - "text": { - "content": "** 链路信息:** %s", - "tag": "lark_md" - } - } diff --git a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/lark-alarm.json b/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/lark-alarm.json deleted file mode 100644 index a64661ae..00000000 --- a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/lark-alarm.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "msg_type": "interactive", - "timestamp": "%s", - "sign": "%s", - "card": { - "config": { - "wide_screen_mode": true - }, - "header": { - "template": "red", - "title": { - "content": "[🔥告警] %s 动态线程池运行告警(%s)", - "tag": "plain_text" - } - }, - "elements": [ - { - "fields": [ - { - "is_short": true, - "text": { - "content": "** 线程池ID:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 应用名称:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 应用实例:** %s", - "tag": "lark_md" - } - } - ], - "tag": "div" - }, - { - "tag": "hr" - }, - { - "fields": [ - { - "is_short": true, - "text": { - "content": "** 核心线程数:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 最大线程数:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 当前线程数:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 活跃线程数:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 同存最大线程数:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 线程池任务总量:** %s", - "tag": "lark_md" - } - } - ], - "tag": "div" - }, - { - "tag": "hr" - }, - { - "fields": [ - { - "is_short": true, - "text": { - "content": "** 队列类型:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 队列容量:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 队列元素个数:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 队列剩余个数:** %s", - "tag": "lark_md" - } - } - ], - "tag": "div" - }, - { - "tag": "hr" - }, - { - "fields": [ - { - "is_short": true, - "text": { - "content": "** 任务执行时间:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 超时时间:** %s", - "tag": "lark_md" - } - } - ,{ - "is_short": true, - "text": { - "content": "** 链路信息:** %s", - "tag": "lark_md" - } - } - ], - "tag": "div" - }, - { - "tag": "hr" - }, - { - "fields": [ - { - "is_short": true, - "text": { - "content": "** 拒绝策略:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 拒绝策略执行次数:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** OWNER:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 播报时间: ** %s", - "tag": "lark_md" - } - } - ], - "tag": "div" - }, - { - "tag": "hr" - }, - { - "tag": "note", - "elements": [ - { - "tag": "plain_text", - "content": "提示: %s 分钟内此线程池不会重复告警(可配置)" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/lark-config.json b/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/lark-config.json deleted file mode 100644 index eb0caeaa..00000000 --- a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/lark-config.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "msg_type": "interactive", - "card": { - "config": { - "wide_screen_mode": true - }, - "header": { - "template": "greed", - "title": { - "content": "[通知] %s 动态线程池参数变更", - "tag": "plain_text" - } - }, - "elements": [ - { - "fields": [ - { - "is_short": true, - "text": { - "content": "** 线程池ID:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 应用名称:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 应用实例:** %s", - "tag": "lark_md" - } - } - ], - "tag": "div" - }, - { - "tag": "hr" - }, - { - "fields": [ - { - "is_short": true, - "text": { - "content": "** 核心线程数:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 最大线程数:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 核心线程超时:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 线程存活时间:** %s", - "tag": "lark_md" - } - } - ], - "tag": "div" - }, - { - "tag": "hr" - }, - { - "fields": [ - { - "is_short": true, - "text": { - "content": "** 队列类型:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 队列容量:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 执行超时时间:** %s", - "tag": "lark_md" - } - } - ], - "tag": "div" - }, - { - "tag": "hr" - }, - { - "fields": [ - { - "is_short": true, - "text": { - "content": "** AGO 拒绝策略:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** NOW 拒绝策略:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** OWNER:** %s", - "tag": "lark_md" - } - }, - { - "is_short": true, - "text": { - "content": "** 播报时间: ** %s", - "tag": "lark_md" - } - } - ], - "tag": "div" - }, - { - "tag": "hr" - }, - { - "tag": "note", - "elements": [ - { - "tag": "plain_text", - "content": "提示:动态线程池配置变更实时通知(无限制)" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/wechat-alarm.txt b/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/wechat-alarm.txt deleted file mode 100644 index 1e1aa9c4..00000000 --- a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/wechat-alarm.txt +++ /dev/null @@ -1,21 +0,0 @@ -### [告警] %s - 动态线程池运行告警(%s) - -> 线程池ID:%s -> 应用名称:%s -> 应用实例:%s -> 核心线程数:%s -> 最大线程数:%s -> 当前线程数:%s -> 活跃线程数:%s -> 同存最大线程数:%s -> 线程池任务总量:%s -> 队列类型:%s -> 队列容量:%s -> 队列元素个数:%s -> 队列剩余个数:%s -> 拒绝策略:%s -> 拒绝策略执行次数:%s ${timeout-content} -> OWNER:<@%s> -> 提示:%d 分钟内此线程池不会重复告警(可配置) - -**播报时间:%s** \ No newline at end of file diff --git a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/wechat-config.txt b/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/wechat-config.txt deleted file mode 100644 index f583eb45..00000000 --- a/kernel/message/core/src/main/resources/message/robot/dynamic-thread-pool/wechat-config.txt +++ /dev/null @@ -1,17 +0,0 @@ -### [通知] %s - 动态线程池参数变更 -> 线程池ID:%s -> 应用名称:%s -> 应用实例:%s -> 核心线程数:%s -> 最大线程数:%s -> 核心线程超时:%s -> 线程存活时间:%s -> 执行超时时间:%s -> 队列类型:%s -> 队列容量:%s -> AGO 拒绝策略:%s -> NOW 拒绝策略:%s -> OWNER:<@%s> -> 提示:动态线程池配置变更实时通知(无限制) - -**播报时间:%s** \ No newline at end of file diff --git a/kernel/message/core/src/test/java/cn/hippo4j/message/service/AlarmControlHandlerTest.java b/kernel/message/core/src/test/java/cn/hippo4j/message/service/AlarmControlHandlerTest.java deleted file mode 100644 index 351116cd..00000000 --- a/kernel/message/core/src/test/java/cn/hippo4j/message/service/AlarmControlHandlerTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.message.service; - -import cn.hippo4j.threadpool.message.api.AlarmControlDTO; -import cn.hippo4j.threadpool.message.api.NotifyTypeEnum; -import cn.hippo4j.threadpool.message.core.service.AlarmControlHandler; -import org.junit.Assert; -import org.junit.Test; - -public final class AlarmControlHandlerTest { - - @Test - public void assertIsNotSendAlarm() { - AlarmControlHandler alarmControlHandler = new AlarmControlHandler(); - AlarmControlDTO alarmControlDTO = new AlarmControlDTO("1", "Wechat", NotifyTypeEnum.ACTIVITY); - Assert.assertFalse(alarmControlHandler.isSendAlarm(alarmControlDTO)); - } - - @Test - public void assertIsSendAlarm() { - AlarmControlHandler alarmControlHandler = new AlarmControlHandler(); - AlarmControlDTO alarmControlDTO = new AlarmControlDTO("1", "Wechat", NotifyTypeEnum.ACTIVITY); - alarmControlHandler.initCacheAndLock("1", "Wechat", 1); - Assert.assertTrue(alarmControlHandler.isSendAlarm(alarmControlDTO)); - } -} diff --git a/kernel/message/mode/config/pom.xml b/kernel/message/mode/config/pom.xml deleted file mode 100644 index cd90e448..00000000 --- a/kernel/message/mode/config/pom.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-message-mode - ${revision} - - - hippo4j-threadpool-message-mode-config - diff --git a/kernel/message/mode/pom.xml b/kernel/message/mode/pom.xml deleted file mode 100644 index e61cadaf..00000000 --- a/kernel/message/mode/pom.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-kernel-message - ${revision} - - - hippo4j-threadpool-message-mode - pom - - - config - server - - diff --git a/kernel/message/mode/server/pom.xml b/kernel/message/mode/server/pom.xml deleted file mode 100644 index 27b9f703..00000000 --- a/kernel/message/mode/server/pom.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-message-mode - ${revision} - - - hippo4j-threadpool-message-mode-server - diff --git a/kernel/message/pom.xml b/kernel/message/pom.xml deleted file mode 100644 index b013a794..00000000 --- a/kernel/message/pom.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-kernel - ${revision} - - - hippo4j-threadpool-kernel-message - pom - - - api - core - mode - - \ No newline at end of file diff --git a/kernel/monitor/pom.xml b/kernel/monitor/pom.xml deleted file mode 100644 index cdfd04bd..00000000 --- a/kernel/monitor/pom.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-kernel - ${revision} - - - hippo4j-threadpool-kernel-monitor - - - - cn.hippo4j - hippo4j-threadpool-infra-common - ${project.version} - - - \ No newline at end of file diff --git a/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/api/AdapterThreadPoolMonitor.java b/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/api/AdapterThreadPoolMonitor.java deleted file mode 100644 index b7f823bc..00000000 --- a/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/api/AdapterThreadPoolMonitor.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.monitor.api; - -/** - * Adapter thread-pool monitor. - */ -public interface AdapterThreadPoolMonitor extends ThreadPoolMonitor { -} diff --git a/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/api/DynamicThreadPoolMonitor.java b/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/api/DynamicThreadPoolMonitor.java deleted file mode 100644 index 13567347..00000000 --- a/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/api/DynamicThreadPoolMonitor.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.monitor.api; - -/** - * Dynamic thread-pool monitor. - */ -public interface DynamicThreadPoolMonitor extends ThreadPoolMonitor { -} diff --git a/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/api/ThreadPoolMonitor.java b/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/api/ThreadPoolMonitor.java deleted file mode 100644 index 9ece85ce..00000000 --- a/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/api/ThreadPoolMonitor.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.monitor.api; - -/** - * Thread-pool runtime monitor. - */ -public interface ThreadPoolMonitor { - - /** - * Get thread-pool monitoring type. - * - * @return monitoring type - */ - String getType(); - - /** - * Collect thread-pool runtime data. - */ - void collect(); -} diff --git a/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/api/WebThreadPoolMonitor.java b/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/api/WebThreadPoolMonitor.java deleted file mode 100644 index 069f3e31..00000000 --- a/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/api/WebThreadPoolMonitor.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.monitor.api; - -import cn.hippo4j.threadpool.monitor.api.ThreadPoolMonitor; - -/** - * Web thread-pool monitor. - */ -public interface WebThreadPoolMonitor extends ThreadPoolMonitor { -} diff --git a/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/support/MonitorThreadPoolTypeEnum.java b/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/support/MonitorThreadPoolTypeEnum.java deleted file mode 100644 index 00b5265a..00000000 --- a/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/support/MonitorThreadPoolTypeEnum.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.monitor.support; - -/** - * Monitor thread-pool type enum. - */ -public enum MonitorThreadPoolTypeEnum { - - /** - * Dynamic thread-pool - */ - DYNAMIC, - - /** - * Web thread-pool - */ - WEB, - - /** - * Adapter thread-pool - */ - ADAPTER -} diff --git a/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/support/MonitorTypeEnum.java b/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/support/MonitorTypeEnum.java deleted file mode 100644 index 7574279a..00000000 --- a/kernel/monitor/src/main/java/cn/hippo4j/threadpool/monitor/support/MonitorTypeEnum.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.threadpool.monitor.support; - -/** - * Monitor type enum. - */ -public enum MonitorTypeEnum { - - /** - * LOG - */ - LOG, - - /** - * MICROMETER - */ - MICROMETER, - - /** - * SERVER - */ - SERVER, - - /** - * ELASTICSEARCH - */ - ELASTICSEARCH -} diff --git a/kernel/pom.xml b/kernel/pom.xml deleted file mode 100644 index 3448f00b..00000000 --- a/kernel/pom.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-all - ${revision} - - - hippo4j-kernel - pom - - - alarm - dynamic - message - monitor - - \ No newline at end of file diff --git a/lombok.config b/lombok.config deleted file mode 100644 index 6bdcc5ab..00000000 --- a/lombok.config +++ /dev/null @@ -1,20 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# this config is to ignore lombok code in jacoco -config.stopBubbling = true -lombok.addLombokGeneratedAnnotation = true diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity deleted file mode 100644 index 42a6cb98..00000000 --- a/node_modules/.yarn-integrity +++ /dev/null @@ -1,12 +0,0 @@ -{ - "systemParams": "darwin-arm64-93", - "modulesFolders": [ - "node_modules" - ], - "flags": [], - "linkedModules": [], - "topLevelPatterns": [], - "lockfileEntries": {}, - "files": [], - "artifacts": {} -} \ No newline at end of file diff --git a/pom.xml b/pom.xml index b6dff1a5..e8a7ffb7 100644 --- a/pom.xml +++ b/pom.xml @@ -129,6 +129,26 @@ -Xlint:unchecked + + com.nanolaba + nrg-maven-plugin + 1.1 + + + README.src.md + + false + + + + compile + + create-files + + + + false + org.apache.maven.plugins maven-jar-plugin diff --git a/starters/pom.xml b/starters/pom.xml deleted file mode 100644 index 7e1e2c9f..00000000 --- a/starters/pom.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-all - ${revision} - - hippo4j-starters - pom - - - threadpool - - \ No newline at end of file diff --git a/starters/threadpool/adapter/alibaba-dubbo/pom.xml b/starters/threadpool/adapter/alibaba-dubbo/pom.xml deleted file mode 100644 index f341e2ea..00000000 --- a/starters/threadpool/adapter/alibaba-dubbo/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter - ${revision} - - hippo4j-threadpool-spring-boot-starter-adapter-alibaba-dubbo - - - - cn.hippo4j - hippo4j-threadpool-adapter-alibaba-dubbo - ${project.version} - - - diff --git a/starters/threadpool/adapter/alibaba-dubbo/src/main/java/cn/hippo4j/springboot/starter/adapter/alibaba/dubbo/AlibabaDubboAdapterAutoConfiguration.java b/starters/threadpool/adapter/alibaba-dubbo/src/main/java/cn/hippo4j/springboot/starter/adapter/alibaba/dubbo/AlibabaDubboAdapterAutoConfiguration.java deleted file mode 100644 index dc7cfb38..00000000 --- a/starters/threadpool/adapter/alibaba-dubbo/src/main/java/cn/hippo4j/springboot/starter/adapter/alibaba/dubbo/AlibabaDubboAdapterAutoConfiguration.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.alibaba.dubbo; - -import cn.hippo4j.adapter.alibaba.dubbo.AlibabaDubboThreadPoolAdapter; -import cn.hippo4j.core.config.ApplicationContextHolder; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * Alibaba Dubbo adapter auto configuration. - */ -@Configuration -public class AlibabaDubboAdapterAutoConfiguration { - - @Bean - @ConditionalOnMissingBean - public ApplicationContextHolder simpleApplicationContextHolder() { - return new ApplicationContextHolder(); - } - - @Bean - @SuppressWarnings("all") - @ConditionalOnProperty(name = "dubbo.application.name") - public AlibabaDubboThreadPoolAdapter dubboThreadPoolAdapter(ApplicationContextHolder applicationContextHolder) { - return new AlibabaDubboThreadPoolAdapter(); - } -} diff --git a/starters/threadpool/adapter/alibaba-dubbo/src/main/resources/META-INF/spring.factories b/starters/threadpool/adapter/alibaba-dubbo/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 383891ec..00000000 --- a/starters/threadpool/adapter/alibaba-dubbo/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.adapter.alibaba.dubbo.AlibabaDubboAdapterAutoConfiguration diff --git a/starters/threadpool/adapter/alibaba-dubbo/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/starters/threadpool/adapter/alibaba-dubbo/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 942e3b44..00000000 --- a/starters/threadpool/adapter/alibaba-dubbo/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.springboot.starter.adapter.alibaba.dubbo.AlibabaDubboAdapterAutoConfiguration \ No newline at end of file diff --git a/starters/threadpool/adapter/all/pom.xml b/starters/threadpool/adapter/all/pom.xml deleted file mode 100644 index ceff5197..00000000 --- a/starters/threadpool/adapter/all/pom.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter - ${revision} - - hippo4j-threadpool-spring-boot-starter-adapter-all - - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-stream-rocketmq - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-rocketmq - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-rabbitmq - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-dubbo - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-alibaba-dubbo - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-hystrix - ${project.version} - - - diff --git a/starters/threadpool/adapter/dubbo/pom.xml b/starters/threadpool/adapter/dubbo/pom.xml deleted file mode 100644 index 56c54222..00000000 --- a/starters/threadpool/adapter/dubbo/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter - ${revision} - - hippo4j-threadpool-spring-boot-starter-adapter-dubbo - - - - cn.hippo4j - hippo4j-threadpool-adapter-dubbo - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-adapter-dubbox - ${project.version} - - - diff --git a/starters/threadpool/adapter/dubbo/src/main/java/cn/hippo4j/springboot/starter/adapter/dubbo/DubboAdapterAutoConfiguration.java b/starters/threadpool/adapter/dubbo/src/main/java/cn/hippo4j/springboot/starter/adapter/dubbo/DubboAdapterAutoConfiguration.java deleted file mode 100644 index 632ba19d..00000000 --- a/starters/threadpool/adapter/dubbo/src/main/java/cn/hippo4j/springboot/starter/adapter/dubbo/DubboAdapterAutoConfiguration.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.dubbo; - -import cn.hippo4j.adapter.dubbo.DubboThreadPoolAdapter; -import cn.hippo4j.core.config.ApplicationContextHolder; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * Dubbo adapter auto configuration. - */ -@Configuration -public class DubboAdapterAutoConfiguration { - - @Bean - @ConditionalOnMissingBean - public ApplicationContextHolder simpleApplicationContextHolder() { - return new ApplicationContextHolder(); - } - - @Bean - @SuppressWarnings("all") - @ConditionalOnProperty(name = "dubbo.application.name") - public DubboThreadPoolAdapter dubboThreadPoolAdapter(ApplicationContextHolder applicationContextHolder) { - return new DubboThreadPoolAdapter(); - } -} diff --git a/starters/threadpool/adapter/dubbo/src/main/resources/META-INF/spring.factories b/starters/threadpool/adapter/dubbo/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 9f14bcd2..00000000 --- a/starters/threadpool/adapter/dubbo/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.adapter.dubbo.DubboAdapterAutoConfiguration diff --git a/starters/threadpool/adapter/dubbo/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/starters/threadpool/adapter/dubbo/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 83ec2e6d..00000000 --- a/starters/threadpool/adapter/dubbo/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.springboot.starter.adapter.dubbo.DubboAdapterAutoConfiguration \ No newline at end of file diff --git a/starters/threadpool/adapter/dubbox/pom.xml b/starters/threadpool/adapter/dubbox/pom.xml deleted file mode 100644 index 621a41f9..00000000 --- a/starters/threadpool/adapter/dubbox/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter - ${revision} - - hippo4j-threadpool-spring-boot-starter-adapter-dubbox - - - - cn.hippo4j - hippo4j-threadpool-adapter-dubbox - ${project.version} - - - diff --git a/starters/threadpool/adapter/dubbox/src/main/java/cn/hippo4j/springboot/starter/adapter/dubbo/DubboxAdapterAutoConfiguration.java b/starters/threadpool/adapter/dubbox/src/main/java/cn/hippo4j/springboot/starter/adapter/dubbo/DubboxAdapterAutoConfiguration.java deleted file mode 100644 index 51095944..00000000 --- a/starters/threadpool/adapter/dubbox/src/main/java/cn/hippo4j/springboot/starter/adapter/dubbo/DubboxAdapterAutoConfiguration.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.dubbo; - -import cn.hippo4j.adapter.dubbo.DubboThreadPoolAdapter; -import cn.hippo4j.adapter.dubbo.DubboxThreadPoolAdapter; -import cn.hippo4j.core.config.ApplicationContextHolder; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * Dubbox adapter auto configuration. - */ -@Configuration -public class DubboxAdapterAutoConfiguration { - - @Bean - @ConditionalOnMissingBean - public ApplicationContextHolder simpleApplicationContextHolder() { - return new ApplicationContextHolder(); - } - - @Bean - @SuppressWarnings("all") - @ConditionalOnProperty(name = "dubbo.application.name") - public DubboThreadPoolAdapter dubboThreadPoolAdapter(ApplicationContextHolder applicationContextHolder) { - return new DubboxThreadPoolAdapter(); - } -} diff --git a/starters/threadpool/adapter/dubbox/src/main/resources/META-INF/spring.factories b/starters/threadpool/adapter/dubbox/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 4a662fec..00000000 --- a/starters/threadpool/adapter/dubbox/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.adapter.dubbo.DubboxAdapterAutoConfiguration diff --git a/starters/threadpool/adapter/dubbox/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/starters/threadpool/adapter/dubbox/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index dea260cf..00000000 --- a/starters/threadpool/adapter/dubbox/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.springboot.starter.adapter.dubbo.DubboxAdapterAutoConfiguration \ No newline at end of file diff --git a/starters/threadpool/adapter/hystrix/pom.xml b/starters/threadpool/adapter/hystrix/pom.xml deleted file mode 100644 index aa660427..00000000 --- a/starters/threadpool/adapter/hystrix/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter - ${revision} - - hippo4j-threadpool-spring-boot-starter-adapter-hystrix - - - - cn.hippo4j - hippo4j-threadpool-adapter-hystrix - ${project.version} - - - diff --git a/starters/threadpool/adapter/hystrix/src/main/java/cn/hippo4j/springboot/starter/adapter/hystrix/HystrixAdapterAutoConfiguration.java b/starters/threadpool/adapter/hystrix/src/main/java/cn/hippo4j/springboot/starter/adapter/hystrix/HystrixAdapterAutoConfiguration.java deleted file mode 100644 index 5fd67420..00000000 --- a/starters/threadpool/adapter/hystrix/src/main/java/cn/hippo4j/springboot/starter/adapter/hystrix/HystrixAdapterAutoConfiguration.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.hystrix; - -import cn.hippo4j.adapter.hystrix.HystrixThreadPoolAdapter4Config; -import cn.hippo4j.adapter.hystrix.HystrixThreadPoolAdapter4Server; -import cn.hippo4j.adapter.hystrix.ThreadPoolAdapterScheduler; -import cn.hippo4j.core.config.ApplicationContextHolder; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * @program: hippo4j - * @description: - * @author: lk - * @create: 2022-07-15 - **/ -@Configuration(proxyBeanMethods = false) -public class HystrixAdapterAutoConfiguration { - - @Bean - @ConditionalOnMissingBean - public ApplicationContextHolder simpleApplicationContextHolder() { - return new ApplicationContextHolder(); - } - - @Bean - public ThreadPoolAdapterScheduler threadPoolAdapterScheduler() { - return new ThreadPoolAdapterScheduler(); - } - - @Bean - @ConditionalOnClass(name = "cn.hippo4j.springboot.starter.config.DynamicThreadPoolAutoConfiguration") - public HystrixThreadPoolAdapter4Server hystrixThreadPoolAdapter4Server(ThreadPoolAdapterScheduler threadPoolAdapterScheduler) { - return new HystrixThreadPoolAdapter4Server(threadPoolAdapterScheduler); - } - - @Bean - @ConditionalOnClass(name = "cn.hippo4j.config.springboot.starter.config.DynamicThreadPoolAutoConfiguration") - public HystrixThreadPoolAdapter4Config hystrixThreadPoolAdapter4Config(ThreadPoolAdapterScheduler threadPoolAdapterScheduler) { - return new HystrixThreadPoolAdapter4Config(threadPoolAdapterScheduler); - } -} diff --git a/starters/threadpool/adapter/hystrix/src/main/resources/META-INF/spring.factories b/starters/threadpool/adapter/hystrix/src/main/resources/META-INF/spring.factories deleted file mode 100644 index e00410f3..00000000 --- a/starters/threadpool/adapter/hystrix/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.adapter.hystrix.HystrixAdapterAutoConfiguration \ No newline at end of file diff --git a/starters/threadpool/adapter/hystrix/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/starters/threadpool/adapter/hystrix/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 568db5a4..00000000 --- a/starters/threadpool/adapter/hystrix/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.springboot.starter.adapter.hystrix.HystrixAdapterAutoConfiguration \ No newline at end of file diff --git a/starters/threadpool/adapter/kafka/pom.xml b/starters/threadpool/adapter/kafka/pom.xml deleted file mode 100644 index 179c94b7..00000000 --- a/starters/threadpool/adapter/kafka/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter - ${revision} - - hippo4j-threadpool-spring-boot-starter-adapter-kafka - - - - cn.hippo4j - hippo4j-threadpool-adapter-kafka - ${project.version} - - - org.springframework.kafka - spring-kafka - true - - - diff --git a/starters/threadpool/adapter/kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/KafkaAdapterAutoConfiguration.java b/starters/threadpool/adapter/kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/KafkaAdapterAutoConfiguration.java deleted file mode 100644 index 5a5b194f..00000000 --- a/starters/threadpool/adapter/kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/KafkaAdapterAutoConfiguration.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.kafka; - -import cn.hippo4j.adapter.kafka.KafkaThreadPoolAdapter; -import cn.hippo4j.core.config.ApplicationContextHolder; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.kafka.core.KafkaTemplate; - -/** - * Kafka adapter auto configuration. - */ -@Configuration -@AutoConfigureAfter(KafkaAutoConfiguration.class) -public class KafkaAdapterAutoConfiguration { - - @Bean - @ConditionalOnMissingBean - public ApplicationContextHolder simpleApplicationContextHolder() { - return new ApplicationContextHolder(); - } - - @Bean - @SuppressWarnings("all") - @ConditionalOnBean(KafkaTemplate.class) - public KafkaThreadPoolAdapter kafkaThreadPoolAdapter(ApplicationContextHolder applicationContextHolder) { - return new KafkaThreadPoolAdapter(); - } -} diff --git a/starters/threadpool/adapter/kafka/src/main/resources/META-INF/spring.factories b/starters/threadpool/adapter/kafka/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 592fba93..00000000 --- a/starters/threadpool/adapter/kafka/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.adapter.kafka.KafkaAdapterAutoConfiguration diff --git a/starters/threadpool/adapter/kafka/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/starters/threadpool/adapter/kafka/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 11a91b8c..00000000 --- a/starters/threadpool/adapter/kafka/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.springboot.starter.adapter.kafka.KafkaAdapterAutoConfiguration \ No newline at end of file diff --git a/starters/threadpool/adapter/pom.xml b/starters/threadpool/adapter/pom.xml deleted file mode 100644 index 292cb308..00000000 --- a/starters/threadpool/adapter/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-starters - ${revision} - - hippo4j-threadpool-spring-boot-starter-adapter - pom - - - all - dubbo - dubbox - alibaba-dubbo - rabbitmq - rocketmq - kafka - hystrix - stream-rocketmq - stream-rabbitmq - web - - diff --git a/starters/threadpool/adapter/rabbitmq/pom.xml b/starters/threadpool/adapter/rabbitmq/pom.xml deleted file mode 100644 index 1922cece..00000000 --- a/starters/threadpool/adapter/rabbitmq/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter - ${revision} - - hippo4j-threadpool-spring-boot-starter-adapter-rabbitmq - - - - cn.hippo4j - hippo4j-threadpool-adapter-rabbitmq - ${project.version} - - - org.springframework.boot - spring-boot-starter-amqp - true - - - diff --git a/starters/threadpool/adapter/rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/RabbitMQAdapterAutoConfiguration.java b/starters/threadpool/adapter/rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/RabbitMQAdapterAutoConfiguration.java deleted file mode 100644 index 85ea6a7f..00000000 --- a/starters/threadpool/adapter/rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rabbitmq/RabbitMQAdapterAutoConfiguration.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rabbitmq; - -import java.util.Map; - -import cn.hippo4j.adapter.rabbitmq.RabbitMQThreadPoolAdapter; -import cn.hippo4j.core.config.ApplicationContextHolder; -import lombok.RequiredArgsConstructor; - -import org.springframework.amqp.rabbit.connection.AbstractConnectionFactory; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * Rabbit adapter auto configuration. - */ -@Configuration -@RequiredArgsConstructor -public class RabbitMQAdapterAutoConfiguration { - - private final Map stringAbstractConnectionFactoryMap; - - @Bean - @ConditionalOnMissingBean - public ApplicationContextHolder simpleApplicationContextHolder() { - return new ApplicationContextHolder(); - } - - @Bean - @SuppressWarnings("all") - @ConditionalOnProperty(name = "spring.rabbitmq.host") - public RabbitMQThreadPoolAdapter rabbitMQThreadPoolAdapter(ApplicationContextHolder applicationContextHolder) { - return new RabbitMQThreadPoolAdapter(stringAbstractConnectionFactoryMap); - } -} diff --git a/starters/threadpool/adapter/rabbitmq/src/main/resources/META-INF/spring.factories b/starters/threadpool/adapter/rabbitmq/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 4ec83b15..00000000 --- a/starters/threadpool/adapter/rabbitmq/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.adapter.rabbitmq.RabbitMQAdapterAutoConfiguration diff --git a/starters/threadpool/adapter/rabbitmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/starters/threadpool/adapter/rabbitmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 6f373cd3..00000000 --- a/starters/threadpool/adapter/rabbitmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.springboot.starter.adapter.rabbitmq.RabbitMQAdapterAutoConfiguration \ No newline at end of file diff --git a/starters/threadpool/adapter/rocketmq/pom.xml b/starters/threadpool/adapter/rocketmq/pom.xml deleted file mode 100644 index a283083d..00000000 --- a/starters/threadpool/adapter/rocketmq/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter - ${revision} - - hippo4j-threadpool-spring-boot-starter-adapter-rocketmq - - - - cn.hippo4j - hippo4j-threadpool-adapter-rocketmq - ${project.version} - - - diff --git a/starters/threadpool/adapter/rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rocketmq/RocketMQAdapterAutoConfiguration.java b/starters/threadpool/adapter/rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rocketmq/RocketMQAdapterAutoConfiguration.java deleted file mode 100644 index bffc969f..00000000 --- a/starters/threadpool/adapter/rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/rocketmq/RocketMQAdapterAutoConfiguration.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.rocketmq; - -import cn.hippo4j.adapter.rocketmq.RocketMQThreadPoolAdapter; -import cn.hippo4j.core.config.ApplicationContextHolder; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * RocketMQ adapter auto configuration. - */ -@Configuration -public class RocketMQAdapterAutoConfiguration { - - @Bean - @ConditionalOnMissingBean - public ApplicationContextHolder simpleApplicationContextHolder() { - return new ApplicationContextHolder(); - } - - @Bean - @SuppressWarnings("all") - @ConditionalOnProperty(name = "rocketmq.name-server") - public RocketMQThreadPoolAdapter rocketMQThreadPoolAdapter(ApplicationContextHolder applicationContextHolder) { - return new RocketMQThreadPoolAdapter(); - } -} diff --git a/starters/threadpool/adapter/rocketmq/src/main/resources/META-INF/spring.factories b/starters/threadpool/adapter/rocketmq/src/main/resources/META-INF/spring.factories deleted file mode 100644 index b9521ada..00000000 --- a/starters/threadpool/adapter/rocketmq/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.adapter.rocketmq.RocketMQAdapterAutoConfiguration diff --git a/starters/threadpool/adapter/rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/starters/threadpool/adapter/rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index b418f693..00000000 --- a/starters/threadpool/adapter/rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.springboot.starter.adapter.rocketmq.RocketMQAdapterAutoConfiguration \ No newline at end of file diff --git a/starters/threadpool/adapter/stream-rabbitmq/pom.xml b/starters/threadpool/adapter/stream-rabbitmq/pom.xml deleted file mode 100644 index 9ce6d01e..00000000 --- a/starters/threadpool/adapter/stream-rabbitmq/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter - ${revision} - - hippo4j-threadpool-spring-boot-starter-adapter-stream-rabbitmq - - - - cn.hippo4j - hippo4j-threadpool-adapter-stream-rabbitmq - ${project.version} - - - org.springframework.cloud - spring-cloud-starter-stream-rabbit - true - - - diff --git a/starters/threadpool/adapter/stream-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rabbitmq/SpringCloudStreamRabbitMQAdapterAutoConfiguration.java b/starters/threadpool/adapter/stream-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rabbitmq/SpringCloudStreamRabbitMQAdapterAutoConfiguration.java deleted file mode 100644 index a4c42221..00000000 --- a/starters/threadpool/adapter/stream-rabbitmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rabbitmq/SpringCloudStreamRabbitMQAdapterAutoConfiguration.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.springcloud.stream.rabbitmq; - -import cn.hippo4j.adapter.springcloud.stream.rabbitmq.SpringCloudStreamRabbitMQThreadPoolAdapter; -import cn.hippo4j.core.config.ApplicationContextHolder; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.cloud.stream.binder.rabbit.config.RabbitMessageChannelBinderConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * Spring cloud stream rabbitmq adapter auto configuration. - */ -@Configuration(proxyBeanMethods = false) -@ConditionalOnClass(RabbitMessageChannelBinderConfiguration.class) -public class SpringCloudStreamRabbitMQAdapterAutoConfiguration { - - @Bean - @ConditionalOnMissingBean - public ApplicationContextHolder simpleApplicationContextHolder() { - return new ApplicationContextHolder(); - } - - @Bean - @SuppressWarnings("all") - @ConditionalOnProperty("spring.rabbitmq.host") - public SpringCloudStreamRabbitMQThreadPoolAdapter springCloudStreamRabbitMQThreadPoolAdapter(ApplicationContextHolder applicationContextHolder) { - return new SpringCloudStreamRabbitMQThreadPoolAdapter(); - } -} diff --git a/starters/threadpool/adapter/stream-rabbitmq/src/main/resources/META-INF/spring.factories b/starters/threadpool/adapter/stream-rabbitmq/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 52a54b9c..00000000 --- a/starters/threadpool/adapter/stream-rabbitmq/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.adapter.springcloud.stream.rabbitmq.SpringCloudStreamRabbitMQAdapterAutoConfiguration diff --git a/starters/threadpool/adapter/stream-rabbitmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/starters/threadpool/adapter/stream-rabbitmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 42a97f8f..00000000 --- a/starters/threadpool/adapter/stream-rabbitmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.springboot.starter.adapter.springcloud.stream.rabbitmq.SpringCloudStreamRabbitMQAdapterAutoConfiguration \ No newline at end of file diff --git a/starters/threadpool/adapter/stream-rocketmq/pom.xml b/starters/threadpool/adapter/stream-rocketmq/pom.xml deleted file mode 100644 index 32bd82cd..00000000 --- a/starters/threadpool/adapter/stream-rocketmq/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter - ${revision} - - hippo4j-threadpool-spring-boot-starter-adapter-stream-rocketmq - - - - cn.hippo4j - hippo4j-threadpool-adapter-stream-rocketmq - ${project.version} - - - diff --git a/starters/threadpool/adapter/stream-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rocketmq/SpringCloudStreamRocketMQAdapterAutoConfiguration.java b/starters/threadpool/adapter/stream-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rocketmq/SpringCloudStreamRocketMQAdapterAutoConfiguration.java deleted file mode 100644 index 0fd74718..00000000 --- a/starters/threadpool/adapter/stream-rocketmq/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/rocketmq/SpringCloudStreamRocketMQAdapterAutoConfiguration.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.springcloud.stream.rocketmq; - -import cn.hippo4j.adapter.springcloud.stream.rocketmq.SpringCloudStreamRocketMQThreadPoolAdapter; -import cn.hippo4j.core.config.ApplicationContextHolder; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * Spring cloud stream rocketMQ adapter auto configuration. - */ -@Configuration -public class SpringCloudStreamRocketMQAdapterAutoConfiguration { - - @Bean - @ConditionalOnMissingBean - public ApplicationContextHolder simpleApplicationContextHolder() { - return new ApplicationContextHolder(); - } - - @Bean - @SuppressWarnings("all") - @ConditionalOnProperty(name = "spring.cloud.stream.rocketmq.binder.name-server") - public SpringCloudStreamRocketMQThreadPoolAdapter springCloudStreamRocketMQThreadPoolAdapter(ApplicationContextHolder applicationContextHolder) { - return new SpringCloudStreamRocketMQThreadPoolAdapter(); - } -} diff --git a/starters/threadpool/adapter/stream-rocketmq/src/main/resources/META-INF/spring.factories b/starters/threadpool/adapter/stream-rocketmq/src/main/resources/META-INF/spring.factories deleted file mode 100644 index fc109fda..00000000 --- a/starters/threadpool/adapter/stream-rocketmq/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.adapter.springcloud.stream.rocketmq.SpringCloudStreamRocketMQAdapterAutoConfiguration diff --git a/starters/threadpool/adapter/stream-rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/starters/threadpool/adapter/stream-rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 82dd1a2e..00000000 --- a/starters/threadpool/adapter/stream-rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.springboot.starter.adapter.springcloud.stream.rocketmq.SpringCloudStreamRocketMQAdapterAutoConfiguration \ No newline at end of file diff --git a/starters/threadpool/adapter/web/pom.xml b/starters/threadpool/adapter/web/pom.xml deleted file mode 100644 index 0410cdbe..00000000 --- a/starters/threadpool/adapter/web/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter - ${revision} - - hippo4j-threadpool-spring-boot-starter-adapter-web - - - - cn.hippo4j - hippo4j-threadpool-adapter-web - ${project.version} - - - org.springframework.boot - spring-boot-starter-tomcat - true - - - org.springframework.boot - spring-boot-starter-jetty - true - - - org.springframework.boot - spring-boot-starter-undertow - true - - - diff --git a/starters/threadpool/adapter/web/src/main/java/cn/hippo4j/springboot/starter/adapter/web/WebAdapterConfiguration.java b/starters/threadpool/adapter/web/src/main/java/cn/hippo4j/springboot/starter/adapter/web/WebAdapterConfiguration.java deleted file mode 100644 index 3087ec58..00000000 --- a/starters/threadpool/adapter/web/src/main/java/cn/hippo4j/springboot/starter/adapter/web/WebAdapterConfiguration.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.web; - -import cn.hippo4j.adapter.web.WebThreadPoolHandlerChoose; -import cn.hippo4j.adapter.web.WebThreadPoolRunStateHandler; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.core.config.UtilAutoConfiguration; -import cn.hippo4j.core.executor.state.ThreadPoolRunStateHandler; -import cn.hippo4j.core.toolkit.inet.InetUtils; -import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.autoconfigure.AutoConfigureBefore; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.DependsOn; -import org.springframework.context.annotation.Import; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; -import org.springframework.core.env.ConfigurableEnvironment; - -/** - * Web adapter auto configuration. - */ -@Configuration -@Import({WebThreadPoolHandlerConfiguration.EmbeddedTomcat.class, - WebThreadPoolHandlerConfiguration.EmbeddedJetty.class, - WebThreadPoolHandlerConfiguration.EmbeddedUndertow.class}) -@RequiredArgsConstructor -@AutoConfigureAfter(UtilAutoConfiguration.class) -public class WebAdapterConfiguration { - - private final ConfigurableEnvironment environment; - - @Bean - @ConditionalOnMissingBean - public ApplicationContextHolder simpleApplicationContextHolder() { - return new ApplicationContextHolder(); - } - - @Bean - public WebThreadPoolRunStateHandler webThreadPoolRunStateHandler() { - return new WebThreadPoolRunStateHandler(); - } - - @Bean - @SuppressWarnings("all") - public ThreadPoolRunStateHandler threadPoolRunStateHandler(InetUtils hippo4jInetUtils) { - return new ThreadPoolRunStateHandler(hippo4jInetUtils, environment); - } - - @Bean - public WebThreadPoolHandlerChoose webThreadPoolServiceChoose() { - return new WebThreadPoolHandlerChoose(); - } -} diff --git a/starters/threadpool/adapter/web/src/main/java/cn/hippo4j/springboot/starter/adapter/web/WebThreadPoolHandlerConfiguration.java b/starters/threadpool/adapter/web/src/main/java/cn/hippo4j/springboot/starter/adapter/web/WebThreadPoolHandlerConfiguration.java deleted file mode 100644 index 263317f7..00000000 --- a/starters/threadpool/adapter/web/src/main/java/cn/hippo4j/springboot/starter/adapter/web/WebThreadPoolHandlerConfiguration.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.adapter.web; - -import cn.hippo4j.adapter.web.jetty.DefaultJettyWebThreadPoolHandler; -import cn.hippo4j.adapter.web.jetty.JettyWebThreadPoolHandlerAdapt; -import cn.hippo4j.adapter.web.tomcat.DefaultTomcatWebThreadPoolHandler; -import cn.hippo4j.adapter.web.tomcat.TomcatWebThreadPoolHandlerAdapt; -import cn.hippo4j.adapter.web.undertow.DefaultUndertowWebThreadPoolHandler; -import cn.hippo4j.adapter.web.WebThreadPoolRunStateHandler; -import cn.hippo4j.adapter.web.undertow.UndertowWebThreadPoolHandlerAdapt; -import io.undertow.Undertow; -import org.apache.catalina.startup.Tomcat; -import org.apache.coyote.UpgradeProtocol; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.util.Loader; -import org.eclipse.jetty.webapp.WebAppContext; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.SearchStrategy; -import org.springframework.boot.web.embedded.jetty.ConfigurableJettyWebServerFactory; -import org.springframework.boot.web.embedded.tomcat.ConfigurableTomcatWebServerFactory; -import org.springframework.boot.web.embedded.undertow.ConfigurableUndertowWebServerFactory; -import org.springframework.boot.web.servlet.server.ServletWebServerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.xnio.SslClientAuthMode; - -import javax.servlet.Servlet; - -/** - * Web Thread Pool Handler Configuration - **/ -@Configuration(proxyBeanMethods = false) -public class WebThreadPoolHandlerConfiguration { - - /** - * embedded tomcat - */ - @Configuration(proxyBeanMethods = false) - @ConditionalOnClass({Servlet.class, Tomcat.class, UpgradeProtocol.class}) - @ConditionalOnBean(value = ConfigurableTomcatWebServerFactory.class, search = SearchStrategy.CURRENT) - @ConditionalOnMissingBean({DefaultTomcatWebThreadPoolHandler.class, TomcatWebThreadPoolHandlerAdapt.class}) - static class EmbeddedTomcat { - - /** - * Refer to the Tomcat loading source code . - * This load is performed if the {@link Tomcat} class exists and - * the Web embedded server loads the {@link ServletWebServerFactory} top-level interface type at the same time - */ - @Bean - public TomcatWebThreadPoolHandlerAdapt tomcatWebThreadPoolHandler(WebThreadPoolRunStateHandler webThreadPoolRunStateHandler) { - return new DefaultTomcatWebThreadPoolHandler(webThreadPoolRunStateHandler); - } - } - - /** - * embedded jetty - */ - @Configuration(proxyBeanMethods = false) - @ConditionalOnClass({Servlet.class, Server.class, Loader.class, WebAppContext.class}) - @ConditionalOnBean(value = ConfigurableJettyWebServerFactory.class, search = SearchStrategy.CURRENT) - @ConditionalOnMissingBean({DefaultJettyWebThreadPoolHandler.class, JettyWebThreadPoolHandlerAdapt.class}) - static class EmbeddedJetty { - - /** - * Refer to the Server loading source code . - * This load is performed if the {@link Server} class exists and - * the Web embedded server loads the {@link ServletWebServerFactory} top-level interface type at the same time - */ - @Bean - public JettyWebThreadPoolHandlerAdapt jettyWebThreadPoolHandler() { - return new DefaultJettyWebThreadPoolHandler(); - } - } - - /** - * embedded undertow - */ - @Configuration(proxyBeanMethods = false) - @ConditionalOnClass({Servlet.class, Undertow.class, SslClientAuthMode.class}) - @ConditionalOnBean(value = ConfigurableUndertowWebServerFactory.class, search = SearchStrategy.CURRENT) - @ConditionalOnMissingBean({DefaultUndertowWebThreadPoolHandler.class, UndertowWebThreadPoolHandlerAdapt.class}) - static class EmbeddedUndertow { - - /** - * Refer to the Undertow loading source code . - * This load is performed if the {@link Undertow} class exists and - * the Web embedded server loads the {@link ServletWebServerFactory} top-level interface type at the same time - */ - @Bean - public UndertowWebThreadPoolHandlerAdapt undertowWebThreadPoolHandler(WebThreadPoolRunStateHandler webThreadPoolRunStateHandler) { - return new DefaultUndertowWebThreadPoolHandler(webThreadPoolRunStateHandler); - } - } -} diff --git a/starters/threadpool/adapter/web/src/main/java/cn/hippo4j/springboot3/starter/adapter/web/WebAdapterConfiguration.java b/starters/threadpool/adapter/web/src/main/java/cn/hippo4j/springboot3/starter/adapter/web/WebAdapterConfiguration.java deleted file mode 100644 index 3665a347..00000000 --- a/starters/threadpool/adapter/web/src/main/java/cn/hippo4j/springboot3/starter/adapter/web/WebAdapterConfiguration.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot3.starter.adapter.web; - -import cn.hippo4j.adapter.web.WebThreadPoolHandlerChoose; -import cn.hippo4j.adapter.web.WebThreadPoolRunStateHandler; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.core.config.UtilAutoConfiguration; -import cn.hippo4j.core.executor.state.ThreadPoolRunStateHandler; -import cn.hippo4j.core.toolkit.inet.InetUtils; -import cn.hippo4j.springboot.starter.adapter.web.WebThreadPoolHandlerConfiguration; -import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.core.env.ConfigurableEnvironment; - -/** - * Web adapter auto configuration. - */ -@Configuration -@Import({cn.hippo4j.springboot3.starter.adapter.web.WebThreadPoolHandlerConfiguration.EmbeddedTomcat.class, - cn.hippo4j.springboot3.starter.adapter.web.WebThreadPoolHandlerConfiguration.EmbeddedJetty.class, - cn.hippo4j.springboot3.starter.adapter.web.WebThreadPoolHandlerConfiguration.EmbeddedUndertow.class}) -@RequiredArgsConstructor -@AutoConfigureAfter(UtilAutoConfiguration.class) -public class WebAdapterConfiguration { - - private final ConfigurableEnvironment environment; - - @Bean - @ConditionalOnMissingBean - public ApplicationContextHolder simpleApplicationContextHolder() { - return new ApplicationContextHolder(); - } - - @Bean - public WebThreadPoolRunStateHandler webThreadPoolRunStateHandler() { - return new WebThreadPoolRunStateHandler(); - } - - @Bean - @SuppressWarnings("all") - public ThreadPoolRunStateHandler threadPoolRunStateHandler(InetUtils hippo4jInetUtils) { - return new ThreadPoolRunStateHandler(hippo4jInetUtils, environment); - } - - @Bean - public WebThreadPoolHandlerChoose webThreadPoolServiceChoose() { - return new WebThreadPoolHandlerChoose(); - } -} diff --git a/starters/threadpool/adapter/web/src/main/java/cn/hippo4j/springboot3/starter/adapter/web/WebThreadPoolHandlerConfiguration.java b/starters/threadpool/adapter/web/src/main/java/cn/hippo4j/springboot3/starter/adapter/web/WebThreadPoolHandlerConfiguration.java deleted file mode 100644 index 497e4d68..00000000 --- a/starters/threadpool/adapter/web/src/main/java/cn/hippo4j/springboot3/starter/adapter/web/WebThreadPoolHandlerConfiguration.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot3.starter.adapter.web; - -import cn.hippo4j.adapter.web.WebThreadPoolRunStateHandler; -import cn.hippo4j.adapter.web.jetty.DefaultJettyWebThreadPoolHandler; -import cn.hippo4j.adapter.web.jetty.JettyWebThreadPoolHandlerAdapt; -import cn.hippo4j.adapter.web.tomcat.DefaultTomcatWebThreadPoolHandler; -import cn.hippo4j.adapter.web.tomcat.TomcatWebThreadPoolHandlerAdapt; -import cn.hippo4j.adapter.web.undertow.DefaultUndertowWebThreadPoolHandler; -import cn.hippo4j.adapter.web.undertow.UndertowWebThreadPoolHandlerAdapt; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.SearchStrategy; -import org.springframework.boot.web.embedded.jetty.ConfigurableJettyWebServerFactory; -import org.springframework.boot.web.embedded.tomcat.ConfigurableTomcatWebServerFactory; -import org.springframework.boot.web.embedded.undertow.ConfigurableUndertowWebServerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * Web Thread Pool Handler Configuration - **/ -@Configuration(proxyBeanMethods = false) -public class WebThreadPoolHandlerConfiguration { - - /** - * embedded tomcat - */ - @Configuration(proxyBeanMethods = false) - @ConditionalOnClass(name = {"org.apache.catalina.startup.Tomcat", "org.apache.coyote.UpgradeProtocol", "jakarta.servlet.Servlet"}) - @ConditionalOnBean(value = ConfigurableTomcatWebServerFactory.class, search = SearchStrategy.CURRENT) - @ConditionalOnMissingBean({DefaultTomcatWebThreadPoolHandler.class, TomcatWebThreadPoolHandlerAdapt.class}) - static class EmbeddedTomcat { - - @Bean - public TomcatWebThreadPoolHandlerAdapt tomcatWebThreadPoolHandler(WebThreadPoolRunStateHandler webThreadPoolRunStateHandler) { - return new DefaultTomcatWebThreadPoolHandler(webThreadPoolRunStateHandler); - } - } - - /** - * embedded jetty - */ - @Configuration(proxyBeanMethods = false) - @ConditionalOnClass(name = {"jakarta.servlet.Servlet", "org.eclipse.jetty.server.Server", "org.eclipse.jetty.util.Loader", "org.eclipse.jetty.ee10.webapp.WebAppContext"}) - @ConditionalOnBean(value = ConfigurableJettyWebServerFactory.class, search = SearchStrategy.CURRENT) - @ConditionalOnMissingBean({DefaultJettyWebThreadPoolHandler.class, JettyWebThreadPoolHandlerAdapt.class}) - static class EmbeddedJetty { - - @Bean - public JettyWebThreadPoolHandlerAdapt jettyWebThreadPoolHandler() { - return new DefaultJettyWebThreadPoolHandler(); - } - } - - /** - * embedded undertow - */ - @Configuration(proxyBeanMethods = false) - @ConditionalOnClass(name = {"jakarta.servlet.Servlet", "org.xnio.SslClientAuthMode", "io.undertow.Undertow"}) - @ConditionalOnBean(value = ConfigurableUndertowWebServerFactory.class, search = SearchStrategy.CURRENT) - @ConditionalOnMissingBean({DefaultUndertowWebThreadPoolHandler.class, UndertowWebThreadPoolHandlerAdapt.class}) - static class EmbeddedUndertow { - - @Bean - public UndertowWebThreadPoolHandlerAdapt undertowWebThreadPoolHandler(WebThreadPoolRunStateHandler webThreadPoolRunStateHandler) { - return new DefaultUndertowWebThreadPoolHandler(webThreadPoolRunStateHandler); - } - } -} diff --git a/starters/threadpool/adapter/web/src/main/resources/META-INF/spring.factories b/starters/threadpool/adapter/web/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 2354dd6a..00000000 --- a/starters/threadpool/adapter/web/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.adapter.web.WebAdapterConfiguration diff --git a/starters/threadpool/adapter/web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/starters/threadpool/adapter/web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 8335f20c..00000000 --- a/starters/threadpool/adapter/web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.springboot3.starter.adapter.web.WebAdapterConfiguration \ No newline at end of file diff --git a/starters/threadpool/config-spring-boot-1x/pom.xml b/starters/threadpool/config-spring-boot-1x/pom.xml deleted file mode 100644 index 21088da8..00000000 --- a/starters/threadpool/config-spring-boot-1x/pom.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-starters - ${revision} - - hippo4j-threadpool-config-spring-boot-1x-starter - - - 8 - 8 - 1.5.22.RELEASE - - - - - cn.hippo4j - hippo4j-threadpool-config-spring-boot-starter - ${project.version} - - - org.springframework.boot - spring-boot-starter-tomcat - true - - - org.springframework.boot - spring-boot-starter-undertow - true - - - org.springframework.boot - spring-boot-starter-jetty - true - - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - \ No newline at end of file diff --git a/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/config/ConfigHandlerAutoConfiguration.java b/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/config/ConfigHandlerAutoConfiguration.java deleted file mode 100644 index 9300ab11..00000000 --- a/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/config/ConfigHandlerAutoConfiguration.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot1x.starter.config; - -import cn.hippo4j.config.springboot1x.starter.refresher.SpringBoot1xBootstrapConfigPropertiesBinderAdapter; -import cn.hippo4j.threadpool.dynamic.mode.config.refresher.BootstrapConfigPropertiesBinderAdapter; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.bind.RelaxedDataBinder; -import org.springframework.context.annotation.Bean; - -/** - * Config handler auto configuration. - */ -public class ConfigHandlerAutoConfiguration { - - @Bean - @ConditionalOnClass(RelaxedDataBinder.class) - public BootstrapConfigPropertiesBinderAdapter bootstrapConfigPropertiesBinderAdapter() { - return new SpringBoot1xBootstrapConfigPropertiesBinderAdapter(); - } -} diff --git a/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/config/WebThreadPoolHandlerConfiguration1x.java b/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/config/WebThreadPoolHandlerConfiguration1x.java deleted file mode 100644 index fa41e3f1..00000000 --- a/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/config/WebThreadPoolHandlerConfiguration1x.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot1x.starter.config; - -import cn.hippo4j.adapter.web.WebThreadPoolRunStateHandler; -import cn.hippo4j.adapter.web.WebThreadPoolService; -import cn.hippo4j.config.springboot1x.starter.web.jetty.JettyWebThreadPoolHandler1x; -import cn.hippo4j.config.springboot1x.starter.web.tomcat.TomcatWebThreadPoolHandler1x; -import cn.hippo4j.config.springboot1x.starter.web.undertow.UndertowWebThreadPoolHandler1x; -import cn.hippo4j.springboot.starter.adapter.web.WebThreadPoolHandlerConfiguration; -import io.undertow.Undertow; -import org.apache.catalina.Loader; -import org.apache.catalina.Server; -import org.apache.catalina.startup.Tomcat; -import org.eclipse.jetty.webapp.WebAppContext; -import org.springframework.boot.autoconfigure.AutoConfigureBefore; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.SearchStrategy; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.xnio.SslClientAuthMode; - -import javax.servlet.Servlet; - -/** - * Spring auto-configuration class for WebThreadPoolHandlers. - */ -@Configuration -@AutoConfigureBefore(WebThreadPoolHandlerConfiguration.class) -public class WebThreadPoolHandlerConfiguration1x { - - /** - * Embedded tomcat - */ - @Configuration - @ConditionalOnClass({Servlet.class, Tomcat.class}) - @ConditionalOnBean(WebThreadPoolRunStateHandler.class) - @ConditionalOnMissingBean(value = WebThreadPoolService.class, search = SearchStrategy.CURRENT) - static class EmbeddedTomcat { - - /** - * Nested configuration if Tomcat is being used. - */ - @Bean - public WebThreadPoolService tomcatWebThreadPoolHandler(WebThreadPoolRunStateHandler webThreadPoolRunStateHandler) { - return new TomcatWebThreadPoolHandler1x(webThreadPoolRunStateHandler); - } - } - - /** - * Nested configuration if Jetty is being used. - */ - @Configuration - @ConditionalOnClass({Servlet.class, Server.class, Loader.class, WebAppContext.class}) - @ConditionalOnBean(WebThreadPoolRunStateHandler.class) - @ConditionalOnMissingBean(value = WebThreadPoolService.class, search = SearchStrategy.CURRENT) - static class EmbeddedJetty { - - @Bean - public WebThreadPoolService jettyWebThreadPoolHandler() { - return new JettyWebThreadPoolHandler1x(); - } - } - - /** - * Nested configuration if Undertow is being used. - */ - @Configuration - @ConditionalOnClass({Servlet.class, Undertow.class, SslClientAuthMode.class}) - @ConditionalOnBean(WebThreadPoolRunStateHandler.class) - @ConditionalOnMissingBean(value = WebThreadPoolService.class, search = SearchStrategy.CURRENT) - static class EmbeddedUndertow { - - @Bean - public WebThreadPoolService undertowWebThreadPoolHandler(WebThreadPoolRunStateHandler webThreadPoolRunStateHandler) { - return new UndertowWebThreadPoolHandler1x(webThreadPoolRunStateHandler); - } - } -} diff --git a/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/refresher/SpringBoot1xBootstrapConfigPropertiesBinderAdapter.java b/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/refresher/SpringBoot1xBootstrapConfigPropertiesBinderAdapter.java deleted file mode 100644 index f07dc976..00000000 --- a/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/refresher/SpringBoot1xBootstrapConfigPropertiesBinderAdapter.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot1x.starter.refresher; - -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.dynamic.api.BootstrapPropertiesInterface; -import cn.hippo4j.threadpool.dynamic.mode.config.refresher.BootstrapConfigPropertiesBinderAdapter; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.BeansException; -import org.springframework.beans.PropertyValues; -import org.springframework.beans.support.ResourceEditorRegistrar; -import org.springframework.boot.bind.CustomPropertyNamePatternsMatcher; -import org.springframework.boot.bind.RelaxedDataBinder; -import org.springframework.boot.bind.RelaxedNames; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.core.env.MapPropertySource; -import org.springframework.core.env.MutablePropertySources; - -import java.beans.PropertyDescriptor; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; - -/** - * Bootstrap core properties binder adapt. - */ -public class SpringBoot1xBootstrapConfigPropertiesBinderAdapter implements ApplicationContextAware, BootstrapConfigPropertiesBinderAdapter { - - private ApplicationContext applicationContext; - - /** - * Bootstrap core properties binder. - * - * @param configInfo config info - * @param bootstrapConfigProperties bootstrap config properties - * @return - */ - @Override - public BootstrapPropertiesInterface bootstrapCorePropertiesBinder(Map configInfo, BootstrapPropertiesInterface bootstrapConfigProperties) { - BootstrapConfigProperties bindableCoreProperties = new BootstrapConfigProperties(); - RelaxedNames relaxedNames = new RelaxedNames(BootstrapConfigProperties.PREFIX); - Set names = getNames(bindableCoreProperties, relaxedNames); - Map stringConfigInfo = new HashMap<>(configInfo.size()); - configInfo.forEach((key, value) -> stringConfigInfo.put(key.toString(), value)); - MapPropertySource test = new MapPropertySource("Hippo4j", stringConfigInfo); - MutablePropertySources propertySources = new MutablePropertySources(); - propertySources.addFirst(test); - PropertyValues propertyValues = CustomPropertyNamePatternsMatcher.getPropertySourcesPropertyValues(names, propertySources); - RelaxedDataBinder dataBinder = new RelaxedDataBinder(bindableCoreProperties, BootstrapConfigProperties.PREFIX); - dataBinder.setAutoGrowCollectionLimit(Integer.MAX_VALUE); - dataBinder.setIgnoreNestedProperties(false); - dataBinder.setIgnoreInvalidFields(false); - dataBinder.setIgnoreUnknownFields(true); - ResourceEditorRegistrar resourceEditorRegistrar = new ResourceEditorRegistrar(applicationContext, applicationContext.getEnvironment()); - resourceEditorRegistrar.registerCustomEditors(dataBinder); - dataBinder.bind(propertyValues); - return bindableCoreProperties; - } - - public static Set getNames(Object target, Iterable prefixes) { - Set names = new LinkedHashSet<>(); - if (target != null) { - PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(target.getClass()); - for (PropertyDescriptor descriptor : descriptors) { - String name = descriptor.getName(); - if (!"class".equals(name)) { - RelaxedNames relaxedNames = RelaxedNames.forCamelCase(name); - if (prefixes == null) { - for (String relaxedName : relaxedNames) { - names.add(relaxedName); - } - } else { - for (String prefix : prefixes) { - for (String relaxedName : relaxedNames) { - names.add(prefix + "." + relaxedName); - names.add(prefix + "_" + relaxedName); - } - } - } - } - } - } - return names; - } - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - this.applicationContext = applicationContext; - } -} diff --git a/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/web/AbstractWebThreadPoolService1x.java b/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/web/AbstractWebThreadPoolService1x.java deleted file mode 100644 index 19acda1e..00000000 --- a/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/web/AbstractWebThreadPoolService1x.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot1x.starter.web; - -import cn.hippo4j.adapter.web.AbstractWebThreadPoolService; -import cn.hippo4j.adapter.web.IWebThreadPoolHandlerSupport; -import cn.hippo4j.core.config.ApplicationContextHolder; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.embedded.EmbeddedServletContainer; -import org.springframework.boot.context.embedded.EmbeddedWebApplicationContext; - -/** - * Abstract class for adapting WebThreadPoolService to Spring 1.x version. - */ -@Slf4j -public abstract class AbstractWebThreadPoolService1x extends AbstractWebThreadPoolService { - - public AbstractWebThreadPoolService1x(IWebThreadPoolHandlerSupport support) { - super(support); - } - - private static final String STARTED_FIELD_NAME = "started"; - - /** - * Get the embedded Servlet container from the Spring application context. - */ - protected EmbeddedServletContainer getContainer() { - return ((EmbeddedWebApplicationContext) ApplicationContextHolder.getInstance()).getEmbeddedServletContainer(); - } - - /** - * Get the port from web container. - */ - @Override - public Integer getPort() { - return getContainer().getPort(); - } - -} diff --git a/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/web/jetty/JettyWebThreadPoolHandler1x.java b/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/web/jetty/JettyWebThreadPoolHandler1x.java deleted file mode 100644 index 4f300e2b..00000000 --- a/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/web/jetty/JettyWebThreadPoolHandler1x.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot1x.starter.web.jetty; - -import cn.hippo4j.adapter.web.jetty.JettyWebThreadPoolHandlerSupport; -import cn.hippo4j.config.springboot1x.starter.web.AbstractWebThreadPoolService1x; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainer; - -import java.util.concurrent.Executor; - -/** - * WebThreadPoolHandler compatible with Jetty container for Spring 1.x version. - */ -@Slf4j -public class JettyWebThreadPoolHandler1x extends AbstractWebThreadPoolService1x { - - public JettyWebThreadPoolHandler1x() { - super(new JettyWebThreadPoolHandlerSupport()); - } - - @Override - protected Executor getWebThreadPoolInternal() { - try { - return ((JettyEmbeddedServletContainer) getContainer()).getServer().getThreadPool(); - } catch (Throwable th) { - log.error("Failed to get Jetty thread pool.", th); - return null; - } - } - -} diff --git a/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/web/tomcat/TomcatWebThreadPoolHandler1x.java b/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/web/tomcat/TomcatWebThreadPoolHandler1x.java deleted file mode 100644 index 66dfa289..00000000 --- a/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/web/tomcat/TomcatWebThreadPoolHandler1x.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot1x.starter.web.tomcat; - -import cn.hippo4j.adapter.web.tomcat.TomcatWebThreadPoolHandlerSupport; -import cn.hippo4j.config.springboot1x.starter.web.AbstractWebThreadPoolService1x; -import cn.hippo4j.common.support.AbstractThreadPoolRuntime; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer; - -import java.util.concurrent.Executor; - -/** - * WebThreadPoolHandler compatible with Tomcat container for Spring 1.x version. - */ -@Slf4j -public class TomcatWebThreadPoolHandler1x extends AbstractWebThreadPoolService1x { - - public TomcatWebThreadPoolHandler1x(AbstractThreadPoolRuntime runtime) { - super(new TomcatWebThreadPoolHandlerSupport(runtime)); - } - - @Override - protected Executor getWebThreadPoolInternal() { - try { - return ((TomcatEmbeddedServletContainer) getContainer()) - .getTomcat().getConnector().getProtocolHandler().getExecutor(); - } catch (Throwable th) { - log.error("Failed to get Tomcat thread pool.", th); - return null; - } - } - -} diff --git a/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/web/undertow/UndertowWebThreadPoolHandler1x.java b/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/web/undertow/UndertowWebThreadPoolHandler1x.java deleted file mode 100644 index 4d10a79d..00000000 --- a/starters/threadpool/config-spring-boot-1x/src/main/java/cn/hippo4j/config/springboot1x/starter/web/undertow/UndertowWebThreadPoolHandler1x.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot1x.starter.web.undertow; - -import cn.hippo4j.adapter.web.undertow.UndertowWebThreadPoolHandlerSupport; -import cn.hippo4j.common.support.AbstractThreadPoolRuntime; -import cn.hippo4j.config.springboot1x.starter.web.AbstractWebThreadPoolService1x; -import io.undertow.Undertow; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.embedded.undertow.UndertowEmbeddedServletContainer; -import org.springframework.util.ReflectionUtils; - -import java.lang.reflect.Field; -import java.util.concurrent.Executor; - -/** - * WebThreadPoolHandler compatible with Undertow container for Spring 1.x version. - */ -@Slf4j -public class UndertowWebThreadPoolHandler1x extends AbstractWebThreadPoolService1x { - - private static final String UNDERTOW_NAME = "undertow"; - - public UndertowWebThreadPoolHandler1x(AbstractThreadPoolRuntime runtime) { - super(new UndertowWebThreadPoolHandlerSupport(runtime)); - } - - @Override - protected Executor getWebThreadPoolInternal() { - try { - UndertowEmbeddedServletContainer container = (UndertowEmbeddedServletContainer) getContainer(); - Field field = ReflectionUtils.findField(UndertowEmbeddedServletContainer.class, UNDERTOW_NAME); - ReflectionUtils.makeAccessible(field); - Undertow undertow = (Undertow) ReflectionUtils.getField(field, container); - return undertow.getWorker(); - } catch (Throwable th) { - log.error("Failed to get Undertow thread pool.", th); - return null; - } - } - -} diff --git a/starters/threadpool/config-spring-boot-1x/src/main/java/org/springframework/boot/bind/CustomPropertyNamePatternsMatcher.java b/starters/threadpool/config-spring-boot-1x/src/main/java/org/springframework/boot/bind/CustomPropertyNamePatternsMatcher.java deleted file mode 100644 index edf29a0d..00000000 --- a/starters/threadpool/config-spring-boot-1x/src/main/java/org/springframework/boot/bind/CustomPropertyNamePatternsMatcher.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.boot.bind; - -import org.springframework.beans.PropertyValues; -import org.springframework.core.env.MutablePropertySources; - -import java.util.Set; - -/** - * Custom property name patterns matcher. - */ -public class CustomPropertyNamePatternsMatcher { - - private static final char[] EXACT_DELIMITERS = {'_', '.', '['}; - - /** - * Get property sources property values. - * - * @param names - * @param propertySources - * @return - */ - public static PropertyValues getPropertySourcesPropertyValues(Set names, MutablePropertySources propertySources) { - PropertyNamePatternsMatcher includes = getPropertyNamePatternsMatcher(names); - return new PropertySourcesPropertyValues(propertySources, names, includes, true); - } - - private static PropertyNamePatternsMatcher getPropertyNamePatternsMatcher(Set names) { - return new DefaultPropertyNamePatternsMatcher(EXACT_DELIMITERS, true, names); - } -} diff --git a/starters/threadpool/config-spring-boot-1x/src/main/resources/META-INF/spring.factories b/starters/threadpool/config-spring-boot-1x/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 9c1405c6..00000000 --- a/starters/threadpool/config-spring-boot-1x/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,3 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - cn.hippo4j.config.springboot1x.starter.config.ConfigHandlerAutoConfiguration,\ - cn.hippo4j.config.springboot1x.starter.config.WebThreadPoolHandlerConfiguration1x \ No newline at end of file diff --git a/starters/threadpool/config/pom.xml b/starters/threadpool/config/pom.xml deleted file mode 100644 index e452e533..00000000 --- a/starters/threadpool/config/pom.xml +++ /dev/null @@ -1,142 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-starters - ${revision} - - hippo4j-threadpool-config-spring-boot-starter - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework - spring-web - - - cn.hippo4j - hippo4j-threadpool-core - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-message - ${project.version} - - - com.alibaba.nacos - nacos-client - true - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - true - - - com.ctrip.framework.apollo - apollo-client - true - - - org.springframework.cloud - spring-cloud-starter-consul-config - compile - true - - - org.apache.curator - curator-framework - true - - - io.etcd - jetcd-core - true - - - com.tencent.polaris - polaris-configuration-factory - true - - - com.tencent.polaris - router-rule - - - com.tencent.polaris - router-nearby - - - com.tencent.polaris - router-metadata - - - com.tencent.polaris - router-canary - - - com.tencent.polaris - router-set - - - com.tencent.polaris - router-isolated - - - com.tencent.polaris - router-healthy - - - io.grpc - grpc-all - - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - cn.hippo4j - hippo4j-threadpool-adapter-base - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-web - ${project.version} - - - cn.hippo4j - hippo4j-spring-boot-starter-monitor-local-log - ${project.version} - - - cn.hippo4j - hippo4j-spring-boot-starter-monitor-micrometer - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-dynamic-api - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-dynamic-mode-config - ${project.version} - - - diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/config/ConfigHandlerConfiguration.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/config/ConfigHandlerConfiguration.java deleted file mode 100644 index bdc0196e..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/config/ConfigHandlerConfiguration.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.config; - -import cn.hippo4j.config.springboot.starter.refresher.*; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.dynamic.mode.config.refresher.BootstrapConfigPropertiesBinderAdapter; -import com.alibaba.cloud.nacos.NacosConfigProperties; -import com.alibaba.nacos.api.config.ConfigService; -import com.tencent.polaris.configuration.api.core.ConfigFileService; -import io.etcd.jetcd.Client; -import lombok.RequiredArgsConstructor; -import org.apache.curator.framework.CuratorFramework; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.cloud.consul.config.ConsulConfigProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * Config handler configuration. - */ -@Configuration(proxyBeanMethods = false) -@ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, value = "enable", matchIfMissing = true, havingValue = "true") -public class ConfigHandlerConfiguration { - - private static final String NACOS_CONFIG_MANAGER_KEY = "com.alibaba.cloud.nacos.NacosConfigManager"; - - private static final String NACOS_INJECTED_BEAN_NAME = "com.alibaba.nacos.spring.beans.factory.annotation.AnnotationNacosInjectedBeanPostProcessor"; - - private static final String NACOS_DATA_ID_KEY = "nacos.data-id"; - - private static final String APOLLO_NAMESPACE_KEY = "apollo.namespace"; - - private static final String CONSUL_DATA_KEY = "consul.data-key"; - - private static final String ZOOKEEPER_CONNECT_STR_KEY = "zookeeper.zk-connect-str"; - - private static final String ETCD = "etcd.endpoints"; - - private static final String POLARIS = "config.serverConnector"; - - @Bean - @ConditionalOnMissingBean - public BootstrapConfigPropertiesBinderAdapter bootstrapConfigPropertiesBinderAdapter() { - return new DefaultBootstrapConfigPropertiesBinderAdapter(); - } - - /** - * Embedded Nacos - */ - @RequiredArgsConstructor - @ConditionalOnClass(value = ConfigService.class, name = NACOS_INJECTED_BEAN_NAME) - @ConditionalOnMissingClass(NACOS_CONFIG_MANAGER_KEY) - @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = NACOS_DATA_ID_KEY) - static class EmbeddedNacos { - - @Bean - public NacosRefresherHandler nacosRefresherHandler() { - return new NacosRefresherHandler(); - } - } - - /** - * Embedded Nacos Cloud - */ - @ConditionalOnClass(NacosConfigProperties.class) - @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = NACOS_DATA_ID_KEY) - static class EmbeddedNacosCloud { - - @Bean - public NacosCloudRefresherHandler nacosCloudRefresherHandler() { - return new NacosCloudRefresherHandler(); - } - } - - /** - * Embedded Apollo - */ - @ConditionalOnClass(com.ctrip.framework.apollo.ConfigService.class) - @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = APOLLO_NAMESPACE_KEY) - static class EmbeddedApollo { - - @Bean - public ApolloRefresherHandler apolloRefresher() { - return new ApolloRefresherHandler(); - } - } - - /** - * Embedded Consul - */ - @ConditionalOnClass(ConsulConfigProperties.class) - @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = CONSUL_DATA_KEY) - static class EmbeddedConsul { - - @Bean - public ConsulRefresherHandler consulRefresher() { - return new ConsulRefresherHandler(); - } - } - - /** - * Embedded Zookeeper - */ - @ConditionalOnClass(CuratorFramework.class) - @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = ZOOKEEPER_CONNECT_STR_KEY) - static class EmbeddedZookeeper { - - @Bean - public ZookeeperRefresherHandler zookeeperRefresher() { - return new ZookeeperRefresherHandler(); - } - } - - /** - * Embedded Etcd - */ - @ConditionalOnClass(Client.class) - @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = ETCD) - static class EmbeddedEtcd { - - @Bean - public EtcdRefresherHandler etcdRefresher() { - return new EtcdRefresherHandler(); - } - } - - /** - * Polaris - */ - @ConditionalOnClass(ConfigFileService.class) - @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = POLARIS) - static class Polaris { - - @Bean - public PolarisRefresherHandler polarisRefresher(ConfigFileService configFileService) { - return new PolarisRefresherHandler(configFileService); - } - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java deleted file mode 100644 index a00fe0fd..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.config; - -import cn.hippo4j.adapter.web.WebThreadPoolService; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.config.springboot.starter.notify.ConfigModeNotifyConfigBuilder; -import cn.hippo4j.config.springboot.starter.refresher.event.AdapterExecutorsRefreshListener; -import cn.hippo4j.config.springboot.starter.refresher.event.DynamicThreadPoolRefreshListener; -import cn.hippo4j.config.springboot.starter.refresher.event.PlatformsRefreshListener; -import cn.hippo4j.config.springboot.starter.refresher.event.WebExecutorRefreshListener; -import cn.hippo4j.config.springboot.starter.support.DynamicThreadPoolAdapterRegister; -import cn.hippo4j.config.springboot.starter.support.DynamicThreadPoolConfigService; -import cn.hippo4j.config.springboot.starter.support.DynamicThreadPoolPostProcessor; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.core.enable.MarkerConfiguration; -import cn.hippo4j.core.executor.handler.DynamicThreadPoolBannerHandler; -import cn.hippo4j.core.extension.initialize.Hippo4jDynamicThreadPoolInitializer; -import cn.hippo4j.threadpool.alarm.api.ThreadPoolCheckAlarm; -import cn.hippo4j.threadpool.alarm.handler.DefaultThreadPoolCheckAlarmHandler; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.message.api.NotifyConfigBuilder; -import cn.hippo4j.threadpool.message.core.service.AlarmControlHandler; -import cn.hippo4j.threadpool.message.core.service.DefaultThreadPoolConfigChangeHandler; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolBaseSendMessageService; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolSendMessageService; -import cn.hippo4j.threadpool.message.core.service.WebThreadPoolConfigChangeHandler; -import lombok.AllArgsConstructor; -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.info.BuildProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.DependsOn; -import org.springframework.context.annotation.Import; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; - -/** - * Dynamic thread-pool auto-configuration. - * - *

NOTE: - * {@code cn.hippo4j.config.springboot.starter.config.DynamicThreadPoolAutoConfiguration} is used in the - * hippo4j-spring-boot-starter-adapter-hystrix module to determine the condition, see - * {@code cn.hippo4j.springboot.starter.adapter.hystrix.HystrixAdapterAutoConfiguration}, please - * note the subsequent modification. - */ -@Configuration -@AllArgsConstructor -@ConditionalOnBean(MarkerConfiguration.Marker.class) -@EnableConfigurationProperties(SpringBootstrapConfigProperties.class) -@Import(ConfigHandlerConfiguration.class) -@ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, value = "enable", matchIfMissing = true, havingValue = "true") -public class DynamicThreadPoolAutoConfiguration { - - private final BootstrapConfigProperties bootstrapConfigProperties; - - @Bean - @ConditionalOnMissingBean - @Order(Ordered.HIGHEST_PRECEDENCE) - public ApplicationContextHolder hippo4jApplicationContextHolder() { - return new ApplicationContextHolder(); - } - - @Bean - public NotifyConfigBuilder notifyConfigBuilder(AlarmControlHandler alarmControlHandler, WebThreadPoolService webThreadPoolService) { - return new ConfigModeNotifyConfigBuilder(alarmControlHandler, bootstrapConfigProperties, webThreadPoolService); - } - - @Bean - @ConditionalOnMissingBean - public ThreadPoolCheckAlarm defaultThreadPoolCheckAlarmHandler(ThreadPoolSendMessageService hippo4jSendMessageService) { - return new DefaultThreadPoolCheckAlarmHandler(hippo4jSendMessageService); - } - - @Bean - @ConditionalOnMissingBean - public DefaultThreadPoolConfigChangeHandler defaultThreadPoolConfigChangeHandler(ThreadPoolSendMessageService hippo4jSendMessageService) { - return new DefaultThreadPoolConfigChangeHandler(hippo4jSendMessageService); - } - - @Bean - @ConditionalOnMissingBean - public WebThreadPoolConfigChangeHandler webThreadPoolConfigChangeHandler(BootstrapConfigProperties bootstrapConfigProperties, - WebThreadPoolService webThreadPoolService, - ThreadPoolSendMessageService hippo4jSendMessageService) { - if (bootstrapConfigProperties.getWeb() != null && StringUtil.isBlank(bootstrapConfigProperties.getWeb().getThreadPoolId())) { - bootstrapConfigProperties.getWeb().setThreadPoolId(webThreadPoolService.getWebContainerType().getName()); - } - return new WebThreadPoolConfigChangeHandler(hippo4jSendMessageService); - } - - @Bean - @DependsOn("hippo4jApplicationContextHolder") - public DynamicThreadPoolPostProcessor dynamicThreadPoolPostProcessor() { - return new DynamicThreadPoolPostProcessor(bootstrapConfigProperties); - } - - @Bean - @SuppressWarnings("all") - public DynamicThreadPoolRefreshListener hippo4jExecutorsListener(DefaultThreadPoolConfigChangeHandler threadPoolConfigChange, - ConfigModeNotifyConfigBuilder configModeNotifyConfigBuilder, - ThreadPoolBaseSendMessageService threadPoolBaseSendMessageService) { - return new DynamicThreadPoolRefreshListener(threadPoolConfigChange, configModeNotifyConfigBuilder, threadPoolBaseSendMessageService); - } - - @Bean - public AdapterExecutorsRefreshListener hippo4jAdapterExecutorsListener(DynamicThreadPoolAdapterRegister dynamicThreadPoolAdapterRegister) { - return new AdapterExecutorsRefreshListener(dynamicThreadPoolAdapterRegister); - } - - @Bean - public PlatformsRefreshListener hippo4jPlatformsListener() { - return new PlatformsRefreshListener(); - } - - @Bean - @SuppressWarnings("all") - public WebExecutorRefreshListener hippo4jWebExecutorListener(WebThreadPoolConfigChangeHandler threadPoolConfigChange) { - return new WebExecutorRefreshListener(threadPoolConfigChange); - } - - @Bean - public DynamicThreadPoolAdapterRegister threadPoolAdapterRegister() { - return new DynamicThreadPoolAdapterRegister(bootstrapConfigProperties); - } - - @Bean - public DynamicThreadPoolBannerHandler threadPoolBannerHandler(ObjectProvider buildProperties) { - return new DynamicThreadPoolBannerHandler(bootstrapConfigProperties, buildProperties.getIfAvailable()); - } - - @Bean - public DynamicThreadPoolConfigService dynamicThreadPoolConfigService() { - return new DynamicThreadPoolConfigService(); - } - - @Bean - public Hippo4jDynamicThreadPoolInitializer hippo4jDynamicThreadPoolInitializer() { - return new Hippo4jDynamicThreadPoolInitializer(); - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/config/MonitorConfiguration.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/config/MonitorConfiguration.java deleted file mode 100644 index 8eceb023..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/config/MonitorConfiguration.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.config; - -import cn.hippo4j.config.springboot.starter.monitor.ThreadPoolMonitorExecutor; -import cn.hippo4j.core.enable.MarkerConfiguration; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import lombok.AllArgsConstructor; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@AllArgsConstructor -@EnableConfigurationProperties(SpringBootstrapConfigProperties.class) -public class MonitorConfiguration { - - private final BootstrapConfigProperties bootstrapConfigProperties; - - @Bean - public ThreadPoolMonitorExecutor hippo4jDynamicThreadPoolMonitorExecutor() { - return new ThreadPoolMonitorExecutor(bootstrapConfigProperties); - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/config/SpringBootstrapConfigProperties.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/config/SpringBootstrapConfigProperties.java deleted file mode 100644 index 5c99b900..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/config/SpringBootstrapConfigProperties.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.config; - -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * Spring bootstrap core properties. - */ -@ConfigurationProperties(prefix = BootstrapConfigProperties.PREFIX) -public class SpringBootstrapConfigProperties extends BootstrapConfigProperties { -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/monitor/ThreadPoolMonitorExecutor.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/monitor/ThreadPoolMonitorExecutor.java deleted file mode 100644 index 8cdec513..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/monitor/ThreadPoolMonitorExecutor.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.monitor; - -import cn.hippo4j.common.executor.ThreadFactoryBuilder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.extension.spi.ServiceLoaderRegistry; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.MonitorProperties; -import cn.hippo4j.threadpool.monitor.api.ThreadPoolMonitor; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * Thread-pool monitor executor. - */ -@Slf4j -@RequiredArgsConstructor -public class ThreadPoolMonitorExecutor implements ApplicationRunner, DisposableBean { - - private final BootstrapConfigProperties properties; - - private ScheduledThreadPoolExecutor collectScheduledExecutor; - - private List threadPoolMonitors; - - static { - ServiceLoaderRegistry.register(ThreadPoolMonitor.class); - } - - @Override - public void run(ApplicationArguments args) throws Exception { - MonitorProperties monitor = properties.getMonitor(); - if (monitor == null - || !monitor.getEnable() - || StringUtil.isBlank(monitor.getThreadPoolTypes()) - || StringUtil.isBlank(monitor.getCollectTypes())) { - return; - } - log.info("Start monitoring the running status of dynamic thread pool."); - threadPoolMonitors = new ArrayList<>(); - collectScheduledExecutor = new ScheduledThreadPoolExecutor( - 1, - ThreadFactoryBuilder.builder().daemon(true).prefix("client.scheduled.collect.data").build()); - // Get dynamic thread pool monitoring component. - List collectTypes = Arrays.asList(monitor.getCollectTypes().split(",")); - ApplicationContextHolder.getBeansOfType(ThreadPoolMonitor.class).forEach((beanName, bean) -> threadPoolMonitors.add(bean)); - Collection dynamicThreadPoolMonitors = - ServiceLoaderRegistry.getSingletonServiceInstances(ThreadPoolMonitor.class); - dynamicThreadPoolMonitors.stream().filter(each -> collectTypes.contains(each.getType())).forEach(each -> threadPoolMonitors.add(each)); - // Execute dynamic thread pool monitoring component. - collectScheduledExecutor.scheduleWithFixedDelay( - this::scheduleRunnable, - monitor.getInitialDelay(), - monitor.getCollectInterval(), - TimeUnit.MILLISECONDS); - if (ThreadPoolExecutorRegistry.getThreadPoolExecutorSize() > 0) { - log.info("Dynamic thread pool: [{}]. The dynamic thread pool starts data collection and reporting.", ThreadPoolExecutorRegistry.getThreadPoolExecutorSize()); - } - } - - private void scheduleRunnable() { - for (ThreadPoolMonitor each : threadPoolMonitors) { - try { - each.collect(); - } catch (Exception ex) { - log.error("Error monitoring the running status of dynamic thread pool. Type: {}", each.getType(), ex); - } - } - } - - @Override - public void destroy() throws Exception { - Optional.ofNullable(collectScheduledExecutor).ifPresent(ScheduledThreadPoolExecutor::shutdown); - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/notify/ConfigModeNotifyConfigBuilder.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/notify/ConfigModeNotifyConfigBuilder.java deleted file mode 100644 index 3bc9b193..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/notify/ConfigModeNotifyConfigBuilder.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.notify; - -import cn.hippo4j.adapter.web.WebThreadPoolService; -import cn.hippo4j.common.api.IExecutorProperties; -import cn.hippo4j.common.model.executor.ExecutorNotifyProperties; -import cn.hippo4j.common.model.executor.ExecutorProperties; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.NotifyPlatformProperties; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.WebExecutorProperties; -import cn.hippo4j.threadpool.message.api.NotifyConfigBuilder; -import cn.hippo4j.threadpool.message.api.NotifyConfigDTO; -import cn.hippo4j.threadpool.message.core.service.AlarmControlHandler; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * Config mode notify config builder. - */ -@AllArgsConstructor -@Slf4j -public class ConfigModeNotifyConfigBuilder implements NotifyConfigBuilder { - - private final AlarmControlHandler alarmControlHandler; - - private final BootstrapConfigProperties configProperties; - - private final WebThreadPoolService webThreadPoolService; - - private static final int DEFAULT_INTERVAL = 5; - - @Override - public Map> buildNotify() { - Map> resultMap = new HashMap<>(); - boolean globalAlarm = Optional.ofNullable(configProperties.getDefaultExecutor()) - .map(ExecutorProperties::getAlarm) - .orElse(true); - List executors = configProperties.getExecutors(); - if (CollectionUtil.isEmpty(executors)) { - log.warn("Failed to build notify, executors configuration is empty."); - return resultMap; - } - List actual = executors.stream() - .filter(each -> Optional.ofNullable(each.getAlarm()) - .orElse(false)) - .collect(Collectors.toList()); - if (!globalAlarm && CollectionUtil.isEmpty(actual)) { - return resultMap; - } - for (ExecutorProperties executorProperties : executors) { - Map> buildSingleNotifyConfig = buildSingleNotifyConfig(executorProperties); - initCacheAndLock(buildSingleNotifyConfig); - resultMap.putAll(buildSingleNotifyConfig); - } - // register notify config for web - WebExecutorProperties webProperties = configProperties.getWeb(); - if (webProperties == null) { - return resultMap; - } - if (StringUtil.isBlank(webProperties.getThreadPoolId())) { - webProperties.setThreadPoolId(webThreadPoolService.getWebContainerType().getName()); - } - Map> webSingleNotifyConfigMap = - buildSingleNotifyConfig(webProperties); - initCacheAndLock(webSingleNotifyConfigMap); - resultMap.putAll(webSingleNotifyConfigMap); - - return resultMap; - } - - /** - * Build single notify config. - * - * @param executorProperties - * @return - */ - public Map> buildSingleNotifyConfig(IExecutorProperties executorProperties) { - String threadPoolId = executorProperties.getThreadPoolId(); - Map> resultMap = new HashMap<>(); - String alarmBuildKey = threadPoolId + "+ALARM"; - List alarmNotifyConfigs = new ArrayList<>(); - List notifyPlatforms = configProperties.getNotifyPlatforms(); - for (NotifyPlatformProperties platformProperties : notifyPlatforms) { - NotifyConfigDTO notifyConfig = new NotifyConfigDTO(); - notifyConfig.setPlatform(platformProperties.getPlatform()); - notifyConfig.setTpId(threadPoolId); - notifyConfig.setType("ALARM"); - notifyConfig.setSecret(platformProperties.getSecret()); - notifyConfig.setSecretKey(getToken(platformProperties)); - notifyConfig.setInterval(buildInterval(executorProperties)); - notifyConfig.setReceives(buildReceive(executorProperties)); - alarmNotifyConfigs.add(notifyConfig); - } - resultMap.put(alarmBuildKey, alarmNotifyConfigs); - String changeBuildKey = threadPoolId + "+CONFIG"; - List changeNotifyConfigs = new ArrayList<>(); - for (NotifyPlatformProperties platformProperties : notifyPlatforms) { - NotifyConfigDTO notifyConfig = new NotifyConfigDTO(); - notifyConfig.setPlatform(platformProperties.getPlatform()); - notifyConfig.setTpId(threadPoolId); - notifyConfig.setType("CONFIG"); - notifyConfig.setSecretKey(getToken(platformProperties)); - notifyConfig.setSecret(platformProperties.getSecret()); - notifyConfig.setReceives(buildReceive(executorProperties)); - changeNotifyConfigs.add(notifyConfig); - } - resultMap.put(changeBuildKey, changeNotifyConfigs); - return resultMap; - } - - public void initCacheAndLock(Map> buildSingleNotifyConfig) { - buildSingleNotifyConfig.forEach( - (key, val) -> val.stream() - .filter(each -> Objects.equals("ALARM", each.getType())) - .forEach(each -> alarmControlHandler.initCacheAndLock(each.getTpId(), each.getPlatform(), each.getInterval()))); - } - - private int buildInterval(IExecutorProperties executorProperties) { - return Optional.ofNullable(executorProperties.getNotify()) - .map(ExecutorNotifyProperties::getInterval) - .orElse(Optional.ofNullable(configProperties.getDefaultExecutor()) - .map(ExecutorProperties::getNotify) - .map(ExecutorNotifyProperties::getInterval) - .orElse(DEFAULT_INTERVAL)); - } - - private String buildReceive(IExecutorProperties executorProperties) { - return Optional.ofNullable(executorProperties.getNotify()) - .map(ExecutorNotifyProperties::getReceives) - .orElse(Optional.ofNullable(configProperties.getDefaultExecutor()) - .map(ExecutorProperties::getNotify) - .map(ExecutorNotifyProperties::getReceives).orElse("")); - } - - private String getToken(NotifyPlatformProperties platformProperties) { - return StringUtil.isNotBlank(platformProperties.getToken()) ? platformProperties.getToken() : platformProperties.getSecretKey(); - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/AbstractConfigThreadPoolDynamicRefresh.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/AbstractConfigThreadPoolDynamicRefresh.java deleted file mode 100644 index b956d617..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/AbstractConfigThreadPoolDynamicRefresh.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher; - -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.config.springboot.starter.refresher.event.ThreadPoolConfigDynamicRefreshEvent; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import cn.hippo4j.threadpool.dynamic.api.BootstrapPropertiesInterface; -import cn.hippo4j.threadpool.dynamic.api.ThreadPoolDynamicRefresh; -import cn.hippo4j.threadpool.dynamic.mode.config.parser.ConfigParserHandler; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.dynamic.mode.config.refresher.BootstrapConfigPropertiesBinderAdapter; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ExecutorService; - -/** - * Abstract config thread-pool dynamic refresh. - */ -@Slf4j -public abstract class AbstractConfigThreadPoolDynamicRefresh implements ThreadPoolDynamicRefresh, ApplicationRunner { - - private final BootstrapConfigPropertiesBinderAdapter bootstrapConfigPropertiesBinderAdapter; - protected BootstrapPropertiesInterface bootstrapConfigProperties; - - protected final ExecutorService dynamicRefreshExecutorService = ThreadPoolBuilder.builder().singlePool("client.dynamic.refresh").build(); - - public AbstractConfigThreadPoolDynamicRefresh() { - bootstrapConfigProperties = ApplicationContextHolder.getBean(BootstrapPropertiesInterface.class); - bootstrapConfigPropertiesBinderAdapter = ApplicationContextHolder.getBean(BootstrapConfigPropertiesBinderAdapter.class); - } - - @Override - public void dynamicRefresh(String configContent) { - dynamicRefresh(configContent, new HashMap<>()); - } - - @Override - public void dynamicRefresh(String configContent, Map newValueChangeMap) { - try { - BootstrapConfigProperties actualBootstrapConfigProperties = (BootstrapConfigProperties) bootstrapConfigProperties; - Map configInfo = ConfigParserHandler.getInstance().parseConfig(configContent, actualBootstrapConfigProperties.getConfigFileType()); - if (CollectionUtil.isNotEmpty(newValueChangeMap)) { - Optional.ofNullable(configInfo).ifPresent(each -> each.putAll(newValueChangeMap)); - } - BootstrapPropertiesInterface binderCoreProperties = bootstrapConfigPropertiesBinderAdapter.bootstrapCorePropertiesBinder(configInfo, bootstrapConfigProperties); - publishDynamicThreadPoolEvent((BootstrapConfigProperties) binderCoreProperties); - } catch (Exception ex) { - log.error("Hippo4j config mode dynamic refresh failed.", ex); - } - } - - private void publishDynamicThreadPoolEvent(BootstrapConfigProperties configProperties) { - ApplicationContextHolder.getInstance().publishEvent(new ThreadPoolConfigDynamicRefreshEvent(this, configProperties)); - } - - @Override - public void run(ApplicationArguments args) { - try { - registerListener(); - } catch (Exception ex) { - log.error("Hippo4j failed to initialize register listener.", ex); - } - try { - publishDynamicThreadPoolEvent((BootstrapConfigProperties) bootstrapConfigProperties); - } catch (Exception ex) { - log.error("Hippo4j failed to initialize update configuration.", ex); - } - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/ApolloRefresherHandler.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/ApolloRefresherHandler.java deleted file mode 100644 index ff839d6e..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/ApolloRefresherHandler.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher; - -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import com.ctrip.framework.apollo.Config; -import com.ctrip.framework.apollo.ConfigChangeListener; -import com.ctrip.framework.apollo.ConfigFile; -import com.ctrip.framework.apollo.ConfigService; -import com.ctrip.framework.apollo.core.enums.ConfigFileFormat; -import com.ctrip.framework.apollo.model.ConfigChange; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; - -import java.util.HashMap; -import java.util.Map; - -/** - * Apollo refresher handler. - */ -@Slf4j -public class ApolloRefresherHandler extends AbstractConfigThreadPoolDynamicRefresh { - - private static final String APOLLO_PROPERTY = "${spring.dynamic.thread-pool.apollo.namespace:application}"; - - @Value(APOLLO_PROPERTY) - private String namespace; - - @Override - public void registerListener() { - String[] apolloNamespaces = this.namespace.split(","); - this.namespace = apolloNamespaces[0]; - BootstrapConfigProperties actualBootstrapConfigProperties = (BootstrapConfigProperties) bootstrapConfigProperties; - Config config = ConfigService.getConfig(String.format("%s.%s", namespace, actualBootstrapConfigProperties.getConfigFileType().getValue())); - ConfigChangeListener configChangeListener = configChangeEvent -> { - String namespace = this.namespace.replaceAll("." + actualBootstrapConfigProperties.getConfigFileType().getValue(), ""); - ConfigFileFormat configFileFormat = ConfigFileFormat.fromString(actualBootstrapConfigProperties.getConfigFileType().getValue()); - ConfigFile configFile = ConfigService.getConfigFile(namespace, configFileFormat); - Map newChangeValueMap = new HashMap<>(); - configChangeEvent.changedKeys().stream().filter(each -> each.contains(BootstrapConfigProperties.PREFIX)).forEach(each -> { - ConfigChange change = configChangeEvent.getChange(each); - String newValue = change.getNewValue(); - newChangeValueMap.put(each, newValue); - }); - dynamicRefresh(configFile.getContent(), newChangeValueMap); - }; - config.addChangeListener(configChangeListener); - log.info("Dynamic thread pool refresher, add apollo listener success. namespace: {}", namespace); - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/ConsulRefresherHandler.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/ConsulRefresherHandler.java deleted file mode 100644 index 0f0dd23b..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/ConsulRefresherHandler.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher; - -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang.StringUtils; -import org.springframework.boot.env.OriginTrackedMapPropertySource; -import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext; -import org.springframework.cloud.bootstrap.config.BootstrapPropertySource; -import org.springframework.cloud.consul.config.ConsulPropertySource; -import org.springframework.cloud.context.environment.EnvironmentChangeEvent; -import org.springframework.context.event.EventListener; -import org.springframework.core.env.AbstractEnvironment; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * Consul refresher handler. - */ -@Slf4j -public class ConsulRefresherHandler extends AbstractConfigThreadPoolDynamicRefresh { - - private static final int INITIAL_CAPACITY = 64; - - private static final String DEFAULT_CONTEXT = "spring.cloud.consul.config.default-context"; - - @EventListener(EnvironmentChangeEvent.class) - public void refreshed(EnvironmentChangeEvent event) { - Map configInfo = extractLatestConfigInfo(event); - dynamicRefresh(StringUtils.EMPTY, configInfo); - } - - private Map extractLatestConfigInfo(EnvironmentChangeEvent event) { - AbstractEnvironment environment = (AbstractEnvironment) ((AnnotationConfigServletWebServerApplicationContext) event.getSource()).getEnvironment(); - String activeProfile = Optional.ofNullable(environment.getActiveProfiles().length > 0 ? environment.getActiveProfiles()[0] : null) - .orElseGet(() -> String.valueOf(getApplicationConfigDefaultContext(environment))); - List> bootstrapPropertySourceList = environment.getPropertySources().stream() - .filter(propertySource -> propertySource instanceof BootstrapPropertySource) - .map(propertySource -> (BootstrapPropertySource) propertySource).collect(Collectors.toList()); - Optional> bootstrapPropertySource = bootstrapPropertySourceList.stream() - .filter(source -> source.getName().contains(activeProfile) && source.getPropertyNames().length != 0).findFirst(); - Map configInfo = new HashMap<>(INITIAL_CAPACITY); - if (bootstrapPropertySource.isPresent()) { - ConsulPropertySource consulPropertySource = (ConsulPropertySource) bootstrapPropertySource.get().getDelegate(); - String[] propertyNames = consulPropertySource.getPropertyNames(); - for (String propertyName : propertyNames) { - configInfo.put(propertyName, consulPropertySource.getProperty(propertyName)); - } - } - return configInfo; - } - - private CharSequence getApplicationConfigDefaultContext(AbstractEnvironment environment) { - return environment.getPropertySources().stream() - .filter(propertySource -> propertySource instanceof OriginTrackedMapPropertySource) - .map(propertySource -> ((Map) propertySource.getSource()).get(DEFAULT_CONTEXT)) - .findFirst().orElse(StringUtils.EMPTY); - } - - @Override - public void registerListener() { - // The listener has been registered by annotation. - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/DefaultBootstrapConfigPropertiesBinderAdapter.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/DefaultBootstrapConfigPropertiesBinderAdapter.java deleted file mode 100644 index af40d3e2..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/DefaultBootstrapConfigPropertiesBinderAdapter.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher; - -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.dynamic.api.BootstrapPropertiesInterface; -import cn.hippo4j.threadpool.dynamic.mode.config.refresher.BootstrapConfigPropertiesBinderAdapter; -import org.springframework.boot.context.properties.bind.Bindable; -import org.springframework.boot.context.properties.bind.Binder; -import org.springframework.boot.context.properties.source.ConfigurationPropertySource; -import org.springframework.boot.context.properties.source.MapConfigurationPropertySource; - -import java.util.Map; - -/** - * Bootstrap core properties binder adapt. - */ -public class DefaultBootstrapConfigPropertiesBinderAdapter implements BootstrapConfigPropertiesBinderAdapter { - - /** - * Bootstrap core properties binder. - * - * @param configInfo - * @param bootstrapConfigProperties - * @return - */ - @Override - public BootstrapPropertiesInterface bootstrapCorePropertiesBinder(Map configInfo, BootstrapPropertiesInterface bootstrapConfigProperties) { - ConfigurationPropertySource sources = new MapConfigurationPropertySource(configInfo); - Binder binder = new Binder(sources); - return binder.bind(BootstrapConfigProperties.PREFIX, Bindable.ofInstance(bootstrapConfigProperties)).get(); - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/EtcdRefresherHandler.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/EtcdRefresherHandler.java deleted file mode 100644 index 004c1f12..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/EtcdRefresherHandler.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher; - -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import io.etcd.jetcd.ByteSequence; -import io.etcd.jetcd.Client; -import io.etcd.jetcd.ClientBuilder; -import io.etcd.jetcd.KeyValue; -import io.etcd.jetcd.Watch; -import io.etcd.jetcd.kv.GetResponse; -import io.etcd.jetcd.watch.WatchEvent; -import io.etcd.jetcd.watch.WatchResponse; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.ExecutionException; - -/** - * Etcd refresher handler. - */ -@Slf4j -public class EtcdRefresherHandler extends AbstractConfigThreadPoolDynamicRefresh { - - private Client client; - - private static final String ENDPOINTS = "endpoints"; - - private static final String USER = "user"; - - private static final String PASSWORD = "password"; - - private static final String CHARSET = "charset"; - - private static final String AUTHORITY = "authority"; - - private static final String KEY = "key"; - - @SneakyThrows(value = {InterruptedException.class, ExecutionException.class}) - @Override - public void registerListener() { - BootstrapConfigProperties actualBootstrapConfigProperties = (BootstrapConfigProperties) bootstrapConfigProperties; - Map etcd = actualBootstrapConfigProperties.getEtcd(); - String key = etcd.get(KEY); - Charset charset = StringUtil.isBlank(etcd.get(CHARSET)) ? StandardCharsets.UTF_8 : Charset.forName(etcd.get(CHARSET)); - initClient(etcd, charset); - GetResponse getResponse = client.getKVClient().get(ByteSequence.from(key, charset)).get(); - KeyValue keyValue = getResponse.getKvs().get(0); - if (Objects.isNull(keyValue)) { - return; - } - client.getWatchClient().watch(ByteSequence.from(key, charset), new Watch.Listener() { - - @Override - public void onNext(WatchResponse response) { - WatchEvent watchEvent = response.getEvents().get(0); - WatchEvent.EventType eventType = watchEvent.getEventType(); - if (Objects.equals(eventType, WatchEvent.EventType.PUT)) { - KeyValue keyValue1 = watchEvent.getKeyValue(); - String value = keyValue1.getValue().toString(charset); - dynamicRefresh(value); - } - } - - @Override - public void onError(Throwable throwable) { - log.error("Dynamic thread pool etcd config watcher exception ", throwable); - } - - @Override - public void onCompleted() { - log.info("Dynamic thread pool etcd config key refreshed, config key {}", key); - } - }); - } - - /** - * if client is null, init it - * - * @param etcd etcd configuration item - * @param charset charset - */ - private void initClient(Map etcd, Charset charset) { - if (Objects.isNull(client)) { - String user = etcd.get(USER); - String password = etcd.get(PASSWORD); - String authority = etcd.get(AUTHORITY); - String endpoints = etcd.get(ENDPOINTS); - ClientBuilder clientBuilder = Client.builder().endpoints(endpoints.split(",")); - client = StringUtil.isAllNotEmpty(user, password) ? clientBuilder.user(ByteSequence.from(user, charset)) - .password(ByteSequence.from(password, charset)).authority(authority) - .build() : clientBuilder.build(); - } - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/NacosCloudRefresherHandler.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/NacosCloudRefresherHandler.java deleted file mode 100644 index 9dcd2eef..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/NacosCloudRefresherHandler.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher; - -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.core.config.ApplicationContextHolder; -import com.alibaba.cloud.nacos.NacosConfigProperties; -import com.alibaba.nacos.api.config.ConfigService; -import com.alibaba.nacos.api.config.listener.Listener; -import com.alibaba.nacos.api.exception.NacosException; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -import java.util.Map; -import java.util.concurrent.Executor; - -/** - * Nacos cloud refresher handler. - */ -@Slf4j -public class NacosCloudRefresherHandler extends AbstractConfigThreadPoolDynamicRefresh { - - static final String DATA_ID = "data-id"; - - static final String GROUP = "group"; - - private final ConfigService configService; - - public NacosCloudRefresherHandler() { - configService = ApplicationContextHolder.getBean(NacosConfigProperties.class).configServiceInstance(); - } - - @SneakyThrows(NacosException.class) - @Override - public void registerListener() { - BootstrapConfigProperties actualBootstrapConfigProperties = (BootstrapConfigProperties) bootstrapConfigProperties; - Map nacosConfig = actualBootstrapConfigProperties.getNacos(); - configService.addListener(nacosConfig.get(DATA_ID), - nacosConfig.get(GROUP), new Listener() { - - @Override - public Executor getExecutor() { - return dynamicRefreshExecutorService; - } - - @Override - public void receiveConfigInfo(String configInfo) { - dynamicRefresh(configInfo); - } - }); - log.info("Dynamic thread pool refresher, add nacos cloud listener success. data-id: {}, group: {}", nacosConfig.get(DATA_ID), nacosConfig.get(GROUP)); - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/NacosRefresherHandler.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/NacosRefresherHandler.java deleted file mode 100644 index 88e53aae..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/NacosRefresherHandler.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher; - -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import com.alibaba.nacos.api.annotation.NacosInjected; -import com.alibaba.nacos.api.config.ConfigService; -import com.alibaba.nacos.api.config.listener.Listener; -import com.alibaba.nacos.api.exception.NacosException; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -import java.util.Map; -import java.util.concurrent.Executor; - -/** - * Nacos refresher handler. - */ -@Slf4j -public class NacosRefresherHandler extends AbstractConfigThreadPoolDynamicRefresh { - - static final String DATA_ID = "data-id"; - - static final String GROUP = "group"; - - @NacosInjected - private ConfigService configService; - - public NacosRefresherHandler() { - super(); - } - - @SneakyThrows(NacosException.class) - @Override - public void registerListener() { - BootstrapConfigProperties actualBootstrapConfigProperties = (BootstrapConfigProperties) bootstrapConfigProperties; - Map nacosConfig = actualBootstrapConfigProperties.getNacos(); - configService.addListener(nacosConfig.get(DATA_ID), nacosConfig.get(GROUP), - new Listener() { - - @Override - public Executor getExecutor() { - return dynamicRefreshExecutorService; - } - - @Override - public void receiveConfigInfo(String configInfo) { - dynamicRefresh(configInfo); - } - }); - log.info("Dynamic thread pool refresher, add nacos listener success. data-id: {}, group: {}", nacosConfig.get(DATA_ID), nacosConfig.get(GROUP)); - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/PolarisRefresherHandler.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/PolarisRefresherHandler.java deleted file mode 100644 index b06b4ebf..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/PolarisRefresherHandler.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher; - -import com.tencent.polaris.configuration.api.core.ConfigFileService; -import com.tencent.polaris.configuration.api.core.ConfigKVFile; -import com.tencent.polaris.configuration.api.core.ConfigKVFileChangeListener; -import com.tencent.polaris.configuration.api.core.ConfigPropertyChangeInfo; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -/** - * Polaris refresher handler. - */ -@RequiredArgsConstructor -public class PolarisRefresherHandler extends AbstractConfigThreadPoolDynamicRefresh { - - private final ConfigFileService configFileService; - - private static final String POLARIS_NAMESPACE = "${spring.dynamic.thread-pool.polaris.namespace:dev}"; - - private static final String POLARIS_FILE_GROUP = "${spring.dynamic.thread-pool.polaris.file.group:dynamic}"; - - private static final String POLARIS_FILE_NAME = "${spring.dynamic.thread-pool.polaris.file.name:root/bootstrap.yaml}"; - - private static final String POLARIS_FILE_TYPE = "${spring.dynamic.thread-pool.polaris.file.type:properties}"; - - @Value(POLARIS_NAMESPACE) - private String namespace; - - @Value(POLARIS_FILE_GROUP) - private String fileGroup; - - @Value(POLARIS_FILE_NAME) - private String fileName; - - @Override - public void registerListener() { - ConfigKVFile configFile = getConfigKVFile(); - configFile.addChangeListener((ConfigKVFileChangeListener) event -> { - String content = configFile.getContent(); - Map newChangeValueMap = new HashMap<>(); - for (String key : event.changedKeys()) { - ConfigPropertyChangeInfo changeInfo = event.getChangeInfo(key); - newChangeValueMap.put(key, changeInfo.getNewValue()); - } - dynamicRefresh(content, newChangeValueMap); - }); - } - - private ConfigKVFile getConfigKVFile() { - return Objects.equals(POLARIS_FILE_TYPE, "yaml") ? configFileService.getConfigYamlFile(namespace, fileGroup, fileName) - : configFileService.getConfigPropertiesFile(namespace, fileGroup, fileName); - } - -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/ZookeeperRefresherHandler.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/ZookeeperRefresherHandler.java deleted file mode 100644 index b83fc2eb..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/ZookeeperRefresherHandler.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher; - -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.message.core.service.GlobalNotifyAlarmManage; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolNotifyAlarm; -import lombok.extern.slf4j.Slf4j; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.framework.api.CuratorListener; -import org.apache.curator.framework.api.GetChildrenBuilder; -import org.apache.curator.framework.api.GetDataBuilder; -import org.apache.curator.framework.state.ConnectionState; -import org.apache.curator.framework.state.ConnectionStateListener; -import org.apache.curator.retry.ExponentialBackoffRetry; -import org.apache.curator.utils.ZKPaths; -import org.apache.zookeeper.WatchedEvent; - -import java.nio.charset.StandardCharsets; -import java.util.List; -import java.util.Map; - -/** - * Zookeeper refresher handler. - */ -@Slf4j -public class ZookeeperRefresherHandler extends AbstractConfigThreadPoolDynamicRefresh { - - private static final String ZK_CONNECT_STR = "zk-connect-str"; - - private static final String ROOT_NODE = "root-node"; - - private static final String CONFIG_VERSION = "config-version"; - - private static final String NODE = "node"; - - private CuratorFramework curatorFramework; - - private static final int BASE_SLEEP_TIME_MS = 1000; - - private static final int MAX_RETRIES = 3; - - @Override - public void registerListener() { - BootstrapConfigProperties actualBootstrapConfigProperties = (BootstrapConfigProperties) bootstrapConfigProperties; - Map zkConfigs = actualBootstrapConfigProperties.getZookeeper(); - curatorFramework = CuratorFrameworkFactory.newClient(zkConfigs.get(ZK_CONNECT_STR), - new ExponentialBackoffRetry(BASE_SLEEP_TIME_MS, MAX_RETRIES)); - String nodePath = ZKPaths.makePath(ZKPaths.makePath(zkConfigs.get(ROOT_NODE), - zkConfigs.get(CONFIG_VERSION)), zkConfigs.get(NODE)); - final ConnectionStateListener connectionStateListener = (client, newState) -> { - if (newState == ConnectionState.CONNECTED) { - loadNode(nodePath); - } else if (newState == ConnectionState.RECONNECTED) { - loadNode(nodePath); - } - }; - final CuratorListener curatorListener = (client, curatorEvent) -> { - final WatchedEvent watchedEvent = curatorEvent.getWatchedEvent(); - if (null != watchedEvent) { - switch (watchedEvent.getType()) { - case NodeChildrenChanged: - case NodeDataChanged: - loadNode(nodePath); - break; - default: - break; - } - } - }; - curatorFramework.getConnectionStateListenable().addListener(connectionStateListener); - curatorFramework.getCuratorListenable().addListener(curatorListener); - curatorFramework.start(); - } - - /** - * Load config info and refresh. - * - * @param nodePath zk config node path. - */ - public void loadNode(String nodePath) { - String content = nodePathResolver(nodePath); - if (content != null) { - dynamicRefresh(content); - registerNotifyAlarmManage(); - } - } - - /** - * resolver for zk config - * - * @param nodePath zk config node path - * @return resolver result - */ - private String nodePathResolver(String nodePath) { - try { - final GetChildrenBuilder childrenBuilder = curatorFramework.getChildren(); - final List children = childrenBuilder.watched().forPath(nodePath); - StringBuilder content = new StringBuilder(); - children.forEach(c -> { - String n = ZKPaths.makePath(nodePath, c); - final String nodeName = ZKPaths.getNodeFromPath(n); - final GetDataBuilder data = curatorFramework.getData(); - String value = ""; - try { - value = new String(data.watched().forPath(n), StandardCharsets.UTF_8); - } catch (Exception ex) { - log.error("Load zookeeper node error", ex); - } - content.append(nodeName).append("=").append(value).append("\n"); - }); - return content.toString(); - } catch (Exception ex) { - log.error("Load zookeeper node error, nodePath is: {}", nodePath, ex); - return null; - } - } - - /** - * Register notify alarm manage. - */ - public void registerNotifyAlarmManage() { - BootstrapConfigProperties actualBootstrapConfigProperties = (BootstrapConfigProperties) bootstrapConfigProperties; - actualBootstrapConfigProperties.getExecutors().forEach(executorProperties -> { - ThreadPoolNotifyAlarm threadPoolNotifyAlarm = new ThreadPoolNotifyAlarm( - executorProperties.getAlarm(), - executorProperties.getCapacityAlarm(), - executorProperties.getActiveAlarm()); - threadPoolNotifyAlarm.setInterval(executorProperties.getNotify().getInterval()); - threadPoolNotifyAlarm.setReceives(executorProperties.getNotify().getReceives()); - GlobalNotifyAlarmManage.put(executorProperties.getThreadPoolId(), threadPoolNotifyAlarm); - }); - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/AbstractRefreshListener.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/AbstractRefreshListener.java deleted file mode 100644 index e1d06c4e..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/AbstractRefreshListener.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher.event; - -import cn.hippo4j.adapter.web.WebIpAndPortHolder; -import lombok.extern.slf4j.Slf4j; - -/** - * Refresh listener abstract base class. - */ -@Slf4j -public abstract class AbstractRefreshListener implements RefreshListener { - - /** - * Matching nodes
- * nodes is ip + port.Get 'nodes' in the new Properties,Compare this with the ip + port of Application.
- * support prefix pattern matching. e.g:
- *

    - *
  • 192.168.1.5:* -- Matches all ports of 192.168.1.5
  • - *
  • 192.168.1.*:2009 -- Matches 2009 port of 192.168.1.*
  • - *
  • * -- all
  • - *
  • empty -- all
  • - *
- * The format of ip + port is ip : port. - * - * @param properties new Properties - */ - @Override - public boolean match(M properties) { - String nodes = getNodes(properties); - return WebIpAndPortHolder.check(nodes); - } - - /** - * Get nodes in new properties. - * - * @param properties new properties - * @return nodes in properties - */ - protected String getNodes(M properties) { - return WebIpAndPortHolder.ALL; - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/AdapterExecutorsRefreshListener.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/AdapterExecutorsRefreshListener.java deleted file mode 100644 index b521a526..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/AdapterExecutorsRefreshListener.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher.event; - -import cn.hippo4j.adapter.base.ThreadPoolAdapter; -import cn.hippo4j.adapter.base.ThreadPoolAdapterParameter; -import cn.hippo4j.common.model.ThreadPoolAdapterState; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.common.toolkit.BeanUtil; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.AdapterExecutorProperties; -import cn.hippo4j.config.springboot.starter.support.DynamicThreadPoolAdapterRegister; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.annotation.Order; - -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import static cn.hippo4j.common.constant.Constants.IDENTIFY_SLICER_SYMBOL; -import static cn.hippo4j.config.springboot.starter.refresher.event.ThreadPoolConfigDynamicRefreshEventOrder.ADAPTER_EXECUTORS_LISTENER; - -/** - * Adapter executors refresh listener. - */ -@Slf4j -@Order(ADAPTER_EXECUTORS_LISTENER) -@RequiredArgsConstructor -public class AdapterExecutorsRefreshListener extends AbstractRefreshListener { - - private final DynamicThreadPoolAdapterRegister dynamicThreadPoolAdapterRegister; - - @Override - public String getNodes(AdapterExecutorProperties properties) { - return properties.getNodes(); - } - - @Override - public void onApplicationEvent(ThreadPoolConfigDynamicRefreshEvent event) { - List adapterExecutors = event.getBootstrapConfigProperties().getAdapterExecutors(); - Map threadPoolAdapterMap = ApplicationContextHolder.getBeansOfType(ThreadPoolAdapter.class); - if (CollectionUtil.isEmpty(adapterExecutors) || CollectionUtil.isEmpty(threadPoolAdapterMap)) { - return; - } - for (AdapterExecutorProperties each : adapterExecutors) { - String buildKey = each.getMark() + IDENTIFY_SLICER_SYMBOL + each.getThreadPoolKey(); - AdapterExecutorProperties adapterExecutorProperties = dynamicThreadPoolAdapterRegister.discoverAdapterExecutorAndGet(buildKey); - if (adapterExecutorProperties == null - || !adapterExecutorProperties.getEnable() - || !match(adapterExecutorProperties)) { - continue; - } - threadPoolAdapterMap.forEach((key, val) -> { - if (Objects.equals(val.mark(), each.getMark())) { - ThreadPoolAdapterState threadPoolState = val.getThreadPoolState(each.getThreadPoolKey()); - if (!Objects.equals(threadPoolState.getCoreSize(), each.getCorePoolSize()) - || !Objects.equals(threadPoolState.getMaximumSize(), each.getMaximumPoolSize())) { - val.updateThreadPool(BeanUtil.convert(each, ThreadPoolAdapterParameter.class)); - DynamicThreadPoolAdapterRegister.ADAPTER_EXECUTORS_MAP.put(buildKey, each); - } - } - }); - } - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/DynamicThreadPoolRefreshListener.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/DynamicThreadPoolRefreshListener.java deleted file mode 100644 index 1fbac959..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/DynamicThreadPoolRefreshListener.java +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher.event; - -import cn.hippo4j.common.api.ThreadPoolConfigChange; -import cn.hippo4j.common.executor.ThreadPoolExecutorHolder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum; -import cn.hippo4j.common.executor.support.RejectedPolicyTypeEnum; -import cn.hippo4j.common.executor.support.ResizableCapacityLinkedBlockingQueue; -import cn.hippo4j.common.model.executor.ExecutorProperties; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.common.toolkit.ThreadPoolExecutorUtil; -import cn.hippo4j.config.springboot.starter.notify.ConfigModeNotifyConfigBuilder; -import cn.hippo4j.core.executor.DynamicThreadPoolExecutor; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.message.api.NotifyConfigDTO; -import cn.hippo4j.threadpool.message.core.request.ChangeParameterNotifyRequest; -import cn.hippo4j.threadpool.message.core.service.GlobalNotifyAlarmManage; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolBaseSendMessageService; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolNotifyAlarm; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.annotation.Order; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_DELIMITER; -import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_THREAD_POOL_TEXT; -import static cn.hippo4j.config.springboot.starter.refresher.event.ThreadPoolConfigDynamicRefreshEventOrder.EXECUTORS_LISTENER; - -/** - * Dynamic thread-pool refresh listener. - */ -@Slf4j -@RequiredArgsConstructor -@Order(EXECUTORS_LISTENER) -public class DynamicThreadPoolRefreshListener extends AbstractRefreshListener { - - private final ThreadPoolConfigChange threadPoolConfigChange; - - private final ConfigModeNotifyConfigBuilder configModeNotifyConfigBuilder; - - private final ThreadPoolBaseSendMessageService threadPoolBaseSendMessageService; - - @Override - public String getNodes(ExecutorProperties properties) { - return properties.getNodes(); - } - - @Override - public void onApplicationEvent(ThreadPoolConfigDynamicRefreshEvent event) { - BootstrapConfigProperties bindableConfigProperties = event.getBootstrapConfigProperties(); - List executors = bindableConfigProperties.getExecutors(); - for (ExecutorProperties properties : executors) { - String threadPoolId = properties.getThreadPoolId(); - if (!match(properties)) { - continue; - } - /* - * Check whether the notification configuration is consistent, this operation will not trigger the notification. - */ - checkNotifyConsistencyAndReplace(properties); - if (!checkConsistency(threadPoolId, properties)) { - continue; - } - dynamicRefreshPool(threadPoolId, properties); - ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(properties.getThreadPoolId()); - ExecutorProperties beforeProperties = executorHolder.getExecutorProperties(); - executorHolder.setExecutorProperties(failDefaultExecutorProperties(beforeProperties, properties)); - ChangeParameterNotifyRequest changeRequest = buildChangeRequest(beforeProperties, properties); - log.info(CHANGE_THREAD_POOL_TEXT, - threadPoolId, - String.format(CHANGE_DELIMITER, beforeProperties.getCorePoolSize(), changeRequest.getNowCorePoolSize()), - String.format(CHANGE_DELIMITER, beforeProperties.getMaximumPoolSize(), changeRequest.getNowMaximumPoolSize()), - String.format(CHANGE_DELIMITER, beforeProperties.getQueueCapacity(), changeRequest.getNowQueueCapacity()), - String.format(CHANGE_DELIMITER, beforeProperties.getKeepAliveTime(), changeRequest.getNowKeepAliveTime()), - String.format(CHANGE_DELIMITER, beforeProperties.getExecuteTimeOut(), changeRequest.getNowExecuteTimeOut()), - String.format(CHANGE_DELIMITER, beforeProperties.getRejectedHandler(), changeRequest.getNowRejectedName()), - String.format(CHANGE_DELIMITER, beforeProperties.getAllowCoreThreadTimeOut(), changeRequest.getNowAllowsCoreThreadTimeOut())); - try { - threadPoolConfigChange.sendPoolConfigChange(changeRequest); - } catch (Throwable ex) { - log.error("Failed to send Chang smart application listener notice. Message: {}", ex.getMessage()); - } - } - } - - /** - * Fail default executor properties. - * - * @param beforeProperties old properties - * @param properties new properties - * @return executor properties - */ - private ExecutorProperties failDefaultExecutorProperties(ExecutorProperties beforeProperties, ExecutorProperties properties) { - return ExecutorProperties.builder() - .corePoolSize(Optional.ofNullable(properties.getCorePoolSize()).orElse(beforeProperties.getCorePoolSize())) - .maximumPoolSize(Optional.ofNullable(properties.getMaximumPoolSize()).orElse(beforeProperties.getMaximumPoolSize())) - .blockingQueue(properties.getBlockingQueue()) - .queueCapacity(Optional.ofNullable(properties.getQueueCapacity()).orElse(beforeProperties.getQueueCapacity())) - .keepAliveTime(Optional.ofNullable(properties.getKeepAliveTime()).orElse(beforeProperties.getKeepAliveTime())) - .executeTimeOut(Optional.ofNullable(properties.getExecuteTimeOut()).orElse(beforeProperties.getExecuteTimeOut())) - .rejectedHandler(Optional.ofNullable(properties.getRejectedHandler()).orElse(beforeProperties.getRejectedHandler())) - .allowCoreThreadTimeOut(Optional.ofNullable(properties.getAllowCoreThreadTimeOut()).orElse(beforeProperties.getAllowCoreThreadTimeOut())) - .threadPoolId(beforeProperties.getThreadPoolId()) - .build(); - } - - /** - * Construct change parameter notify request instance. - * - * @param beforeProperties old properties - * @param properties new properties - * @return instance - */ - private ChangeParameterNotifyRequest buildChangeRequest(ExecutorProperties beforeProperties, ExecutorProperties properties) { - ChangeParameterNotifyRequest changeParameterNotifyRequest = ChangeParameterNotifyRequest.builder() - .beforeCorePoolSize(beforeProperties.getCorePoolSize()) - .beforeMaximumPoolSize(beforeProperties.getMaximumPoolSize()) - .beforeAllowsCoreThreadTimeOut(beforeProperties.getAllowCoreThreadTimeOut()) - .beforeKeepAliveTime(beforeProperties.getKeepAliveTime()) - .beforeQueueCapacity(beforeProperties.getQueueCapacity()) - .beforeRejectedName(beforeProperties.getRejectedHandler()) - .beforeExecuteTimeOut(beforeProperties.getExecuteTimeOut()) - .blockingQueueName(properties.getBlockingQueue()) - .nowCorePoolSize(Optional.ofNullable(properties.getCorePoolSize()).orElse(beforeProperties.getCorePoolSize())) - .nowMaximumPoolSize(Optional.ofNullable(properties.getMaximumPoolSize()).orElse(beforeProperties.getMaximumPoolSize())) - .nowAllowsCoreThreadTimeOut(Optional.ofNullable(properties.getAllowCoreThreadTimeOut()).orElse(beforeProperties.getAllowCoreThreadTimeOut())) - .nowKeepAliveTime(Optional.ofNullable(properties.getKeepAliveTime()).orElse(beforeProperties.getKeepAliveTime())) - .nowQueueCapacity(Optional.ofNullable(properties.getQueueCapacity()).orElse(beforeProperties.getQueueCapacity())) - .nowRejectedName(Optional.ofNullable(properties.getRejectedHandler()).orElse(beforeProperties.getRejectedHandler())) - .nowExecuteTimeOut(Optional.ofNullable(properties.getExecuteTimeOut()).orElse(beforeProperties.getExecuteTimeOut())) - .build(); - changeParameterNotifyRequest.setThreadPoolId(beforeProperties.getThreadPoolId()); - return changeParameterNotifyRequest; - } - - /** - * Check notify consistency and replace. - * - * @param executorProperties - */ - private void checkNotifyConsistencyAndReplace(ExecutorProperties executorProperties) { - boolean checkNotifyConfig = false; - boolean checkNotifyAlarm = false; - Map> newDynamicThreadPoolNotifyMap = - configModeNotifyConfigBuilder.buildSingleNotifyConfig(executorProperties); - Map> notifyConfigs = threadPoolBaseSendMessageService.getNotifyConfigs(); - if (CollectionUtil.isNotEmpty(notifyConfigs)) { - for (Map.Entry> each : newDynamicThreadPoolNotifyMap.entrySet()) { - if (checkNotifyConfig) { - break; - } - List notifyConfigDTOS = notifyConfigs.get(each.getKey()); - for (NotifyConfigDTO notifyConfig : each.getValue()) { - if (!notifyConfigDTOS.contains(notifyConfig)) { - checkNotifyConfig = true; - break; - } - } - } - } - if (checkNotifyConfig) { - configModeNotifyConfigBuilder.initCacheAndLock(newDynamicThreadPoolNotifyMap); - threadPoolBaseSendMessageService.putPlatform(newDynamicThreadPoolNotifyMap); - } - ThreadPoolNotifyAlarm threadPoolNotifyAlarm = GlobalNotifyAlarmManage.get(executorProperties.getThreadPoolId()); - if (threadPoolNotifyAlarm != null) { - Boolean isAlarm = executorProperties.getAlarm(); - Integer activeAlarm = executorProperties.getActiveAlarm(); - Integer capacityAlarm = executorProperties.getCapacityAlarm(); - if ((isAlarm != null && !Objects.equals(isAlarm, threadPoolNotifyAlarm.getAlarm())) - || (activeAlarm != null && !Objects.equals(activeAlarm, threadPoolNotifyAlarm.getActiveAlarm())) - || (capacityAlarm != null && !Objects.equals(capacityAlarm, threadPoolNotifyAlarm.getCapacityAlarm()))) { - checkNotifyAlarm = true; - threadPoolNotifyAlarm.setAlarm(Optional.ofNullable(isAlarm).orElse(threadPoolNotifyAlarm.getAlarm())); - threadPoolNotifyAlarm.setActiveAlarm(Optional.ofNullable(activeAlarm).orElse(threadPoolNotifyAlarm.getActiveAlarm())); - threadPoolNotifyAlarm.setCapacityAlarm(Optional.ofNullable(capacityAlarm).orElse(threadPoolNotifyAlarm.getCapacityAlarm())); - } - } - if (checkNotifyConfig || checkNotifyAlarm) { - log.info("[{}] Dynamic thread pool notification property changes.", executorProperties.getThreadPoolId()); - } - } - - /** - * Check consistency. - * - * @param threadPoolId - * @param properties - */ - private boolean checkConsistency(String threadPoolId, ExecutorProperties properties) { - ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(threadPoolId); - ExecutorProperties beforeProperties = executorHolder.getExecutorProperties(); - ThreadPoolExecutor executor = executorHolder.getExecutor(); - if (executor == null) { - return false; - } - boolean result = (properties.getCorePoolSize() != null && !Objects.equals(beforeProperties.getCorePoolSize(), properties.getCorePoolSize())) - || (properties.getMaximumPoolSize() != null && !Objects.equals(beforeProperties.getMaximumPoolSize(), properties.getMaximumPoolSize())) - || (properties.getAllowCoreThreadTimeOut() != null && !Objects.equals(beforeProperties.getAllowCoreThreadTimeOut(), properties.getAllowCoreThreadTimeOut())) - || (properties.getExecuteTimeOut() != null && !Objects.equals(beforeProperties.getExecuteTimeOut(), properties.getExecuteTimeOut())) - || (properties.getKeepAliveTime() != null && !Objects.equals(beforeProperties.getKeepAliveTime(), properties.getKeepAliveTime())) - || (properties.getRejectedHandler() != null && !Objects.equals(beforeProperties.getRejectedHandler(), properties.getRejectedHandler())) - || - ((properties.getQueueCapacity() != null && !Objects.equals(beforeProperties.getQueueCapacity(), properties.getQueueCapacity()) - && Objects.equals(BlockingQueueTypeEnum.RESIZABLE_LINKED_BLOCKING_QUEUE.getName(), executor.getQueue().getClass().getSimpleName()))); - return result; - } - - /** - * Dynamic refresh pool. - * - * @param threadPoolId - * @param properties - */ - private void dynamicRefreshPool(String threadPoolId, ExecutorProperties properties) { - ExecutorProperties beforeProperties = ThreadPoolExecutorRegistry.getHolder(threadPoolId).getExecutorProperties(); - ThreadPoolExecutor executor = ThreadPoolExecutorRegistry.getHolder(threadPoolId).getExecutor(); - if (properties.getMaximumPoolSize() != null && properties.getCorePoolSize() != null) { - ThreadPoolExecutorUtil.safeSetPoolSize(executor, properties.getCorePoolSize(), properties.getMaximumPoolSize()); - } else { - if (properties.getMaximumPoolSize() != null) { - executor.setMaximumPoolSize(properties.getMaximumPoolSize()); - } - if (properties.getCorePoolSize() != null) { - executor.setCorePoolSize(properties.getCorePoolSize()); - } - } - if (properties.getAllowCoreThreadTimeOut() != null && !Objects.equals(beforeProperties.getAllowCoreThreadTimeOut(), properties.getAllowCoreThreadTimeOut())) { - executor.allowCoreThreadTimeOut(properties.getAllowCoreThreadTimeOut()); - } - if (properties.getExecuteTimeOut() != null && !Objects.equals(beforeProperties.getExecuteTimeOut(), properties.getExecuteTimeOut())) { - if (executor instanceof DynamicThreadPoolExecutor) { - ((DynamicThreadPoolExecutor) executor).setExecuteTimeOut(properties.getExecuteTimeOut()); - } - } - if (properties.getRejectedHandler() != null && !Objects.equals(beforeProperties.getRejectedHandler(), properties.getRejectedHandler())) { - RejectedExecutionHandler rejectedExecutionHandler = RejectedPolicyTypeEnum.createPolicy(properties.getRejectedHandler()); - executor.setRejectedExecutionHandler(rejectedExecutionHandler); - } - if (properties.getKeepAliveTime() != null && !Objects.equals(beforeProperties.getKeepAliveTime(), properties.getKeepAliveTime())) { - executor.setKeepAliveTime(properties.getKeepAliveTime(), TimeUnit.SECONDS); - } - if (properties.getQueueCapacity() != null && !Objects.equals(beforeProperties.getQueueCapacity(), properties.getQueueCapacity()) - && Objects.equals(BlockingQueueTypeEnum.RESIZABLE_LINKED_BLOCKING_QUEUE.getName(), executor.getQueue().getClass().getSimpleName())) { - if (executor.getQueue() instanceof ResizableCapacityLinkedBlockingQueue) { - ResizableCapacityLinkedBlockingQueue queue = (ResizableCapacityLinkedBlockingQueue) executor.getQueue(); - queue.setCapacity(properties.getQueueCapacity()); - } else { - log.warn("The queue length cannot be modified. Queue type mismatch. Current queue type: {}", executor.getQueue().getClass().getSimpleName()); - } - } - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/PlatformsRefreshListener.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/PlatformsRefreshListener.java deleted file mode 100644 index 68bb9fbc..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/PlatformsRefreshListener.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher.event; - -import cn.hippo4j.common.executor.ThreadPoolExecutorHolder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.model.executor.ExecutorProperties; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.config.springboot.starter.notify.ConfigModeNotifyConfigBuilder; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.message.api.NotifyConfigDTO; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolBaseSendMessageService; -import org.springframework.core.annotation.Order; - -import java.util.List; -import java.util.Map; - -import static cn.hippo4j.config.springboot.starter.refresher.event.ThreadPoolConfigDynamicRefreshEventOrder.PLATFORMS_LISTENER; - -/** - * Platforms refresh listener. - */ -@Order(PLATFORMS_LISTENER) -public class PlatformsRefreshListener extends AbstractRefreshListener { - - @Override - public void onApplicationEvent(ThreadPoolConfigDynamicRefreshEvent threadPoolDynamicRefreshEvent) { - BootstrapConfigProperties bindableConfigProperties = threadPoolDynamicRefreshEvent.getBootstrapConfigProperties(); - List executors = bindableConfigProperties.getExecutors(); - for (ExecutorProperties executorProperties : executors) { - String threadPoolId = executorProperties.getThreadPoolId(); - ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(threadPoolId); - ThreadPoolBaseSendMessageService sendMessageService = ApplicationContextHolder.getBean(ThreadPoolBaseSendMessageService.class); - /** - * TODO The logic here should be: - * - * 1. When the application starts, the thread pool parameters are not configured in the configuration center - * 2. After the application starts, put the relevant configuration into the configuration center - * 3. Use whether there is a thread pool notification as a judgment condition - */ - List notifyConfigList = sendMessageService.getNotifyConfigs().get(threadPoolId); - if (executorHolder != null && CollectionUtil.isEmpty(notifyConfigList)) { - ConfigModeNotifyConfigBuilder configBuilder = ApplicationContextHolder.getBean(ConfigModeNotifyConfigBuilder.class); - Map> notifyConfig = configBuilder.buildSingleNotifyConfig(executorProperties); - sendMessageService.putPlatform(notifyConfig); - } - } - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/RefreshListener.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/RefreshListener.java deleted file mode 100644 index 7ed4386c..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/RefreshListener.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher.event; - -import cn.hippo4j.common.extension.function.Matcher; -import org.springframework.context.ApplicationEvent; -import org.springframework.context.ApplicationListener; - -/** - * Refresh listener interface. - * T:event. - * M:properties. - */ -public interface RefreshListener extends ApplicationListener, Matcher { - -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/ThreadPoolConfigDynamicRefreshEvent.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/ThreadPoolConfigDynamicRefreshEvent.java deleted file mode 100644 index 253f7fc3..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/ThreadPoolConfigDynamicRefreshEvent.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher.event; - -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import lombok.Getter; -import lombok.Setter; -import org.springframework.context.ApplicationEvent; - -/** - * Hippo-4j config dynamic refresh event. - */ -public class ThreadPoolConfigDynamicRefreshEvent extends ApplicationEvent { - - @Getter - @Setter - private BootstrapConfigProperties bootstrapConfigProperties; - - public ThreadPoolConfigDynamicRefreshEvent(Object source, BootstrapConfigProperties bootstrapConfigProperties) { - super(source); - this.bootstrapConfigProperties = bootstrapConfigProperties; - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/ThreadPoolConfigDynamicRefreshEventOrder.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/ThreadPoolConfigDynamicRefreshEventOrder.java deleted file mode 100644 index 15767d0c..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/ThreadPoolConfigDynamicRefreshEventOrder.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher.event; - -/** - * Hippo-4j config dynamic refresh event order. - */ -public class ThreadPoolConfigDynamicRefreshEventOrder { - - public static final int WEB_EXECUTOR_LISTENER = 0; - - public static final int PLATFORMS_LISTENER = 1; - - public static final int EXECUTORS_LISTENER = 2; - - public static final int ADAPTER_EXECUTORS_LISTENER = 3; -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/WebExecutorRefreshListener.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/WebExecutorRefreshListener.java deleted file mode 100644 index 4165b9dd..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/WebExecutorRefreshListener.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.refresher.event; - -import cn.hippo4j.adapter.web.WebThreadPoolHandlerChoose; -import cn.hippo4j.adapter.web.WebThreadPoolService; -import cn.hippo4j.common.api.ThreadPoolConfigChange; -import cn.hippo4j.common.model.ThreadPoolParameter; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.WebExecutorProperties; -import cn.hippo4j.threadpool.message.core.request.WebChangeParameterNotifyRequest; -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.annotation.Order; - -import java.util.Objects; - -import static cn.hippo4j.config.springboot.starter.refresher.event.ThreadPoolConfigDynamicRefreshEventOrder.WEB_EXECUTOR_LISTENER; - -/** - * Web executor refresh listener. - */ -@Slf4j -@Order(WEB_EXECUTOR_LISTENER) -@SuppressWarnings("rawtypes") -public class WebExecutorRefreshListener extends AbstractRefreshListener { - - private final ThreadPoolConfigChange configChange; - - public WebExecutorRefreshListener(ThreadPoolConfigChange configChange) { - this.configChange = configChange; - } - - @Override - public String getNodes(WebExecutorProperties properties) { - return properties.getNodes(); - } - - @Override - public void onApplicationEvent(ThreadPoolConfigDynamicRefreshEvent threadPoolDynamicRefreshEvent) { - BootstrapConfigProperties bindableCoreProperties = threadPoolDynamicRefreshEvent.getBootstrapConfigProperties(); - if (bindableCoreProperties.getWeb() == null) { - return; - } - try { - ThreadPoolParameterInfo nowParameter = buildWebPoolParameter(bindableCoreProperties); - if (nowParameter != null) { - WebThreadPoolHandlerChoose webThreadPoolHandlerChoose = ApplicationContextHolder.getBean(WebThreadPoolHandlerChoose.class); - WebThreadPoolService webThreadPoolService = webThreadPoolHandlerChoose.choose(); - ThreadPoolParameter beforeParameter = webThreadPoolService.getWebThreadPoolParameter(); - - // Prevent NPE exceptions from being thrown when certain parameters are not configured. - if (nowParameter.getCoreSize() == null) { - nowParameter.setCoreSize(beforeParameter.getCoreSize()); - } - if (nowParameter.getMaxSize() == null) { - nowParameter.setMaxSize(beforeParameter.getMaxSize()); - } - if (nowParameter.getKeepAliveTime() == null) { - nowParameter.setKeepAliveTime(beforeParameter.getKeepAliveTime()); - } - if (!Objects.equals(beforeParameter.getCoreSize(), nowParameter.getCoreSize()) - || !Objects.equals(beforeParameter.getMaxSize(), nowParameter.getMaxSize()) - || !Objects.equals(beforeParameter.getKeepAliveTime(), nowParameter.getKeepAliveTime())) { - webThreadPoolService.updateWebThreadPool(nowParameter); - configChange.sendPoolConfigChange(buildChangeRequest(beforeParameter, nowParameter, webThreadPoolService)); - } - } - } catch (Exception ex) { - log.error("Failed to modify web thread pool.", ex); - } - } - - /** - * Constructing a request for web thread pool parameter change notification - * - * @param before - * @param now - * @return - */ - private WebChangeParameterNotifyRequest buildChangeRequest(ThreadPoolParameter before, ThreadPoolParameter now, - WebThreadPoolService webThreadPoolService) { - WebChangeParameterNotifyRequest changeNotifyRequest = WebChangeParameterNotifyRequest.builder() - .beforeCorePoolSize(before.getCoreSize()) - .nowCorePoolSize(now.getCoreSize()) - .beforeMaximumPoolSize(before.getMaxSize()) - .nowMaximumPoolSize(now.getMaxSize()) - .beforeKeepAliveTime(before.getKeepAliveTime()) - .nowKeepAliveTime(now.getKeepAliveTime()).build(); - changeNotifyRequest.setThreadPoolId(webThreadPoolService.getWebContainerType().getName()); - return changeNotifyRequest; - } - - private ThreadPoolParameterInfo buildWebPoolParameter(BootstrapConfigProperties bindableCoreProperties) { - ThreadPoolParameterInfo threadPoolParameterInfo = null; - WebExecutorProperties webThreadPoolProperties = bindableCoreProperties.getWeb(); - - if (webThreadPoolProperties != null && webThreadPoolProperties.getEnable() && match(webThreadPoolProperties)) { - threadPoolParameterInfo = ThreadPoolParameterInfo.builder() - .coreSize(webThreadPoolProperties.getCorePoolSize()) - .maximumPoolSize(webThreadPoolProperties.getMaximumPoolSize()) - .keepAliveTime(webThreadPoolProperties.getKeepAliveTime()) - .build(); - } - return threadPoolParameterInfo; - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/support/DynamicThreadPoolAdapterRegister.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/support/DynamicThreadPoolAdapterRegister.java deleted file mode 100644 index 004d8779..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/support/DynamicThreadPoolAdapterRegister.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.support; - -import cn.hippo4j.threadpool.dynamic.mode.config.properties.AdapterExecutorProperties; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.InitializingBean; - -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; - -import static cn.hippo4j.common.constant.Constants.IDENTIFY_SLICER_SYMBOL; - -/** - * Dynamic thread-pool adapter register. - */ -@Slf4j -@AllArgsConstructor -public class DynamicThreadPoolAdapterRegister implements InitializingBean { - - private final BootstrapConfigProperties bootstrapConfigProperties; - - public static final Map ADAPTER_EXECUTORS_MAP = new ConcurrentHashMap<>(); - - @Override - public void afterPropertiesSet() throws Exception { - discoverAdapterExecutor(); - } - - public AdapterExecutorProperties discoverAdapterExecutorAndGet(String mark) { - List adapterExecutors = bootstrapConfigProperties.getAdapterExecutors(); - for (AdapterExecutorProperties each : adapterExecutors) { - String buildKey = each.getMark() + IDENTIFY_SLICER_SYMBOL + each.getThreadPoolKey(); - ADAPTER_EXECUTORS_MAP.putIfAbsent(buildKey, each); - } - return ADAPTER_EXECUTORS_MAP.get(mark); - } - - public void discoverAdapterExecutor() { - Optional> adapterExecutorProperties = - Optional.ofNullable(bootstrapConfigProperties.getAdapterExecutors()); - adapterExecutorProperties.ifPresent(props -> { - for (AdapterExecutorProperties each : props) { - String buildKey = each.getMark() + IDENTIFY_SLICER_SYMBOL + each.getThreadPoolKey(); - ADAPTER_EXECUTORS_MAP.putIfAbsent(buildKey, each); - } - }); - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/support/DynamicThreadPoolConfigService.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/support/DynamicThreadPoolConfigService.java deleted file mode 100644 index d0c3c4ba..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/support/DynamicThreadPoolConfigService.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.support; - -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum; -import cn.hippo4j.common.executor.support.RejectedPolicyTypeEnum; -import cn.hippo4j.common.model.executor.ExecutorProperties; -import cn.hippo4j.common.model.register.DynamicThreadPoolRegisterParameter; -import cn.hippo4j.common.model.register.DynamicThreadPoolRegisterWrapper; -import cn.hippo4j.common.model.register.notify.DynamicThreadPoolRegisterCoreNotifyParameter; -import cn.hippo4j.common.toolkit.BooleanUtil; -import cn.hippo4j.core.executor.support.service.AbstractDynamicThreadPoolService; -import cn.hippo4j.threadpool.message.core.service.GlobalNotifyAlarmManage; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolNotifyAlarm; - -import java.util.concurrent.ThreadPoolExecutor; - -/** - * Dynamic thread-pool config service. - */ -public class DynamicThreadPoolConfigService extends AbstractDynamicThreadPoolService { - - @Override - public ThreadPoolExecutor registerDynamicThreadPool(DynamicThreadPoolRegisterWrapper registerWrapper) { - DynamicThreadPoolRegisterParameter registerParameter = registerWrapper.getParameter(); - String threadPoolId = registerParameter.getThreadPoolId(); - ThreadPoolExecutor dynamicThreadPoolExecutor = buildDynamicThreadPoolExecutor(registerParameter); - ExecutorProperties executorProperties = buildExecutorProperties(registerWrapper); - ThreadPoolExecutorRegistry.putHolder(threadPoolId, dynamicThreadPoolExecutor, executorProperties); - DynamicThreadPoolRegisterCoreNotifyParameter notifyParameter = registerWrapper.getConfigNotify(); - ThreadPoolNotifyAlarm notifyAlarm = new ThreadPoolNotifyAlarm(true, registerParameter.getActiveAlarm(), registerParameter.getCapacityAlarm()); - notifyAlarm.setReceives(notifyParameter.getReceives()); - notifyAlarm.setInterval(notifyParameter.getInterval()); - GlobalNotifyAlarmManage.put(threadPoolId, notifyAlarm); - return dynamicThreadPoolExecutor; - } - - private ExecutorProperties buildExecutorProperties(DynamicThreadPoolRegisterWrapper registerWrapper) { - DynamicThreadPoolRegisterParameter registerParameter = registerWrapper.getParameter(); - ExecutorProperties executorProperties = ExecutorProperties.builder() - .corePoolSize(registerParameter.getCorePoolSize()) - .maximumPoolSize(registerParameter.getMaximumPoolSize()) - .allowCoreThreadTimeOut(BooleanUtil.toBoolean(String.valueOf(registerParameter.getAllowCoreThreadTimeOut()))) - .keepAliveTime(registerParameter.getKeepAliveTime()) - .blockingQueue(BlockingQueueTypeEnum.getBlockingQueueNameByType(registerParameter.getBlockingQueueType().getType())) - .queueCapacity(registerParameter.getCapacity()) - .threadNamePrefix(registerParameter.getThreadNamePrefix()) - .rejectedHandler(RejectedPolicyTypeEnum.getRejectedNameByType(registerParameter.getRejectedPolicyType().getType())) - .executeTimeOut(registerParameter.getExecuteTimeOut()) - .threadPoolId(registerParameter.getThreadPoolId()) - .build(); - return executorProperties; - } -} diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/support/DynamicThreadPoolPostProcessor.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/support/DynamicThreadPoolPostProcessor.java deleted file mode 100644 index 864c7a8d..00000000 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/support/DynamicThreadPoolPostProcessor.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.springboot.starter.support; - -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum; -import cn.hippo4j.common.executor.support.RejectedPolicyTypeEnum; -import cn.hippo4j.common.model.executor.ExecutorNotifyProperties; -import cn.hippo4j.common.model.executor.ExecutorProperties; -import cn.hippo4j.common.toolkit.ReflectUtil; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.common.toolkit.ThreadPoolExecutorUtil; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.DynamicThreadPoolExecutor; -import cn.hippo4j.core.executor.support.adpter.DynamicThreadPoolAdapterChoose; -import cn.hippo4j.core.toolkit.DynamicThreadPoolAnnotationUtil; -import cn.hippo4j.threadpool.dynamic.mode.config.properties.BootstrapConfigProperties; -import cn.hippo4j.threadpool.message.core.service.GlobalNotifyAlarmManage; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolNotifyAlarm; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.BeanPostProcessor; - -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * Dynamic thread-pool post processor. - */ -@Slf4j -@AllArgsConstructor -public final class DynamicThreadPoolPostProcessor implements BeanPostProcessor { - - private final BootstrapConfigProperties configProperties; - - private static final int DEFAULT_ACTIVE_ALARM = 80; - - private static final int DEFAULT_CAPACITY_ALARM = 80; - - private static final int DEFAULT_INTERVAL = 5; - - private static final String DEFAULT_RECEIVES = ""; - - @Override - public Object postProcessBeforeInitialization(Object bean, String beanName) { - return bean; - } - - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { - if (bean instanceof DynamicThreadPoolExecutor || DynamicThreadPoolAdapterChoose.match(bean)) { - DynamicThreadPool dynamicThreadPool; - try { - dynamicThreadPool = ApplicationContextHolder.findAnnotationOnBean(beanName, DynamicThreadPool.class); - if (Objects.isNull(dynamicThreadPool)) { - // Adapt to lower versions of SpringBoot. - dynamicThreadPool = DynamicThreadPoolAnnotationUtil.findAnnotationOnBean(beanName, DynamicThreadPool.class); - if (Objects.isNull(dynamicThreadPool)) { - return bean; - } - } - } catch (Exception ex) { - log.error("Failed to create dynamic thread pool in annotation mode.", ex); - return bean; - } - ThreadPoolExecutor dynamicThreadPoolExecutor = DynamicThreadPoolAdapterChoose.unwrap(bean); - if (dynamicThreadPoolExecutor == null) { - dynamicThreadPoolExecutor = (DynamicThreadPoolExecutor) bean; - } - ThreadPoolExecutor remoteThreadPoolExecutor = fillPoolAndRegister(((DynamicThreadPoolExecutor) dynamicThreadPoolExecutor).getThreadPoolId(), dynamicThreadPoolExecutor); - DynamicThreadPoolAdapterChoose.replace(bean, remoteThreadPoolExecutor); - return DynamicThreadPoolAdapterChoose.match(bean) ? bean : remoteThreadPoolExecutor; - } - return bean; - } - - /** - * Fill the thread pool and register. - * - * @param threadPoolId dynamic thread-pool id - * @param executor dynamic thread-pool executor - */ - protected ThreadPoolExecutor fillPoolAndRegister(String threadPoolId, ThreadPoolExecutor executor) { - ExecutorProperties executorProperties = null; - if (configProperties.getExecutors() != null) { - executorProperties = configProperties.getExecutors() - .stream() - .filter(each -> Objects.equals(threadPoolId, each.getThreadPoolId())) - .findFirst() - .orElseThrow(() -> new RuntimeException("The thread pool id does not exist in the configuration.")); - try { - executorProperties = buildActualExecutorProperties(executorProperties); - threadPoolParamReplace(executor, executorProperties); - } catch (Exception ex) { - log.error("Failed to initialize thread pool configuration.", ex); - } - ThreadPoolNotifyAlarm threadPoolNotifyAlarm = buildThreadPoolNotifyAlarm(executorProperties); - GlobalNotifyAlarmManage.put(threadPoolId, threadPoolNotifyAlarm); - } - ThreadPoolExecutorRegistry.putHolder(threadPoolId, executor, - executorProperties == null - ? buildDefaultExecutorProperties(threadPoolId, executor) - : executorProperties); - // GlobalThreadPoolManage.registerPool(dynamicThreadPoolWrapper.getThreadPoolId(), dynamicThreadPoolWrapper); - // GlobalConfigThreadPoolManage.register( - // threadPoolId, - // executorProperties == null - // ? buildDefaultExecutorProperties(threadPoolId, executor) - // : executorProperties); - return executor; - } - - /** - * Build actual executor properties. - * - * @param executorProperties executor properties - * @return executor properties - */ - private ExecutorProperties buildActualExecutorProperties(ExecutorProperties executorProperties) { - return Optional.ofNullable(configProperties.getDefaultExecutor()).map(each -> buildExecutorProperties(executorProperties)).orElse(executorProperties); - } - - /** - * Build default executor properties. - * - * @param threadPoolId thread-pool id - * @param executor dynamic thread-pool executor - * @return executor properties - */ - private ExecutorProperties buildDefaultExecutorProperties(String threadPoolId, ThreadPoolExecutor executor) { - ExecutorProperties executorProperties = new ExecutorProperties(); - BlockingQueue blockingQueue = executor.getQueue(); - int queueSize = blockingQueue.size(); - String queueType = blockingQueue.getClass().getSimpleName(); - int remainingCapacity = blockingQueue.remainingCapacity(); - int queueCapacity = queueSize + remainingCapacity; - executorProperties.setCorePoolSize(executor.getCorePoolSize()) - .setMaximumPoolSize(executor.getMaximumPoolSize()) - .setAllowCoreThreadTimeOut(executor.allowsCoreThreadTimeOut()) - .setKeepAliveTime(executor.getKeepAliveTime(TimeUnit.SECONDS)) - .setBlockingQueue(queueType) - .setExecuteTimeOut(Constants.EXECUTE_TIME_OUT) - .setQueueCapacity(queueCapacity) - .setRejectedHandler(executor.getRejectedExecutionHandler().getClass().getSimpleName()) - .setThreadPoolId(threadPoolId); - return executorProperties; - } - - /** - * Thread-pool param replace. - * - * @param executor dynamic thread-pool executor - * @param executorProperties executor properties - */ - private void threadPoolParamReplace(ThreadPoolExecutor executor, ExecutorProperties executorProperties) { - BlockingQueue workQueue = BlockingQueueTypeEnum.createBlockingQueue(executorProperties.getBlockingQueue(), executorProperties.getQueueCapacity()); - ReflectUtil.setFieldValue(executor, "workQueue", workQueue); - // fix https://github.com/opengoofy/hippo4j/issues/1063 - ThreadPoolExecutorUtil.safeSetPoolSize(executor, executorProperties.getCorePoolSize(), executorProperties.getMaximumPoolSize()); - executor.setKeepAliveTime(executorProperties.getKeepAliveTime(), TimeUnit.SECONDS); - executor.allowCoreThreadTimeOut(executorProperties.getAllowCoreThreadTimeOut()); - executor.setRejectedExecutionHandler(RejectedPolicyTypeEnum.createPolicy(executorProperties.getRejectedHandler())); - if (executor instanceof DynamicThreadPoolExecutor) { - Optional.ofNullable(executorProperties.getExecuteTimeOut()) - .ifPresent(executeTimeOut -> ((DynamicThreadPoolExecutor) executor).setExecuteTimeOut(executeTimeOut)); - } - } - - /** - * Build executor properties. - * - * @param executorProperties executor properties - * @return executor properties - */ - private ExecutorProperties buildExecutorProperties(ExecutorProperties executorProperties) { - return ExecutorProperties.builder() - .corePoolSize(Optional.ofNullable(executorProperties.getCorePoolSize()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getCorePoolSize).get())) - .maximumPoolSize(Optional.ofNullable(executorProperties.getMaximumPoolSize()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getMaximumPoolSize).get())) - .allowCoreThreadTimeOut(Optional.ofNullable(executorProperties.getAllowCoreThreadTimeOut()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getAllowCoreThreadTimeOut).get())) - .keepAliveTime(Optional.ofNullable(executorProperties.getKeepAliveTime()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getKeepAliveTime).get())) - .blockingQueue(Optional.ofNullable(executorProperties.getBlockingQueue()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getBlockingQueue).get())) - .executeTimeOut(Optional.ofNullable(executorProperties.getExecuteTimeOut()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getExecuteTimeOut).orElse(0L))) - .queueCapacity(Optional.ofNullable(executorProperties.getQueueCapacity()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getQueueCapacity).get())) - .rejectedHandler(Optional.ofNullable(executorProperties.getRejectedHandler()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getRejectedHandler).get())) - .threadNamePrefix(StringUtil.isBlank(executorProperties.getThreadNamePrefix()) ? executorProperties.getThreadPoolId() : executorProperties.getThreadNamePrefix()) - .threadPoolId(executorProperties.getThreadPoolId()) - .alarm(Optional.ofNullable(executorProperties.getAlarm()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getAlarm).orElse(null))) - .activeAlarm(Optional.ofNullable(executorProperties.getActiveAlarm()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getActiveAlarm).orElse(null))) - .capacityAlarm(Optional.ofNullable(executorProperties.getCapacityAlarm()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getCapacityAlarm).orElse(null))) - .notify(Optional.ofNullable(executorProperties.getNotify()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getNotify).orElse(null))) - .nodes(Optional.ofNullable(executorProperties.getNodes()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getNodes).orElse(null))) - .build(); - } - - /** - * Build thread-pool notify alarm - * - * @param executorProperties executor properties - * @return thread-pool notify alarm - */ - private ThreadPoolNotifyAlarm buildThreadPoolNotifyAlarm(ExecutorProperties executorProperties) { - ExecutorNotifyProperties notify = Optional.ofNullable(executorProperties).map(ExecutorProperties::getNotify).orElse(null); - boolean isAlarm = Optional.ofNullable(executorProperties.getAlarm()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getAlarm).orElse(true)); - int activeAlarm = Optional.ofNullable(executorProperties.getActiveAlarm()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getActiveAlarm).orElse(DEFAULT_ACTIVE_ALARM)); - int capacityAlarm = Optional.ofNullable(executorProperties.getCapacityAlarm()) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getCapacityAlarm).orElse(DEFAULT_CAPACITY_ALARM)); - int interval = Optional.ofNullable(notify) - .map(ExecutorNotifyProperties::getInterval) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getNotify).map(ExecutorNotifyProperties::getInterval).orElse(DEFAULT_INTERVAL)); - String receive = Optional.ofNullable(notify) - .map(ExecutorNotifyProperties::getReceives) - .orElseGet(() -> Optional.ofNullable(configProperties.getDefaultExecutor()).map(ExecutorProperties::getNotify).map(ExecutorNotifyProperties::getReceives).orElse(DEFAULT_RECEIVES)); - ThreadPoolNotifyAlarm threadPoolNotifyAlarm = new ThreadPoolNotifyAlarm(isAlarm, activeAlarm, capacityAlarm); - threadPoolNotifyAlarm.setInterval(interval); - threadPoolNotifyAlarm.setReceives(receive); - return threadPoolNotifyAlarm; - } -} diff --git a/starters/threadpool/config/src/main/resources/META-INF/spring.factories b/starters/threadpool/config/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 0d75c58b..00000000 --- a/starters/threadpool/config/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,5 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.config.springboot.starter.config.DynamicThreadPoolAutoConfiguration,\ -cn.hippo4j.core.config.UtilAutoConfiguration,\ -cn.hippo4j.message.config.MessageConfiguration,\ -cn.hippo4j.springboot.starter.adapter.web.WebAdapterConfiguration,\ -cn.hippo4j.config.springboot.starter.config.MonitorConfiguration \ No newline at end of file diff --git a/starters/threadpool/config/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/starters/threadpool/config/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index dff6abf1..00000000 --- a/starters/threadpool/config/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1,4 +0,0 @@ -cn.hippo4j.config.springboot.starter.config.DynamicThreadPoolAutoConfiguration -cn.hippo4j.core.config.UtilAutoConfiguration -cn.hippo4j.message.config.MessageConfiguration -cn.hippo4j.config.springboot.starter.config.MonitorConfiguration \ No newline at end of file diff --git a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-elasticsearch/pom.xml b/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-elasticsearch/pom.xml deleted file mode 100644 index 9934583f..00000000 --- a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-elasticsearch/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-monitor - ${revision} - - hippo4j-spring-boot-starter-monitor-elasticsearch - - - - cn.hippo4j - hippo4j-threadpool-monitor-elasticsearch - ${project.version} - - - diff --git a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-elasticsearch/src/main/java/cn/hippo4j/springboot/starter/monitor/elasticsearch/ElasticSearchMonitorAutoConfiguration.java b/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-elasticsearch/src/main/java/cn/hippo4j/springboot/starter/monitor/elasticsearch/ElasticSearchMonitorAutoConfiguration.java deleted file mode 100644 index 26c79b5d..00000000 --- a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-elasticsearch/src/main/java/cn/hippo4j/springboot/starter/monitor/elasticsearch/ElasticSearchMonitorAutoConfiguration.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.monitor.elasticsearch; - -import cn.hippo4j.core.executor.state.ThreadPoolRunStateHandler; -import cn.hippo4j.core.enable.MarkerConfiguration; -import cn.hippo4j.monitor.elasticsearch.AdapterThreadPoolElasticSearchMonitorHandler; -import cn.hippo4j.monitor.elasticsearch.DynamicThreadPoolElasticSearchMonitorHandler; -import cn.hippo4j.monitor.elasticsearch.WebThreadPoolElasticSearchMonitorHandler; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * Elastic-search monitor auto configuration. - */ -@Configuration -@ConditionalOnBean(MarkerConfiguration.Marker.class) -@ConditionalOnExpression("'${spring.dynamic.thread-pool.monitor.collect-types:}'.contains('elasticsearch')") -public class ElasticSearchMonitorAutoConfiguration { - - @Bean - @ConditionalOnExpression("'${spring.dynamic.thread-pool.monitor.thread-pool-types:}'.contains('dynamic')") - public DynamicThreadPoolElasticSearchMonitorHandler dynamicThreadPoolElasticSearchMonitorHandler(ThreadPoolRunStateHandler handler) { - return new DynamicThreadPoolElasticSearchMonitorHandler(handler); - } - - @Bean - @ConditionalOnExpression("'${spring.dynamic.thread-pool.monitor.thread-pool-types:}'.contains('web')") - public WebThreadPoolElasticSearchMonitorHandler webThreadPoolElasticSearchMonitorHandler(ThreadPoolRunStateHandler handler) { - return new WebThreadPoolElasticSearchMonitorHandler(); - } - - @Bean - @ConditionalOnExpression("'${spring.dynamic.thread-pool.monitor.thread-pool-types:}'.contains('adapter')") - public AdapterThreadPoolElasticSearchMonitorHandler adapterThreadPoolElasticSearchMonitorHandler(ThreadPoolRunStateHandler handler) { - return new AdapterThreadPoolElasticSearchMonitorHandler(); - } -} diff --git a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-elasticsearch/src/main/resources/META-INF/spring.factories b/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-elasticsearch/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 3239d90b..00000000 --- a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-elasticsearch/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.monitor.elasticsearch.ElasticSearchMonitorAutoConfiguration diff --git a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-elasticsearch/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-elasticsearch/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index c3bef7ad..00000000 --- a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-elasticsearch/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.springboot.starter.monitor.elasticsearch.ElasticSearchMonitorAutoConfiguration \ No newline at end of file diff --git a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-local-log/pom.xml b/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-local-log/pom.xml deleted file mode 100644 index f31dd5e6..00000000 --- a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-local-log/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-monitor - ${revision} - - hippo4j-spring-boot-starter-monitor-local-log - - - - cn.hippo4j - hippo4j-threadpool-monitor-local-log - ${project.version} - - - diff --git a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-local-log/src/main/java/cn/hippo4j/springboot/starter/monitor/local/log/LocalLogMonitorAutoConfiguration.java b/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-local-log/src/main/java/cn/hippo4j/springboot/starter/monitor/local/log/LocalLogMonitorAutoConfiguration.java deleted file mode 100644 index c9e8438a..00000000 --- a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-local-log/src/main/java/cn/hippo4j/springboot/starter/monitor/local/log/LocalLogMonitorAutoConfiguration.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.monitor.local.log; - -import cn.hippo4j.adapter.web.WebThreadPoolService; -import cn.hippo4j.core.executor.state.ThreadPoolRunStateHandler; -import cn.hippo4j.core.enable.MarkerConfiguration; -import cn.hippo4j.monitor.local.log.AdapterThreadPoolLocalLogMonitorHandler; -import cn.hippo4j.monitor.local.log.DynamicThreadPoolLocalLogMonitorHandler; -import cn.hippo4j.monitor.local.log.WebThreadPoolLocalLogMonitorHandler; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * Local log monitor auto configuration. - */ -@Configuration -@ConditionalOnBean(MarkerConfiguration.Marker.class) -@ConditionalOnExpression("'${spring.dynamic.thread-pool.monitor.collect-types:}'.contains('log')") -public class LocalLogMonitorAutoConfiguration { - - @Bean - @ConditionalOnExpression("'${spring.dynamic.thread-pool.monitor.thread-pool-types:}'.contains('dynamic')") - public DynamicThreadPoolLocalLogMonitorHandler dynamicThreadPoolLocalLogMonitorHandler(ThreadPoolRunStateHandler handler) { - return new DynamicThreadPoolLocalLogMonitorHandler(handler); - } - - @Bean - @ConditionalOnBean(WebThreadPoolService.class) - @ConditionalOnExpression("'${spring.dynamic.thread-pool.monitor.thread-pool-types:}'.contains('web')") - public WebThreadPoolLocalLogMonitorHandler webThreadPoolLocalLogMonitorHandler() { - return new WebThreadPoolLocalLogMonitorHandler(); - } - - @Bean - @ConditionalOnExpression("'${spring.dynamic.thread-pool.monitor.thread-pool-types:}'.contains('adapter')") - public AdapterThreadPoolLocalLogMonitorHandler adapterThreadPoolLocalLogMonitorHandler() { - return new AdapterThreadPoolLocalLogMonitorHandler(); - } -} diff --git a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-local-log/src/main/resources/META-INF/spring.factories b/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-local-log/src/main/resources/META-INF/spring.factories deleted file mode 100644 index b1af5e04..00000000 --- a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-local-log/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.monitor.local.log.LocalLogMonitorAutoConfiguration diff --git a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-local-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-local-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 54adbd04..00000000 --- a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-local-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.springboot.starter.monitor.local.log.LocalLogMonitorAutoConfiguration \ No newline at end of file diff --git a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-micrometer/pom.xml b/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-micrometer/pom.xml deleted file mode 100644 index 7f846c6d..00000000 --- a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-micrometer/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-monitor - ${revision} - - hippo4j-spring-boot-starter-monitor-micrometer - - - - cn.hippo4j - hippo4j-threadpool-monitor-micrometer - ${project.version} - - - diff --git a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-micrometer/src/main/java/cn/hippo4j/springboot/starter/monitor/micrometer/MicrometerMonitorAutoConfiguration.java b/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-micrometer/src/main/java/cn/hippo4j/springboot/starter/monitor/micrometer/MicrometerMonitorAutoConfiguration.java deleted file mode 100644 index 73834bb8..00000000 --- a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-micrometer/src/main/java/cn/hippo4j/springboot/starter/monitor/micrometer/MicrometerMonitorAutoConfiguration.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.monitor.micrometer; - -import cn.hippo4j.adapter.web.WebThreadPoolService; -import cn.hippo4j.core.executor.state.ThreadPoolRunStateHandler; -import cn.hippo4j.core.enable.MarkerConfiguration; -import cn.hippo4j.monitor.micrometer.AdapterThreadPoolMicrometerMonitorHandler; -import cn.hippo4j.monitor.micrometer.DynamicThreadPoolMicrometerMonitorHandler; -import cn.hippo4j.monitor.micrometer.WebThreadPoolMicrometerMonitorHandler; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * Micrometer monitor auto configuration. - */ -@Configuration -@ConditionalOnBean(MarkerConfiguration.Marker.class) -@ConditionalOnExpression("'${spring.dynamic.thread-pool.monitor.collect-types:}'.contains('micrometer')") -public class MicrometerMonitorAutoConfiguration { - - @Bean - @ConditionalOnExpression("'${spring.dynamic.thread-pool.monitor.thread-pool-types:}'.contains('dynamic')") - public DynamicThreadPoolMicrometerMonitorHandler dynamicThreadPoolMicrometerMonitorHandler(ThreadPoolRunStateHandler handler) { - return new DynamicThreadPoolMicrometerMonitorHandler(handler); - } - - @Bean - @ConditionalOnBean(WebThreadPoolService.class) - @ConditionalOnExpression("'${spring.dynamic.thread-pool.monitor.thread-pool-types:}'.contains('web')") - public WebThreadPoolMicrometerMonitorHandler webThreadPoolMicrometerMonitorHandler() { - return new WebThreadPoolMicrometerMonitorHandler(); - } - - @Bean - @ConditionalOnExpression("'${spring.dynamic.thread-pool.monitor.thread-pool-types:}'.contains('adapter')") - public AdapterThreadPoolMicrometerMonitorHandler adapterThreadPoolMicrometerMonitorHandler() { - return new AdapterThreadPoolMicrometerMonitorHandler(); - } -} diff --git a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-micrometer/src/main/resources/META-INF/spring.factories b/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-micrometer/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 6e626350..00000000 --- a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-micrometer/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.monitor.micrometer.MicrometerMonitorAutoConfiguration diff --git a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-micrometer/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-micrometer/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 74f85afc..00000000 --- a/starters/threadpool/monitor/hippo4j-spring-boot-starter-monitor-micrometer/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.springboot.starter.monitor.micrometer.MicrometerMonitorAutoConfiguration \ No newline at end of file diff --git a/starters/threadpool/monitor/pom.xml b/starters/threadpool/monitor/pom.xml deleted file mode 100644 index d1dad88c..00000000 --- a/starters/threadpool/monitor/pom.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-starters - ${revision} - - hippo4j-threadpool-spring-boot-starter-monitor - pom - - - hippo4j-spring-boot-starter-monitor-elasticsearch - hippo4j-spring-boot-starter-monitor-local-log - hippo4j-spring-boot-starter-monitor-micrometer - - diff --git a/starters/threadpool/pom.xml b/starters/threadpool/pom.xml deleted file mode 100644 index 253da58c..00000000 --- a/starters/threadpool/pom.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-starters - ${revision} - - hippo4j-threadpool-starters - pom - - - config - server - adapter - monitor - config-spring-boot-1x - - diff --git a/starters/threadpool/server/pom.xml b/starters/threadpool/server/pom.xml deleted file mode 100644 index 04636137..00000000 --- a/starters/threadpool/server/pom.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-starters - ${revision} - - hippo4j-threadpool-spring-boot-starter - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - cn.hippo4j - hippo4j-threadpool-core - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-infra-common - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-message - ${project.version} - - - org.springframework.boot - spring-boot-configuration-processor - true - - - org.projectlombok - lombok - - - org.springframework.boot - spring-boot-starter-tomcat - true - - - org.springframework.boot - spring-boot-starter-jetty - true - - - org.springframework.boot - spring-boot-starter-undertow - true - - - cn.hippo4j - hippo4j-threadpool-adapter-base - ${project.version} - - - io.netty - netty-all - - - cn.hippo4j - hippo4j-threadpool-spring-boot-starter-adapter-web - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-monitor-base - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-dynamic-api - ${project.version} - - - cn.hippo4j - hippo4j-threadpool-kernel-alarm - ${project.version} - - - - javax.annotation - javax.annotation-api - - - diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/config/BootstrapProperties.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/config/BootstrapProperties.java deleted file mode 100644 index 0669aed1..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/config/BootstrapProperties.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.config; - -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.threadpool.dynamic.api.BootstrapPropertiesInterface; -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * Bootstrap properties. - */ -@Slf4j -@Getter -@Setter -@ConfigurationProperties(prefix = Constants.CONFIGURATION_PROPERTIES_PREFIX) -public class BootstrapProperties implements BootstrapPropertiesInterface { - - /** - * Username - */ - private String username; - - /** - * Password - */ - private String password; - - /** - * Server address - */ - private String serverAddr; - - /** - * Netty server port - */ - private String nettyServerPort; - - /** - * Report type - */ - private String reportType; - - /** - * Namespace - */ - private String namespace; - - /** - * Item id - */ - private String itemId; - - /** - * Whether to enable dynamic thread pool - */ - private Boolean enable = true; - - /** - * Print dynamic thread pool banner - */ - private Boolean banner = true; - - /** - * Thread pool monitoring related configuration. - */ - private MonitorProperties monitor = new MonitorProperties(); - - /*** - * Latest use {@link MonitorProperties#getEnable()} - */ - @Deprecated - private Boolean collect = Boolean.TRUE; - - /** - * Latest use {@link MonitorProperties#getCollectTypes()} - */ - @Deprecated - private String collectType; - - /** - * Latest use {@link MonitorProperties#getInitialDelay()} - */ - @Deprecated - private Long initialDelay = 10000L; - - /** - * Latest use {@link MonitorProperties#getCollectInterval()} - */ - @Deprecated - private Long collectInterval = 5000L; - - /** - * Latest use {@link MonitorProperties#getTaskBufferSize()} - */ - @Deprecated - private Integer taskBufferSize = 4096; -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/config/DiscoveryConfiguration.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/config/DiscoveryConfiguration.java deleted file mode 100644 index 0b5dc6d4..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/config/DiscoveryConfiguration.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.config; - -import cn.hippo4j.common.model.InstanceInfo; -import cn.hippo4j.core.toolkit.inet.InetUtils; -import cn.hippo4j.springboot.starter.core.ClientShutdown; -import cn.hippo4j.springboot.starter.core.DiscoveryClient; -import cn.hippo4j.springboot.starter.provider.InstanceInfoProviderFactory; -import cn.hippo4j.springboot.starter.remote.HttpAgent; -import lombok.AllArgsConstructor; -import org.springframework.context.annotation.Bean; -import org.springframework.core.env.ConfigurableEnvironment; - -/** - * Dynamic thread-pool discovery config. - */ -@AllArgsConstructor -public class DiscoveryConfiguration { - - private final ConfigurableEnvironment environment; - - private final BootstrapProperties bootstrapProperties; - - private final InetUtils hippo4jInetUtils; - - @Bean - public InstanceInfo instanceConfig() { - return InstanceInfoProviderFactory.getInstance(environment, bootstrapProperties, hippo4jInetUtils); - } - - @Bean - public ClientShutdown hippo4jClientShutdown() { - return new ClientShutdown(); - } - - @Bean - public DiscoveryClient hippo4jDiscoveryClient(HttpAgent httpAgent, - InstanceInfo instanceInfo, - ClientShutdown hippo4jClientShutdown) { - return new DiscoveryClient(httpAgent, instanceInfo, hippo4jClientShutdown); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java deleted file mode 100644 index 50d59116..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.config; - -import cn.hippo4j.adapter.base.ThreadPoolAdapterBeanContainer; -import cn.hippo4j.adapter.web.WebThreadPoolHandlerChoose; -import cn.hippo4j.common.api.ThreadDetailState; -import cn.hippo4j.common.api.ThreadPoolConfigChange; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.core.config.UtilAutoConfiguration; -import cn.hippo4j.core.enable.MarkerConfiguration; -import cn.hippo4j.core.executor.state.ThreadPoolRunStateHandler; -import cn.hippo4j.core.executor.support.service.DynamicThreadPoolService; -import cn.hippo4j.core.executor.handler.DynamicThreadPoolBannerHandler; -import cn.hippo4j.core.extension.initialize.Hippo4jDynamicThreadPoolInitializer; -import cn.hippo4j.core.toolkit.IdentifyUtil; -import cn.hippo4j.core.toolkit.inet.InetUtils; -import cn.hippo4j.message.config.MessageConfiguration; -import cn.hippo4j.springboot.starter.adapter.web.WebAdapterConfiguration; -import cn.hippo4j.springboot.starter.controller.ThreadPoolAdapterController; -import cn.hippo4j.springboot.starter.controller.WebThreadPoolController; -import cn.hippo4j.springboot.starter.controller.WebThreadPoolRunStateController; -import cn.hippo4j.springboot.starter.core.BaseThreadDetailStateHandler; -import cn.hippo4j.springboot.starter.core.ClientShutdown; -import cn.hippo4j.springboot.starter.core.ClientWorker; -import cn.hippo4j.springboot.starter.core.DynamicThreadPoolSubscribeConfig; -import cn.hippo4j.springboot.starter.core.ServerThreadPoolDynamicRefresh; -import cn.hippo4j.springboot.starter.core.ThreadPoolAdapterRegister; -import cn.hippo4j.springboot.starter.event.ApplicationContentPostProcessor; -import cn.hippo4j.springboot.starter.monitor.ReportingEventExecutor; -import cn.hippo4j.springboot.starter.monitor.collect.RunTimeInfoCollector; -import cn.hippo4j.springboot.starter.monitor.send.MessageSender; -import cn.hippo4j.springboot.starter.monitor.send.http.HttpConnectSender; -import cn.hippo4j.springboot.starter.notify.ServerModeNotifyConfigBuilder; -import cn.hippo4j.springboot.starter.remote.HttpAgent; -import cn.hippo4j.springboot.starter.remote.HttpScheduledHealthCheck; -import cn.hippo4j.springboot.starter.remote.ServerHealthCheck; -import cn.hippo4j.springboot.starter.remote.ServerHttpAgent; -import cn.hippo4j.springboot.starter.support.AdaptedThreadPoolDestroyPostProcessor; -import cn.hippo4j.springboot.starter.support.DynamicThreadPoolConfigService; -import cn.hippo4j.springboot.starter.support.DynamicThreadPoolPostProcessor; -import cn.hippo4j.springboot.starter.support.ThreadPoolPluginRegisterPostProcessor; -import cn.hippo4j.threadpool.alarm.api.ThreadPoolCheckAlarm; -import cn.hippo4j.threadpool.alarm.handler.DefaultThreadPoolCheckAlarmHandler; -import cn.hippo4j.threadpool.dynamic.api.ThreadPoolDynamicRefresh; -import cn.hippo4j.threadpool.message.api.NotifyConfigBuilder; -import cn.hippo4j.threadpool.message.core.service.AlarmControlHandler; -import cn.hippo4j.threadpool.message.core.service.DefaultThreadPoolConfigChangeHandler; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolBaseSendMessageService; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolSendMessageService; -import lombok.AllArgsConstructor; -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.boot.autoconfigure.ImportAutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.info.BuildProperties; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; -import org.springframework.core.env.ConfigurableEnvironment; - -/** - * Dynamic thread-pool auto-configuration. - * - *

NOTE: - * {@code cn.hippo4j.springboot.starter.config.DynamicThreadPoolAutoConfiguration} is used in the - * hippo4j-spring-boot-starter-adapter-hystrix module to determine the condition, see - * {@code cn.hippo4j.springboot.starter.adapter.hystrix.HystrixAdapterAutoConfiguration}, please - * note the subsequent modification. - */ -@Configuration -@AllArgsConstructor -@ConditionalOnBean(MarkerConfiguration.Marker.class) -@EnableConfigurationProperties(BootstrapProperties.class) -@ConditionalOnProperty(prefix = Constants.CONFIGURATION_PROPERTIES_PREFIX, value = "enable", matchIfMissing = true, havingValue = "true") -@ImportAutoConfiguration({WebAdapterConfiguration.class, NettyClientConfiguration.class, DiscoveryConfiguration.class, MessageConfiguration.class, UtilAutoConfiguration.class}) -public class DynamicThreadPoolAutoConfiguration { - - private final BootstrapProperties properties; - - private final ConfigurableEnvironment environment; - - @Bean - public DynamicThreadPoolBannerHandler threadPoolBannerHandler(ObjectProvider buildProperties) { - return new DynamicThreadPoolBannerHandler(properties, buildProperties.getIfAvailable()); - } - - @Bean - @ConditionalOnMissingBean - @Order(Ordered.HIGHEST_PRECEDENCE) - public ApplicationContextHolder hippo4jApplicationContextHolder() { - return new ApplicationContextHolder(); - } - - @Bean - public ClientWorker hippo4jClientWorker(HttpAgent httpAgent, - InetUtils hippo4jInetUtils, - ServerHealthCheck serverHealthCheck, - DynamicThreadPoolBannerHandler dynamicThreadPoolBannerHandlers, - ClientShutdown hippo4jClientShutdown) { - String identify = IdentifyUtil.generate(environment, hippo4jInetUtils); - return new ClientWorker(httpAgent, identify, serverHealthCheck, dynamicThreadPoolBannerHandlers.getVersion(), hippo4jClientShutdown); - } - - @Bean - @SuppressWarnings("all") - public DynamicThreadPoolService dynamicThreadPoolConfigService(HttpAgent httpAgent, - ServerHealthCheck serverHealthCheck, - ServerModeNotifyConfigBuilder serverModeNotifyConfigBuilder, - ThreadPoolBaseSendMessageService threadPoolBaseSendMessageService, - DynamicThreadPoolSubscribeConfig dynamicThreadPoolSubscribeConfig) { - return new DynamicThreadPoolConfigService(httpAgent, properties, serverModeNotifyConfigBuilder, threadPoolBaseSendMessageService, dynamicThreadPoolSubscribeConfig); - } - - @Bean - public AdaptedThreadPoolDestroyPostProcessor adaptedThreadPoolDestroyPostProcessor(ApplicationContext applicationContext) { - return new AdaptedThreadPoolDestroyPostProcessor(applicationContext); - } - - @Bean - @ConditionalOnProperty(prefix = Constants.CONFIGURATION_PROPERTIES_PREFIX, value = "enable", matchIfMissing = true, havingValue = "true") - @SuppressWarnings("all") - public DynamicThreadPoolPostProcessor threadPoolBeanPostProcessor(HttpAgent httpAgent, - ApplicationContextHolder hippo4jApplicationContextHolder, - DynamicThreadPoolSubscribeConfig dynamicThreadPoolSubscribeConfig) { - return new DynamicThreadPoolPostProcessor(properties, httpAgent, dynamicThreadPoolSubscribeConfig); - } - - @Bean - @ConditionalOnMissingBean(value = ThreadDetailState.class) - public ThreadDetailState baseThreadDetailStateHandler() { - return new BaseThreadDetailStateHandler(); - } - - @Bean - public WebThreadPoolRunStateController poolRunStateController(ThreadPoolRunStateHandler threadPoolRunStateHandler, - ThreadDetailState threadDetailState) { - return new WebThreadPoolRunStateController(threadPoolRunStateHandler, threadDetailState); - } - - @Bean - @ConditionalOnMissingBean - @SuppressWarnings("all") - public MessageSender messageSender(HttpAgent httpAgent) { - return new HttpConnectSender(httpAgent); - } - - @Bean - public ReportingEventExecutor reportingEventExecutor(BootstrapProperties properties, - MessageSender messageSender, - ServerHealthCheck serverHealthCheck) { - return new ReportingEventExecutor(properties, messageSender, serverHealthCheck); - } - - @Bean - @SuppressWarnings("all") - public ServerHealthCheck httpScheduledHealthCheck(HttpAgent httpAgent) { - return new HttpScheduledHealthCheck(httpAgent); - } - - @Bean - public RunTimeInfoCollector runTimeInfoCollector() { - return new RunTimeInfoCollector(properties); - } - - @Bean - @SuppressWarnings("all") - public ThreadPoolAdapterController threadPoolAdapterController(InetUtils hippo4jInetUtils) { - return new ThreadPoolAdapterController(environment, hippo4jInetUtils); - } - - @Bean - public ThreadPoolAdapterBeanContainer threadPoolAdapterBeanContainer() { - return new ThreadPoolAdapterBeanContainer(); - } - - @Bean - public ApplicationContentPostProcessor applicationContentPostProcessor() { - return new ApplicationContentPostProcessor(); - } - - @Bean - @SuppressWarnings("all") - public WebThreadPoolController webThreadPoolController(WebThreadPoolHandlerChoose webThreadPoolServiceChoose) { - return new WebThreadPoolController(webThreadPoolServiceChoose); - } - - @Bean - @SuppressWarnings("all") - public ThreadPoolAdapterRegister threadPoolAdapterRegister(HttpAgent httpAgent, - InetUtils hippo4jInetUtils) { - return new ThreadPoolAdapterRegister(httpAgent, properties, environment, hippo4jInetUtils); - } - - @Bean - public NotifyConfigBuilder serverNotifyConfigBuilder(HttpAgent httpAgent, - BootstrapProperties properties, - AlarmControlHandler alarmControlHandler) { - return new ServerModeNotifyConfigBuilder(httpAgent, properties, alarmControlHandler); - } - - @Bean - @ConditionalOnMissingBean - public ThreadPoolCheckAlarm defaultThreadPoolCheckAlarmHandler(ThreadPoolSendMessageService hippo4jSendMessageService) { - return new DefaultThreadPoolCheckAlarmHandler(hippo4jSendMessageService); - } - - @Bean - @ConditionalOnMissingBean - public ThreadPoolConfigChange defaultThreadPoolConfigChangeHandler(ThreadPoolSendMessageService hippo4jSendMessageService) { - return new DefaultThreadPoolConfigChangeHandler(hippo4jSendMessageService); - } - - @Bean - public ThreadPoolDynamicRefresh threadPoolDynamicRefresh(ThreadPoolConfigChange threadPoolConfigChange) { - return new ServerThreadPoolDynamicRefresh(threadPoolConfigChange); - } - - @Bean - public DynamicThreadPoolSubscribeConfig dynamicThreadPoolSubscribeConfig(ThreadPoolDynamicRefresh threadPoolDynamicRefresh, - ClientWorker clientWorker) { - return new DynamicThreadPoolSubscribeConfig(threadPoolDynamicRefresh, clientWorker, properties); - } - - @Bean - public HttpAgent httpAgent(BootstrapProperties properties) { - return new ServerHttpAgent(properties); - } - - @Bean - public ThreadPoolPluginRegisterPostProcessor threadPoolPluginRegisterPostProcessor() { - return new ThreadPoolPluginRegisterPostProcessor(); - } - - @Bean - public Hippo4jDynamicThreadPoolInitializer hippo4jDynamicThreadPoolInitializer() { - return new Hippo4jDynamicThreadPoolInitializer(); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/config/MonitorProperties.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/config/MonitorProperties.java deleted file mode 100644 index cee9336c..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/config/MonitorProperties.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.config; - -import cn.hippo4j.threadpool.monitor.support.MonitorThreadPoolTypeEnum; -import cn.hippo4j.threadpool.monitor.support.MonitorTypeEnum; -import lombok.Data; - -/** - * Thread pool monitoring properties. - */ -@Data -public class MonitorProperties { - - /** - * Collect thread pool runtime indicators. - */ - private Boolean enable = Boolean.TRUE; - - /** - * Type of collection thread pool running data. eg: log,micrometer. Multiple can be used at the same time, default micrometer. - */ - private String collectTypes = MonitorTypeEnum.SERVER.toString().toLowerCase(); - - /** - * Monitor the type of thread pool. eg: dynamic,web,adapter. Can be configured arbitrarily, default dynamic. - */ - private String threadPoolTypes = MonitorThreadPoolTypeEnum.DYNAMIC.toString().toLowerCase(); - - /** - * Delay starting data acquisition task. unit: ms - */ - private Long initialDelay = 10000L; - - /** - * Collect interval. unit: ms - */ - private Long collectInterval = 5000L; - - /** - * Task buffer container capacity - */ - private Integer taskBufferSize = 4096; -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/config/NettyClientConfiguration.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/config/NettyClientConfiguration.java deleted file mode 100644 index e628a831..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/config/NettyClientConfiguration.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.config; - -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.springboot.starter.monitor.send.netty.NettyConnectSender; -import cn.hippo4j.springboot.starter.monitor.send.MessageSender; -import cn.hippo4j.springboot.starter.remote.ServerNettyAgent; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; - -/** - * Netty client configuration. - */ -@ConditionalOnProperty(prefix = Constants.CONFIGURATION_PROPERTIES_PREFIX, name = "report-type", havingValue = "netty") -public class NettyClientConfiguration { - - @Bean - @SuppressWarnings("all") - public ServerNettyAgent serverNettyAgent(BootstrapProperties properties) { - return new ServerNettyAgent(properties); - } - - @Bean - public MessageSender messageSender(ServerNettyAgent serverNettyAgent) { - return new NettyConnectSender(serverNettyAgent); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/controller/ThreadPoolAdapterController.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/controller/ThreadPoolAdapterController.java deleted file mode 100644 index 25addd96..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/controller/ThreadPoolAdapterController.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.controller; - -import cn.hippo4j.adapter.base.ThreadPoolAdapter; -import cn.hippo4j.adapter.base.ThreadPoolAdapterParameter; -import cn.hippo4j.common.model.ThreadPoolAdapterState; -import cn.hippo4j.common.model.Result; -import cn.hippo4j.core.api.ClientNetworkService; -import cn.hippo4j.common.extension.spi.ServiceLoaderRegistry; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.core.toolkit.IdentifyUtil; -import cn.hippo4j.core.toolkit.inet.InetUtils; -import cn.hippo4j.springboot.starter.toolkit.CloudCommonIdUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Optional; - -import static cn.hippo4j.adapter.base.ThreadPoolAdapterBeanContainer.THREAD_POOL_ADAPTER_BEAN_CONTAINER; - -/** - * Thread-pool adapter controller. - */ -@Slf4j -@RestController -@AllArgsConstructor -public class ThreadPoolAdapterController { - - private final ConfigurableEnvironment environment; - private final InetUtils hippo4jInetUtils; - - @GetMapping("/adapter/thread-pool/info") - public Result getAdapterThreadPool(ThreadPoolAdapterParameter requestParameter) { - ThreadPoolAdapter threadPoolAdapter = THREAD_POOL_ADAPTER_BEAN_CONTAINER.get(requestParameter.getMark()); - ThreadPoolAdapterState result = Optional.ofNullable(threadPoolAdapter).map(each -> { - ThreadPoolAdapterState threadPoolState = each.getThreadPoolState(requestParameter.getThreadPoolKey()); - String active = environment.getProperty("spring.profiles.active", "UNKNOWN"); - threadPoolState.setActive(active.toUpperCase()); - String[] customerNetwork = ServiceLoaderRegistry.getSingletonServiceInstances(ClientNetworkService.class) - .stream().findFirst().map(network -> network.getNetworkIpPort(environment)).orElse(null); - String clientAddress; - if (customerNetwork != null) { - clientAddress = StringUtil.newBuilder(customerNetwork[0], ":", customerNetwork[1]); - } else { - clientAddress = CloudCommonIdUtil.getClientIpPort(environment, hippo4jInetUtils); - } - threadPoolState.setClientAddress(clientAddress); - threadPoolState.setIdentify(IdentifyUtil.getIdentify()); - return threadPoolState; - }).orElse(null); - return new Result().setCode(Result.SUCCESS_CODE).setData(result); - } - - @PostMapping("/adapter/thread-pool/update") - public Result updateAdapterThreadPool(@RequestBody ThreadPoolAdapterParameter requestParameter) { - log.info("[{}] Change third-party thread pool data. key: {}, coreSize: {}, maximumSize: {}", - requestParameter.getMark(), requestParameter.getThreadPoolKey(), requestParameter.getCorePoolSize(), requestParameter.getMaximumPoolSize()); - ThreadPoolAdapter threadPoolAdapter = THREAD_POOL_ADAPTER_BEAN_CONTAINER.get(requestParameter.getMark()); - Optional.ofNullable(threadPoolAdapter).ifPresent(each -> each.updateThreadPool(requestParameter)); - return new Result().setCode(Result.SUCCESS_CODE); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/controller/WebThreadPoolController.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/controller/WebThreadPoolController.java deleted file mode 100644 index ca48a8fe..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/controller/WebThreadPoolController.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.controller; - -import cn.hippo4j.adapter.web.WebThreadPoolHandlerChoose; -import cn.hippo4j.adapter.web.WebThreadPoolService; -import cn.hippo4j.common.model.Result; -import cn.hippo4j.common.model.ThreadPoolBaseInfo; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import cn.hippo4j.common.model.ThreadPoolRunStateInfo; -import lombok.AllArgsConstructor; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -/** - * Web thread pool controller. - * - *

At present, only Tomcat is well supported, and other web containers need to be improved. - */ -@CrossOrigin -@RestController -@AllArgsConstructor -public class WebThreadPoolController { - - private final WebThreadPoolHandlerChoose webThreadPoolServiceChoose; - - @GetMapping("/web/base/info") - public Result getPoolBaseState(@RequestParam(value = "mark") String mark) { - WebThreadPoolService webThreadPoolService = webThreadPoolServiceChoose.choose(); - if (webThreadPoolService != null && webThreadPoolService.getClass().getSimpleName().contains(mark)) { - return new Result().setCode(Result.SUCCESS_CODE).setData(webThreadPoolService.simpleInfo()); - } - return new Result().setCode(Result.SUCCESS_CODE); - } - - @GetMapping("/web/run/state") - public Result getPoolRunState() { - return new Result().setCode(Result.SUCCESS_CODE).setData(webThreadPoolServiceChoose.choose().getWebRunStateInfo()); - } - - @PostMapping("/web/update/pool") - public Result updateWebThreadPool(@RequestBody ThreadPoolParameterInfo threadPoolParameterInfo) { - webThreadPoolServiceChoose.choose().updateWebThreadPool(threadPoolParameterInfo); - return new Result().setCode(Result.SUCCESS_CODE); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/controller/WebThreadPoolRunStateController.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/controller/WebThreadPoolRunStateController.java deleted file mode 100644 index 52e0bf96..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/controller/WebThreadPoolRunStateController.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.controller; - -import cn.hippo4j.common.api.ThreadDetailState; -import cn.hippo4j.common.model.Result; -import cn.hippo4j.common.model.ThreadPoolRunStateInfo; -import cn.hippo4j.common.model.ThreadDetailStateInfo; -import cn.hippo4j.core.executor.state.ThreadPoolRunStateHandler; -import lombok.AllArgsConstructor; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -/** - * Web thread-pool run state controller. - */ -@CrossOrigin -@RestController -@AllArgsConstructor -public class WebThreadPoolRunStateController { - - private final ThreadPoolRunStateHandler threadPoolRunStateHandler; - private final ThreadDetailState threadDetailState; - - @GetMapping("/run/state/{threadPoolId}") - public Result getPoolRunState(@PathVariable("threadPoolId") String threadPoolId) { - return new Result().setCode(Result.SUCCESS_CODE).setData(threadPoolRunStateHandler.getPoolRunState(threadPoolId)); - } - - @GetMapping("/run/thread/state/{threadPoolId}") - public Result> getThreadStateDetail(@PathVariable("threadPoolId") String threadPoolId) { - return new Result>().setCode(Result.SUCCESS_CODE).setData(threadDetailState.getThreadDetailStateInfo(threadPoolId)); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/BaseThreadDetailStateHandler.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/BaseThreadDetailStateHandler.java deleted file mode 100644 index 99e56a13..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/BaseThreadDetailStateHandler.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.core; - -import cn.hippo4j.common.api.ThreadDetailState; -import cn.hippo4j.common.executor.ThreadPoolExecutorHolder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.model.ThreadDetailStateInfo; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.common.toolkit.ReflectUtil; -import lombok.extern.slf4j.Slf4j; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.concurrent.ThreadPoolExecutor; - -/** - * Base thread detail state handler. - * - *

The Java 8 implementation is temporarily provided, {@link ThreadDetailState} interface can be customized. - */ -@Slf4j -public class BaseThreadDetailStateHandler implements ThreadDetailState { - - private final String workersName = "workers"; - - private final String threadName = "thread"; - - @Override - public List getThreadDetailStateInfo(String threadPoolId) { - ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(threadPoolId); - ThreadPoolExecutor threadPoolExecutor = executorHolder.getExecutor(); - return getThreadDetailStateInfo(threadPoolExecutor); - } - - @Override - public List getThreadDetailStateInfo(ThreadPoolExecutor threadPoolExecutor) { - List resultThreadStates = new ArrayList(); - try { - HashSet workers = (HashSet) ReflectUtil.getFieldValue(threadPoolExecutor, workersName); - if (CollectionUtil.isEmpty(workers)) { - return resultThreadStates; - } - for (Object worker : workers) { - Thread thread; - try { - thread = (Thread) ReflectUtil.getFieldValue(worker, threadName); - if (thread == null) { - log.warn("Reflection get worker thread is null. Worker: {}", worker); - continue; - } - } catch (Exception ex) { - log.error("Reflection get worker thread exception. Worker: {}", worker, ex); - continue; - } - long threadId = thread.getId(); - String threadName = thread.getName(); - String threadStatus = thread.getState().name(); - StackTraceElement[] stackTrace = thread.getStackTrace(); - List threadStack = new ArrayList(stackTrace.length); - for (int i = 0; i < stackTrace.length; i++) { - threadStack.add(stackTrace[i].toString()); - } - ThreadDetailStateInfo threadState = ThreadDetailStateInfo.builder() - .threadId(threadId) - .threadName(threadName) - .threadStatus(threadStatus) - .threadStack(threadStack) - .build(); - resultThreadStates.add(threadState); - } - } catch (Exception ex) { - log.error("Failed to get thread status.", ex); - } - return resultThreadStates; - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/CacheData.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/CacheData.java deleted file mode 100644 index 0e682d99..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/CacheData.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.core; - -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import cn.hippo4j.springboot.starter.wrapper.ManagerListenerWrapper; -import cn.hippo4j.common.toolkit.ContentUtil; -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.common.toolkit.Md5Util; -import cn.hippo4j.common.toolkit.IncrementalContentUtil; -import cn.hippo4j.common.constant.Constants; -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.CopyOnWriteArrayList; - -/** - * Cache data. - */ -@Slf4j -public class CacheData { - - @Getter - private volatile String md5; - - private volatile String content; - - @Getter - private final String tenantId; - - @Getter - private final String itemId; - - @Getter - private final String threadPoolId; - - private final String clientVersion; - - @Setter - private volatile boolean isInitializing = true; - - private final CopyOnWriteArrayList listeners; - - public CacheData(String tenantId, String itemId, String threadPoolId, String clientVersion) { - this.tenantId = tenantId; - this.itemId = itemId; - this.threadPoolId = threadPoolId; - this.clientVersion = clientVersion; - // Store full content for listeners to receive complete configuration - ThreadPoolParameterInfo parameterInfo = ThreadPoolExecutorRegistry.getHolder(threadPoolId).getParameterInfo(); - this.content = ContentUtil.getPoolContent(parameterInfo); - // Calculate MD5 based on incremental content for version compatibility - String incrementalContent = IncrementalContentUtil.getVersionedContent(parameterInfo, clientVersion); - this.md5 = getMd5String(incrementalContent); - this.listeners = new CopyOnWriteArrayList<>(); - } - - public void addListener(Listener listener) { - if (null == listener) { - throw new IllegalArgumentException("Listener is null."); - } - ManagerListenerWrapper managerListenerWrap = new ManagerListenerWrapper(md5, listener); - if (listeners.addIfAbsent(managerListenerWrap)) { - log.info("Add listener status: ok, thread pool id: {}, listeners count: {}", threadPoolId, listeners.size()); - } - } - - public void checkListenerMd5() { - for (ManagerListenerWrapper managerListenerWrapper : listeners) { - if (!md5.equals(managerListenerWrapper.getLastCallMd5())) { - safeNotifyListener(content, md5, managerListenerWrapper); - } - } - } - - private void safeNotifyListener(String content, String md5, ManagerListenerWrapper managerListenerWrapper) { - Listener listener = managerListenerWrapper.getListener(); - Runnable runnable = () -> { - managerListenerWrapper.setLastCallMd5(md5); - listener.receiveConfigInfo(content); - }; - try { - listener.getExecutor().execute(runnable); - } catch (Exception ex) { - log.error("Failed to execute listener. message: {}", ex.getMessage()); - } - } - - public void setContent(String content) { - // Store full content for listeners - this.content = content; - // Calculate MD5 based on incremental content for version compatibility - try { - ThreadPoolParameterInfo parameterInfo = JSONUtil.parseObject(content, ThreadPoolParameterInfo.class); - String incrementalContent = IncrementalContentUtil.getVersionedContent(parameterInfo, clientVersion); - this.md5 = getMd5String(incrementalContent); - } catch (Exception e) { - // Fallback to full content MD5 if parsing fails - this.md5 = getMd5String(content); - } - } - - public static String getMd5String(String config) { - return (null == config) ? Constants.NULL : Md5Util.md5Hex(config, Constants.ENCODE); - } - - public boolean isInitializing() { - return isInitializing; - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ClientShutdown.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ClientShutdown.java deleted file mode 100644 index 1434d4b2..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ClientShutdown.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.core; - -import lombok.Getter; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -/** - * Called when the application is closed to avoid data exceptions caused by - * long polling on the client side. - * - * @version 1.5.0 - * @see - */ -public class ClientShutdown { - - @Getter - private volatile boolean prepareClose = false; - private static final Long TIME_OUT_SECOND = 1L; - - private static final int DEFAULT_COUNT = 1; - private final CountDownLatch countDownLatch = new CountDownLatch(DEFAULT_COUNT); - - /** - * Called when the application is closed. - * - * @throws InterruptedException - */ - public void prepareDestroy() throws InterruptedException { - prepareClose = true; - countDownLatch.await(TIME_OUT_SECOND, TimeUnit.SECONDS); - } - - /** - * Decrements the count of the latch, releasing all waiting threads if - * the count reaches zero. - * - *

If the current count is greater than zero then it is decremented. - * If the new count is zero then all waiting threads are re-enabled for - * thread scheduling purposes. - * - *

If the current count equals zero then nothing happens. - */ - public void countDown() { - countDownLatch.countDown(); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ClientWorker.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ClientWorker.java deleted file mode 100644 index 22c917fe..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ClientWorker.java +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.core; - -import cn.hippo4j.common.executor.ThreadFactoryBuilder; -import cn.hippo4j.common.model.Result; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import cn.hippo4j.common.toolkit.ContentUtil; -import cn.hippo4j.common.toolkit.GroupKey; -import cn.hippo4j.common.toolkit.IdUtil; -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.common.toolkit.VersionUtil; -import cn.hippo4j.springboot.starter.remote.HttpAgent; -import cn.hippo4j.springboot.starter.remote.ServerHealthCheck; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.util.StringUtils; - -import java.net.URLDecoder; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -import static cn.hippo4j.common.constant.Constants.CONFIG_LONG_POLL_TIMEOUT; -import static cn.hippo4j.common.constant.Constants.GROUP_KEY_DELIMITER_TRANSLATION; -import static cn.hippo4j.common.constant.Constants.WORD_SEPARATOR; -import static cn.hippo4j.common.constant.Constants.LINE_SEPARATOR; -import static cn.hippo4j.common.constant.Constants.LISTENING_CONFIGS; -import static cn.hippo4j.common.constant.Constants.WEIGHT_CONFIGS; -import static cn.hippo4j.common.constant.Constants.LONG_PULLING_TIMEOUT; -import static cn.hippo4j.common.constant.Constants.LONG_PULLING_CLIENT_IDENTIFICATION; -import static cn.hippo4j.common.constant.Constants.LONG_PULLING_TIMEOUT_NO_HANGUP; -import static cn.hippo4j.common.constant.Constants.CLIENT_VERSION; -import static cn.hippo4j.common.constant.Constants.LISTENER_PATH; -import static cn.hippo4j.common.constant.Constants.INITIAL_CAPACITY; -import static cn.hippo4j.common.constant.Constants.DATA_GROUP_TENANT_SIZE; -import static cn.hippo4j.common.constant.Constants.CONFIG_CONTROLLER_PATH; -import static cn.hippo4j.common.constant.Constants.NULL; - -/** - * Client worker. - */ -@Slf4j -public class ClientWorker implements DisposableBean { - - private final long timeout; - private final String identify; - private final String version; - private final HttpAgent agent; - private final ServerHealthCheck serverHealthCheck; - private final ScheduledExecutorService executorService; - private final ClientShutdown hippo4jClientShutdown; - - private final CountDownLatch awaitApplicationComplete = new CountDownLatch(1); - private final CountDownLatch cacheCondition = new CountDownLatch(1); - private final ConcurrentHashMap cacheMap = new ConcurrentHashMap<>(16); - - private final long defaultTimedOut = 3000L; - - @SuppressWarnings("all") - public ClientWorker(HttpAgent httpAgent, - String identify, - ServerHealthCheck serverHealthCheck, - String version, - ClientShutdown hippo4jClientShutdown) { - this.agent = httpAgent; - this.identify = identify; - this.timeout = CONFIG_LONG_POLL_TIMEOUT; - this.version = VersionUtil.resolveClientVersion(version, ClientWorker.class); - this.serverHealthCheck = serverHealthCheck; - this.hippo4jClientShutdown = hippo4jClientShutdown; - ScheduledExecutorService executor = Executors.newScheduledThreadPool(1, runnable -> { - Thread thread = new Thread(runnable); - thread.setName("client.worker.executor"); - thread.setDaemon(true); - return thread; - }); - this.executorService = Executors.newSingleThreadScheduledExecutor( - ThreadFactoryBuilder.builder().prefix("client.long.polling.executor").daemon(true).build()); - log.info("Client identify: {}", identify); - executor.schedule(() -> { - try { - awaitApplicationComplete.await(); - executorService.execute(new LongPollingRunnable(cacheMap.isEmpty(), cacheCondition)); - } catch (Throwable ex) { - log.error("Sub check rotate check error.", ex); - } - }, 1L, TimeUnit.MILLISECONDS); - } - - @Override - public void destroy() throws Exception { - executorService.shutdownNow(); - } - - /** - * LongPollingRunnable - */ - class LongPollingRunnable implements Runnable { - - private boolean cacheMapInitEmptyFlag; - - private final CountDownLatch cacheCondition; - - LongPollingRunnable(boolean cacheMapInitEmptyFlag, CountDownLatch cacheCondition) { - this.cacheMapInitEmptyFlag = cacheMapInitEmptyFlag; - this.cacheCondition = cacheCondition; - } - - @Override - @SneakyThrows - public void run() { - if (executorService.isShutdown() || hippo4jClientShutdown.isPrepareClose()) { - hippo4jClientShutdown.countDown(); - log.info("The task of monitoring dynamic thread pool changes has stopped."); - return; - } - if (cacheMapInitEmptyFlag) { - cacheCondition.await(); - cacheMapInitEmptyFlag = false; - } - serverHealthCheck.isHealthStatus(); - List cacheDataList = new ArrayList<>(); - List inInitializingCacheList = new ArrayList<>(); - cacheMap.forEach((key, val) -> cacheDataList.add(val)); - List changedTpIds = checkUpdateDataIds(cacheDataList, inInitializingCacheList); - for (String groupKey : changedTpIds) { - String[] keys = groupKey.split(GROUP_KEY_DELIMITER_TRANSLATION); - String tpId = keys[0]; - String itemId = keys[1]; - String namespace = keys[2]; - try { - String content = getServerConfig(namespace, itemId, tpId, defaultTimedOut); - CacheData cacheData = cacheMap.get(tpId); - String poolContent = ContentUtil.getPoolContent(JSONUtil.parseObject(content, ThreadPoolParameterInfo.class)); - cacheData.setContent(poolContent); - } catch (Exception ignored) { - log.error("Failed to get the latest thread pool configuration.", ignored); - } - } - for (CacheData cacheData : cacheDataList) { - if (!cacheData.isInitializing() || inInitializingCacheList - .contains(GroupKey.getKeyTenant(cacheData.getThreadPoolId(), cacheData.getItemId(), cacheData.getTenantId()))) { - cacheData.checkListenerMd5(); - cacheData.setInitializing(false); - } - } - inInitializingCacheList.clear(); - executorService.execute(this); - } - } - - private List checkUpdateDataIds(List cacheDataList, List inInitializingCacheList) { - StringBuilder sb = new StringBuilder(); - for (CacheData cacheData : cacheDataList) { - sb.append(cacheData.getThreadPoolId()).append(WORD_SEPARATOR); - sb.append(cacheData.getItemId()).append(WORD_SEPARATOR); - sb.append(cacheData.getTenantId()).append(WORD_SEPARATOR); - sb.append(identify).append(WORD_SEPARATOR); - sb.append(cacheData.getMd5()).append(LINE_SEPARATOR); - if (cacheData.isInitializing()) { - inInitializingCacheList.add(GroupKey.getKeyTenant(cacheData.getThreadPoolId(), cacheData.getItemId(), cacheData.getTenantId())); - } - } - boolean isInitializingCacheList = !inInitializingCacheList.isEmpty(); - return checkUpdateTpIds(sb.toString(), isInitializingCacheList); - } - - public List checkUpdateTpIds(String probeUpdateString, boolean isInitializingCacheList) { - if (StringUtils.isEmpty(probeUpdateString)) { - return Collections.emptyList(); - } - Map params = new HashMap<>(2); - params.put(LISTENING_CONFIGS, probeUpdateString); - params.put(WEIGHT_CONFIGS, IdUtil.simpleUUID()); - Map headers = new HashMap<>(3); - headers.put(LONG_PULLING_TIMEOUT, "" + timeout); - // Confirm the identity of the client, and can be modified separately when modifying the thread pool configuration. - headers.put(LONG_PULLING_CLIENT_IDENTIFICATION, identify); - // Told server do not hang me up if new initializing cacheData added in. - if (isInitializingCacheList) { - headers.put(LONG_PULLING_TIMEOUT_NO_HANGUP, "true"); - } - headers.put(CLIENT_VERSION, version); - try { - long readTimeoutMs = timeout + Math.round(timeout >> 1); - Result result = agent.httpPostByConfig(LISTENER_PATH, headers, params, readTimeoutMs); - if (result != null && result.isSuccess()) { - return parseUpdateDataIdResponse(result.getData().toString()); - } - } catch (Exception ex) { - setHealthServer(false); - log.error("Check update get changed dataId exception. error message: {}", ex.getMessage()); - } - return Collections.emptyList(); - } - - public String getServerConfig(String namespace, String itemId, String threadPoolId, long readTimeout) { - Map params = new HashMap<>(INITIAL_CAPACITY); - params.put("namespace", namespace); - params.put("itemId", itemId); - params.put("tpId", threadPoolId); - params.put("instanceId", identify); - Result result = agent.httpGetByConfig(CONFIG_CONTROLLER_PATH, null, params, readTimeout); - if (result.isSuccess()) { - return JSONUtil.toJSONString(result.getData()); - } - log.error("Sub server namespace: {}, itemId: {}, threadPoolId: {}, result code: {}", namespace, itemId, threadPoolId, result.getCode()); - return NULL; - } - - public List parseUpdateDataIdResponse(String response) { - if (StringUtils.isEmpty(response)) { - return Collections.emptyList(); - } - try { - response = URLDecoder.decode(response, "UTF-8"); - } catch (Exception e) { - log.error("Polling resp decode modifiedDataIdsString error.", e); - } - List updateList = new LinkedList<>(); - for (String dataIdAndGroup : response.split(LINE_SEPARATOR)) { - if (!StringUtils.isEmpty(dataIdAndGroup)) { - String[] keyArr = dataIdAndGroup.split(WORD_SEPARATOR); - String dataId = keyArr[0]; - String group = keyArr[1]; - if (keyArr.length == DATA_GROUP_TENANT_SIZE) { - String tenant = keyArr[2]; - updateList.add(GroupKey.getKeyTenant(dataId, group, tenant)); - log.info("[{}] Refresh thread pool changed.", dataId); - } else { - log.error("[{}] Polling resp invalid dataIdAndGroup error.", dataIdAndGroup); - } - } - } - return updateList; - } - - public void addTenantListeners(String namespace, String itemId, String threadPoolId, List listeners) { - CacheData cacheData = addCacheDataIfAbsent(namespace, itemId, threadPoolId); - for (Listener listener : listeners) { - cacheData.addListener(listener); - } - // Lazy loading - if (awaitApplicationComplete.getCount() == 0L) { - cacheCondition.countDown(); - } - } - - public CacheData addCacheDataIfAbsent(String namespace, String itemId, String threadPoolId) { - CacheData cacheData = cacheMap.get(threadPoolId); - if (cacheData != null) { - return cacheData; - } - cacheData = new CacheData(namespace, itemId, threadPoolId, version); - CacheData lastCacheData = cacheMap.putIfAbsent(threadPoolId, cacheData); - if (lastCacheData == null) { - String serverConfig; - try { - serverConfig = getServerConfig(namespace, itemId, threadPoolId, defaultTimedOut); - ThreadPoolParameterInfo poolInfo = JSONUtil.parseObject(serverConfig, ThreadPoolParameterInfo.class); - cacheData.setContent(ContentUtil.getPoolContent(poolInfo)); - } catch (Exception ex) { - log.error("Cache Data Error. Service Unavailable: {}", ex.getMessage()); - } - lastCacheData = cacheData; - } - return lastCacheData; - } - - private void setHealthServer(boolean isHealthServer) { - this.serverHealthCheck.setHealthStatus(isHealthServer); - } - - public void notifyApplicationComplete() { - awaitApplicationComplete.countDown(); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ConfigEmptyAnalyzer.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ConfigEmptyAnalyzer.java deleted file mode 100644 index 66678250..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ConfigEmptyAnalyzer.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.core; - -import cn.hippo4j.core.config.ConfigEmptyException; -import org.springframework.boot.diagnostics.AbstractFailureAnalyzer; -import org.springframework.boot.diagnostics.FailureAnalysis; - -/** - * Config empty analyzer. - */ -public class ConfigEmptyAnalyzer extends AbstractFailureAnalyzer { - - @Override - protected FailureAnalysis analyze(Throwable rootFailure, ConfigEmptyException configEmptyException) { - return new FailureAnalysis(configEmptyException.getDescription(), configEmptyException.getAction(), configEmptyException); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ConfigService.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ConfigService.java deleted file mode 100644 index 72610226..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ConfigService.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.core; - -/** - * Config service. - */ -public interface ConfigService { - - /** - * Add listener. - * - * @param tenantId - * @param itemId - * @param threadPoolId - * @param listener - */ - void addListener(String tenantId, String itemId, String threadPoolId, Listener listener); - - /** - * Get server status. - * - * @return - */ - String getServerStatus(); -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/DiscoveryClient.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/DiscoveryClient.java deleted file mode 100644 index 95818c8f..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/DiscoveryClient.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.core; - -import cn.hippo4j.common.api.ClientCloseHookExecute; -import cn.hippo4j.common.model.Result; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.common.model.InstanceInfo; -import cn.hippo4j.common.executor.ThreadFactoryBuilder; -import cn.hippo4j.springboot.starter.remote.HttpAgent; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.DisposableBean; - -import java.util.Objects; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import static cn.hippo4j.common.constant.Constants.BASE_PATH; - -/** - * Discovery client. - */ -@Slf4j -public class DiscoveryClient implements DisposableBean { - - private final ScheduledExecutorService scheduler; - private final HttpAgent httpAgent; - private final InstanceInfo instanceInfo; - private final ClientShutdown hippo4jClientShutdown; - - private volatile long lastSuccessfulHeartbeatTimestamp = -1; - private final int delayTime = 30; - - private static final String PREFIX = "DiscoveryClient_"; - private final String appPathIdentifier; - private final String SERVICE_ERROR_CODE = "3"; - private final String SERVICE_NOT_FOUND_CODE = "404"; - - public DiscoveryClient(HttpAgent httpAgent, InstanceInfo instanceInfo, ClientShutdown hippo4jClientShutdown) { - this.httpAgent = httpAgent; - this.instanceInfo = instanceInfo; - this.hippo4jClientShutdown = hippo4jClientShutdown; - this.appPathIdentifier = instanceInfo.getAppName().toUpperCase() + "/" + instanceInfo.getInstanceId(); - this.scheduler = new ScheduledThreadPoolExecutor( - new Integer(1), - ThreadFactoryBuilder.builder().daemon(true).prefix("client.discovery.scheduler").build()); - register(); - // Init the schedule tasks. - initScheduledTasks(); - } - - private void initScheduledTasks() { - scheduler.scheduleWithFixedDelay(new HeartbeatThread(), delayTime, delayTime, TimeUnit.SECONDS); - } - - boolean register() { - log.info("{}{} - registering service...", PREFIX, appPathIdentifier); - String urlPath = BASE_PATH + "/apps/register/"; - Result registerResult; - try { - registerResult = httpAgent.httpPostByDiscovery(urlPath, instanceInfo); - } catch (Exception ex) { - registerResult = new Result().setCode(SERVICE_ERROR_CODE); - log.error("{}{} - registration failed: {}", PREFIX, appPathIdentifier, ex.getMessage()); - } - if (log.isInfoEnabled()) { - log.info("{}{} - registration status: {}", PREFIX, appPathIdentifier, registerResult.isSuccess() ? "success" : "fail"); - } - return registerResult.isSuccess(); - } - - @Override - public void destroy() throws Exception { - log.info("{}{} - destroy service...", PREFIX, appPathIdentifier); - String clientCloseUrlPath = Constants.BASE_PATH + "/client/close"; - Result clientCloseResult; - try { - this.prepareDestroy(); - String groupKeyIp = new StringBuilder() - .append(instanceInfo.getGroupKey()) - .append(Constants.GROUP_KEY_DELIMITER) - .append(instanceInfo.getIdentify()) - .toString(); - ClientCloseHookExecute.ClientCloseHookReq clientCloseHookReq = new ClientCloseHookExecute.ClientCloseHookReq(); - clientCloseHookReq.setAppName(instanceInfo.getAppName()) - .setInstanceId(instanceInfo.getInstanceId()) - .setGroupKey(groupKeyIp); - clientCloseResult = httpAgent.httpPostByDiscovery(clientCloseUrlPath, clientCloseHookReq); - if (clientCloseResult.isSuccess()) { - log.info("{}{} - client close hook success.", PREFIX, appPathIdentifier); - } - } catch (Throwable ex) { - if (ex instanceof ShutdownExecuteException) { - return; - } - log.error("{}{} - client close hook fail.", PREFIX, appPathIdentifier, ex); - } - } - - private void prepareDestroy() throws InterruptedException { - scheduler.shutdownNow(); - // Try to make sure the ClientWorker is closed first. - hippo4jClientShutdown.prepareDestroy(); - } - - /** - * HeartbeatThread - */ - public class HeartbeatThread implements Runnable { - - @Override - public void run() { - if (renew()) { - lastSuccessfulHeartbeatTimestamp = System.currentTimeMillis(); - } - } - } - - private boolean renew() { - Result renewResult; - try { - if (scheduler.isShutdown()) { - return false; - } - InstanceInfo.InstanceRenew instanceRenew = new InstanceInfo.InstanceRenew() - .setAppName(instanceInfo.getAppName()) - .setInstanceId(instanceInfo.getInstanceId()) - .setLastDirtyTimestamp(instanceInfo.getLastDirtyTimestamp().toString()) - .setStatus(instanceInfo.getStatus().toString()); - renewResult = httpAgent.httpPostByDiscovery(BASE_PATH + "/apps/renew", instanceRenew); - if (Objects.equals(SERVICE_NOT_FOUND_CODE, renewResult.getCode())) { - long timestamp = instanceInfo.setIsDirtyWithTime(); - boolean success = register(); - // TODO Abstract server registration logic - ThreadPoolAdapterRegister adapterRegister = ApplicationContextHolder.getBean(ThreadPoolAdapterRegister.class); - adapterRegister.register(); - if (success) { - instanceInfo.unsetIsDirty(timestamp); - } - return success; - } - return renewResult.isSuccess(); - } catch (Exception ex) { - log.error(PREFIX + "{} - was unable to send heartbeat!", appPathIdentifier, ex); - return false; - } - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/DynamicThreadPoolSubscribeConfig.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/DynamicThreadPoolSubscribeConfig.java deleted file mode 100644 index 404f8a29..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/DynamicThreadPoolSubscribeConfig.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.core; - -import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum; -import cn.hippo4j.core.executor.support.ThreadPoolBuilder; -import cn.hippo4j.springboot.starter.config.BootstrapProperties; -import cn.hippo4j.threadpool.dynamic.api.ThreadPoolDynamicRefresh; -import lombok.RequiredArgsConstructor; - -import java.util.Arrays; -import java.util.concurrent.Executor; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * Dynamic thread-pool subscribe config. - */ -@RequiredArgsConstructor -public class DynamicThreadPoolSubscribeConfig { - - private final ThreadPoolDynamicRefresh threadPoolDynamicRefresh; - - private final ClientWorker clientWorker; - - private final BootstrapProperties properties; - - private final int defaultAliveTime = 2000; - - private final ExecutorService configRefreshExecutorService = ThreadPoolBuilder.builder() - .corePoolSize(1) - .maximumPoolSize(2) - .keepAliveTime(defaultAliveTime) - .timeUnit(TimeUnit.MILLISECONDS) - .workQueue(BlockingQueueTypeEnum.SYNCHRONOUS_QUEUE) - .allowCoreThreadTimeOut(true) - .threadFactory("client.dynamic.threadPool.change.config") - .rejected(new ThreadPoolExecutor.AbortPolicy()) - .build(); - - public void subscribeConfig(String threadPoolId) { - subscribeConfig(threadPoolId, threadPoolDynamicRefresh::dynamicRefresh); - } - - public void subscribeConfig(String threadPoolId, ThreadPoolSubscribeCallback threadPoolSubscribeCallback) { - Listener configListener = new Listener() { - - @Override - public void receiveConfigInfo(String config) { - threadPoolSubscribeCallback.callback(config); - } - - @Override - public Executor getExecutor() { - return configRefreshExecutorService; - } - }; - clientWorker.addTenantListeners(properties.getNamespace(), properties.getItemId(), threadPoolId, Arrays.asList(configListener)); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/Listener.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/Listener.java deleted file mode 100644 index 36c7bb6e..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/Listener.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.core; - -import java.util.concurrent.Executor; - -/** - * Listener. - */ -public interface Listener { - - /** - * Get executor. - * - * @return executor - */ - Executor getExecutor(); - - /** - * Receive config info. - * - * @param configInfo config info - */ - void receiveConfigInfo(String configInfo); -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ServerThreadPoolDynamicRefresh.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ServerThreadPoolDynamicRefresh.java deleted file mode 100644 index 0c2669d4..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ServerThreadPoolDynamicRefresh.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.core; - -import cn.hippo4j.common.api.ThreadPoolConfigChange; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum; -import cn.hippo4j.common.executor.support.BlockingQueueManager; -import cn.hippo4j.common.executor.support.RejectedPolicyTypeEnum; -import cn.hippo4j.common.extension.enums.EnableEnum; -import cn.hippo4j.common.model.ThreadPoolParameter; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.common.toolkit.ThreadPoolExecutorUtil; -import cn.hippo4j.core.executor.DynamicThreadPoolExecutor; -import cn.hippo4j.threadpool.dynamic.api.ThreadPoolDynamicRefresh; -import cn.hippo4j.threadpool.message.core.request.ChangeParameterNotifyRequest; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_DELIMITER; -import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_THREAD_POOL_TEXT; - -/** - * Server thread-pool dynamic refresh. - */ -@Slf4j -@AllArgsConstructor -public class ServerThreadPoolDynamicRefresh implements ThreadPoolDynamicRefresh { - - private final ThreadPoolConfigChange threadPoolConfigChange; - - @Override - public void dynamicRefresh(String content) { - ThreadPoolParameterInfo parameter = JSONUtil.parseObject(content, ThreadPoolParameterInfo.class); - String threadPoolId = parameter.getTpId(); - ThreadPoolExecutor executor = ThreadPoolExecutorRegistry.getHolder(threadPoolId).getExecutor(); - refreshDynamicPool(parameter, executor); - } - - private void refreshDynamicPool(ThreadPoolParameter parameter, ThreadPoolExecutor executor) { - String threadPoolId = parameter.getTpId(); - int originalCoreSize = executor.getCorePoolSize(); - int originalMaximumPoolSize = executor.getMaximumPoolSize(); - String originalQuery = executor.getQueue().getClass().getSimpleName(); - int originalCapacity = executor.getQueue().remainingCapacity() + executor.getQueue().size(); - long originalKeepAliveTime = executor.getKeepAliveTime(TimeUnit.SECONDS); - boolean originalAllowCoreThreadTimeOut = executor.allowsCoreThreadTimeOut(); - Long originalExecuteTimeOut = null; - RejectedExecutionHandler rejectedExecutionHandler = executor.getRejectedExecutionHandler(); - if (executor instanceof DynamicThreadPoolExecutor) { - DynamicThreadPoolExecutor dynamicExecutor = (DynamicThreadPoolExecutor) executor; - rejectedExecutionHandler = dynamicExecutor.getRejectedExecutionHandler(); - originalExecuteTimeOut = dynamicExecutor.getExecuteTimeOut(); - } - changePoolInfo(executor, parameter); - ThreadPoolExecutor afterExecutor = ThreadPoolExecutorRegistry.getHolder(threadPoolId).getExecutor(); - String originalRejected = rejectedExecutionHandler.getClass().getSimpleName(); - Long executeTimeOut = Optional.ofNullable(parameter.getExecuteTimeOut()).orElse(0L); - ChangeParameterNotifyRequest changeNotifyRequest = ChangeParameterNotifyRequest.builder() - .beforeCorePoolSize(originalCoreSize) - .beforeMaximumPoolSize(originalMaximumPoolSize) - .beforeAllowsCoreThreadTimeOut(originalAllowCoreThreadTimeOut) - .beforeKeepAliveTime(originalKeepAliveTime) - .blockingQueueName(originalQuery) - .beforeQueueCapacity(originalCapacity) - .beforeRejectedName(originalRejected) - .beforeExecuteTimeOut(originalExecuteTimeOut) - .nowCorePoolSize(afterExecutor.getCorePoolSize()) - .nowMaximumPoolSize(afterExecutor.getMaximumPoolSize()) - .nowAllowsCoreThreadTimeOut(EnableEnum.getBool(parameter.getAllowCoreThreadTimeOut())) - .nowKeepAliveTime(afterExecutor.getKeepAliveTime(TimeUnit.SECONDS)) - .nowQueueCapacity((afterExecutor.getQueue().remainingCapacity() + afterExecutor.getQueue().size())) - .nowRejectedName(RejectedPolicyTypeEnum.getRejectedNameByType(parameter.getRejectedType())) - .nowExecuteTimeOut(executeTimeOut) - .build(); - changeNotifyRequest.setThreadPoolId(threadPoolId); - threadPoolConfigChange.sendPoolConfigChange(changeNotifyRequest); - log.info(CHANGE_THREAD_POOL_TEXT, - threadPoolId, - String.format(CHANGE_DELIMITER, originalCoreSize, afterExecutor.getCorePoolSize()), - String.format(CHANGE_DELIMITER, originalMaximumPoolSize, afterExecutor.getMaximumPoolSize()), - String.format(CHANGE_DELIMITER, originalCapacity, (afterExecutor.getQueue().remainingCapacity() + afterExecutor.getQueue().size())), - String.format(CHANGE_DELIMITER, originalKeepAliveTime, afterExecutor.getKeepAliveTime(TimeUnit.SECONDS)), - String.format(CHANGE_DELIMITER, originalExecuteTimeOut, executeTimeOut), - String.format(CHANGE_DELIMITER, originalRejected, RejectedPolicyTypeEnum.getRejectedNameByType(parameter.getRejectedType())), - String.format(CHANGE_DELIMITER, originalAllowCoreThreadTimeOut, EnableEnum.getBool(parameter.getAllowCoreThreadTimeOut()))); - } - - private void changePoolInfo(ThreadPoolExecutor executor, ThreadPoolParameter parameter) { - Integer desiredCore = null; - Integer desiredMax = null; - if (parameter instanceof ThreadPoolParameterInfo) { - ThreadPoolParameterInfo info = (ThreadPoolParameterInfo) parameter; - desiredCore = info.corePoolSizeAdapt(); - desiredMax = info.maximumPoolSizeAdapt(); - } else { - desiredCore = parameter.getCoreSize(); - desiredMax = parameter.getMaxSize(); - } - if (desiredCore != null && desiredMax != null) { - ThreadPoolExecutorUtil.safeSetPoolSize(executor, desiredCore, desiredMax); - } else { - if (desiredMax != null) { - executor.setMaximumPoolSize(desiredMax); - } - if (desiredCore != null) { - executor.setCorePoolSize(desiredCore); - } - } - handleQueueChanges(executor, parameter); - if (parameter.getKeepAliveTime() != null) { - executor.setKeepAliveTime(parameter.getKeepAliveTime(), TimeUnit.SECONDS); - } - Long executeTimeOut = Optional.ofNullable(parameter.getExecuteTimeOut()).orElse(0L); - if (executor instanceof DynamicThreadPoolExecutor) { - ((DynamicThreadPoolExecutor) executor).setExecuteTimeOut(executeTimeOut); - } - if (parameter.getRejectedType() != null) { - RejectedExecutionHandler rejectedExecutionHandler = RejectedPolicyTypeEnum.createPolicy(parameter.getRejectedType()); - executor.setRejectedExecutionHandler(rejectedExecutionHandler); - } - if (parameter.getAllowCoreThreadTimeOut() != null) { - executor.allowCoreThreadTimeOut(EnableEnum.getBool(parameter.getAllowCoreThreadTimeOut())); - } - } - - /** - * Handle queue capacity changes - * - * @param executor thread pool executor - * @param parameter thread pool parameter - */ - private void handleQueueChanges(ThreadPoolExecutor executor, ThreadPoolParameter parameter) { - if (parameter.getCapacity() == null) { - return; - } - // Only support capacity adjustment for queues that support it - if (BlockingQueueManager.canChangeCapacity(executor.getQueue())) { - boolean success = BlockingQueueManager.changeQueueCapacity(executor.getQueue(), parameter.getCapacity()); - if (success) { - log.info("Queue capacity changed to: {} for thread pool: {}", parameter.getCapacity(), parameter.getTpId()); - } else { - log.warn("Failed to change queue capacity to: {} for thread pool: {}", parameter.getCapacity(), parameter.getTpId()); - } - } else { - log.warn("Queue capacity cannot be changed for current queue type: {}. " + - "Only ResizableCapacityLinkedBlockingQueue supports dynamic capacity changes.", - BlockingQueueManager.getQueueName(executor.getQueue())); - } - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ShutdownExecuteException.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ShutdownExecuteException.java deleted file mode 100644 index 42543fda..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ShutdownExecuteException.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.core; - -/** - * Shutdown execute exception. - */ -public class ShutdownExecuteException extends Exception { - - public ShutdownExecuteException() { - super("Execute task when stopped."); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ThreadPoolAdapterRegister.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ThreadPoolAdapterRegister.java deleted file mode 100644 index 852ce85d..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ThreadPoolAdapterRegister.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.core; - -import cn.hippo4j.adapter.base.ThreadPoolAdapter; -import cn.hippo4j.adapter.base.ThreadPoolAdapterCacheConfig; -import cn.hippo4j.adapter.base.ThreadPoolAdapterRegisterAction; -import cn.hippo4j.common.model.ThreadPoolAdapterState; -import cn.hippo4j.common.model.Result; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.core.toolkit.IdentifyUtil; -import cn.hippo4j.core.toolkit.inet.InetUtils; -import cn.hippo4j.springboot.starter.config.BootstrapProperties; -import cn.hippo4j.springboot.starter.remote.HttpAgent; -import cn.hippo4j.springboot.starter.toolkit.CloudCommonIdUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.core.env.ConfigurableEnvironment; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static cn.hippo4j.common.constant.Constants.IDENTIFY_SLICER_SYMBOL; -import static cn.hippo4j.common.constant.Constants.REGISTER_ADAPTER_PATH; - -/** - * Thread-pool adapter register. - */ -@Slf4j -@AllArgsConstructor -public class ThreadPoolAdapterRegister implements ApplicationRunner, ThreadPoolAdapterRegisterAction { - - private final HttpAgent httpAgent; - - private final BootstrapProperties properties; - - private final ConfigurableEnvironment environment; - - private final InetUtils hippo4jInetUtils; - - @Override - public void run(ApplicationArguments args) throws Exception { - register(); - } - - @Override - public List getThreadPoolAdapterCacheConfigs(Map threadPoolAdapterMap) { - List adapterCacheConfigList = new ArrayList<>(); - for (Map.Entry threadPoolAdapterEntry : threadPoolAdapterMap.entrySet()) { - ThreadPoolAdapter threadPoolAdapter = threadPoolAdapterEntry.getValue(); - List threadPoolStates = threadPoolAdapter.getThreadPoolStates(); - if (CollectionUtil.isEmpty(threadPoolStates) || threadPoolStates.size() == 0) { - continue; - } - ThreadPoolAdapterCacheConfig cacheConfig = new ThreadPoolAdapterCacheConfig(); - cacheConfig.setMark(threadPoolAdapter.mark()); - String tenantItemKey = properties.getNamespace() + IDENTIFY_SLICER_SYMBOL + properties.getItemId(); - cacheConfig.setTenantItemKey(tenantItemKey); - cacheConfig.setClientIdentify(IdentifyUtil.getIdentify()); - String clientAddress = CloudCommonIdUtil.getClientIpPort(environment, hippo4jInetUtils); - cacheConfig.setClientAddress(clientAddress); - cacheConfig.setThreadPoolAdapterStates(threadPoolStates); - adapterCacheConfigList.add(cacheConfig); - } - return adapterCacheConfigList; - } - - @Override - public void doRegister(List cacheConfigList) { - if (CollectionUtil.isNotEmpty(cacheConfigList) && cacheConfigList.size() > 0) { - try { - Result result = httpAgent.httpPost(REGISTER_ADAPTER_PATH, cacheConfigList); - if (!result.isSuccess()) { - log.warn("Failed to register third-party thread pool data."); - } - } catch (Throwable ex) { - log.error("Failed to register third-party thread pool data.", ex); - } - } - } - - public void register() { - Map threadPoolAdapterMap = ApplicationContextHolder.getBeansOfType(ThreadPoolAdapter.class); - List threadPoolAdapterCacheConfigs = getThreadPoolAdapterCacheConfigs(threadPoolAdapterMap); - doRegister(threadPoolAdapterCacheConfigs); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ThreadPoolSubscribeCallback.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ThreadPoolSubscribeCallback.java deleted file mode 100644 index 3bff89c4..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/core/ThreadPoolSubscribeCallback.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.core; - -/** - * ThreadPool subscribe callback. - */ -public interface ThreadPoolSubscribeCallback { - - /** - * Callback. - * - * @param config config info - */ - void callback(String config); -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/event/ApplicationContentPostProcessor.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/event/ApplicationContentPostProcessor.java deleted file mode 100644 index 3dd1adf2..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/event/ApplicationContentPostProcessor.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.event; - -import cn.hippo4j.springboot.starter.core.ClientWorker; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationListener; -import org.springframework.context.event.ContextRefreshedEvent; - -import javax.annotation.Resource; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * Application content post processor. - */ -public class ApplicationContentPostProcessor implements ApplicationListener { - - @Resource - private ApplicationContext applicationContext; - - @Resource - private ClientWorker clientWorker; - - private final AtomicBoolean executeOnlyOnce = new AtomicBoolean(false); - - @Override - public void onApplicationEvent(ContextRefreshedEvent event) { - if (!executeOnlyOnce.compareAndSet(false, true)) { - return; - } - applicationContext.publishEvent(new ApplicationRefreshedEvent(this)); - clientWorker.notifyApplicationComplete(); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/event/ApplicationRefreshedEvent.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/event/ApplicationRefreshedEvent.java deleted file mode 100644 index dbac0303..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/event/ApplicationRefreshedEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.event; - -import org.springframework.context.ApplicationEvent; - -/** - * Execute after the spring application context is successfully started. - */ -public class ApplicationRefreshedEvent extends ApplicationEvent { - - /** - * Create a new {@code ApplicationEvent}. - * - * @param source the object on which the event initially occurred or with - * which the event is associated (never {@code null}) - */ - public ApplicationRefreshedEvent(Object source) { - super(source); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/ReportingEventExecutor.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/ReportingEventExecutor.java deleted file mode 100644 index 981ea3d5..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/ReportingEventExecutor.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.monitor; - -import cn.hippo4j.common.executor.ThreadFactoryBuilder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.extension.spi.ServiceLoaderRegistry; -import cn.hippo4j.common.monitor.Message; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.common.toolkit.ThreadUtil; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.threadpool.monitor.support.MonitorTypeEnum; -import cn.hippo4j.springboot.starter.config.BootstrapProperties; -import cn.hippo4j.springboot.starter.config.MonitorProperties; -import cn.hippo4j.springboot.starter.monitor.collect.Collector; -import cn.hippo4j.springboot.starter.monitor.send.MessageSender; -import cn.hippo4j.springboot.starter.remote.ServerHealthCheck; -import cn.hippo4j.threadpool.monitor.api.ThreadPoolMonitor; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.boot.CommandLineRunner; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * Dynamic thread pool collection and reporting event executor. - * - *

{@link BlockingQueue} Act as a buffer container, enabling a production-consumption model. - */ -@Slf4j -@RequiredArgsConstructor -public class ReportingEventExecutor implements Runnable, CommandLineRunner, DisposableBean { - - private final BootstrapProperties properties; - - private final MessageSender messageSender; - - private final ServerHealthCheck serverHealthCheck; - - /** - * Collection of data collection components. - */ - private Map collectors; - - /** - * Thread pool monitoring collection. - */ - private List threadPoolMonitors; - - /** - * Buffer container for data collection, waiting - * for ReportingEventExecutor to report to the server. - */ - private BlockingQueue messageCollectVessel; - - /** - * Data collection timing executor, after Spring starts, - * it delays for a period of time to collect the running data of the dynamic thread pool. - */ - private ScheduledThreadPoolExecutor collectVesselExecutor; - - static { - ServiceLoaderRegistry.register(ThreadPoolMonitor.class); - } - - @SneakyThrows - @Override - public void run() { - while (true) { - try { - Message message = messageCollectVessel.take(); - messageSender.send(message); - } catch (Throwable ex) { - log.error("Consumption buffer container task failed. Number of buffer container tasks: {}", messageCollectVessel.size(), ex); - } - } - } - - @Override - public void run(String... args) { - MonitorProperties monitor = properties.getMonitor(); - if (monitor == null - || !monitor.getEnable() - || StringUtil.isBlank(monitor.getThreadPoolTypes()) - || StringUtil.isBlank(monitor.getCollectTypes())) { - return; - } - threadPoolMonitors = new ArrayList<>(); - String collectType = Optional.ofNullable(StringUtil.emptyToNull(monitor.getCollectTypes())).orElse(MonitorTypeEnum.SERVER.name().toLowerCase()); - collectVesselExecutor = new ScheduledThreadPoolExecutor( - new Integer(collectType.split(",").length), - ThreadFactoryBuilder.builder().daemon(true).prefix("client.scheduled.collect.data").build()); - Collection dynamicThreadPoolMonitors = - ServiceLoaderRegistry.getSingletonServiceInstances(ThreadPoolMonitor.class); - Map threadPoolMonitorMap = ApplicationContextHolder.getBeansOfType(ThreadPoolMonitor.class); - boolean customerDynamicThreadPoolMonitorFlag = CollectionUtil.isNotEmpty(dynamicThreadPoolMonitors) || CollectionUtil.isNotEmpty(threadPoolMonitorMap); - if (customerDynamicThreadPoolMonitorFlag) { - threadPoolMonitorMap.forEach((beanName, bean) -> threadPoolMonitors.add(bean)); - dynamicThreadPoolMonitors.forEach(each -> threadPoolMonitors.add(each)); - collectVesselExecutor.scheduleWithFixedDelay( - () -> dynamicThreadPoolMonitor(), - properties.getInitialDelay(), - properties.getCollectInterval(), - TimeUnit.MILLISECONDS); - } - if (collectType.contains(MonitorTypeEnum.SERVER.name().toLowerCase())) { - collectVesselExecutor.scheduleWithFixedDelay( - () -> runTimeGatherTask(), - properties.getInitialDelay(), - properties.getCollectInterval(), - TimeUnit.MILLISECONDS); - Integer bufferSize = properties.getTaskBufferSize(); - messageCollectVessel = new LinkedBlockingQueue(bufferSize); - // Get all data collection components, currently only historical operation data collection. - collectors = ApplicationContextHolder.getBeansOfType(Collector.class); - // Start reporting monitoring data thread. - ThreadUtil.newThread(this, "client.thread.reporting.task", Boolean.TRUE).start(); - } - if (ThreadPoolExecutorRegistry.getThreadPoolExecutorSize() > 0) { - log.info("Dynamic thread pool: [{}]. The dynamic thread pool starts data collection and reporting.", ThreadPoolExecutorRegistry.getThreadPoolExecutorSize()); - } - } - - @Override - public void destroy() { - Optional.ofNullable(collectVesselExecutor).ifPresent((each) -> each.shutdown()); - } - - /** - * Running dynamic thread pool monitoring. - */ - private void dynamicThreadPoolMonitor() { - threadPoolMonitors.forEach(each -> each.collect()); - } - - /** - * Collect dynamic thread pool data and add buffer queues. - */ - private void runTimeGatherTask() { - boolean healthStatus = serverHealthCheck.isHealthStatus(); - if (!healthStatus || CollectionUtil.isEmpty(collectors)) { - return; - } - collectors.forEach((beanName, collector) -> { - Message message = collector.collectMessage(); - boolean offer = messageCollectVessel.offer(message); - if (!offer) { - log.warn("Buffer data starts stacking data..."); - } - }); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/collect/Collector.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/collect/Collector.java deleted file mode 100644 index b1e7f5c4..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/collect/Collector.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.monitor.collect; - -import cn.hippo4j.common.monitor.Message; - -/** - * Collect thread-pool data. - */ -public interface Collector { - - /** - * Collect message. - * - * @return message - */ - Message collectMessage(); -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/collect/RunTimeInfoCollector.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/collect/RunTimeInfoCollector.java deleted file mode 100644 index 393e2ba0..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/collect/RunTimeInfoCollector.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.monitor.collect; - -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.model.ThreadPoolRunStateInfo; -import cn.hippo4j.common.monitor.AbstractMessage; -import cn.hippo4j.common.monitor.Message; -import cn.hippo4j.common.monitor.MessageTypeEnum; -import cn.hippo4j.common.monitor.RuntimeMessage; -import cn.hippo4j.common.toolkit.BeanUtil; -import cn.hippo4j.common.support.AbstractThreadPoolRuntime; -import cn.hippo4j.springboot.starter.config.BootstrapProperties; -import lombok.AllArgsConstructor; - -import java.util.ArrayList; -import java.util.List; - -import static cn.hippo4j.core.toolkit.IdentifyUtil.getThreadPoolIdentify; - -/** - * Thread pool runtime data collection. - */ -@AllArgsConstructor -public class RunTimeInfoCollector extends AbstractThreadPoolRuntime implements Collector { - - private final BootstrapProperties properties; - - @Override - public Message collectMessage() { - AbstractMessage message = new RuntimeMessage(); - List runtimeMessages = new ArrayList<>(); - List listThreadPoolId = ThreadPoolExecutorRegistry.listThreadPoolExecutorId(); - for (String each : listThreadPoolId) { - ThreadPoolRunStateInfo poolRunState = getPoolRunState(each); - RuntimeMessage runtimeMessage = BeanUtil.convert(poolRunState, RuntimeMessage.class); - runtimeMessage.setGroupKey(getThreadPoolIdentify(each, properties.getItemId(), properties.getNamespace())); - runtimeMessages.add(runtimeMessage); - } - message.setMessageType(MessageTypeEnum.RUNTIME); - message.setMessages(runtimeMessages); - return message; - } - - @Override - public ThreadPoolRunStateInfo supplement(ThreadPoolRunStateInfo threadPoolRunStateInfo) { - return threadPoolRunStateInfo; - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/send/MessageSender.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/send/MessageSender.java deleted file mode 100644 index bf91464a..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/send/MessageSender.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.monitor.send; - -import cn.hippo4j.common.monitor.Message; - -/** - * Message sender. - */ -public interface MessageSender { - - /** - * Send. - * - * @param message - */ - void send(Message message); -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/send/http/HttpConnectSender.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/send/http/HttpConnectSender.java deleted file mode 100644 index 33fc1173..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/send/http/HttpConnectSender.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.monitor.send.http; - -import cn.hippo4j.common.monitor.Message; -import cn.hippo4j.common.monitor.MessageWrapper; -import cn.hippo4j.common.toolkit.MessageConvert; -import cn.hippo4j.springboot.starter.monitor.send.MessageSender; -import cn.hippo4j.springboot.starter.remote.HttpAgent; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import static cn.hippo4j.common.constant.Constants.MONITOR_PATH; - -/** - * Http sender. - */ -@Slf4j -@AllArgsConstructor -public class HttpConnectSender implements MessageSender { - - private final HttpAgent httpAgent; - - @Override - public void send(Message message) { - try { - MessageWrapper messageWrapper = MessageConvert.convert(message); - httpAgent.httpPost(MONITOR_PATH, messageWrapper); - } catch (Throwable ex) { - log.error("Failed to push dynamic thread pool runtime data.", ex); - } - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/send/netty/NettyConnectSender.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/send/netty/NettyConnectSender.java deleted file mode 100644 index 6ec5b98c..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/send/netty/NettyConnectSender.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.monitor.send.netty; - -import cn.hippo4j.common.monitor.Message; -import cn.hippo4j.common.monitor.MessageWrapper; -import cn.hippo4j.common.toolkit.MessageConvert; -import cn.hippo4j.springboot.starter.monitor.send.MessageSender; -import cn.hippo4j.springboot.starter.remote.ServerNettyAgent; -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.codec.serialization.ClassResolvers; -import io.netty.handler.codec.serialization.ObjectDecoder; -import io.netty.handler.codec.serialization.ObjectEncoder; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -/** - * Netty connect sender. - */ -@Slf4j -@AllArgsConstructor -public class NettyConnectSender implements MessageSender { - - private ServerNettyAgent serverNettyAgent; - - @Override - public void send(Message message) { - MessageWrapper messageWrapper = MessageConvert.convert(message); - EventLoopGroup eventLoopGroup = serverNettyAgent.getEventLoopGroup(); - try { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.group(eventLoopGroup) - .channel(NioSocketChannel.class) - .handler(new ChannelInitializer() { - - @Override - protected void initChannel(SocketChannel ch) { - ChannelPipeline pipeline = ch.pipeline(); - pipeline.addLast(new ObjectEncoder()); - pipeline.addLast(new ObjectDecoder(Integer.MAX_VALUE, - ClassResolvers.cacheDisabled(null))); - pipeline.addLast(new SenderHandler(messageWrapper)); - } - }); - bootstrap.connect(serverNettyAgent.getNettyServerAddress(), serverNettyAgent.getNettyServerPort()).sync(); - } catch (Exception e) { - log.error("Netty send error.", e); - } - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/send/netty/SenderHandler.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/send/netty/SenderHandler.java deleted file mode 100644 index 21c72be5..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/monitor/send/netty/SenderHandler.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.monitor.send.netty; - -import cn.hippo4j.common.monitor.MessageWrapper; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -/** - * Sender handler. - */ -@Slf4j -@AllArgsConstructor -public class SenderHandler extends SimpleChannelInboundHandler { - - private MessageWrapper messageWrapper; - - @Override - protected void channelRead0(ChannelHandlerContext ctx, MessageWrapper msg) throws Exception { - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - ctx.channel().writeAndFlush(messageWrapper); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/notify/ServerModeNotifyConfigBuilder.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/notify/ServerModeNotifyConfigBuilder.java deleted file mode 100644 index 05e7a601..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/notify/ServerModeNotifyConfigBuilder.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.notify; - -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.model.Result; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.common.toolkit.GroupKey; -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.springboot.starter.config.BootstrapProperties; -import cn.hippo4j.springboot.starter.remote.HttpAgent; -import cn.hippo4j.threadpool.message.api.NotifyConfigBuilder; -import cn.hippo4j.threadpool.message.api.NotifyConfigDTO; -import cn.hippo4j.threadpool.message.api.ThreadPoolNotifyDTO; -import cn.hippo4j.threadpool.message.core.request.ThreadPoolNotifyRequest; -import cn.hippo4j.threadpool.message.core.service.AlarmControlHandler; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import static cn.hippo4j.common.constant.Constants.BASE_PATH; - -/** - * Server mode notify config builder. - */ -@Slf4j -@AllArgsConstructor -public class ServerModeNotifyConfigBuilder implements NotifyConfigBuilder { - - private final HttpAgent httpAgent; - - private final BootstrapProperties properties; - - private final AlarmControlHandler alarmControlHandler; - - @Override - public Map> buildNotify() { - List threadPoolIds = ThreadPoolExecutorRegistry.listThreadPoolExecutorId(); - if (CollectionUtil.isEmpty(threadPoolIds)) { - log.warn("The client does not have a dynamic thread pool instance configured."); - return new HashMap<>(); - } - return getAndInitNotify(threadPoolIds); - } - - public Map> getAndInitNotify(List threadPoolIds) { - Map> resultMap = new HashMap<>(); - List groupKeys = new ArrayList<>(); - threadPoolIds.forEach(each -> { - String groupKey = GroupKey.getKeyTenant(each, properties.getItemId(), properties.getNamespace()); - groupKeys.add(groupKey); - }); - Result result = null; - try { - result = httpAgent.httpPostByDiscovery(BASE_PATH + "/notify/list/config", new ThreadPoolNotifyRequest(groupKeys)); - } catch (Throwable ex) { - log.error("Get dynamic thread pool notify configuration error. message: {}", ex.getMessage()); - } - if (result != null && result.isSuccess() && result.getData() != null) { - String resultDataStr = JSONUtil.toJSONString(result.getData()); - List resultData = JSONUtil.parseArray(resultDataStr, ThreadPoolNotifyDTO.class); - resultData.forEach(each -> resultMap.put(each.getNotifyKey(), each.getNotifyList())); - resultMap.forEach((key, val) -> val.stream().filter(each -> Objects.equals("ALARM", each.getType())) - .forEach(each -> alarmControlHandler.initCacheAndLock(each.getTpId(), each.getPlatform(), each.getInterval()))); - } - return resultMap; - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/provider/InstanceInfoProviderFactory.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/provider/InstanceInfoProviderFactory.java deleted file mode 100644 index 697557d1..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/provider/InstanceInfoProviderFactory.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.provider; - -import cn.hippo4j.core.api.ClientNetworkService; -import cn.hippo4j.common.model.InstanceInfo; -import cn.hippo4j.common.extension.spi.ServiceLoaderRegistry; -import cn.hippo4j.common.toolkit.ContentUtil; -import cn.hippo4j.core.toolkit.IdentifyUtil; -import cn.hippo4j.core.toolkit.inet.InetUtils; -import cn.hippo4j.springboot.starter.config.BootstrapProperties; -import cn.hippo4j.springboot.starter.toolkit.CloudCommonIdUtil; -import lombok.SneakyThrows; -import org.springframework.core.env.ConfigurableEnvironment; - -import java.net.InetAddress; -import java.util.Optional; - -import static cn.hippo4j.common.constant.Constants.IDENTIFY_SLICER_SYMBOL; -import static cn.hippo4j.core.toolkit.IdentifyUtil.CLIENT_IDENTIFICATION_VALUE; - -/** - * Instance info provider factory. - */ -public final class InstanceInfoProviderFactory { - - static { - ServiceLoaderRegistry.register(ClientNetworkService.class); - } - - /** - * Create client registration instance information. - * - * @param environment configurable environment - * @param bootstrapProperties bootstrap properties - * @param inetUtils inet utils - * @return - */ - @SneakyThrows - public static InstanceInfo getInstance(final ConfigurableEnvironment environment, - final BootstrapProperties bootstrapProperties, - final InetUtils inetUtils) { - String namespace = bootstrapProperties.getNamespace(); - String itemId = bootstrapProperties.getItemId(); - String port = environment.getProperty("server.port", "8080"); - String applicationName = environment.getProperty("spring.dynamic.thread-pool.item-id"); - String active = environment.getProperty("spring.profiles.active", "UNKNOWN"); - InstanceInfo instanceInfo = new InstanceInfo(); - String instanceId = CloudCommonIdUtil.getDefaultInstanceId(environment, inetUtils); - instanceId = new StringBuilder() - .append(instanceId).append(IDENTIFY_SLICER_SYMBOL).append(CLIENT_IDENTIFICATION_VALUE).toString(); - String contextPath = environment.getProperty("server.servlet.context-path", ""); - instanceInfo.setInstanceId(instanceId) - .setIpApplicationName(CloudCommonIdUtil.getIpApplicationName(environment, inetUtils)) - .setHostName(InetAddress.getLocalHost().getHostAddress()).setAppName(applicationName) - .setPort(port).setClientBasePath(contextPath).setGroupKey(ContentUtil.getGroupKey(itemId, namespace)); - String[] customerNetwork = ServiceLoaderRegistry.getSingletonServiceInstances(ClientNetworkService.class) - .stream().findFirst().map(each -> each.getNetworkIpPort(environment)).orElse(null); - String callBackUrl = new StringBuilder().append(Optional.ofNullable(customerNetwork).map(each -> each[0]).orElse(instanceInfo.getHostName())).append(":") - .append(Optional.ofNullable(customerNetwork).map(each -> each[1]).orElse(port)).append(instanceInfo.getClientBasePath()) - .toString(); - instanceInfo.setCallBackUrl(callBackUrl); - String identify = IdentifyUtil.generate(environment, inetUtils); - instanceInfo.setIdentify(identify); - instanceInfo.setActive(active.toUpperCase()); - return instanceInfo; - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/AbstractHealthCheck.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/AbstractHealthCheck.java deleted file mode 100644 index 354ba94e..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/AbstractHealthCheck.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.remote; - -import cn.hippo4j.common.toolkit.ThreadUtil; -import cn.hippo4j.springboot.starter.event.ApplicationRefreshedEvent; -import cn.hippo4j.springboot.starter.core.ShutdownExecuteException; -import cn.hippo4j.common.executor.ThreadFactoryBuilder; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.context.ApplicationListener; - -import java.util.Objects; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.ReentrantLock; -import static cn.hippo4j.common.constant.Constants.MAX_CHECK_FAILURE_COUNT; -import static cn.hippo4j.common.constant.Constants.SECONDS_IN_MILLISECONDS; -import static cn.hippo4j.common.constant.Constants.HEALTH_CHECK_INTERVAL; -import static cn.hippo4j.common.constant.Constants.FAILURE_SLEEP_INTERVAL; - -/** - * Abstract health check. - */ -@Slf4j -public abstract class AbstractHealthCheck implements ServerHealthCheck, InitializingBean, ApplicationListener { - - /** - * Health status - */ - private volatile boolean healthStatus = true; - - /** - * Health check failure count - */ - private volatile int checkFailureCount = 0; - - /** - * Client shutdown hook - */ - private volatile boolean clientShutdownHook = false; - - /** - * Spring context init complete. TODO: Why this - */ - private boolean contextInitComplete = false; - - /** - * Health main lock - */ - private final ReentrantLock healthMainLock = new ReentrantLock(); - - /** - * Health condition - */ - private final Condition healthCondition = healthMainLock.newCondition(); - - /** - * Health check executor - */ - private final ScheduledThreadPoolExecutor healthCheckExecutor = new ScheduledThreadPoolExecutor( - new Integer(1), - ThreadFactoryBuilder.builder().daemon(true).prefix("client.scheduled.health.check").build()); - - /** - * Send health check. - * - * @return - */ - protected abstract boolean sendHealthCheck(); - - /** - * Health check. - */ - public void healthCheck() { - boolean healthCheckStatus = sendHealthCheck(); - if (healthCheckStatus) { - if (Objects.equals(healthStatus, false)) { - healthStatus = true; - checkFailureCount = 0; - log.info("The client reconnects to the server successfully."); - signalAllBizThread(); - } - } else { - healthStatus = false; - checkFailureCount++; - if (checkFailureCount > 1 && checkFailureCount < MAX_CHECK_FAILURE_COUNT) { - ThreadUtil.sleep((long) HEALTH_CHECK_INTERVAL * SECONDS_IN_MILLISECONDS * (checkFailureCount - 1)); - } else if (checkFailureCount >= MAX_CHECK_FAILURE_COUNT) { - ThreadUtil.sleep(FAILURE_SLEEP_INTERVAL); - } - } - } - - @Override - @SneakyThrows - public boolean isHealthStatus() { - while (contextInitComplete && !healthStatus && !clientShutdownHook) { - healthMainLock.lock(); - try { - healthCondition.await(); - } finally { - healthMainLock.unlock(); - } - } - if (!healthStatus) { - throw new ShutdownExecuteException(); - } - return healthStatus; - } - - @Override - public void setHealthStatus(boolean healthStatus) { - healthMainLock.lock(); - try { - this.healthStatus = healthStatus; - log.warn("The server health status setting is unavailable."); - } finally { - healthMainLock.unlock(); - } - } - - /** - * Signal all biz thread. - */ - private void signalAllBizThread() { - healthMainLock.lock(); - try { - healthCondition.signalAll(); - } finally { - healthMainLock.unlock(); - } - } - - @Override - public void afterPropertiesSet() throws Exception { - /** - * Add a hook function, when the client stops, if the server is in an unhealthy state, - * the client destroy function will suspend operation. - */ - Runtime.getRuntime().addShutdownHook(new Thread(() -> { - clientShutdownHook = true; - signalAllBizThread(); - })); - healthCheckExecutor.scheduleWithFixedDelay(this::healthCheck, 0, HEALTH_CHECK_INTERVAL, TimeUnit.SECONDS); - } - - @Override - public void onApplicationEvent(ApplicationRefreshedEvent event) { - contextInitComplete = true; - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/HttpAgent.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/HttpAgent.java deleted file mode 100644 index 91de1849..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/HttpAgent.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.remote; - -import cn.hippo4j.common.model.Result; - -import java.util.Map; - -/** - * Http agent. - */ -public interface HttpAgent { - - /** - * Start. - */ - void start(); - - /** - * Get tenant id. - * - * @return - */ - String getTenantId(); - - /** - * Get encode. - * - * @return - */ - String getEncode(); - - /** - * Http get simple. - * - * @param path - * @return - */ - Result httpGetSimple(String path); - - /** - * Http post. - * - * @param path - * @param body - * @return - */ - Result httpPost(String path, Object body); - - /** - * Send HTTP post request by discovery. - * - * @param path - * @param body - * @return - */ - Result httpPostByDiscovery(String path, Object body); - - /** - * Send HTTP get request by dynamic config. - * - * @param path - * @param headers - * @param paramValues - * @param readTimeoutMs - * @return - */ - Result httpGetByConfig(String path, Map headers, Map paramValues, - long readTimeoutMs); - - /** - * Send HTTP post request by dynamic config. - * - * @param path - * @param headers - * @param paramValues - * @param readTimeoutMs - * @return - */ - Result httpPostByConfig(String path, Map headers, Map paramValues, - long readTimeoutMs); - - /** - * Send HTTP delete request by dynamic config. - * - * @param path - * @param headers - * @param paramValues - * @param readTimeoutMs - * @return - */ - Result httpDeleteByConfig(String path, Map headers, Map paramValues, - long readTimeoutMs); -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/HttpScheduledHealthCheck.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/HttpScheduledHealthCheck.java deleted file mode 100644 index 2d842a04..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/HttpScheduledHealthCheck.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.remote; - -import cn.hippo4j.common.model.Result; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.Objects; - -import static cn.hippo4j.common.constant.Constants.HEALTH_CHECK_PATH; -import static cn.hippo4j.common.constant.Constants.UP; - -/** - * Server health check. - */ -@Slf4j -@AllArgsConstructor -public class HttpScheduledHealthCheck extends AbstractHealthCheck { - - private final HttpAgent httpAgent; - - @Override - protected boolean sendHealthCheck() { - boolean healthStatus = false; - try { - Result healthResult = httpAgent.httpGetSimple(HEALTH_CHECK_PATH); - if (healthResult != null && Objects.equals(healthResult.getData(), UP)) { - healthStatus = true; - } - } catch (Throwable ex) { - log.error("Failed to periodically check the health status of the server. message: {}", ex.getMessage()); - } - return healthStatus; - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/ServerHealthCheck.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/ServerHealthCheck.java deleted file mode 100644 index cdda8bf9..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/ServerHealthCheck.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.remote; - -/** - * Server health check. - */ -public interface ServerHealthCheck { - - /** - * Is health status. - * - * @return - */ - boolean isHealthStatus(); - - /** - * Set health status. - * - * @param healthStatus - */ - void setHealthStatus(boolean healthStatus); -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/ServerHttpAgent.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/ServerHttpAgent.java deleted file mode 100644 index 498aedd4..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/ServerHttpAgent.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.remote; - -import cn.hippo4j.common.model.Result; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.common.executor.ThreadFactoryBuilder; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.common.toolkit.http.HttpUtil; -import cn.hippo4j.springboot.starter.config.BootstrapProperties; -import cn.hippo4j.springboot.starter.security.SecurityProxy; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * Server http agent. - */ -public class ServerHttpAgent implements HttpAgent { - - private final BootstrapProperties dynamicThreadPoolProperties; - - private final ServerListManager serverListManager; - - private SecurityProxy securityProxy; - - private ServerHealthCheck serverHealthCheck; - - private ScheduledExecutorService executorService; - - private final long securityInfoRefreshIntervalMills = TimeUnit.SECONDS.toMillis(5); - - public ServerHttpAgent(BootstrapProperties properties) { - this.dynamicThreadPoolProperties = properties; - this.serverListManager = new ServerListManager(dynamicThreadPoolProperties); - this.securityProxy = new SecurityProxy(properties); - this.securityProxy.applyToken(this.serverListManager.getServerUrls()); - this.executorService = new ScheduledThreadPoolExecutor( - new Integer(1), - ThreadFactoryBuilder.builder().daemon(true).prefix("client.scheduled.token.security.updater").build()); - this.executorService.scheduleWithFixedDelay( - () -> securityProxy.applyToken(serverListManager.getServerUrls()), - 0, - securityInfoRefreshIntervalMills, - TimeUnit.MILLISECONDS); - } - - @Override - public void start() { - - } - - @Override - public String getTenantId() { - return dynamicThreadPoolProperties.getNamespace(); - } - - @Override - public String getEncode() { - return null; - } - - @Override - public Result httpGetSimple(String path) { - path = injectSecurityInfoByPath(path); - return HttpUtil.get(buildUrl(path), Result.class); - } - - @Override - public Result httpPost(String path, Object body) { - isHealthStatus(); - path = injectSecurityInfoByPath(path); - return HttpUtil.post(buildUrl(path), body, Result.class); - } - - @Override - public Result httpPostByDiscovery(String path, Object body) { - isHealthStatus(); - path = injectSecurityInfoByPath(path); - return HttpUtil.post(buildUrl(path), body, Result.class); - } - - @Override - public Result httpGetByConfig(String path, Map headers, Map paramValues, long readTimeoutMs) { - isHealthStatus(); - injectSecurityInfo(paramValues); - return HttpUtil.get(buildUrl(path), headers, paramValues, readTimeoutMs, Result.class); - } - - @Override - public Result httpPostByConfig(String path, Map headers, Map paramValues, long readTimeoutMs) { - isHealthStatus(); - injectSecurityInfo(paramValues); - return HttpUtil.post(buildUrl(path), headers, paramValues, readTimeoutMs, Result.class); - } - - @Override - public Result httpDeleteByConfig(String path, Map headers, Map paramValues, long readTimeoutMs) { - return null; - } - - private String buildUrl(String path) { - return serverListManager.getCurrentServerAddr() + path; - } - - private void isHealthStatus() { - if (serverHealthCheck == null) { - serverHealthCheck = ApplicationContextHolder.getBean(ServerHealthCheck.class); - } - serverHealthCheck.isHealthStatus(); - } - - private Map injectSecurityInfo(Map params) { - if (StringUtil.isNotBlank(securityProxy.getAccessToken())) { - params.put(Constants.ACCESS_TOKEN, securityProxy.getAccessToken()); - } - return params; - } - - @Deprecated - private String injectSecurityInfoByPath(String path) { - String resultPath = HttpUtil.buildUrl(path, injectSecurityInfo(new HashMap<>())); - return resultPath; - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/ServerListManager.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/ServerListManager.java deleted file mode 100644 index 3202869c..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/ServerListManager.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.remote; - -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.springboot.starter.config.BootstrapProperties; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.StringUtils; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - -/** - * Server list manager. - */ -@Slf4j -public class ServerListManager { - - private static final String HTTPS = "https://"; - - private static final String HTTP = "http://"; - - private String serverAddrsStr; - - private String nettyServerPort; - - @Getter - volatile List serverUrls = new ArrayList(); - - private volatile String currentServerAddr; - - private Iterator iterator; - - private final BootstrapProperties properties; - - public ServerListManager(BootstrapProperties dynamicThreadPoolProperties) { - this.properties = dynamicThreadPoolProperties; - serverAddrsStr = properties.getServerAddr(); - nettyServerPort = properties.getNettyServerPort(); - if (!StringUtils.isEmpty(serverAddrsStr)) { - List serverAddrList = new ArrayList(); - String[] serverAddrListArr = this.serverAddrsStr.split(","); - for (String serverAddr : serverAddrListArr) { - boolean whetherJoint = StringUtil.isNotBlank(serverAddr) - && !serverAddr.startsWith(HTTPS) && !serverAddr.startsWith(HTTP); - if (whetherJoint) { - serverAddr = HTTP + serverAddr; - } - currentServerAddr = serverAddr; - serverAddrList.add(serverAddr); - } - this.serverUrls = serverAddrList; - } - } - - public String getCurrentServerAddr() { - if (StringUtils.isEmpty(currentServerAddr)) { - iterator = iterator(); - currentServerAddr = iterator.next(); - } - return currentServerAddr; - } - - public String getNettyServerPort() { - return nettyServerPort; - } - - Iterator iterator() { - return new ServerAddressIterator(serverUrls); - } - - /** - * Server Address Iterator - */ - private static class ServerAddressIterator implements Iterator { - - final List sorted; - - final Iterator iter; - - ServerAddressIterator(List source) { - sorted = new ArrayList(); - for (String address : source) { - sorted.add(new RandomizedServerAddress(address)); - } - Collections.sort(sorted); - iter = sorted.iterator(); - } - - @Override - public boolean hasNext() { - return false; - } - - @Override - public String next() { - return null; - } - - /** - * Randomized Server Address - */ - static class RandomizedServerAddress implements Comparable { - - static Random random = new Random(); - - String serverIp; - - int priority = 0; - - int seed; - - RandomizedServerAddress(String ip) { - try { - this.serverIp = ip; - /* - * change random scope from 32 to Integer.MAX_VALUE to fix load balance issue - */ - this.seed = random.nextInt(Integer.MAX_VALUE); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public int compareTo(RandomizedServerAddress other) { - if (this.priority != other.priority) { - return other.priority - this.priority; - } else { - return other.seed - this.seed; - } - } - } - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/ServerNettyAgent.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/ServerNettyAgent.java deleted file mode 100644 index fb3617b8..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/remote/ServerNettyAgent.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.remote; - -import cn.hippo4j.springboot.starter.config.BootstrapProperties; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; - -/** - * Server netty agent. - */ -public class ServerNettyAgent { - - private final BootstrapProperties dynamicThreadPoolProperties; - - private final ServerListManager serverListManager; - - private EventLoopGroup eventLoopGroup; - - public ServerNettyAgent(BootstrapProperties properties) { - this.dynamicThreadPoolProperties = properties; - this.serverListManager = new ServerListManager(dynamicThreadPoolProperties); - this.eventLoopGroup = new NioEventLoopGroup(); - } - - public EventLoopGroup getEventLoopGroup() { - return eventLoopGroup; - } - - public String getNettyServerAddress() { - return serverListManager.getCurrentServerAddr().split(":")[1].replace("//", ""); - } - - public Integer getNettyServerPort() { - return Integer.parseInt(serverListManager.getNettyServerPort()); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/security/SecurityProxy.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/security/SecurityProxy.java deleted file mode 100644 index 83d6b3c2..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/security/SecurityProxy.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.security; - -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.common.model.Result; -import cn.hippo4j.common.model.TokenInfo; -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.common.toolkit.http.HttpUtil; -import cn.hippo4j.springboot.starter.config.BootstrapProperties; -import lombok.extern.slf4j.Slf4j; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -/** - * Security proxy. - */ -@Slf4j -public class SecurityProxy { - - private static final String APPLY_TOKEN_URL = Constants.BASE_PATH + "/auth/users/apply/token"; - - private final int refreshWindowDuration = 10; - - private final String username; - - private final String password; - - private String accessToken; - - private long tokenTtl; - - private long lastRefreshTime; - - private long tokenRefreshWindow; - - public SecurityProxy(BootstrapProperties properties) { - username = properties.getUsername(); - password = properties.getPassword(); - } - - public boolean applyToken(List servers) { - try { - if ((System.currentTimeMillis() - lastRefreshTime) < TimeUnit.SECONDS.toMillis(tokenTtl - tokenRefreshWindow)) { - return true; - } - for (String server : servers) { - if (applyToken(server)) { - lastRefreshTime = System.currentTimeMillis(); - return true; - } - } - } catch (Throwable ignored) { - } - return false; - } - - public boolean applyToken(String server) { - if (StringUtil.isAllNotEmpty(username, password)) { - String url = server + APPLY_TOKEN_URL; - Map bodyMap = new HashMap(2); - bodyMap.put("userName", username); - bodyMap.put("password", password); - try { - Result result = HttpUtil.post(url, bodyMap, Result.class); - if (!result.isSuccess()) { - log.error("Error getting access token. message: {}", result.getMessage()); - return false; - } - String tokenJsonStr = JSONUtil.toJSONString(result.getData()); - TokenInfo tokenInfo = JSONUtil.parseObject(tokenJsonStr, TokenInfo.class); - accessToken = tokenInfo.getAccessToken(); - tokenTtl = tokenInfo.getTokenTtl(); - tokenRefreshWindow = tokenTtl / refreshWindowDuration; - } catch (Throwable ex) { - log.error("Failed to apply for token. message: {}", ex.getMessage()); - return false; - } - } - return true; - } - - public String getAccessToken() { - return accessToken; - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/support/AdaptedThreadPoolDestroyPostProcessor.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/support/AdaptedThreadPoolDestroyPostProcessor.java deleted file mode 100644 index 9b60a4f6..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/support/AdaptedThreadPoolDestroyPostProcessor.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.support; - -import cn.hippo4j.common.executor.ThreadPoolExecutorHolder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.core.executor.DynamicThreadPoolExecutor; -import cn.hippo4j.common.api.DynamicThreadPoolAdapter; -import cn.hippo4j.core.executor.support.adpter.DynamicThreadPoolAdapterChoose; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor; -import org.springframework.context.ApplicationContext; - -import java.util.Optional; - -/** - *

Adapted thread pool destroy post processor.
- * The processor is used to destroy the internal {@link DynamicThreadPoolExecutor} instance - * in the instance adapted by {@link DynamicThreadPoolAdapter} in the spring context. - * - * @see DynamicThreadPoolAdapter - */ -@RequiredArgsConstructor -@Slf4j -public class AdaptedThreadPoolDestroyPostProcessor implements DestructionAwareBeanPostProcessor { - - /** - * Application context. - */ - private final ApplicationContext applicationContext; - - /** - * If {@link DynamicThreadPoolAdapterChoose#match} method returns true, - * try to destroy its internal {@link DynamicThreadPoolExecutor} instance. - * - * @param bean the bean instance to check - * @return {@code true} if {@link DynamicThreadPoolAdapterChoose#match} method returns true, false otherwise - * @see DynamicThreadPoolAdapterChoose#match - */ - @Override - public boolean requiresDestruction(Object bean) { - return DynamicThreadPoolAdapterChoose.match(bean); - } - - /** - * If the internal {@link DynamicThreadPoolExecutor} instance in the adapted bean is not managed by spring, - * call its {@link DynamicThreadPoolExecutor#destroy()} directly. - * - * @param bean the bean instance to be destroyed - * @param beanName the name of the bean - * @throws BeansException in case of errors - * @see DynamicThreadPoolExecutor#destroy() - */ - @Override - public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException { - Optional.ofNullable(DynamicThreadPoolAdapterChoose.unwrap(bean)) - .map(each -> ((DynamicThreadPoolExecutor) each).getThreadPoolId()) - // the internal thread pool is also managed by spring, no manual destruction required - .filter(applicationContext::containsBeanDefinition) - .map(ThreadPoolExecutorRegistry::getHolder) - .ifPresent(executorHolder -> destroyAdaptedThreadPoolExecutor(beanName, executorHolder)); - } - - @Override - public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { - // forked default implementation from spring-beans-5.1.14.RELEASE.jar - // org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization - return bean; - } - - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { - // forked default implementation from spring-beans-5.1.14.RELEASE.jar - // org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization - return bean; - } - - private void destroyAdaptedThreadPoolExecutor(String beanName, ThreadPoolExecutorHolder executorHolder) { - try { - if (log.isDebugEnabled()) { - log.debug("Destroy internal dynamic thread pool '{}' for bean '{}'", executorHolder.getThreadPoolId(), beanName); - } - if (executorHolder.getExecutor() instanceof DynamicThreadPoolExecutor) { - ((DynamicThreadPoolExecutor) executorHolder.getExecutor()).destroy(); - } - } catch (Exception e) { - log.warn("Failed to destroy internal dynamic thread pool '{}' for bean '{}'", executorHolder.getThreadPoolId(), beanName); - } - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/support/DynamicThreadPoolConfigService.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/support/DynamicThreadPoolConfigService.java deleted file mode 100644 index f28a0df5..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/support/DynamicThreadPoolConfigService.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.support; - -import cn.hippo4j.common.executor.ThreadPoolExecutorHolder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.model.Result; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import cn.hippo4j.common.model.register.DynamicThreadPoolRegisterParameter; -import cn.hippo4j.common.model.register.DynamicThreadPoolRegisterWrapper; -import cn.hippo4j.common.toolkit.Assert; -import cn.hippo4j.common.toolkit.BooleanUtil; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.core.executor.support.service.AbstractDynamicThreadPoolService; -import cn.hippo4j.springboot.starter.config.BootstrapProperties; -import cn.hippo4j.springboot.starter.core.DynamicThreadPoolSubscribeConfig; -import cn.hippo4j.springboot.starter.notify.ServerModeNotifyConfigBuilder; -import cn.hippo4j.springboot.starter.remote.HttpAgent; -import cn.hippo4j.threadpool.message.api.NotifyConfigDTO; -import cn.hippo4j.threadpool.message.core.service.GlobalNotifyAlarmManage; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolBaseSendMessageService; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolNotifyAlarm; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ThreadPoolExecutor; - -import static cn.hippo4j.common.constant.Constants.REGISTER_DYNAMIC_THREAD_POOL_PATH; - -/** - * Dynamic thread-pool config service. - */ -@Slf4j -@RequiredArgsConstructor -public class DynamicThreadPoolConfigService extends AbstractDynamicThreadPoolService { - - private final HttpAgent httpAgent; - private final BootstrapProperties properties; - private final ServerModeNotifyConfigBuilder serverModeNotifyConfigBuilder; - private final ThreadPoolBaseSendMessageService threadPoolBaseSendMessageService; - private final DynamicThreadPoolSubscribeConfig dynamicThreadPoolSubscribeConfig; - - @Override - public ThreadPoolExecutor registerDynamicThreadPool(DynamicThreadPoolRegisterWrapper registerWrapper) { - ThreadPoolExecutor dynamicThreadPoolExecutor = registerExecutor(registerWrapper); - subscribeConfig(registerWrapper); - putNotifyAlarmConfig(registerWrapper); - return dynamicThreadPoolExecutor; - } - - private ThreadPoolExecutor registerExecutor(DynamicThreadPoolRegisterWrapper registerWrapper) { - DynamicThreadPoolRegisterParameter registerParameter = registerWrapper.getParameter(); - checkThreadPoolParameter(registerParameter); - String threadPoolId = registerParameter.getThreadPoolId(); - try { - failDynamicThreadPoolRegisterWrapper(registerWrapper); - Result registerResult = httpAgent.httpPost(REGISTER_DYNAMIC_THREAD_POOL_PATH, registerWrapper); - if (registerResult == null || !registerResult.isSuccess()) { - throw new RuntimeException("Dynamic thread pool registration returns error." - + Optional.ofNullable(registerResult).map(Result::getMessage).orElse("")); - } - } catch (Throwable ex) { - log.error("Dynamic thread pool registration execution error: {}", threadPoolId, ex); - throw ex; - } - ThreadPoolParameterInfo parameter = JSONUtil.parseObject(JSONUtil.toJSONString(registerParameter), ThreadPoolParameterInfo.class); - ThreadPoolExecutor dynamicThreadPoolExecutor = buildDynamicThreadPoolExecutor(registerParameter); - ThreadPoolExecutorHolder executorHolder = new ThreadPoolExecutorHolder(threadPoolId, dynamicThreadPoolExecutor, null); - executorHolder.setParameterInfo(parameter); - ThreadPoolExecutorRegistry.putHolder(executorHolder); - return dynamicThreadPoolExecutor; - } - - private void subscribeConfig(DynamicThreadPoolRegisterWrapper registerWrapper) { - dynamicThreadPoolSubscribeConfig.subscribeConfig(registerWrapper.getParameter().getThreadPoolId()); - } - - private void putNotifyAlarmConfig(DynamicThreadPoolRegisterWrapper registerWrapper) { - DynamicThreadPoolRegisterParameter registerParameter = registerWrapper.getParameter(); - ThreadPoolNotifyAlarm threadPoolNotifyAlarm = new ThreadPoolNotifyAlarm( - BooleanUtil.toBoolean(String.valueOf(registerParameter.getIsAlarm())), - registerParameter.getActiveAlarm(), - registerParameter.getCapacityAlarm()); - GlobalNotifyAlarmManage.put(registerParameter.getThreadPoolId(), threadPoolNotifyAlarm); - Map> builderNotify = serverModeNotifyConfigBuilder.getAndInitNotify(CollectionUtil.newArrayList(registerParameter.getThreadPoolId())); - threadPoolBaseSendMessageService.putPlatform(builderNotify); - } - - private void checkThreadPoolParameter(DynamicThreadPoolRegisterParameter registerParameter) { - Assert.isTrue(!registerParameter.getThreadPoolId().contains("+"), "The thread pool contains sensitive characters."); - } - - private void failDynamicThreadPoolRegisterWrapper(DynamicThreadPoolRegisterWrapper registerWrapper) { - registerWrapper.setTenantId(properties.getNamespace()); - registerWrapper.setItemId(properties.getItemId()); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/support/DynamicThreadPoolPostProcessor.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/support/DynamicThreadPoolPostProcessor.java deleted file mode 100644 index e2ea8e8f..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/support/DynamicThreadPoolPostProcessor.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.support; - -import cn.hippo4j.common.constant.Constants; -import cn.hippo4j.common.executor.ThreadPoolExecutorHolder; -import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; -import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum; -import cn.hippo4j.common.executor.support.RejectedPolicyTypeEnum; -import cn.hippo4j.common.extension.enums.EnableEnum; -import cn.hippo4j.common.model.Result; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import cn.hippo4j.common.model.register.DynamicThreadPoolRegisterParameter; -import cn.hippo4j.common.model.register.DynamicThreadPoolRegisterWrapper; -import cn.hippo4j.common.toolkit.BooleanUtil; -import cn.hippo4j.common.toolkit.JSONUtil; -import cn.hippo4j.common.toolkit.ReflectUtil; -import cn.hippo4j.common.toolkit.ThreadPoolExecutorUtil; -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.core.executor.DynamicThreadPool; -import cn.hippo4j.core.executor.DynamicThreadPoolExecutor; -import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage; -import cn.hippo4j.core.executor.support.adpter.DynamicThreadPoolAdapterChoose; -import cn.hippo4j.core.toolkit.DynamicThreadPoolAnnotationUtil; -import cn.hippo4j.springboot.starter.config.BootstrapProperties; -import cn.hippo4j.springboot.starter.core.DynamicThreadPoolSubscribeConfig; -import cn.hippo4j.springboot.starter.remote.HttpAgent; -import cn.hippo4j.threadpool.message.core.service.GlobalNotifyAlarmManage; -import cn.hippo4j.threadpool.message.core.service.ThreadPoolNotifyAlarm; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.BeanPostProcessor; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import static cn.hippo4j.common.constant.Constants.ACTIVE_ALARM; -import static cn.hippo4j.common.constant.Constants.CAPACITY_ALARM; -import static cn.hippo4j.common.constant.Constants.EXECUTE_TIME_OUT; -import static cn.hippo4j.common.constant.Constants.HTTP_EXECUTE_TIMEOUT; -import static cn.hippo4j.common.constant.Constants.INITIAL_CAPACITY; -import static cn.hippo4j.common.constant.Constants.ITEM_ID; -import static cn.hippo4j.common.constant.Constants.NAMESPACE; -import static cn.hippo4j.common.constant.Constants.TP_ID; - -/** - * Dynamic thread-pool post processor. - */ -@Slf4j -@AllArgsConstructor -public final class DynamicThreadPoolPostProcessor implements BeanPostProcessor { - - private final BootstrapProperties properties; - private final HttpAgent httpAgent; - private final DynamicThreadPoolSubscribeConfig dynamicThreadPoolSubscribeConfig; - - @Override - public Object postProcessBeforeInitialization(Object bean, String beanName) { - return bean; - } - - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { - if (bean instanceof DynamicThreadPoolExecutor || DynamicThreadPoolAdapterChoose.match(bean)) { - DynamicThreadPool dynamicThreadPool; - try { - dynamicThreadPool = ApplicationContextHolder.findAnnotationOnBean(beanName, DynamicThreadPool.class); - if (Objects.isNull(dynamicThreadPool)) { - // Adapt to lower versions of SpringBoot. - dynamicThreadPool = DynamicThreadPoolAnnotationUtil.findAnnotationOnBean(beanName, DynamicThreadPool.class); - if (Objects.isNull(dynamicThreadPool)) { - return bean; - } - } - } catch (Exception ex) { - log.error("Failed to create dynamic thread pool in annotation mode.", ex); - return bean; - } - ThreadPoolExecutor dynamicThreadPoolExecutor = DynamicThreadPoolAdapterChoose.unwrap(bean); - if ((dynamicThreadPoolExecutor) == null) { - dynamicThreadPoolExecutor = (DynamicThreadPoolExecutor) bean; - } - ThreadPoolExecutor remoteThreadPoolExecutor = fillPoolAndRegister(((DynamicThreadPoolExecutor) dynamicThreadPoolExecutor).getThreadPoolId(), dynamicThreadPoolExecutor); - DynamicThreadPoolAdapterChoose.replace(bean, remoteThreadPoolExecutor); - subscribeConfig(((DynamicThreadPoolExecutor) dynamicThreadPoolExecutor).getThreadPoolId()); - return DynamicThreadPoolAdapterChoose.match(bean) ? bean : remoteThreadPoolExecutor; - } - return bean; - } - - /** - * Register and subscribe. - * - * @param threadPoolId dynamic thread-pool id - * @param executor dynamic thread-pool executor - */ - protected void registerAndSubscribe(String threadPoolId, ThreadPoolExecutor executor) { - fillPoolAndRegister(threadPoolId, executor); - subscribeConfig(threadPoolId); - } - - /** - * Fill the thread pool and register. - * - * @param threadPoolId dynamic thread-pool id - * @param executor dynamic thread-pool executor - */ - protected ThreadPoolExecutor fillPoolAndRegister(String threadPoolId, ThreadPoolExecutor executor) { - Map queryStrMap = new HashMap<>(INITIAL_CAPACITY); - queryStrMap.put(TP_ID, threadPoolId); - queryStrMap.put(ITEM_ID, properties.getItemId()); - queryStrMap.put(NAMESPACE, properties.getNamespace()); - ThreadPoolParameterInfo threadPoolParameterInfo = new ThreadPoolParameterInfo(); - try { - Result result = httpAgent.httpGetByConfig(Constants.CONFIG_CONTROLLER_PATH, null, queryStrMap, HTTP_EXECUTE_TIMEOUT); - if (result.isSuccess() && result.getData() != null) { - String resultJsonStr = JSONUtil.toJSONString(result.getData()); - threadPoolParameterInfo = JSONUtil.parseObject(resultJsonStr, ThreadPoolParameterInfo.class); - if (threadPoolParameterInfo != null) { - threadPoolParamReplace(executor, threadPoolParameterInfo); - registerNotifyAlarm(threadPoolParameterInfo); - } - } else { - // DynamicThreadPool configuration undefined in server - DynamicThreadPoolRegisterParameter parameterInfo = DynamicThreadPoolRegisterParameter.builder() - .threadPoolId(threadPoolId) - .corePoolSize(executor.getCorePoolSize()) - .maximumPoolSize(executor.getMaximumPoolSize()) - .blockingQueueType(BlockingQueueTypeEnum.getBlockingQueueTypeEnumByName(executor.getQueue().getClass().getSimpleName())) - .capacity(executor.getQueue().remainingCapacity()) - .threadFactory(executor.getThreadFactory()) - .allowCoreThreadTimeOut(executor.allowsCoreThreadTimeOut()) - .keepAliveTime(executor.getKeepAliveTime(TimeUnit.MILLISECONDS)) - .isAlarm(false) - .activeAlarm(ACTIVE_ALARM) - .capacityAlarm(CAPACITY_ALARM) - .executeTimeOut(EXECUTE_TIME_OUT) - .rejectedPolicyType(RejectedPolicyTypeEnum.getRejectedPolicyTypeEnumByName(executor.getRejectedExecutionHandler().getClass().getSimpleName())) - .build(); - DynamicThreadPoolRegisterWrapper registerWrapper = DynamicThreadPoolRegisterWrapper.builder() - .parameter(parameterInfo) - .build(); - GlobalThreadPoolManage.dynamicRegister(registerWrapper); - } - } catch (Exception ex) { - log.error("Failed to initialize thread pool configuration. error message: {}", ex.getMessage()); - } - ThreadPoolExecutorHolder executorHolder = new ThreadPoolExecutorHolder(threadPoolId, executor, null); - executorHolder.setParameterInfo(threadPoolParameterInfo); - ThreadPoolExecutorRegistry.putHolder(executorHolder); - return executor; - } - - /** - * Thread-pool param replace. - * - * @param executor dynamic thread-pool executor - * @param threadPoolParameterInfo thread-pool parameter info - */ - private void threadPoolParamReplace(ThreadPoolExecutor executor, ThreadPoolParameterInfo threadPoolParameterInfo) { - BlockingQueue workQueue = BlockingQueueTypeEnum.createBlockingQueue(threadPoolParameterInfo.getQueueType(), threadPoolParameterInfo.getCapacity()); - ReflectUtil.setFieldValue(executor, "workQueue", workQueue); - // fix https://github.com/opengoofy/hippo4j/issues/1063 - ThreadPoolExecutorUtil.safeSetPoolSize(executor, threadPoolParameterInfo.corePoolSizeAdapt(), threadPoolParameterInfo.maximumPoolSizeAdapt()); - executor.setKeepAliveTime(threadPoolParameterInfo.getKeepAliveTime(), TimeUnit.SECONDS); - executor.allowCoreThreadTimeOut(EnableEnum.getBool(threadPoolParameterInfo.getAllowCoreThreadTimeOut())); - executor.setRejectedExecutionHandler(RejectedPolicyTypeEnum.createPolicy(threadPoolParameterInfo.getRejectedType())); - if (executor instanceof DynamicThreadPoolExecutor) { - Optional.ofNullable(threadPoolParameterInfo.getExecuteTimeOut()) - .ifPresent(executeTimeOut -> ((DynamicThreadPoolExecutor) executor).setExecuteTimeOut(executeTimeOut)); - } - } - - /** - * Register notify alarm. - * - * @param threadPoolParameterInfo thread-pool parameter info - */ - private void registerNotifyAlarm(ThreadPoolParameterInfo threadPoolParameterInfo) { - // Set dynamic thread pool enhancement parameters. - ThreadPoolNotifyAlarm threadPoolNotifyAlarm = new ThreadPoolNotifyAlarm( - BooleanUtil.toBoolean(threadPoolParameterInfo.getIsAlarm().toString()), - threadPoolParameterInfo.getLivenessAlarm(), - threadPoolParameterInfo.getCapacityAlarm()); - GlobalNotifyAlarmManage.put(threadPoolParameterInfo.getTpId(), threadPoolNotifyAlarm); - } - - /** - * Client dynamic thread pool subscription server configuration. - * - * @param threadPoolId thread-pool id - */ - protected void subscribeConfig(String threadPoolId) { - dynamicThreadPoolSubscribeConfig.subscribeConfig(threadPoolId); - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/support/ThreadPoolPluginRegisterPostProcessor.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/support/ThreadPoolPluginRegisterPostProcessor.java deleted file mode 100644 index e5b9d2c7..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/support/ThreadPoolPluginRegisterPostProcessor.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.support; - -import cn.hippo4j.common.toolkit.Assert; -import cn.hippo4j.core.executor.plugin.ThreadPoolPlugin; -import cn.hippo4j.core.executor.plugin.manager.DefaultGlobalThreadPoolPluginManager; -import cn.hippo4j.core.executor.plugin.manager.GlobalThreadPoolPluginManager; -import cn.hippo4j.core.executor.plugin.manager.ThreadPoolPluginRegistrar; -import cn.hippo4j.core.executor.plugin.manager.ThreadPoolPluginSupport; -import lombok.extern.slf4j.Slf4j; -import org.springframework.aop.framework.autoproxy.AutoProxyUtils; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.BeanInitializationException; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.NoSuchBeanDefinitionException; -import org.springframework.beans.factory.config.AutowireCapableBeanFactory; -import org.springframework.beans.factory.config.BeanPostProcessor; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ApplicationContextException; -import org.springframework.context.ApplicationEventPublisherAware; -import org.springframework.context.MessageSourceAware; -import org.springframework.context.ResourceLoaderAware; - -import java.util.Objects; - -/** - *

The extension implementation of {@link GlobalThreadPoolPluginManager} and {@link BeanPostProcessor}, - * used to register {@link ThreadPoolPlugin} for the bean initialization stage of the {@link ThreadPoolPluginSupport}. - * - *

NOTE: - * If the {@link ThreadPoolPlugin}, {@link ThreadPoolPluginRegistrar}, and {@link ThreadPoolPluginSupport} is set to lazy load, - * The processor will not perceive the bean unless the user actively triggers the initialization of the bean. - * - * @see ThreadPoolPluginSupport - * @see ThreadPoolPluginRegistrar - * @see ThreadPoolPlugin - * @see GlobalThreadPoolPluginManager - * @see DefaultGlobalThreadPoolPluginManager - */ -@Slf4j -public class ThreadPoolPluginRegisterPostProcessor extends DefaultGlobalThreadPoolPluginManager implements BeanPostProcessor, ApplicationContextAware { - - /** - * Application context - */ - private ConfigurableListableBeanFactory beanFactory; - - /** - *

Post process bean, if bean is instance of {@link ThreadPoolPlugin}, - * {@link ThreadPoolPluginRegistrar} or {@link ThreadPoolPluginSupport}, - * then take beans as an available component and register to {@link GlobalThreadPoolPluginManager}. - * - * @param bean the new bean instance - * @param beanName the name of the bean - * @return the bean instance to use, either the original or a wrapped one; - * if {@code null}, no subsequent BeanPostProcessors will be invoked - * @throws BeansException in case of errors - * @see GlobalThreadPoolPluginManager#enableThreadPoolPlugin - * @see GlobalThreadPoolPluginManager#enableThreadPoolPluginRegistrar - * @see GlobalThreadPoolPluginManager#registerThreadPoolPluginSupport - */ - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { - Class beanType = null; - try { - beanType = AutoProxyUtils.determineTargetClass(beanFactory, beanName); - } catch (NoSuchBeanDefinitionException ex) { - if (log.isDebugEnabled()) { - log.debug("Could not resolve target class for bean with name '" + beanName + "'", ex); - } - } - if (Objects.isNull(beanType)) { - if (log.isDebugEnabled()) { - log.debug("Cannot resolve type for bean [{}]", beanName); - } - return bean; - } - - // register bean if necessary - registerThreadPoolPluginRegistrarIfNecessary(bean, beanType); - registerThreadPoolPluginIfNecessary(bean, beanType); - registerThreadPoolPluginSupportIfNecessary(bean, beanType); - return bean; - } - - private void registerThreadPoolPluginSupportIfNecessary(Object bean, Class beanType) { - if (ThreadPoolPluginSupport.class.isAssignableFrom(beanType)) { - ThreadPoolPluginSupport support = (ThreadPoolPluginSupport) bean; - if (registerThreadPoolPluginSupport(support) && log.isDebugEnabled()) { - log.debug("Register ThreadPoolPluginSupport [{}]", support.getThreadPoolId()); - } - } - } - - private void registerThreadPoolPluginIfNecessary(Object bean, Class beanType) { - if (ThreadPoolPlugin.class.isAssignableFrom(beanType)) { - ThreadPoolPlugin plugin = (ThreadPoolPlugin) bean; - if (enableThreadPoolPlugin(plugin) && log.isDebugEnabled()) { - log.debug("Register ThreadPoolPlugin [{}]", plugin.getId()); - } - } - } - - private void registerThreadPoolPluginRegistrarIfNecessary(Object bean, Class beanType) { - if (ThreadPoolPluginRegistrar.class.isAssignableFrom(beanType)) { - ThreadPoolPluginRegistrar registrar = (ThreadPoolPluginRegistrar) bean; - if (enableThreadPoolPluginRegistrar(registrar) && log.isDebugEnabled()) { - log.debug("Register ThreadPoolPluginRegistrar [{}]", registrar.getId()); - } - } - } - - /** - * Set the ApplicationContext that this object runs in. - * Normally this call will be used to initialize the object. - *

Invoked after population of normal bean properties but before an init callback such - * as {@link InitializingBean#afterPropertiesSet()} - * or a custom init-method. Invoked after {@link ResourceLoaderAware#setResourceLoader}, - * {@link ApplicationEventPublisherAware#setApplicationEventPublisher} and - * {@link MessageSourceAware}, if applicable. - * - * @param applicationContext the ApplicationContext object to be used by this object - * @throws ApplicationContextException in case of context initialization errors - * @throws BeansException if thrown by application context methods - * @see BeanInitializationException - */ - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory(); - Assert.isTrue( - factory instanceof ConfigurableListableBeanFactory, - "Factory cannot cast to ConfigurableListableBeanFactory"); - this.beanFactory = (ConfigurableListableBeanFactory) factory; - } - - /** - * Apply this {@code BeanPostProcessor} to the given new bean instance before any bean - * initialization callbacks (like InitializingBean's {@code afterPropertiesSet} - * or a custom init-method). The bean will already be populated with property values. - * The returned bean instance may be a wrapper around the original. - *

The default implementation returns the given {@code bean} as-is. - * - * @param bean the new bean instance - * @param beanName the name of the bean - * @return the bean instance to use, either the original or a wrapped one; - * if {@code null}, no subsequent BeanPostProcessors will be invoked - * @throws BeansException in case of errors - * @see InitializingBean#afterPropertiesSet - */ - @Override - public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { - return bean; - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/toolkit/CloudCommonIdUtil.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/toolkit/CloudCommonIdUtil.java deleted file mode 100644 index 53c79ff4..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/toolkit/CloudCommonIdUtil.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.toolkit; - -import cn.hippo4j.core.toolkit.inet.InetUtils; -import lombok.SneakyThrows; -import org.springframework.core.env.PropertyResolver; - -/** - * Cloud common id util. - */ -public class CloudCommonIdUtil { - - /** - * Splice target information separator - */ - private static final String SEPARATOR = ":"; - - /** - * Get client ip port. - * - * @param resolver resolver - * @param inetUtils inet utils - * @return ip and port - */ - public static String getClientIpPort(PropertyResolver resolver, InetUtils inetUtils) { - String hostname = inetUtils.findFirstNonLoopBackHostInfo().getIpAddress(); - String port = resolver.getProperty("server.port", "8080"); - return combineParts(hostname, SEPARATOR, port); - } - - /** - * Get default instance id. - * - * @param resolver resolver - * @param inetUtils inet utils - * @return default instance id - */ - @SneakyThrows - public static String getDefaultInstanceId(PropertyResolver resolver, InetUtils inetUtils) { - String namePart = getIpApplicationName(resolver, inetUtils); - String indexPart = resolver.getProperty("spring.application.instance_id", resolver.getProperty("server.port")); - return combineParts(namePart, SEPARATOR, indexPart); - } - - /** - * Get ip application name. - * - * @param resolver resolver - * @param inetUtils inet utils - * @return ip application name - */ - @SneakyThrows - public static String getIpApplicationName(PropertyResolver resolver, InetUtils inetUtils) { - String hostname = inetUtils.findFirstNonLoopBackHostInfo().getIpAddress(); - String appName = resolver.getProperty("spring.application.name"); - return combineParts(hostname, SEPARATOR, appName); - } - - /** - * Combine parts. - * - * @param firstPart first part - * @param separator separator - * @param secondPart second part - * @return combined - */ - public static String combineParts(String firstPart, String separator, String secondPart) { - String combined = null; - if (firstPart != null && secondPart != null) { - combined = firstPart + separator + secondPart; - } else if (firstPart != null) { - combined = firstPart; - } else if (secondPart != null) { - combined = secondPart; - } - return combined; - } -} diff --git a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/wrapper/ManagerListenerWrapper.java b/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/wrapper/ManagerListenerWrapper.java deleted file mode 100644 index 0119f655..00000000 --- a/starters/threadpool/server/src/main/java/cn/hippo4j/springboot/starter/wrapper/ManagerListenerWrapper.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.springboot.starter.wrapper; - -import cn.hippo4j.springboot.starter.core.Listener; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -/** - * Manager listener wrapper. - */ -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -public class ManagerListenerWrapper { - - /** - * Last call md5 - */ - private String lastCallMd5; - - /** - * Listener - */ - private Listener listener; -} diff --git a/starters/threadpool/server/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/starters/threadpool/server/src/main/resources/META-INF/additional-spring-configuration-metadata.json deleted file mode 100644 index fe916f2f..00000000 --- a/starters/threadpool/server/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "properties": [ - { - "name": "spring.dynamic.thread-pool.server-addr", - "type": "java.lang.String", - "defaultValue": "localhost:6691", - "description": "dynamic thread-pool server address." - }, - { - "name": "spring.dynamic.thread-pool.netty-server-port", - "type": "java.lang.String", - "defaultValue": "8899", - "description": "dynamic thread-pool server netty port." - }, - { - "name": "spring.dynamic.thread-pool.report-type", - "type": "java.lang.String", - "defaultValue": "http", - "description": "dynamic thread-pool report-type." - }, - { - "name": "spring.dynamic.thread-pool.namespace", - "type": "java.lang.String", - "defaultValue": "public", - "description": "dynamic thread-pool namespace." - }, - { - "name": "spring.dynamic.thread-pool.item-id", - "type": "java.lang.String", - "description": "dynamic thread-pool item-id." - }, - { - "name": "spring.dynamic.thread-pool.banner", - "type": "java.lang.Boolean", - "defaultValue": true, - "description": "dynamic thread-pool banner." - } - ] -} \ No newline at end of file diff --git a/starters/threadpool/server/src/main/resources/META-INF/spring.factories b/starters/threadpool/server/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 18f30aff..00000000 --- a/starters/threadpool/server/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,2 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.config.DynamicThreadPoolAutoConfiguration -org.springframework.boot.diagnostics.FailureAnalyzer=cn.hippo4j.springboot.starter.core.ConfigEmptyAnalyzer diff --git a/starters/threadpool/server/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/starters/threadpool/server/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 868f4b74..00000000 --- a/starters/threadpool/server/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.hippo4j.springboot.starter.config.DynamicThreadPoolAutoConfiguration \ No newline at end of file diff --git a/tests/pom.xml b/tests/pom.xml deleted file mode 100644 index 0d5f9db6..00000000 --- a/tests/pom.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-all - ${revision} - - hippo4j-tests - - - true - - \ No newline at end of file diff --git a/threadpool/adapter/alibaba-dubbo/pom.xml b/threadpool/adapter/alibaba-dubbo/pom.xml deleted file mode 100644 index ec7c2476..00000000 --- a/threadpool/adapter/alibaba-dubbo/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-adapter - ${revision} - - hippo4j-threadpool-adapter-alibaba-dubbo - - - - cn.hippo4j - hippo4j-threadpool-adapter-base - ${project.version} - - - com.alibaba - dubbo - true - - - diff --git a/threadpool/adapter/alibaba-dubbo/src/main/java/cn/hippo4j/adapter/alibaba/dubbo/AlibabaDubboThreadPoolAdapter.java b/threadpool/adapter/alibaba-dubbo/src/main/java/cn/hippo4j/adapter/alibaba/dubbo/AlibabaDubboThreadPoolAdapter.java deleted file mode 100644 index c110624a..00000000 --- a/threadpool/adapter/alibaba-dubbo/src/main/java/cn/hippo4j/adapter/alibaba/dubbo/AlibabaDubboThreadPoolAdapter.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.alibaba.dubbo; - -import cn.hippo4j.adapter.base.ThreadPoolAdapter; -import cn.hippo4j.adapter.base.ThreadPoolAdapterParameter; -import cn.hippo4j.common.model.ThreadPoolAdapterState; -import cn.hippo4j.common.toolkit.ThreadPoolExecutorUtil; -import com.alibaba.dubbo.common.extension.ExtensionLoader; -import com.alibaba.dubbo.common.store.DataStore; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.event.ApplicationStartedEvent; -import org.springframework.context.ApplicationListener; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ThreadPoolExecutor; - -import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_DELIMITER; - -/** - * Alibaba Dubbo thread-pool adapter. - */ -@Slf4j -public class AlibabaDubboThreadPoolAdapter implements ThreadPoolAdapter, ApplicationListener { - - private final Map dubboProtocolExecutor = new HashMap<>(); - - @Override - public String mark() { - return "AlibabaDubbo"; - } - - @Override - public ThreadPoolAdapterState getThreadPoolState(String identify) { - ThreadPoolAdapterState threadPoolAdapterState = new ThreadPoolAdapterState(); - ThreadPoolExecutor executor = dubboProtocolExecutor.get(identify); - if (executor == null) { - log.warn("[{}] Alibaba Dubbo consuming thread pool not found.", identify); - return threadPoolAdapterState; - } - threadPoolAdapterState.setThreadPoolKey(identify); - threadPoolAdapterState.setCoreSize(executor.getCorePoolSize()); - threadPoolAdapterState.setMaximumSize(executor.getMaximumPoolSize()); - return threadPoolAdapterState; - } - - @Override - public List getThreadPoolStates() { - List threadPoolAdapterStates = new ArrayList<>(); - dubboProtocolExecutor.forEach((key, val) -> threadPoolAdapterStates.add(getThreadPoolState(String.valueOf(key)))); - return threadPoolAdapterStates; - } - - @Override - public boolean updateThreadPool(ThreadPoolAdapterParameter threadPoolAdapterParameter) { - String threadPoolKey = threadPoolAdapterParameter.getThreadPoolKey(); - ThreadPoolExecutor executor = dubboProtocolExecutor.get(threadPoolAdapterParameter.getThreadPoolKey()); - if (executor == null) { - log.warn("[{}] Alibaba Dubbo consuming thread pool not found.", threadPoolKey); - return false; - } - int originalCoreSize = executor.getCorePoolSize(); - int originalMaximumPoolSize = executor.getMaximumPoolSize(); - ThreadPoolExecutorUtil.safeSetPoolSize(executor, threadPoolAdapterParameter.getCorePoolSize(), threadPoolAdapterParameter.getMaximumPoolSize()); - log.info("[{}] Alibaba Dubbo consumption thread pool parameter change. coreSize: {}, maximumSize: {}", - threadPoolKey, - String.format(CHANGE_DELIMITER, originalCoreSize, executor.getCorePoolSize()), - String.format(CHANGE_DELIMITER, originalMaximumPoolSize, executor.getMaximumPoolSize())); - return true; - } - - @Override - public void onApplicationEvent(ApplicationStartedEvent event) { - String poolKey = ExecutorService.class.getName(); - try { - DataStore dataStore = ExtensionLoader.getExtensionLoader(DataStore.class).getDefaultExtension(); - Map executors = dataStore.get(poolKey); - executors.forEach((key, value) -> dubboProtocolExecutor.put(key, (ThreadPoolExecutor) value)); - } catch (Exception ex) { - log.error("Failed to get Alibaba Dubbo protocol thread pool", ex); - } - } -} diff --git a/threadpool/adapter/base/pom.xml b/threadpool/adapter/base/pom.xml deleted file mode 100644 index 939675d7..00000000 --- a/threadpool/adapter/base/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-adapter - ${revision} - - hippo4j-threadpool-adapter-base - - - - cn.hippo4j - hippo4j-threadpool-core - ${project.version} - - - diff --git a/threadpool/adapter/base/src/main/java/cn/hippo4j/adapter/base/ThreadPoolAdapter.java b/threadpool/adapter/base/src/main/java/cn/hippo4j/adapter/base/ThreadPoolAdapter.java deleted file mode 100644 index 23f98cf8..00000000 --- a/threadpool/adapter/base/src/main/java/cn/hippo4j/adapter/base/ThreadPoolAdapter.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.base; - -import cn.hippo4j.common.model.ThreadPoolAdapterState; - -import java.util.List; - -/** - * Adapt to the thread pool of the third-party framework. - */ -public interface ThreadPoolAdapter { - - /** - * Framework thread pool identification. - * - * @return - */ - String mark(); - - /** - * Get the core parameters of the framework thread pool. - * - * @param identify Thread pool unique id - * @return - */ - ThreadPoolAdapterState getThreadPoolState(String identify); - - /** - * Get the core parameters of the framework thread pool. - * - * @return - */ - default List getThreadPoolStates() { - return null; - } - - /** - * Modify the core parameters of the framework thread pool. - * - * @param threadPoolAdapterParameter Thread pool parameters to be modified - * @return - */ - boolean updateThreadPool(ThreadPoolAdapterParameter threadPoolAdapterParameter); -} diff --git a/threadpool/adapter/base/src/main/java/cn/hippo4j/adapter/base/ThreadPoolAdapterBeanContainer.java b/threadpool/adapter/base/src/main/java/cn/hippo4j/adapter/base/ThreadPoolAdapterBeanContainer.java deleted file mode 100644 index 1338dc5c..00000000 --- a/threadpool/adapter/base/src/main/java/cn/hippo4j/adapter/base/ThreadPoolAdapterBeanContainer.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.base; - -import cn.hippo4j.core.config.ApplicationContextHolder; -import org.springframework.beans.factory.InitializingBean; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Thread-pool adapter bean container. - */ -public class ThreadPoolAdapterBeanContainer implements InitializingBean { - - /** - * Store three-party thread pool framework bean instances - */ - public static final Map THREAD_POOL_ADAPTER_BEAN_CONTAINER = new ConcurrentHashMap<>(); - - @Override - public void afterPropertiesSet() throws Exception { - Map threadPoolAdapterMap = ApplicationContextHolder.getBeansOfType(ThreadPoolAdapter.class); - threadPoolAdapterMap.forEach((key, val) -> THREAD_POOL_ADAPTER_BEAN_CONTAINER.put(val.mark(), val)); - } -} diff --git a/threadpool/adapter/base/src/main/java/cn/hippo4j/adapter/base/ThreadPoolAdapterCacheConfig.java b/threadpool/adapter/base/src/main/java/cn/hippo4j/adapter/base/ThreadPoolAdapterCacheConfig.java deleted file mode 100644 index 6117d803..00000000 --- a/threadpool/adapter/base/src/main/java/cn/hippo4j/adapter/base/ThreadPoolAdapterCacheConfig.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.base; - -import cn.hippo4j.common.model.ThreadPoolAdapterState; -import lombok.Data; - -import java.util.List; - -/** - * Thread-pool adapter cache config. - */ -@Data -public class ThreadPoolAdapterCacheConfig { - - /** - * Mark - */ - private String mark; - - /** - * Tenant item key - */ - private String tenantItemKey; - - /** - * Client identify - */ - private String clientIdentify; - - /** - * Active - */ - private String active; - - /** - * Client address - */ - private String clientAddress; - - /** - * Thread-pool adapter states - */ - private List threadPoolAdapterStates; -} diff --git a/threadpool/adapter/base/src/main/java/cn/hippo4j/adapter/base/ThreadPoolAdapterParameter.java b/threadpool/adapter/base/src/main/java/cn/hippo4j/adapter/base/ThreadPoolAdapterParameter.java deleted file mode 100644 index c68129eb..00000000 --- a/threadpool/adapter/base/src/main/java/cn/hippo4j/adapter/base/ThreadPoolAdapterParameter.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.base; - -import lombok.Data; - -/** - * Thread pool adapter parameter info. - */ -@Data -public class ThreadPoolAdapterParameter { - - /** - * Mark - */ - private String mark; - - /** - * Thread-pool key - */ - private String threadPoolKey; - - /** - * Core pool size - */ - private Integer corePoolSize; - - /** - * Maximum pool size - */ - private Integer maximumPoolSize; -} diff --git a/threadpool/adapter/base/src/main/java/cn/hippo4j/adapter/base/ThreadPoolAdapterRegisterAction.java b/threadpool/adapter/base/src/main/java/cn/hippo4j/adapter/base/ThreadPoolAdapterRegisterAction.java deleted file mode 100644 index 0dda7fa3..00000000 --- a/threadpool/adapter/base/src/main/java/cn/hippo4j/adapter/base/ThreadPoolAdapterRegisterAction.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.base; - -import java.util.List; -import java.util.Map; - -/** - * Provide registration for each adaptation - */ -public interface ThreadPoolAdapterRegisterAction { - - /** - * Get thread pool adapter cache configs. - * - * @param threadPoolAdapterMap thread-pool adapter map - * @return List - */ - List getThreadPoolAdapterCacheConfigs(Map threadPoolAdapterMap); - - /** - * Do register. - * - * @param cacheConfigList cache config list - */ - void doRegister(List cacheConfigList); -} diff --git a/threadpool/adapter/dubbo/pom.xml b/threadpool/adapter/dubbo/pom.xml deleted file mode 100644 index c94f6be7..00000000 --- a/threadpool/adapter/dubbo/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-adapter - ${revision} - - hippo4j-threadpool-adapter-dubbo - - - - cn.hippo4j - hippo4j-threadpool-adapter-base - ${project.version} - - - org.apache.dubbo - dubbo - true - - - diff --git a/threadpool/adapter/dubbo/src/main/java/cn/hippo4j/adapter/dubbo/DubboThreadPoolAdapter.java b/threadpool/adapter/dubbo/src/main/java/cn/hippo4j/adapter/dubbo/DubboThreadPoolAdapter.java deleted file mode 100644 index b387d41b..00000000 --- a/threadpool/adapter/dubbo/src/main/java/cn/hippo4j/adapter/dubbo/DubboThreadPoolAdapter.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.dubbo; - -import cn.hippo4j.adapter.base.ThreadPoolAdapter; -import cn.hippo4j.adapter.base.ThreadPoolAdapterParameter; -import cn.hippo4j.common.model.ThreadPoolAdapterState; -import cn.hippo4j.common.toolkit.ReflectUtil; -import cn.hippo4j.common.toolkit.ThreadPoolExecutorUtil; -import lombok.extern.slf4j.Slf4j; -import org.apache.dubbo.common.Version; -import org.apache.dubbo.common.extension.ExtensionLoader; -import org.apache.dubbo.common.store.DataStore; -import org.apache.dubbo.common.threadpool.manager.ExecutorRepository; -import org.springframework.boot.context.event.ApplicationStartedEvent; -import org.springframework.context.ApplicationListener; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ThreadPoolExecutor; - -import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_DELIMITER; - -/** - * Dubbo thread-pool adapter. - */ -@Slf4j -public class DubboThreadPoolAdapter implements ThreadPoolAdapter, ApplicationListener { - - private final Map dubboProtocolExecutor = new HashMap<>(); - - @Override - public String mark() { - return "Dubbo"; - } - - @Override - public ThreadPoolAdapterState getThreadPoolState(String identify) { - ThreadPoolAdapterState threadPoolAdapterState = new ThreadPoolAdapterState(); - ThreadPoolExecutor executor = dubboProtocolExecutor.get(identify); - if (executor == null) { - log.warn("[{}] Dubbo consuming thread pool not found.", identify); - return threadPoolAdapterState; - } - threadPoolAdapterState.setThreadPoolKey(identify); - threadPoolAdapterState.setCoreSize(executor.getCorePoolSize()); - threadPoolAdapterState.setMaximumSize(executor.getMaximumPoolSize()); - return threadPoolAdapterState; - } - - @Override - public List getThreadPoolStates() { - List threadPoolAdapterStates = new ArrayList<>(); - dubboProtocolExecutor.forEach((key, val) -> threadPoolAdapterStates.add(getThreadPoolState(String.valueOf(key)))); - return threadPoolAdapterStates; - } - - @Override - public boolean updateThreadPool(ThreadPoolAdapterParameter threadPoolAdapterParameter) { - String threadPoolKey = threadPoolAdapterParameter.getThreadPoolKey(); - ThreadPoolExecutor executor = dubboProtocolExecutor.get(threadPoolAdapterParameter.getThreadPoolKey()); - if (executor == null) { - log.warn("[{}] Dubbo consuming thread pool not found.", threadPoolKey); - return false; - } - int originalCoreSize = executor.getCorePoolSize(); - int originalMaximumPoolSize = executor.getMaximumPoolSize(); - ThreadPoolExecutorUtil.safeSetPoolSize(executor, threadPoolAdapterParameter.getCorePoolSize(), threadPoolAdapterParameter.getMaximumPoolSize()); - log.info("[{}] Dubbo consumption thread pool parameter change. coreSize: {}, maximumSize: {}", - threadPoolKey, - String.format(CHANGE_DELIMITER, originalCoreSize, executor.getCorePoolSize()), - String.format(CHANGE_DELIMITER, originalMaximumPoolSize, executor.getMaximumPoolSize())); - return true; - } - - @Override - public void onApplicationEvent(ApplicationStartedEvent event) { - boolean isLegacyVersion = false; - String poolKey = ExecutorService.class.getName(); - // Since 2.7.5, Dubbo has changed the way thread pools are used - // fixed https://github.com/opengoofy/hippo4j/issues/708 - if (Version.getIntVersion(Version.getVersion()) < 2070500) { - isLegacyVersion = true; - } - try { - if (isLegacyVersion) { - DataStore dataStore = ExtensionLoader.getExtensionLoader(DataStore.class).getDefaultExtension(); - Map executors = dataStore.get(poolKey); - executors.forEach((key, value) -> dubboProtocolExecutor.put(key, (ThreadPoolExecutor) value)); - return; - } - ExecutorRepository executorRepository = ExtensionLoader.getExtensionLoader(ExecutorRepository.class).getDefaultExtension(); - ConcurrentMap> data = - (ConcurrentMap>) ReflectUtil.getFieldValue(executorRepository, "data"); - ConcurrentMap executorServiceMap = data.get(poolKey); - executorServiceMap.forEach((key, value) -> dubboProtocolExecutor.put(String.valueOf(key), (ThreadPoolExecutor) value)); - } catch (Exception ex) { - log.error("Failed to get Dubbo {} protocol thread pool", Version.getVersion(), ex); - } - } -} diff --git a/threadpool/adapter/dubbox/pom.xml b/threadpool/adapter/dubbox/pom.xml deleted file mode 100644 index be4aa026..00000000 --- a/threadpool/adapter/dubbox/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-adapter - ${revision} - - hippo4j-threadpool-adapter-dubbox - - - - cn.hippo4j - hippo4j-threadpool-adapter-dubbo - ${project.version} - - - diff --git a/threadpool/adapter/dubbox/src/main/java/cn/hippo4j/adapter/dubbo/DubboxThreadPoolAdapter.java b/threadpool/adapter/dubbox/src/main/java/cn/hippo4j/adapter/dubbo/DubboxThreadPoolAdapter.java deleted file mode 100644 index 5207bbac..00000000 --- a/threadpool/adapter/dubbox/src/main/java/cn/hippo4j/adapter/dubbo/DubboxThreadPoolAdapter.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.dubbo; - -import lombok.extern.slf4j.Slf4j; - -/** - * Dubbox thread-pool adapter. - */ -@Slf4j -public class DubboxThreadPoolAdapter extends DubboThreadPoolAdapter { - - @Override - public String mark() { - return "Dubbox"; - } -} diff --git a/threadpool/adapter/hystrix/pom.xml b/threadpool/adapter/hystrix/pom.xml deleted file mode 100644 index 00832d21..00000000 --- a/threadpool/adapter/hystrix/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-adapter - ${revision} - - hippo4j-threadpool-adapter-hystrix - - - - cn.hippo4j - hippo4j-threadpool-adapter-base - ${project.version} - - - org.springframework.cloud - spring-cloud-starter-netflix-hystrix - true - - - diff --git a/threadpool/adapter/hystrix/src/main/java/cn/hippo4j/adapter/hystrix/AbstractHystrixThreadPoolAdapter.java b/threadpool/adapter/hystrix/src/main/java/cn/hippo4j/adapter/hystrix/AbstractHystrixThreadPoolAdapter.java deleted file mode 100644 index 9108680c..00000000 --- a/threadpool/adapter/hystrix/src/main/java/cn/hippo4j/adapter/hystrix/AbstractHystrixThreadPoolAdapter.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.hystrix; - -import cn.hippo4j.adapter.base.ThreadPoolAdapter; -import cn.hippo4j.adapter.base.ThreadPoolAdapterParameter; -import cn.hippo4j.common.model.ThreadPoolAdapterState; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.common.toolkit.ThreadPoolExecutorUtil; -import com.netflix.hystrix.HystrixThreadPool; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.event.ApplicationStartedEvent; -import org.springframework.context.ApplicationListener; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_DELIMITER; - -/** - * abstract hystrix thread-pool adapter - */ -@Slf4j -public abstract class AbstractHystrixThreadPoolAdapter implements ThreadPoolAdapter, ApplicationListener { - - private static final String THREAD_POOL_FIELD = "threadPool"; - - private static final String THREAD_POOLS_FIELD = "threadPools"; - - private final Map hystrixConsumeExecutor = new HashMap<>(); - - protected final ThreadPoolAdapterScheduler threadPoolAdapterScheduler; - - protected AbstractHystrixThreadPoolAdapter(ThreadPoolAdapterScheduler threadPoolAdapterScheduler) { - this.threadPoolAdapterScheduler = threadPoolAdapterScheduler; - } - - @Override - public String mark() { - return "Hystrix"; - } - - @Override - public ThreadPoolAdapterState getThreadPoolState(String identify) { - ThreadPoolAdapterState result = new ThreadPoolAdapterState(); - ThreadPoolExecutor threadPoolExecutor = hystrixConsumeExecutor.get(identify); - if (threadPoolExecutor != null) { - BlockingQueue blockingQueue = threadPoolExecutor.getQueue(); - result.setThreadPoolKey(identify); - result.setCoreSize(threadPoolExecutor.getCorePoolSize()); - result.setMaximumSize(threadPoolExecutor.getMaximumPoolSize()); - result.setBlockingQueueCapacity(blockingQueue.size() + blockingQueue.remainingCapacity()); - return result; - } - log.warn("[{}] Hystrix thread pool not found.", identify); - return result; - } - - @Override - public List getThreadPoolStates() { - List threadPoolAdapterStates = new ArrayList<>(); - hystrixConsumeExecutor.forEach((kel, val) -> threadPoolAdapterStates.add(getThreadPoolState(kel))); - return threadPoolAdapterStates; - } - - @Override - public boolean updateThreadPool(ThreadPoolAdapterParameter threadPoolAdapterParameter) { - String threadPoolKey = threadPoolAdapterParameter.getThreadPoolKey(); - ThreadPoolExecutor threadPoolExecutor = hystrixConsumeExecutor.get(threadPoolKey); - if (threadPoolExecutor == null) { - log.warn("[{}] Hystrix thread pool not found.", threadPoolKey); - return false; - } - int originalCoreSize = threadPoolExecutor.getCorePoolSize(); - int originalMaximumPoolSize = threadPoolExecutor.getMaximumPoolSize(); - ThreadPoolExecutorUtil.safeSetPoolSize(threadPoolExecutor, threadPoolAdapterParameter.getCorePoolSize(), threadPoolAdapterParameter.getMaximumPoolSize()); - log.info("[{}] Hystrix thread pool parameter change. coreSize: {}, maximumSize: {}", - threadPoolKey, - String.format(CHANGE_DELIMITER, originalCoreSize, threadPoolExecutor.getCorePoolSize()), - String.format(CHANGE_DELIMITER, originalMaximumPoolSize, threadPoolExecutor.getMaximumPoolSize())); - return true; - } - - @Override - public void onApplicationEvent(ApplicationStartedEvent event) { - ScheduledExecutorService scheduler = threadPoolAdapterScheduler.getScheduler(); - int taskIntervalSeconds = threadPoolAdapterScheduler.getTaskIntervalSeconds(); - // Periodically update the Hystrix thread pool. - HystrixThreadPoolRefreshTask hystrixThreadPoolRefreshTask = new HystrixThreadPoolRefreshTask(scheduler, taskIntervalSeconds); - scheduler.schedule(hystrixThreadPoolRefreshTask, taskIntervalSeconds, TimeUnit.SECONDS); - } - - /** - * hystrix thread-pool refresh task - */ - class HystrixThreadPoolRefreshTask implements Runnable { - - private final ScheduledExecutorService scheduler; - - private final int taskIntervalSeconds; - - HystrixThreadPoolRefreshTask(ScheduledExecutorService scheduler, int taskIntervalSeconds) { - this.scheduler = scheduler; - this.taskIntervalSeconds = taskIntervalSeconds; - } - - @Override - public void run() { - try { - hystrixThreadPoolRefresh(); - } finally { - if (!scheduler.isShutdown()) { - scheduler.schedule(this, taskIntervalSeconds, TimeUnit.MILLISECONDS); - } - } - } - - private void hystrixThreadPoolRefresh() { - try { - Class factoryClass = HystrixThreadPool.Factory.class; - Field threadPoolsField = factoryClass.getDeclaredField(THREAD_POOLS_FIELD); - threadPoolsField.setAccessible(true); - ConcurrentHashMap threadPools = - (ConcurrentHashMap) threadPoolsField.get(factoryClass); - if (CollectionUtil.isNotEmpty(threadPools)) { - for (Map.Entry stringHystrixThreadPoolEntry : threadPools.entrySet()) { - String key = stringHystrixThreadPoolEntry.getKey(); - HystrixThreadPool value = stringHystrixThreadPoolEntry.getValue(); - if (value instanceof HystrixThreadPool.HystrixThreadPoolDefault) { - HystrixThreadPool.HystrixThreadPoolDefault hystrixThreadPoolDefault = - (HystrixThreadPool.HystrixThreadPoolDefault) value; - Class hystrixThreadPoolDefaultClass = hystrixThreadPoolDefault.getClass(); - Field threadPoolField = hystrixThreadPoolDefaultClass.getDeclaredField(THREAD_POOL_FIELD); - threadPoolField.setAccessible(true); - ThreadPoolExecutor threadPoolExecutor = - (ThreadPoolExecutor) threadPoolField.get(hystrixThreadPoolDefault); - hystrixConsumeExecutor.put(key, threadPoolExecutor); - } - } - } - } catch (Exception ex) { - log.error("Failed to get Hystrix thread pool.", ex); - } - } - } -} diff --git a/threadpool/adapter/hystrix/src/main/java/cn/hippo4j/adapter/hystrix/HystrixThreadPoolAdapter4Config.java b/threadpool/adapter/hystrix/src/main/java/cn/hippo4j/adapter/hystrix/HystrixThreadPoolAdapter4Config.java deleted file mode 100644 index 5a06e167..00000000 --- a/threadpool/adapter/hystrix/src/main/java/cn/hippo4j/adapter/hystrix/HystrixThreadPoolAdapter4Config.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.hystrix; - -/** - * hystrix thread-pool adapter for hippo4j config. - */ -public class HystrixThreadPoolAdapter4Config extends AbstractHystrixThreadPoolAdapter { - - public HystrixThreadPoolAdapter4Config(ThreadPoolAdapterScheduler threadPoolAdapterScheduler) { - super(threadPoolAdapterScheduler); - } -} diff --git a/threadpool/adapter/hystrix/src/main/java/cn/hippo4j/adapter/hystrix/HystrixThreadPoolAdapter4Server.java b/threadpool/adapter/hystrix/src/main/java/cn/hippo4j/adapter/hystrix/HystrixThreadPoolAdapter4Server.java deleted file mode 100644 index 92e6b43e..00000000 --- a/threadpool/adapter/hystrix/src/main/java/cn/hippo4j/adapter/hystrix/HystrixThreadPoolAdapter4Server.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.hystrix; - -import cn.hippo4j.adapter.base.ThreadPoolAdapter; -import cn.hippo4j.adapter.base.ThreadPoolAdapterCacheConfig; -import cn.hippo4j.adapter.base.ThreadPoolAdapterRegisterAction; -import cn.hippo4j.common.model.ThreadPoolAdapterState; -import cn.hippo4j.core.config.ApplicationContextHolder; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.event.ApplicationStartedEvent; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -/** - * hystrix thread-pool adapter for hippo4j server. - */ -@Slf4j -public class HystrixThreadPoolAdapter4Server extends AbstractHystrixThreadPoolAdapter { - - public HystrixThreadPoolAdapter4Server(ThreadPoolAdapterScheduler threadPoolAdapterScheduler) { - super(threadPoolAdapterScheduler); - } - - @Override - public void onApplicationEvent(ApplicationStartedEvent event) { - super.onApplicationEvent(event); - ScheduledExecutorService scheduler = threadPoolAdapterScheduler.getScheduler(); - int taskIntervalSeconds = threadPoolAdapterScheduler.getTaskIntervalSeconds(); - // Periodically refresh registration. - ThreadPoolAdapterRegisterAction threadPoolAdapterRegisterAction = ApplicationContextHolder.getBean(ThreadPoolAdapterRegisterAction.class); - Map beansOfType = ApplicationContextHolder.getBeansOfType(this.getClass()); - Map map = new HashMap<>(beansOfType); - ThreadPoolAdapterRegisterTask threadPoolAdapterRegisterTask = new ThreadPoolAdapterRegisterTask(scheduler, taskIntervalSeconds, map, threadPoolAdapterRegisterAction); - scheduler.schedule(threadPoolAdapterRegisterTask, threadPoolAdapterScheduler.getTaskIntervalSeconds(), TimeUnit.SECONDS); - } - - /** - * Thread Pool Adapter Register Task - */ - static class ThreadPoolAdapterRegisterTask implements Runnable { - - private final ScheduledExecutorService scheduler; - - private final int taskIntervalSeconds; - - Map threadPoolAdapterMap; - - ThreadPoolAdapterRegisterAction threadPoolAdapterRegisterAction; - - private List cacheConfigList = new ArrayList<>(); - - ThreadPoolAdapterRegisterTask(ScheduledExecutorService scheduler, int taskIntervalSeconds, - Map threadPoolAdapterMap, - ThreadPoolAdapterRegisterAction threadPoolAdapterRegisterAction) { - this.scheduler = scheduler; - this.taskIntervalSeconds = taskIntervalSeconds; - this.threadPoolAdapterMap = threadPoolAdapterMap; - this.threadPoolAdapterRegisterAction = threadPoolAdapterRegisterAction; - } - - @Override - public void run() { - try { - List newThreadPoolAdapterCacheConfigs = threadPoolAdapterRegisterAction.getThreadPoolAdapterCacheConfigs(threadPoolAdapterMap); - boolean registerFlag = compareThreadPoolAdapterCacheConfigs(newThreadPoolAdapterCacheConfigs, cacheConfigList); - cacheConfigList = newThreadPoolAdapterCacheConfigs; - if (registerFlag) { - threadPoolAdapterRegisterAction.doRegister(cacheConfigList); - } - } catch (Exception ex) { - log.error("Register task error.", ex); - } finally { - if (!scheduler.isShutdown()) { - scheduler.schedule(this, taskIntervalSeconds, TimeUnit.MILLISECONDS); - } - } - } - - private boolean compareThreadPoolAdapterCacheConfigs(List newThreadPoolAdapterCacheConfigs, - List oldThreadPoolAdapterCacheConfigs) { - boolean registerFlag = false; - Map> newThreadPoolAdapterCacheConfigMap = - newThreadPoolAdapterCacheConfigs.stream().collect(Collectors.toMap( - ThreadPoolAdapterCacheConfig::getMark, ThreadPoolAdapterCacheConfig::getThreadPoolAdapterStates, (k1, k2) -> k2)); - Map> oldThreadPoolAdapterCacheConfigMap = - oldThreadPoolAdapterCacheConfigs.stream().collect(Collectors.toMap( - ThreadPoolAdapterCacheConfig::getMark, ThreadPoolAdapterCacheConfig::getThreadPoolAdapterStates, (k1, k2) -> k2)); - for (Map.Entry> entry : newThreadPoolAdapterCacheConfigMap.entrySet()) { - String key = entry.getKey(); - List newValue = entry.getValue(); - List oldValue = oldThreadPoolAdapterCacheConfigMap.get(key); - if (oldValue == null) { - registerFlag = true; - break; - } else { - if (newValue.size() != oldValue.size()) { - registerFlag = true; - break; - } - } - } - return registerFlag; - } - } -} diff --git a/threadpool/adapter/hystrix/src/main/java/cn/hippo4j/adapter/hystrix/ThreadPoolAdapterScheduler.java b/threadpool/adapter/hystrix/src/main/java/cn/hippo4j/adapter/hystrix/ThreadPoolAdapterScheduler.java deleted file mode 100644 index e07dbe57..00000000 --- a/threadpool/adapter/hystrix/src/main/java/cn/hippo4j/adapter/hystrix/ThreadPoolAdapterScheduler.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.hystrix; - -import cn.hippo4j.common.executor.ThreadFactoryBuilder; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; - -/** - * thread pool adapter schedule. - */ -@Slf4j -public class ThreadPoolAdapterScheduler { - - private static final int TASK_INTERVAL_SECONDS = 10; - - @Getter - private final ScheduledExecutorService scheduler; - - public ThreadPoolAdapterScheduler() { - scheduler = new ScheduledThreadPoolExecutor(2, - new ThreadFactoryBuilder() - .prefix("threadPoolAdapter") - .daemon(true) - .build()); - } - - /** - * Gt task interval seconds. - * - * @return task interval seconds - */ - public int getTaskIntervalSeconds() { - return TASK_INTERVAL_SECONDS; - } -} diff --git a/threadpool/adapter/kafka/pom.xml b/threadpool/adapter/kafka/pom.xml deleted file mode 100644 index 5532e45b..00000000 --- a/threadpool/adapter/kafka/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-adapter - ${revision} - - hippo4j-threadpool-adapter-kafka - - - - cn.hippo4j - hippo4j-threadpool-adapter-base - ${project.version} - - - org.springframework.kafka - spring-kafka - true - - - diff --git a/threadpool/adapter/kafka/src/main/java/cn/hippo4j/adapter/kafka/KafkaThreadPoolAdapter.java b/threadpool/adapter/kafka/src/main/java/cn/hippo4j/adapter/kafka/KafkaThreadPoolAdapter.java deleted file mode 100644 index b87d9b89..00000000 --- a/threadpool/adapter/kafka/src/main/java/cn/hippo4j/adapter/kafka/KafkaThreadPoolAdapter.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.kafka; - -import cn.hippo4j.adapter.base.ThreadPoolAdapter; -import cn.hippo4j.adapter.base.ThreadPoolAdapterParameter; -import cn.hippo4j.common.model.ThreadPoolAdapterState; -import cn.hippo4j.common.toolkit.ReflectUtil; -import cn.hippo4j.core.config.ApplicationContextHolder; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.event.ApplicationStartedEvent; -import org.springframework.cglib.core.Constants; -import org.springframework.context.ApplicationListener; -import org.springframework.kafka.config.KafkaListenerEndpointRegistry; -import org.springframework.kafka.listener.ConcurrentMessageListenerContainer; -import org.springframework.kafka.listener.ContainerProperties; -import org.springframework.kafka.listener.KafkaMessageListenerContainer; -import org.springframework.kafka.listener.MessageListenerContainer; -import org.springframework.kafka.support.TopicPartitionOffset; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_DELIMITER; - -/** - * Kafka thread-pool adapter. - */ -@Slf4j -public class KafkaThreadPoolAdapter implements ThreadPoolAdapter, ApplicationListener { - - private KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry; - - @Override - public String mark() { - return "Kafka"; - } - - @Override - public ThreadPoolAdapterState getThreadPoolState(String identify) { - ThreadPoolAdapterState result = new ThreadPoolAdapterState(); - MessageListenerContainer listenerContainer = kafkaListenerEndpointRegistry.getListenerContainer(identify); - - if (listenerContainer == null) { - log.warn("[{}] Kafka consuming thread pool not found.", identify); - return result; - } - - result.setThreadPoolKey(identify); - if (listenerContainer instanceof ConcurrentMessageListenerContainer) { - result.setCoreSize(((ConcurrentMessageListenerContainer) listenerContainer).getConcurrency()); - result.setMaximumSize(result.getCoreSize()); - } else { - result.setCoreSize(1); - result.setMaximumSize(1); - } - return result; - } - - @Override - public List getThreadPoolStates() { - List adapterStateList = new ArrayList<>(); - kafkaListenerEndpointRegistry.getListenerContainerIds().forEach(id -> adapterStateList.add(getThreadPoolState(id))); - return adapterStateList; - } - - @Override - public boolean updateThreadPool(ThreadPoolAdapterParameter threadPoolAdapterParameter) { - String threadPoolKey = threadPoolAdapterParameter.getThreadPoolKey(); - MessageListenerContainer listenerContainer = kafkaListenerEndpointRegistry.getListenerContainer(threadPoolKey); - - if (listenerContainer == null) { - log.warn("[{}] Kafka consuming thread pool not found.", threadPoolKey); - return false; - } - if (!(listenerContainer instanceof ConcurrentMessageListenerContainer)) { - log.warn("[{}] Kafka consuming thread pool not support modify.", threadPoolKey); - return false; - } - ConcurrentMessageListenerContainer concurrentContainer = (ConcurrentMessageListenerContainer) listenerContainer; - int originalCoreSize = concurrentContainer.getConcurrency(); - int originalMaximumPoolSize = originalCoreSize; - Integer concurrency = threadPoolAdapterParameter.getCorePoolSize(); - if (originalCoreSize < concurrency) { - // add consumer - if (!addConsumer(threadPoolKey, concurrentContainer, originalCoreSize, concurrency)) { - return false; - } - } else { - // stop consumer - decreaseConsumer(threadPoolKey, concurrentContainer, originalCoreSize, concurrency); - } - concurrentContainer.setConcurrency(concurrency); - log.info("[{}] Kafka consumption thread pool parameter change. coreSize: {}, maximumSize: {}", - threadPoolKey, - String.format(CHANGE_DELIMITER, originalCoreSize, concurrency), - String.format(CHANGE_DELIMITER, originalMaximumPoolSize, concurrency)); - return true; - - } - - /** - * @param threadPoolKey - * @param concurrentContainer - * @param originalCoreSize - * @param concurrency - * @since org.springframework.kafka.listener.ConcurrentMessageListenerContainer.doStop - */ - private static void decreaseConsumer(String threadPoolKey, ConcurrentMessageListenerContainer concurrentContainer, int originalCoreSize, Integer concurrency) { - int targetDecrease = originalCoreSize - concurrency; - List containers = (List) ReflectUtil.getFieldValue(concurrentContainer, "containers"); - Iterator iterator = containers.iterator(); - int count = 0; - while (iterator.hasNext() && count < targetDecrease) { - KafkaMessageListenerContainer container = iterator.next(); - if (container.isRunning()) { - container.stop(() -> { - }); - count++; - } - } - log.info("[{}] Kafka consumption change. target decrease {} ,real decrease {}", threadPoolKey, targetDecrease, count); - } - - /** - * @param threadPoolKey - * @param concurrentContainer - * @param originalCoreSize - * @param concurrency - * @return true success - * @since org.springframework.kafka.listener.ConcurrentMessageListenerContainer#doStart() - */ - @SneakyThrows - private static boolean addConsumer(String threadPoolKey, ConcurrentMessageListenerContainer concurrentContainer, int originalCoreSize, Integer concurrency) { - ContainerProperties containerProperties = concurrentContainer.getContainerProperties(); - TopicPartitionOffset[] topicPartitions = containerProperties.getTopicPartitions(); - if (topicPartitions != null && concurrency > topicPartitions.length) { - log.warn("[{}] Kafka consuming thread pool not support modify. " - + "When specific partitions are provided, the concurrency must be less than or " - + "equal to the number of partitions;", threadPoolKey); - return false; - } - List containers = (List) ReflectUtil.getFieldValue(concurrentContainer, "containers"); - boolean alwaysClientIdSuffix = (Boolean) ReflectUtil.getFieldValue(concurrentContainer, "alwaysClientIdSuffix"); - int size = containers.size(); - for (int i = size; i < concurrency - originalCoreSize + size; i++) { - KafkaMessageListenerContainer container = ReflectUtil.invoke(concurrentContainer, "constructContainer", containerProperties, topicPartitions, i); - String beanName = concurrentContainer.getBeanName(); - container.setBeanName((beanName != null ? beanName : "consumer") + "-" + i); - container.setApplicationContext(ApplicationContextHolder.getInstance()); - if (concurrentContainer.getApplicationEventPublisher() != null) { - container.setApplicationEventPublisher(concurrentContainer.getApplicationEventPublisher()); - } - container.setClientIdSuffix(concurrency > 1 || alwaysClientIdSuffix ? "-" + i : ""); - container.setGenericErrorHandler(ReflectUtil.invoke(concurrentContainer, "getGenericErrorHandler")); - container.setAfterRollbackProcessor(ReflectUtil.invoke(concurrentContainer, "getAfterRollbackProcessor")); - - Method getRecordInterceptor = ReflectUtil.findDeclaredMethod(concurrentContainer.getClass(), "getRecordInterceptor", Constants.EMPTY_CLASS_ARRAY); - ReflectUtil.setAccessible(getRecordInterceptor); - container.setRecordInterceptor(ReflectUtil.invoke(concurrentContainer, getRecordInterceptor)); - - Method isInterceptBeforeTx = ReflectUtil.findDeclaredMethod(concurrentContainer.getClass(), "isInterceptBeforeTx", Constants.EMPTY_CLASS_ARRAY); - ReflectUtil.setAccessible(isInterceptBeforeTx); - container.setInterceptBeforeTx(ReflectUtil.invoke(concurrentContainer, isInterceptBeforeTx)); - - container.setEmergencyStop(() -> { - concurrentContainer.stop(() -> { - }); - ReflectUtil.invoke(concurrentContainer, "publishContainerStoppedEvent"); - }); - Method isPaused = ReflectUtil.findDeclaredMethod(concurrentContainer.getClass(), "isPaused", Constants.EMPTY_CLASS_ARRAY); - ReflectUtil.setAccessible(isPaused); - - if (ReflectUtil.invoke(concurrentContainer, isPaused)) { - container.pause(); - } - container.start(); - containers.add(container); - } - return true; - } - - @Override - public void onApplicationEvent(ApplicationStartedEvent event) { - try { - KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry = ApplicationContextHolder.getBean(KafkaListenerEndpointRegistry.class); - this.kafkaListenerEndpointRegistry = kafkaListenerEndpointRegistry; - } catch (Exception ex) { - log.error("Failed to get Kafka thread pool.", ex); - } - } -} diff --git a/threadpool/adapter/pom.xml b/threadpool/adapter/pom.xml deleted file mode 100644 index d980bce1..00000000 --- a/threadpool/adapter/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool - ${revision} - - hippo4j-threadpool-adapter - pom - - - alibaba-dubbo - base - dubbo - dubbox - rabbitmq - rocketmq - kafka - hystrix - stream-rocketmq - stream-rabbitmq - web - - diff --git a/threadpool/adapter/rabbitmq/pom.xml b/threadpool/adapter/rabbitmq/pom.xml deleted file mode 100644 index cdf756c5..00000000 --- a/threadpool/adapter/rabbitmq/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-adapter - ${revision} - - hippo4j-threadpool-adapter-rabbitmq - - - - cn.hippo4j - hippo4j-threadpool-adapter-base - ${project.version} - - - org.springframework.boot - spring-boot-starter-amqp - true - - - diff --git a/threadpool/adapter/rabbitmq/src/main/java/cn/hippo4j/adapter/rabbitmq/RabbitMQThreadPoolAdapter.java b/threadpool/adapter/rabbitmq/src/main/java/cn/hippo4j/adapter/rabbitmq/RabbitMQThreadPoolAdapter.java deleted file mode 100644 index 09de9206..00000000 --- a/threadpool/adapter/rabbitmq/src/main/java/cn/hippo4j/adapter/rabbitmq/RabbitMQThreadPoolAdapter.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.rabbitmq; - -import cn.hippo4j.adapter.base.ThreadPoolAdapter; -import cn.hippo4j.adapter.base.ThreadPoolAdapterParameter; -import cn.hippo4j.common.model.ThreadPoolAdapterState; -import cn.hippo4j.common.toolkit.ReflectUtil; -import cn.hippo4j.common.toolkit.ThreadPoolExecutorUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.rabbit.connection.AbstractConnectionFactory; -import org.springframework.boot.context.event.ApplicationStartedEvent; -import org.springframework.context.ApplicationListener; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ThreadPoolExecutor; - -import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_DELIMITER; - -/** - * RabbitMQ thread-pool adapter. - */ -@Slf4j -@RequiredArgsConstructor -public class RabbitMQThreadPoolAdapter implements ThreadPoolAdapter, ApplicationListener { - - private static final String RABBITMQ = "RabbitMQ"; - - private static final String FILED_NAME = "executorService"; - - private final Map abstractConnectionFactoryMap; - - private final Map rabbitmqThreadPoolTaskExecutor = new HashMap<>(); - - @Override - public String mark() { - return RABBITMQ; - } - - @Override - public ThreadPoolAdapterState getThreadPoolState(String identify) { - ThreadPoolAdapterState threadPoolAdapterState = new ThreadPoolAdapterState(); - ThreadPoolExecutor threadPoolTaskExecutor = rabbitmqThreadPoolTaskExecutor.get(identify); - threadPoolAdapterState.setThreadPoolKey(identify); - if (Objects.nonNull(threadPoolTaskExecutor)) { - threadPoolAdapterState.setCoreSize(threadPoolTaskExecutor.getCorePoolSize()); - threadPoolAdapterState.setMaximumSize(threadPoolTaskExecutor.getMaximumPoolSize()); - } - return threadPoolAdapterState; - } - - @Override - public List getThreadPoolStates() { - List adapterStateList = new ArrayList<>(); - rabbitmqThreadPoolTaskExecutor.forEach( - (key, val) -> adapterStateList.add(getThreadPoolState(key))); - return adapterStateList; - } - - @Override - public boolean updateThreadPool(ThreadPoolAdapterParameter threadPoolAdapterParameter) { - String threadPoolKey = threadPoolAdapterParameter.getThreadPoolKey(); - ThreadPoolExecutor threadPoolTaskExecutor = rabbitmqThreadPoolTaskExecutor.get(threadPoolKey); - if (Objects.nonNull(threadPoolTaskExecutor)) { - int originalCoreSize = threadPoolTaskExecutor.getCorePoolSize(); - int originalMaximumPoolSize = threadPoolTaskExecutor.getMaximumPoolSize(); - ThreadPoolExecutorUtil.safeSetPoolSize(threadPoolTaskExecutor, threadPoolAdapterParameter.getCorePoolSize(), threadPoolAdapterParameter.getMaximumPoolSize()); - log.info("[{}] Rabbitmq consumption thread pool parameter change. coreSize: {}, maximumSize: {}", - threadPoolKey, - String.format(CHANGE_DELIMITER, originalCoreSize, threadPoolAdapterParameter.getCorePoolSize()), - String.format(CHANGE_DELIMITER, originalMaximumPoolSize, threadPoolAdapterParameter.getMaximumPoolSize())); - return true; - } - log.warn("[{}] Rabbitmq consuming thread pool not found.", threadPoolKey); - return false; - } - - @Override - public void onApplicationEvent(ApplicationStartedEvent event) { - abstractConnectionFactoryMap.forEach((beanName, abstractConnectionFactor) -> { - ExecutorService executor = (ExecutorService) ReflectUtil.getFieldValue(abstractConnectionFactor, FILED_NAME); - if (Objects.nonNull(executor)) { - if (executor instanceof ThreadPoolExecutor) { - ThreadPoolExecutor threadPoolTaskExecutor = (ThreadPoolExecutor) executor; - rabbitmqThreadPoolTaskExecutor.put(beanName, threadPoolTaskExecutor); - log.info("Rabbitmq executor name {}", beanName); - } else { - log.warn("Custom thread pools only support ThreadPoolExecutor"); - } - } - }); - } -} diff --git a/threadpool/adapter/rocketmq/pom.xml b/threadpool/adapter/rocketmq/pom.xml deleted file mode 100644 index df55a001..00000000 --- a/threadpool/adapter/rocketmq/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-adapter - ${revision} - - hippo4j-threadpool-adapter-rocketmq - - - - cn.hippo4j - hippo4j-threadpool-adapter-base - ${project.version} - - - org.apache.rocketmq - rocketmq-spring-boot-starter - true - - - diff --git a/threadpool/adapter/rocketmq/src/main/java/cn/hippo4j/adapter/rocketmq/RocketMQThreadPoolAdapter.java b/threadpool/adapter/rocketmq/src/main/java/cn/hippo4j/adapter/rocketmq/RocketMQThreadPoolAdapter.java deleted file mode 100644 index bd2599e7..00000000 --- a/threadpool/adapter/rocketmq/src/main/java/cn/hippo4j/adapter/rocketmq/RocketMQThreadPoolAdapter.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.rocketmq; - -import cn.hippo4j.adapter.base.ThreadPoolAdapter; -import cn.hippo4j.adapter.base.ThreadPoolAdapterParameter; -import cn.hippo4j.common.model.ThreadPoolAdapterState; -import cn.hippo4j.common.toolkit.ReflectUtil; -import cn.hippo4j.common.toolkit.ThreadPoolExecutorUtil; -import cn.hippo4j.core.config.ApplicationContextHolder; -import lombok.extern.slf4j.Slf4j; -import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; -import org.apache.rocketmq.client.impl.consumer.ConsumeMessageService; -import org.apache.rocketmq.spring.support.DefaultRocketMQListenerContainer; -import org.springframework.boot.context.event.ApplicationStartedEvent; -import org.springframework.context.ApplicationListener; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ThreadPoolExecutor; - -import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_DELIMITER; - -/** - * RocketMQ thread-pool adapter. - */ -@Slf4j -public class RocketMQThreadPoolAdapter implements ThreadPoolAdapter, ApplicationListener { - - private final Map rocketmqConsumeExecutor = new HashMap<>(); - - @Override - public String mark() { - return "RocketMQ"; - } - - @Override - public ThreadPoolAdapterState getThreadPoolState(String identify) { - ThreadPoolAdapterState result = new ThreadPoolAdapterState(); - ThreadPoolExecutor rocketMQConsumeExecutor = rocketmqConsumeExecutor.get(identify); - if (rocketMQConsumeExecutor != null) { - result.setThreadPoolKey(identify); - result.setCoreSize(rocketMQConsumeExecutor.getCorePoolSize()); - result.setMaximumSize(rocketMQConsumeExecutor.getMaximumPoolSize()); - return result; - } - log.warn("[{}] RocketMQ consuming thread pool not found.", identify); - return result; - } - - @Override - public List getThreadPoolStates() { - List adapterStateList = new ArrayList<>(); - rocketmqConsumeExecutor.forEach( - (key, val) -> adapterStateList.add(getThreadPoolState(key))); - return adapterStateList; - } - - @Override - public boolean updateThreadPool(ThreadPoolAdapterParameter threadPoolAdapterParameter) { - String threadPoolKey = threadPoolAdapterParameter.getThreadPoolKey(); - ThreadPoolExecutor rocketMQConsumeExecutor = rocketmqConsumeExecutor.get(threadPoolKey); - if (rocketMQConsumeExecutor != null) { - int originalCoreSize = rocketMQConsumeExecutor.getCorePoolSize(); - int originalMaximumPoolSize = rocketMQConsumeExecutor.getMaximumPoolSize(); - ThreadPoolExecutorUtil.safeSetPoolSize(rocketMQConsumeExecutor, threadPoolAdapterParameter.getCorePoolSize(), threadPoolAdapterParameter.getMaximumPoolSize()); - log.info("[{}] RocketMQ consumption thread pool parameter change. coreSize: {}, maximumSize: {}", - threadPoolKey, - String.format(CHANGE_DELIMITER, originalCoreSize, rocketMQConsumeExecutor.getCorePoolSize()), - String.format(CHANGE_DELIMITER, originalMaximumPoolSize, rocketMQConsumeExecutor.getMaximumPoolSize())); - return true; - } - log.warn("[{}] RocketMQ consuming thread pool not found.", threadPoolKey); - return false; - } - - @Override - public void onApplicationEvent(ApplicationStartedEvent event) { - Map containerMap = - ApplicationContextHolder.getBeansOfType(DefaultRocketMQListenerContainer.class); - try { - for (DefaultRocketMQListenerContainer container : containerMap.values()) { - DefaultMQPushConsumer defaultMQPushConsumer = container.getConsumer(); - if (defaultMQPushConsumer != null) { - ConsumeMessageService consumeMessageService = defaultMQPushConsumer.getDefaultMQPushConsumerImpl().getConsumeMessageService(); - ThreadPoolExecutor consumeExecutor = (ThreadPoolExecutor) ReflectUtil.getFieldValue(consumeMessageService, "consumeExecutor"); - rocketmqConsumeExecutor.put(container.getConsumerGroup(), consumeExecutor); - } - } - } catch (Exception ex) { - log.error("Failed to get RocketMQ thread pool.", ex); - } - } -} diff --git a/threadpool/adapter/stream-rabbitmq/pom.xml b/threadpool/adapter/stream-rabbitmq/pom.xml deleted file mode 100644 index ad554813..00000000 --- a/threadpool/adapter/stream-rabbitmq/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-adapter - ${revision} - - hippo4j-threadpool-adapter-stream-rabbitmq - - - - cn.hippo4j - hippo4j-threadpool-adapter-base - ${project.version} - - - org.springframework.cloud - spring-cloud-starter-stream-rabbit - true - - - diff --git a/threadpool/adapter/stream-rabbitmq/src/main/java/cn/hippo4j/adapter/springcloud/stream/rabbitmq/SpringCloudStreamRabbitMQThreadPoolAdapter.java b/threadpool/adapter/stream-rabbitmq/src/main/java/cn/hippo4j/adapter/springcloud/stream/rabbitmq/SpringCloudStreamRabbitMQThreadPoolAdapter.java deleted file mode 100644 index eeebaa5a..00000000 --- a/threadpool/adapter/stream-rabbitmq/src/main/java/cn/hippo4j/adapter/springcloud/stream/rabbitmq/SpringCloudStreamRabbitMQThreadPoolAdapter.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.springcloud.stream.rabbitmq; - -import cn.hippo4j.adapter.base.ThreadPoolAdapter; -import cn.hippo4j.adapter.base.ThreadPoolAdapterParameter; -import cn.hippo4j.common.model.ThreadPoolAdapterState; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.common.toolkit.ReflectUtil; -import cn.hippo4j.core.config.ApplicationContextHolder; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer; -import org.springframework.amqp.rabbit.listener.DirectMessageListenerContainer; -import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; -import org.springframework.boot.context.event.ApplicationStartedEvent; -import org.springframework.cloud.stream.binder.Binding; -import org.springframework.cloud.stream.binder.DefaultBinding; -import org.springframework.cloud.stream.binding.InputBindingLifecycle; -import org.springframework.context.ApplicationListener; -import org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_DELIMITER; - -/** - * Spring cloud stream rabbit-mq thread-pool adapter. - */ -@Slf4j -public class SpringCloudStreamRabbitMQThreadPoolAdapter implements ThreadPoolAdapter, ApplicationListener { - - private final Map rocketMqSpringCloudStreamConsumeExecutor = new HashMap<>(); - - @Override - public String mark() { - return "RabbitMQSpringCloudStream"; - } - - @Override - public ThreadPoolAdapterState getThreadPoolState(String identify) { - ThreadPoolAdapterState result = new ThreadPoolAdapterState(); - AbstractMessageListenerContainer messageListenerContainer = rocketMqSpringCloudStreamConsumeExecutor.get(identify); - if (messageListenerContainer != null) { - result.setThreadPoolKey(identify); - if (messageListenerContainer instanceof SimpleMessageListenerContainer) { - int concurrentConsumers = (int) ReflectUtil.getFieldValue(messageListenerContainer, "concurrentConsumers"); - result.setCoreSize(concurrentConsumers); - Object maxConcurrentConsumers = ReflectUtil.getFieldValue(messageListenerContainer, "maxConcurrentConsumers"); - if (maxConcurrentConsumers != null) { - result.setMaximumSize((Integer) maxConcurrentConsumers); - } else { - result.setMaximumSize(concurrentConsumers); - } - } else if (messageListenerContainer instanceof DirectMessageListenerContainer) { - int consumersPerQueue = (int) ReflectUtil.getFieldValue(messageListenerContainer, "consumersPerQueue"); - result.setCoreSize(consumersPerQueue); - result.setMaximumSize(consumersPerQueue); - } - return result; - } - log.warn("[{}] RabbitMQ consuming thread pool not found.", identify); - return result; - } - - @Override - public List getThreadPoolStates() { - List adapterStateList = new ArrayList<>(); - rocketMqSpringCloudStreamConsumeExecutor.forEach( - (key, val) -> adapterStateList.add(getThreadPoolState(key))); - return adapterStateList; - } - - @Override - public boolean updateThreadPool(ThreadPoolAdapterParameter threadPoolAdapterParameter) { - String threadPoolKey = threadPoolAdapterParameter.getThreadPoolKey(); - AbstractMessageListenerContainer messageListenerContainer = rocketMqSpringCloudStreamConsumeExecutor.get(threadPoolKey); - if (messageListenerContainer != null) { - synchronized (rocketMqSpringCloudStreamConsumeExecutor) { - Integer corePoolSize = threadPoolAdapterParameter.getCorePoolSize(); - Integer maximumPoolSize = threadPoolAdapterParameter.getMaximumPoolSize(); - if (messageListenerContainer instanceof SimpleMessageListenerContainer) { - int originalCoreSize = (int) ReflectUtil.getFieldValue(messageListenerContainer, "concurrentConsumers"); - Object maxConcurrentConsumers = ReflectUtil.getFieldValue(messageListenerContainer, "maxConcurrentConsumers"); - int originalMaximumPoolSize; - if (maxConcurrentConsumers != null) { - originalMaximumPoolSize = (Integer) maxConcurrentConsumers; - } else { - originalMaximumPoolSize = originalCoreSize; - } - SimpleMessageListenerContainer simpleMessageListenerContainer = (SimpleMessageListenerContainer) messageListenerContainer; - if (originalCoreSize > maximumPoolSize) { - simpleMessageListenerContainer.setConcurrentConsumers(corePoolSize); - simpleMessageListenerContainer.setMaxConcurrentConsumers(maximumPoolSize); - } else { - simpleMessageListenerContainer.setMaxConcurrentConsumers(maximumPoolSize); - simpleMessageListenerContainer.setConcurrentConsumers(corePoolSize); - } - log.info("[{}] RabbitMQ consumption thread pool parameter change. coreSize: {}, maximumSize: {}", - threadPoolKey, - String.format(CHANGE_DELIMITER, originalCoreSize, corePoolSize), - String.format(CHANGE_DELIMITER, originalMaximumPoolSize, maximumPoolSize)); - } else if (messageListenerContainer instanceof DirectMessageListenerContainer) { - int originalCoreSize = (int) ReflectUtil.getFieldValue(messageListenerContainer, "consumersPerQueue"); - DirectMessageListenerContainer directMessageListenerContainer = (DirectMessageListenerContainer) messageListenerContainer; - directMessageListenerContainer.setConsumersPerQueue(maximumPoolSize); - log.info("[{}] RabbitMQ consumption thread pool parameter change. coreSize: {}", - threadPoolKey, - String.format(CHANGE_DELIMITER, originalCoreSize, corePoolSize)); - } else { - log.warn("[{}] RabbitMQ consuming thread pool not support. messageListenerContainer: {}", threadPoolKey, messageListenerContainer.getClass()); - return false; - } - } - return true; - } - log.warn("[{}] RabbitMQ consuming thread pool not found.", threadPoolKey); - return false; - } - - @Override - public void onApplicationEvent(ApplicationStartedEvent event) { - InputBindingLifecycle bindingLifecycle = ApplicationContextHolder.getBean(InputBindingLifecycle.class); - Collection> inputBindings = Optional.ofNullable(ReflectUtil.getFieldValue(bindingLifecycle, "inputBindings")) - .map(each -> (Collection>) each).orElse(null); - if (CollectionUtil.isEmpty(inputBindings)) { - log.info("InputBindings record not found."); - return; - } - try { - for (Binding each : inputBindings) { - String bindingName = each.getBindingName(); - DefaultBinding defaultBinding = (DefaultBinding) each; - Object lifecycle = ReflectUtil.getFieldValue(defaultBinding, "lifecycle"); - if (lifecycle instanceof AmqpInboundChannelAdapter) { - AbstractMessageListenerContainer rabbitMQListenerContainer = (AbstractMessageListenerContainer) ReflectUtil.getFieldValue(lifecycle, "messageListenerContainer"); - rocketMqSpringCloudStreamConsumeExecutor.put(bindingName, rabbitMQListenerContainer); - } - } - } catch (Exception ex) { - log.error("Failed to get input-bindings thread pool.", ex); - } - } -} diff --git a/threadpool/adapter/stream-rocketmq/pom.xml b/threadpool/adapter/stream-rocketmq/pom.xml deleted file mode 100644 index 1329d01b..00000000 --- a/threadpool/adapter/stream-rocketmq/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-adapter - ${revision} - - hippo4j-threadpool-adapter-stream-rocketmq - - - - cn.hippo4j - hippo4j-threadpool-adapter-base - ${project.version} - - - com.alibaba.cloud - spring-cloud-starter-stream-rocketmq - true - - - diff --git a/threadpool/adapter/stream-rocketmq/src/main/java/cn/hippo4j/adapter/springcloud/stream/rocketmq/SpringCloudStreamRocketMQThreadPoolAdapter.java b/threadpool/adapter/stream-rocketmq/src/main/java/cn/hippo4j/adapter/springcloud/stream/rocketmq/SpringCloudStreamRocketMQThreadPoolAdapter.java deleted file mode 100644 index 3438dc2d..00000000 --- a/threadpool/adapter/stream-rocketmq/src/main/java/cn/hippo4j/adapter/springcloud/stream/rocketmq/SpringCloudStreamRocketMQThreadPoolAdapter.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.springcloud.stream.rocketmq; - -import cn.hippo4j.adapter.base.ThreadPoolAdapter; -import cn.hippo4j.adapter.base.ThreadPoolAdapterParameter; -import cn.hippo4j.common.model.ThreadPoolAdapterState; -import cn.hippo4j.common.toolkit.CollectionUtil; -import cn.hippo4j.common.toolkit.ReflectUtil; -import cn.hippo4j.common.toolkit.ThreadPoolExecutorUtil; -import cn.hippo4j.core.config.ApplicationContextHolder; -import com.alibaba.cloud.stream.binder.rocketmq.consuming.RocketMQListenerBindingContainer; -import com.alibaba.cloud.stream.binder.rocketmq.integration.RocketMQInboundChannelAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; -import org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyService; -import org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl; -import org.springframework.boot.context.event.ApplicationStartedEvent; -import org.springframework.cloud.stream.binder.Binding; -import org.springframework.cloud.stream.binder.DefaultBinding; -import org.springframework.cloud.stream.binding.InputBindingLifecycle; -import org.springframework.context.ApplicationListener; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ThreadPoolExecutor; - -import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_DELIMITER; - -/** - * Spring cloud stream rocketMQ thread-pool adapter. - */ -@Slf4j -public class SpringCloudStreamRocketMQThreadPoolAdapter implements ThreadPoolAdapter, ApplicationListener { - - private final Map rocketMqSpringCloudStreamConsumeExecutor = new HashMap<>(); - - @Override - public String mark() { - return "RocketMQSpringCloudStream"; - } - - @Override - public ThreadPoolAdapterState getThreadPoolState(String identify) { - ThreadPoolAdapterState result = new ThreadPoolAdapterState(); - ThreadPoolExecutor rocketMQConsumeExecutor = rocketMqSpringCloudStreamConsumeExecutor.get(identify); - if (rocketMQConsumeExecutor != null) { - result.setThreadPoolKey(identify); - result.setCoreSize(rocketMQConsumeExecutor.getCorePoolSize()); - result.setMaximumSize(rocketMQConsumeExecutor.getMaximumPoolSize()); - return result; - } - log.warn("[{}] RocketMQ consuming thread pool not found.", identify); - return result; - } - - @Override - public List getThreadPoolStates() { - List adapterStateList = new ArrayList<>(); - rocketMqSpringCloudStreamConsumeExecutor.forEach( - (key, val) -> adapterStateList.add(getThreadPoolState(key))); - return adapterStateList; - } - - @Override - public boolean updateThreadPool(ThreadPoolAdapterParameter threadPoolAdapterParameter) { - String threadPoolKey = threadPoolAdapterParameter.getThreadPoolKey(); - ThreadPoolExecutor rocketMQConsumeExecutor = rocketMqSpringCloudStreamConsumeExecutor.get(threadPoolKey); - if (rocketMQConsumeExecutor != null) { - int originalCoreSize = rocketMQConsumeExecutor.getCorePoolSize(); - int originalMaximumPoolSize = rocketMQConsumeExecutor.getMaximumPoolSize(); - ThreadPoolExecutorUtil.safeSetPoolSize(rocketMQConsumeExecutor, threadPoolAdapterParameter.getCorePoolSize(), threadPoolAdapterParameter.getMaximumPoolSize()); - log.info("[{}] RocketMQ consumption thread pool parameter change. coreSize: {}, maximumSize: {}", - threadPoolKey, - String.format(CHANGE_DELIMITER, originalCoreSize, rocketMQConsumeExecutor.getCorePoolSize()), - String.format(CHANGE_DELIMITER, originalMaximumPoolSize, rocketMQConsumeExecutor.getMaximumPoolSize())); - return true; - } - log.warn("[{}] RocketMQ consuming thread pool not found.", threadPoolKey); - return false; - } - - @Override - public void onApplicationEvent(ApplicationStartedEvent event) { - InputBindingLifecycle bindingLifecycle = ApplicationContextHolder.getBean(InputBindingLifecycle.class); - Collection> inputBindings = Optional.ofNullable(ReflectUtil.getFieldValue(bindingLifecycle, "inputBindings")).map(each -> (Collection>) each).orElse(null); - if (CollectionUtil.isEmpty(inputBindings)) { - log.info("InputBindings record not found."); - } - try { - for (Binding each : inputBindings) { - String bindingName = each.getBindingName(); - DefaultBinding defaultBinding = (DefaultBinding) each; - RocketMQInboundChannelAdapter lifecycle = (RocketMQInboundChannelAdapter) ReflectUtil.getFieldValue(defaultBinding, "lifecycle"); - RocketMQListenerBindingContainer rocketMQListenerContainer = (RocketMQListenerBindingContainer) ReflectUtil.getFieldValue(lifecycle, "rocketMQListenerContainer"); - DefaultMQPushConsumer consumer = rocketMQListenerContainer.getConsumer(); - DefaultMQPushConsumerImpl defaultMQPushConsumerImpl = consumer.getDefaultMQPushConsumerImpl(); - ConsumeMessageConcurrentlyService consumeMessageService = (ConsumeMessageConcurrentlyService) defaultMQPushConsumerImpl.getConsumeMessageService(); - ThreadPoolExecutor consumeExecutor = (ThreadPoolExecutor) ReflectUtil.getFieldValue(consumeMessageService, "consumeExecutor"); - rocketMqSpringCloudStreamConsumeExecutor.put(bindingName, consumeExecutor); - } - } catch (Exception ex) { - log.error("Failed to get input-bindings thread pool.", ex); - } - } -} diff --git a/threadpool/adapter/web/pom.xml b/threadpool/adapter/web/pom.xml deleted file mode 100644 index c39f17c6..00000000 --- a/threadpool/adapter/web/pom.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - 4.0.0 - - cn.hippo4j - hippo4j-threadpool-adapter - ${revision} - - hippo4j-threadpool-adapter-web - - - - org.apache.tomcat.embed - tomcat-embed-core - true - - - org.springframework.boot - spring-boot-starter-tomcat - true - - - org.springframework.boot - spring-boot-starter-jetty - true - - - org.springframework.boot - spring-boot-starter-undertow - true - - - org.springframework.boot - spring-boot-starter - - - cn.hippo4j - hippo4j-threadpool-core - ${project.version} - - - diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/AbstractWebThreadPoolService.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/AbstractWebThreadPoolService.java deleted file mode 100644 index 96a0b0c8..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/AbstractWebThreadPoolService.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web; - -import cn.hippo4j.common.extension.enums.WebContainerEnum; -import cn.hippo4j.common.model.ThreadPoolBaseInfo; -import cn.hippo4j.common.model.ThreadPoolParameter; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import cn.hippo4j.common.model.ThreadPoolRunStateInfo; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; - -import java.util.concurrent.Executor; - -/** - * Abstract web thread pool service. - */ -@Slf4j -@Order(Ordered.HIGHEST_PRECEDENCE) -public abstract class AbstractWebThreadPoolService implements WebThreadPoolService, ApplicationRunner { - - private final IWebThreadPoolHandlerSupport support; - - public AbstractWebThreadPoolService(IWebThreadPoolHandlerSupport support) { - this.support = support; - } - - /** - * Thread pool executor - */ - protected volatile Executor executor; - - /** - * Get web thread pool by server - * - * @return - */ - protected abstract Executor getWebThreadPoolInternal(); - - @Override - public Executor getWebThreadPool() { - if (executor == null) { - synchronized (AbstractWebThreadPoolService.class) { - if (executor == null) { - executor = getWebThreadPoolInternal(); - } - } - } - return executor; - } - - @Override - public ThreadPoolBaseInfo simpleInfo() { - return support.simpleInfo(); - } - - @Override - public ThreadPoolParameter getWebThreadPoolParameter() { - return support.getWebThreadPoolParameter(); - } - - @Override - public ThreadPoolRunStateInfo getWebRunStateInfo() { - return support.getWebRunStateInfo(); - } - - @Override - public void updateWebThreadPool(ThreadPoolParameterInfo threadPoolParameterInfo) { - support.updateWebThreadPool(threadPoolParameterInfo); - } - - @Override - public WebContainerEnum getWebContainerType() { - return support.getWebContainerType(); - } - - /** - * Call-back after the web container has been started. - */ - @Override - public void run(ApplicationArguments args) { - try { - this.support.setExecutor(getWebThreadPool()); - } catch (Exception ignored) { - } - } -} diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/DefaultAbstractWebThreadPoolService.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/DefaultAbstractWebThreadPoolService.java deleted file mode 100644 index 337a247c..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/DefaultAbstractWebThreadPoolService.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web; - -import cn.hippo4j.core.config.ApplicationContextHolder; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.web.context.WebServerApplicationContext; -import org.springframework.boot.web.server.WebServer; -import org.springframework.context.ApplicationContext; - -import java.util.concurrent.Executor; - -/** - * Default WebThreadPoolService abstract class, - * reuses common capabilities for web container operations. - */ -@Slf4j -public abstract class DefaultAbstractWebThreadPoolService extends AbstractWebThreadPoolService { - - public DefaultAbstractWebThreadPoolService(IWebThreadPoolHandlerSupport support) { - super(support); - } - - private static final String STARTED_FIELD_NAME = "started"; - - /** - * Get the internal abstract method of the web container thread pool, - * to be implemented by subclasses. - * @return - */ - @Override - protected Executor getWebThreadPoolInternal() { - return getWebThreadPoolByServer(getWebServer()); - } - - /** - * Get port by server. - * @return web port - */ - @Override - public Integer getPort() { - return getWebServer().getPort(); - } - - /** - * Get the thread pool object of the current web container based on the WebServer. - * @param webServer current Web-Server. - * @return Thread pool executor of the current web container. - */ - protected abstract Executor getWebThreadPoolByServer(WebServer webServer); - - /** - * Get current Web Server. - * @return webServer current Web-Server. - */ - public WebServer getWebServer() { - ApplicationContext applicationContext = ApplicationContextHolder.getInstance(); - return ((WebServerApplicationContext) applicationContext).getWebServer(); - } - -} diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/IWebThreadPoolHandlerSupport.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/IWebThreadPoolHandlerSupport.java deleted file mode 100644 index 8f850287..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/IWebThreadPoolHandlerSupport.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web; - -import cn.hippo4j.common.extension.enums.WebContainerEnum; -import cn.hippo4j.common.model.ThreadPoolBaseInfo; -import cn.hippo4j.common.model.ThreadPoolParameter; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import cn.hippo4j.common.model.ThreadPoolRunStateInfo; - -import java.util.concurrent.Executor; - -/** - * Support class for WebThreadPoolHandler, providing some common methods. - */ -public interface IWebThreadPoolHandlerSupport { - - /** - * Set the Executor to the current class - * so that other methods in the class can function properly. - * @param executor - */ - void setExecutor(Executor executor); - - /** - * Retrieve the simple information of the thread pool. - * @return - */ - ThreadPoolBaseInfo simpleInfo(); - - /** - * Retrieve the parameter of the thread pool. - * @return - */ - ThreadPoolParameter getWebThreadPoolParameter(); - - /** - * Retrieve the run state of the thread pool. - * @return - */ - ThreadPoolRunStateInfo getWebRunStateInfo(); - - /** - * Update thread pool parameters. - * @param threadPoolParameterInfo New parameters - */ - void updateWebThreadPool(ThreadPoolParameterInfo threadPoolParameterInfo); - - WebContainerEnum getWebContainerType(); -} diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/WebIpAndPortHolder.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/WebIpAndPortHolder.java deleted file mode 100644 index c2b4f2e2..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/WebIpAndPortHolder.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web; - -import cn.hippo4j.core.config.ApplicationContextHolder; -import cn.hippo4j.common.model.WebIpAndPortInfo; -import cn.hippo4j.common.toolkit.Assert; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.core.toolkit.inet.InetUtils; -import lombok.NoArgsConstructor; -import org.springframework.core.env.ConfigurableEnvironment; - -import java.util.Arrays; -import java.util.Objects; -import java.util.concurrent.atomic.AtomicReference; - -/** - * Ip and port holder. - */ -@NoArgsConstructor(access = lombok.AccessLevel.PRIVATE) -public class WebIpAndPortHolder { - - private static boolean supportVersion = false; - - static { - try { - Class.forName("org.springframework.boot.web.server.WebServer"); - supportVersion = true; - } catch (Exception ignored) { - } - } - - /** - * Application ip and application post - */ - protected static AtomicReference webIpAndPort = new AtomicReference<>(); - - public static final String ALL = "*"; - - protected static final String SEPARATOR = ","; - - /** - * get port for Environment - */ - protected static final String PORT_KEY = "server.port"; - - /** - * if port is null, use this - */ - protected static final int PORT = 8080; - - protected static void initIpAndPort() { - if (!supportVersion) { - return; - } - webIpAndPort.compareAndSet(null, getWebIpAndPortInfo()); - } - - private static WebIpAndPortInfo getWebIpAndPortInfo() { - InetUtils inetUtils = ApplicationContextHolder.getBean(InetUtils.class); - InetUtils.HostInfo loopBackHostInfo = inetUtils.findFirstNonLoopBackHostInfo(); - Assert.notNull(loopBackHostInfo, "Unable to get the application IP address"); - String ip = loopBackHostInfo.getIpAddress(); - - ConfigurableEnvironment environment = ApplicationContextHolder.getBean(ConfigurableEnvironment.class); - Integer port = environment.getProperty(PORT_KEY, Integer.TYPE); - port = Objects.isNull(port) ? PORT : port; - - if (port == 0) { - WebThreadPoolHandlerChoose webThreadPoolHandlerChoose = ApplicationContextHolder.getBean(WebThreadPoolHandlerChoose.class); - WebThreadPoolService webThreadPoolService = webThreadPoolHandlerChoose.choose(); - // When get the port at startup, can get the message: "port xxx was already in use" or use two ports - port = webThreadPoolService.getPort(); - } - - return new WebIpAndPortInfo(ip, String.valueOf(port)); - } - - /** - * get WebIpAndPortInfo, If it is null, initialize it. - * - * @return Web ip and port info - */ - public static WebIpAndPortInfo getWebIpAndPort() { - if (webIpAndPort.get() == null) { - initIpAndPort(); - } - return WebIpAndPortHolder.webIpAndPort.get(); - } - - /** - * Check the new properties and instance IP and port. - * - * @param nodes nodes in properties - * @return Whether it meets the conditions - */ - public static boolean check(String nodes) { - WebIpAndPortInfo webIpAndPort = WebIpAndPortHolder.getWebIpAndPort(); - if (StringUtil.isEmpty(nodes) || ALL.equals(nodes) || webIpAndPort == null) { - return true; - } - String[] splitNodes = nodes.split(SEPARATOR); - return Arrays.stream(splitNodes) - .distinct() - .map(WebIpAndPortInfo::build) - .filter(Objects::nonNull) - .anyMatch(each -> each.check(webIpAndPort.getIpSegment(), webIpAndPort.getPort())); - } -} diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/WebThreadPoolHandlerChoose.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/WebThreadPoolHandlerChoose.java deleted file mode 100644 index 824fda84..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/WebThreadPoolHandlerChoose.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web; - -import cn.hippo4j.core.config.ApplicationContextHolder; -import lombok.extern.slf4j.Slf4j; - -/** - * Web thread pool handler choose. - */ -@Slf4j -public class WebThreadPoolHandlerChoose { - - /** - * Choose the web thread pool service bean. - * - * @return web thread pool service bean - */ - public WebThreadPoolService choose() { - WebThreadPoolService webThreadPoolService; - try { - webThreadPoolService = ApplicationContextHolder.getBean(WebThreadPoolService.class); - } catch (Exception ex) { - throw new RuntimeException("Web thread pool service bean not found.", ex); - } - return webThreadPoolService; - } -} diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/WebThreadPoolRunStateHandler.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/WebThreadPoolRunStateHandler.java deleted file mode 100644 index b42b9db9..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/WebThreadPoolRunStateHandler.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web; - -import cn.hippo4j.common.model.ThreadPoolRunStateInfo; -import cn.hippo4j.common.toolkit.ByteConvertUtil; -import cn.hippo4j.common.toolkit.MemoryUtil; -import cn.hippo4j.common.toolkit.StringUtil; -import cn.hippo4j.common.support.AbstractThreadPoolRuntime; -import lombok.extern.slf4j.Slf4j; - -/** - * Web thread pool run state handler. - */ -@Slf4j -public class WebThreadPoolRunStateHandler extends AbstractThreadPoolRuntime { - - @Override - public ThreadPoolRunStateInfo supplement(ThreadPoolRunStateInfo poolRunStateInfo) { - long used = MemoryUtil.heapMemoryUsed(); - long max = MemoryUtil.heapMemoryMax(); - String memoryProportion = StringUtil.newBuilder( - "Allocation: ", - ByteConvertUtil.getPrintSize(used), - " / Maximum available: ", - ByteConvertUtil.getPrintSize(max)); - poolRunStateInfo.setCurrentLoad(poolRunStateInfo.getCurrentLoad() + "%"); - poolRunStateInfo.setPeakLoad(poolRunStateInfo.getPeakLoad() + "%"); - poolRunStateInfo.setMemoryProportion(memoryProportion); - poolRunStateInfo.setFreeMemory(ByteConvertUtil.getPrintSize(Math.subtractExact(max, used))); - return poolRunStateInfo; - } -} diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/WebThreadPoolService.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/WebThreadPoolService.java deleted file mode 100644 index b85f89b9..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/WebThreadPoolService.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web; - -import cn.hippo4j.common.extension.enums.WebContainerEnum; -import cn.hippo4j.common.model.ThreadPoolBaseInfo; -import cn.hippo4j.common.model.ThreadPoolParameter; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import cn.hippo4j.common.model.ThreadPoolRunStateInfo; - -import java.util.concurrent.Executor; - -/** - * Web thread pool service. - */ -public interface WebThreadPoolService { - - /** - * Get web thread pool. - * - * @return Tomcat、Jetty、Undertow ThreadPoolExecutor - */ - Executor getWebThreadPool(); - - /** - * Get web container port. - * @return - */ - Integer getPort(); - - /** - * Simple info. - * - * @return - */ - ThreadPoolBaseInfo simpleInfo(); - - /** - * Get web thread pool parameter. - * - * @return - */ - ThreadPoolParameter getWebThreadPoolParameter(); - - /** - * Get web run state info. - * - * @return - */ - ThreadPoolRunStateInfo getWebRunStateInfo(); - - /** - * Update web thread pool. - * - * @param threadPoolParameterInfo - */ - void updateWebThreadPool(ThreadPoolParameterInfo threadPoolParameterInfo); - - /** - * resolve current web container type. - * - *

e.g: tomcat, jetty, undertow, etc.

- */ - WebContainerEnum getWebContainerType(); -} diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/jetty/DefaultJettyWebThreadPoolHandler.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/jetty/DefaultJettyWebThreadPoolHandler.java deleted file mode 100644 index c0cee096..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/jetty/DefaultJettyWebThreadPoolHandler.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web.jetty; - -import cn.hippo4j.adapter.web.DefaultAbstractWebThreadPoolService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.web.embedded.jetty.JettyWebServer; -import org.springframework.boot.web.server.WebServer; - -import java.util.concurrent.Executor; - -/** - * Jetty web thread pool handler. - */ -@Slf4j -public class DefaultJettyWebThreadPoolHandler extends DefaultAbstractWebThreadPoolService - implements - JettyWebThreadPoolHandlerAdapt { - - public DefaultJettyWebThreadPoolHandler() { - super(new JettyWebThreadPoolHandlerSupport()); - } - - /** - * Get the thread pool object of the current web container based on the WebServer. - * @param webServer current Web-Server. - * @return Thread pool executor of the current web container. - */ - @Override - protected Executor getWebThreadPoolByServer(WebServer webServer) { - JettyWebServer jettyWebServer = (JettyWebServer) webServer; - return jettyWebServer.getServer().getThreadPool(); - } - -} diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/jetty/JettyWebThreadPoolHandlerAdapt.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/jetty/JettyWebThreadPoolHandlerAdapt.java deleted file mode 100644 index 49613c5f..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/jetty/JettyWebThreadPoolHandlerAdapt.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web.jetty; - -import cn.hippo4j.adapter.web.WebThreadPoolService; - -/** - * Adapt interface of Jetty web thread-pool handler. - */ -public interface JettyWebThreadPoolHandlerAdapt extends WebThreadPoolService { -} diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/jetty/JettyWebThreadPoolHandlerSupport.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/jetty/JettyWebThreadPoolHandlerSupport.java deleted file mode 100644 index 6307af4d..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/jetty/JettyWebThreadPoolHandlerSupport.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web.jetty; - -import cn.hippo4j.adapter.web.IWebThreadPoolHandlerSupport; -import cn.hippo4j.common.constant.ChangeThreadPoolConstants; -import cn.hippo4j.common.extension.enums.WebContainerEnum; -import cn.hippo4j.common.model.ThreadPoolBaseInfo; -import cn.hippo4j.common.model.ThreadPoolParameter; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import cn.hippo4j.common.model.ThreadPoolRunStateInfo; -import cn.hippo4j.common.toolkit.CalculateUtil; -import cn.hippo4j.common.toolkit.ReflectUtil; -import lombok.extern.slf4j.Slf4j; -import org.eclipse.jetty.util.thread.QueuedThreadPool; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.Executor; - -/** - * The supporting class for WebThreadPoolHandler, - * which facilitates the creation of a Jetty web container. - */ -@Slf4j -public class JettyWebThreadPoolHandlerSupport implements IWebThreadPoolHandlerSupport { - - private Executor executor; - - /** - * A callback will be invoked and the Executor will be set up when the web container has been started. - * - * @param executor Thread-pool executor in Jetty container. - */ - @Override - public void setExecutor(Executor executor) { - this.executor = executor; - } - - @Override - public ThreadPoolBaseInfo simpleInfo() { - ThreadPoolBaseInfo poolBaseInfo = new ThreadPoolBaseInfo(); - QueuedThreadPool queuedThreadPool = (QueuedThreadPool) executor; - poolBaseInfo.setCoreSize(queuedThreadPool.getMinThreads()); - poolBaseInfo.setMaximumSize(queuedThreadPool.getMaxThreads()); - BlockingQueue jobs = (BlockingQueue) ReflectUtil.getFieldValue(queuedThreadPool, "_jobs"); - int queueCapacity = jobs.remainingCapacity() + jobs.size(); - poolBaseInfo.setQueueCapacity(queueCapacity); - poolBaseInfo.setQueueType(jobs.getClass().getSimpleName()); - poolBaseInfo.setKeepAliveTime((long) queuedThreadPool.getIdleTimeout()); - poolBaseInfo.setRejectedName("RejectedExecutionException"); - return poolBaseInfo; - } - - @Override - public ThreadPoolParameter getWebThreadPoolParameter() { - ThreadPoolParameterInfo parameterInfo = null; - try { - parameterInfo = new ThreadPoolParameterInfo(); - QueuedThreadPool jettyExecutor = (QueuedThreadPool) executor; - int minThreads = jettyExecutor.getMinThreads(); - int maxThreads = jettyExecutor.getMaxThreads(); - parameterInfo.setCoreSize(minThreads); - parameterInfo.setMaxSize(maxThreads); - } catch (Exception ex) { - log.error("Failed to get the jetty thread pool parameter.", ex); - } - return parameterInfo; - } - - @Override - public ThreadPoolRunStateInfo getWebRunStateInfo() { - ThreadPoolRunStateInfo runStateInfo = new ThreadPoolRunStateInfo(); - QueuedThreadPool queuedThreadPool = (QueuedThreadPool) executor; - int corePoolSize = queuedThreadPool.getMinThreads(); - int maximumPoolSize = queuedThreadPool.getMaxThreads(); - int poolSize = queuedThreadPool.getThreads(); - int busyCount = queuedThreadPool.getBusyThreads(); - String currentLoad = CalculateUtil.divide(busyCount, maximumPoolSize) + ""; - BlockingQueue queue = ReflectUtil.invoke(queuedThreadPool, "getQueue"); - String queueType = queue.getClass().getSimpleName(); - int remainingCapacity = queue.remainingCapacity(); - int queueSize = queue.size(); - int queueCapacity = queueSize + remainingCapacity; - runStateInfo.setQueueType(queueType); - runStateInfo.setQueueSize(queueSize); - runStateInfo.setQueueCapacity(queueCapacity); - runStateInfo.setQueueRemainingCapacity(remainingCapacity); - runStateInfo.setCoreSize(corePoolSize); - runStateInfo.setPoolSize(poolSize); - runStateInfo.setMaximumSize(maximumPoolSize); - runStateInfo.setActiveSize(busyCount); - runStateInfo.setCurrentLoad(currentLoad); - runStateInfo.setClientLastRefreshTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - runStateInfo.setTimestamp(System.currentTimeMillis()); - return runStateInfo; - } - - @Override - public void updateWebThreadPool(ThreadPoolParameterInfo threadPoolParameterInfo) { - try { - QueuedThreadPool jettyExecutor = (QueuedThreadPool) executor; - int minThreads = jettyExecutor.getMinThreads(); - int maxThreads = jettyExecutor.getMaxThreads(); - Integer coreSize = threadPoolParameterInfo.corePoolSizeAdapt(); - Integer maxSize = threadPoolParameterInfo.maximumPoolSizeAdapt(); - jettyExecutor.setMinThreads(coreSize); - jettyExecutor.setMaxThreads(maxSize); - log.info("[Jetty] Changed web thread pool. corePoolSize: {}, maximumPoolSize: {}", - String.format(ChangeThreadPoolConstants.CHANGE_DELIMITER, minThreads, jettyExecutor.getMinThreads()), - String.format(ChangeThreadPoolConstants.CHANGE_DELIMITER, maxThreads, jettyExecutor.getMaxThreads())); - } catch (Exception ex) { - log.error("Failed to modify the jetty thread pool parameter.", ex); - } - } - - @Override - public WebContainerEnum getWebContainerType() { - return WebContainerEnum.JETTY; - } -} diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/tomcat/DefaultTomcatWebThreadPoolHandler.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/tomcat/DefaultTomcatWebThreadPoolHandler.java deleted file mode 100644 index 75653682..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/tomcat/DefaultTomcatWebThreadPoolHandler.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web.tomcat; - -import cn.hippo4j.adapter.web.DefaultAbstractWebThreadPoolService; -import cn.hippo4j.common.support.AbstractThreadPoolRuntime; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.web.embedded.tomcat.TomcatWebServer; -import org.springframework.boot.web.server.WebServer; - -import java.util.concurrent.Executor; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * Tomcat web thread pool handler. - */ -@Slf4j -public class DefaultTomcatWebThreadPoolHandler extends DefaultAbstractWebThreadPoolService - implements - TomcatWebThreadPoolHandlerAdapt { - - private final AtomicBoolean cacheFlag = new AtomicBoolean(Boolean.FALSE); - - private static String exceptionMessage; - - public DefaultTomcatWebThreadPoolHandler(AbstractThreadPoolRuntime runtime) { - super(new TomcatWebThreadPoolHandlerSupport(runtime)); - } - - /** - * Get the thread pool object of the current web container based on the WebServer. - * @param webServer current Web-Server. - * @return Thread pool executor of the current web container. - */ - @Override - protected Executor getWebThreadPoolByServer(WebServer webServer) { - if (cacheFlag.get()) { - log.warn("Exception getting Tomcat thread pool. Exception message: {}", exceptionMessage); - return null; - } - Executor tomcatExecutor = null; - try { - tomcatExecutor = ((TomcatWebServer) webServer).getTomcat().getConnector().getProtocolHandler().getExecutor(); - } catch (Exception ex) { - cacheFlag.set(Boolean.TRUE); - exceptionMessage = ex.getMessage(); - log.error("Failed to get Tomcat thread pool. Message: {}", exceptionMessage); - } - return tomcatExecutor; - } -} diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/tomcat/TomcatWebThreadPoolHandlerAdapt.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/tomcat/TomcatWebThreadPoolHandlerAdapt.java deleted file mode 100644 index d8229ab2..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/tomcat/TomcatWebThreadPoolHandlerAdapt.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web.tomcat; - -import cn.hippo4j.adapter.web.WebThreadPoolService; - -/** - * Adapt interface of Tomcat web thread-pool handler. - */ -public interface TomcatWebThreadPoolHandlerAdapt extends WebThreadPoolService { -} diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/tomcat/TomcatWebThreadPoolHandlerSupport.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/tomcat/TomcatWebThreadPoolHandlerSupport.java deleted file mode 100644 index 20701e06..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/tomcat/TomcatWebThreadPoolHandlerSupport.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web.tomcat; - -import cn.hippo4j.adapter.web.IWebThreadPoolHandlerSupport; -import cn.hippo4j.common.constant.ChangeThreadPoolConstants; -import cn.hippo4j.common.extension.enums.WebContainerEnum; -import cn.hippo4j.common.model.ThreadPoolBaseInfo; -import cn.hippo4j.common.model.ThreadPoolParameter; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import cn.hippo4j.common.model.ThreadPoolRunStateInfo; -import cn.hippo4j.common.toolkit.CalculateUtil; -import cn.hippo4j.common.support.AbstractThreadPoolRuntime; -import lombok.extern.slf4j.Slf4j; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * The supporting class for WebThreadPoolHandler, - * which facilitates the creation of a Tomcat web container. - */ -@Slf4j -public class TomcatWebThreadPoolHandlerSupport implements IWebThreadPoolHandlerSupport { - - private final AbstractThreadPoolRuntime runtime; - - private Executor executor; - - public TomcatWebThreadPoolHandlerSupport(AbstractThreadPoolRuntime runtime) { - this.runtime = runtime; - } - - /** - * A callback will be invoked and the Executor will be set up when the web container has been started. - * @param executor Thread-pool executor in Tomcat container. - */ - @Override - public void setExecutor(Executor executor) { - this.executor = executor; - } - - @Override - public ThreadPoolBaseInfo simpleInfo() { - ThreadPoolBaseInfo poolBaseInfo = new ThreadPoolBaseInfo(); - org.apache.tomcat.util.threads.ThreadPoolExecutor tomcatThreadPoolExecutor = (org.apache.tomcat.util.threads.ThreadPoolExecutor) executor; - int corePoolSize = tomcatThreadPoolExecutor.getCorePoolSize(); - int maximumPoolSize = tomcatThreadPoolExecutor.getMaximumPoolSize(); - long keepAliveTime = tomcatThreadPoolExecutor.getKeepAliveTime(TimeUnit.SECONDS); - BlockingQueue blockingQueue = tomcatThreadPoolExecutor.getQueue(); - int queueSize = blockingQueue.size(); - int remainingCapacity = blockingQueue.remainingCapacity(); - int queueCapacity = queueSize + remainingCapacity; - String rejectedExecutionHandlerName = executor instanceof ThreadPoolExecutor ? ((ThreadPoolExecutor) executor).getRejectedExecutionHandler().getClass().getSimpleName() - : tomcatThreadPoolExecutor.getRejectedExecutionHandler().getClass().getSimpleName(); - poolBaseInfo.setCoreSize(corePoolSize); - poolBaseInfo.setMaximumSize(maximumPoolSize); - poolBaseInfo.setKeepAliveTime(keepAliveTime); - poolBaseInfo.setQueueType(blockingQueue.getClass().getSimpleName()); - poolBaseInfo.setQueueCapacity(queueCapacity); - poolBaseInfo.setRejectedName(rejectedExecutionHandlerName); - return poolBaseInfo; - } - - @Override - public ThreadPoolParameter getWebThreadPoolParameter() { - ThreadPoolParameterInfo parameterInfo = new ThreadPoolParameterInfo(); - try { - org.apache.tomcat.util.threads.ThreadPoolExecutor tomcatThreadPoolExecutor = (org.apache.tomcat.util.threads.ThreadPoolExecutor) executor; - int minThreads = tomcatThreadPoolExecutor.getCorePoolSize(); - int maxThreads = tomcatThreadPoolExecutor.getMaximumPoolSize(); - long keepAliveTime = tomcatThreadPoolExecutor.getKeepAliveTime(TimeUnit.SECONDS); - parameterInfo.setCoreSize(minThreads); - parameterInfo.setMaxSize(maxThreads); - parameterInfo.setKeepAliveTime(keepAliveTime); - } catch (Exception ex) { - log.error("Failed to get the tomcat thread pool parameter.", ex); - } - return parameterInfo; - } - - @Override - public ThreadPoolRunStateInfo getWebRunStateInfo() { - if (executor instanceof ThreadPoolExecutor) { - return runtime.getPoolRunState(null, executor); - } - ThreadPoolRunStateInfo runStateInfo = new ThreadPoolRunStateInfo(); - org.apache.tomcat.util.threads.ThreadPoolExecutor tomcatThreadPoolExecutor = (org.apache.tomcat.util.threads.ThreadPoolExecutor) executor; - int corePoolSize = tomcatThreadPoolExecutor.getCorePoolSize(); - int maximumPoolSize = tomcatThreadPoolExecutor.getMaximumPoolSize(); - int poolSize = tomcatThreadPoolExecutor.getPoolSize(); - int activeCount = tomcatThreadPoolExecutor.getActiveCount(); - int largestPoolSize = tomcatThreadPoolExecutor.getLargestPoolSize(); - long completedTaskCount = tomcatThreadPoolExecutor.getCompletedTaskCount(); - String currentLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + ""; - String peakLoad = CalculateUtil.divide(largestPoolSize, maximumPoolSize) + ""; - BlockingQueue queue = tomcatThreadPoolExecutor.getQueue(); - int queueSize = queue.size(); - String queueType = queue.getClass().getSimpleName(); - int remainingCapacity = queue.remainingCapacity(); - int queueCapacity = queueSize + remainingCapacity; - runStateInfo.setCoreSize(corePoolSize); - runStateInfo.setPoolSize(poolSize); - runStateInfo.setMaximumSize(maximumPoolSize); - runStateInfo.setActiveSize(activeCount); - runStateInfo.setCurrentLoad(currentLoad); - runStateInfo.setPeakLoad(peakLoad); - runStateInfo.setQueueType(queueType); - runStateInfo.setQueueSize(queueSize); - runStateInfo.setQueueCapacity(queueCapacity); - runStateInfo.setQueueRemainingCapacity(remainingCapacity); - runStateInfo.setLargestPoolSize(largestPoolSize); - runStateInfo.setCompletedTaskCount(completedTaskCount); - runStateInfo.setClientLastRefreshTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - runStateInfo.setTimestamp(System.currentTimeMillis()); - String rejectedExecutionHandlerName = executor instanceof ThreadPoolExecutor ? ((ThreadPoolExecutor) executor).getRejectedExecutionHandler().getClass().getSimpleName() - : tomcatThreadPoolExecutor.getRejectedExecutionHandler().getClass().getSimpleName(); - runStateInfo.setRejectedName(rejectedExecutionHandlerName); - return runtime.supplement(runStateInfo); - } - - @Override - public void updateWebThreadPool(ThreadPoolParameterInfo threadPoolParameterInfo) { - try { - org.apache.tomcat.util.threads.ThreadPoolExecutor tomcatThreadPoolExecutor = (org.apache.tomcat.util.threads.ThreadPoolExecutor) executor; - int originalCoreSize = tomcatThreadPoolExecutor.getCorePoolSize(); - int originalMaximumPoolSize = tomcatThreadPoolExecutor.getMaximumPoolSize(); - long originalKeepAliveTime = tomcatThreadPoolExecutor.getKeepAliveTime(TimeUnit.SECONDS); - // see cn.hippo4j.common.toolkit.ThreadPoolUtil#setCoreSizeAndMaximumSize - if (threadPoolParameterInfo.corePoolSizeAdapt() > originalMaximumPoolSize) { - tomcatThreadPoolExecutor.setMaximumPoolSize(threadPoolParameterInfo.maximumPoolSizeAdapt()); - tomcatThreadPoolExecutor.setCorePoolSize(threadPoolParameterInfo.corePoolSizeAdapt()); - } else { - tomcatThreadPoolExecutor.setCorePoolSize(threadPoolParameterInfo.corePoolSizeAdapt()); - tomcatThreadPoolExecutor.setMaximumPoolSize(threadPoolParameterInfo.maximumPoolSizeAdapt()); - } - tomcatThreadPoolExecutor.setKeepAliveTime(threadPoolParameterInfo.getKeepAliveTime(), TimeUnit.SECONDS); - log.info("[Tomcat] Changed web thread pool. corePoolSize: {}, maximumPoolSize: {}, keepAliveTime: {}", - String.format(ChangeThreadPoolConstants.CHANGE_DELIMITER, originalCoreSize, threadPoolParameterInfo.corePoolSizeAdapt()), - String.format(ChangeThreadPoolConstants.CHANGE_DELIMITER, originalMaximumPoolSize, threadPoolParameterInfo.maximumPoolSizeAdapt()), - String.format(ChangeThreadPoolConstants.CHANGE_DELIMITER, originalKeepAliveTime, threadPoolParameterInfo.getKeepAliveTime())); - } catch (Exception ex) { - log.error("Failed to modify the Tomcat thread pool parameter.", ex); - } - } - - @Override - public WebContainerEnum getWebContainerType() { - return WebContainerEnum.TOMCAT; - } -} diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/undertow/DefaultUndertowWebThreadPoolHandler.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/undertow/DefaultUndertowWebThreadPoolHandler.java deleted file mode 100644 index 78fe89da..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/undertow/DefaultUndertowWebThreadPoolHandler.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web.undertow; - -import java.lang.reflect.Field; -import java.util.Objects; -import java.util.concurrent.Executor; - -import cn.hippo4j.adapter.web.DefaultAbstractWebThreadPoolService; -import cn.hippo4j.common.support.AbstractThreadPoolRuntime; -import io.undertow.Undertow; -import lombok.extern.slf4j.Slf4j; - -import org.springframework.boot.web.embedded.undertow.UndertowServletWebServer; -import org.springframework.boot.web.server.WebServer; -import org.springframework.util.ReflectionUtils; - -/** - * Undertow web thread pool handler. - */ -@Slf4j -public class DefaultUndertowWebThreadPoolHandler extends DefaultAbstractWebThreadPoolService - implements - UndertowWebThreadPoolHandlerAdapt { - - private static final String UNDERTOW_NAME = "undertow"; - - public DefaultUndertowWebThreadPoolHandler(AbstractThreadPoolRuntime runtime) { - super(new UndertowWebThreadPoolHandlerSupport(runtime)); - } - - /** - * Get the thread pool object of the current web container based on the WebServer. - * @param webServer current Web-Server. - * @return Thread pool executor of the current web container. - */ - @Override - protected Executor getWebThreadPoolByServer(WebServer webServer) { - // There is no need to consider reflection performance because the fetch is a singleton. - // Springboot 2-3 version, can directly through reflection to obtain the undertow property - UndertowServletWebServer undertowServletWebServer = (UndertowServletWebServer) webServer; - Field undertowField = ReflectionUtils.findField(UndertowServletWebServer.class, UNDERTOW_NAME); - ReflectionUtils.makeAccessible(undertowField); - - Undertow undertow = (Undertow) ReflectionUtils.getField(undertowField, undertowServletWebServer); - return Objects.isNull(undertow) ? null : undertow.getWorker(); - } - -} diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/undertow/UndertowWebThreadPoolHandlerAdapt.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/undertow/UndertowWebThreadPoolHandlerAdapt.java deleted file mode 100644 index 208d8ebb..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/undertow/UndertowWebThreadPoolHandlerAdapt.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web.undertow; - -import cn.hippo4j.adapter.web.WebThreadPoolService; - -/** - * Adapt interface of Undertow web thread-pool handler. - */ -public interface UndertowWebThreadPoolHandlerAdapt extends WebThreadPoolService { -} diff --git a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/undertow/UndertowWebThreadPoolHandlerSupport.java b/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/undertow/UndertowWebThreadPoolHandlerSupport.java deleted file mode 100644 index d22d0c91..00000000 --- a/threadpool/adapter/web/src/main/java/cn/hippo4j/adapter/web/undertow/UndertowWebThreadPoolHandlerSupport.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.adapter.web.undertow; - -import cn.hippo4j.adapter.web.IWebThreadPoolHandlerSupport; -import cn.hippo4j.common.constant.ChangeThreadPoolConstants; -import cn.hippo4j.common.extension.enums.WebContainerEnum; -import cn.hippo4j.common.model.ThreadPoolBaseInfo; -import cn.hippo4j.common.model.ThreadPoolParameter; -import cn.hippo4j.common.model.ThreadPoolParameterInfo; -import cn.hippo4j.common.model.ThreadPoolRunStateInfo; -import cn.hippo4j.common.support.AbstractThreadPoolRuntime; -import cn.hippo4j.common.toolkit.CalculateUtil; -import cn.hippo4j.common.toolkit.ReflectUtil; -import cn.hippo4j.core.executor.DynamicThreadPoolExecutor; -import lombok.extern.slf4j.Slf4j; -import org.jboss.threads.EnhancedQueueExecutor; -import org.springframework.util.ReflectionUtils; -import org.xnio.Options; -import org.xnio.XnioWorker; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.concurrent.Executor; - -/** - * The supporting class for WebThreadPoolHandler, - * which facilitates the creation of a Undertow web container. - */ -@Slf4j -public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandlerSupport { - - private final AbstractThreadPoolRuntime runtime; - - private Executor executor; - - public UndertowWebThreadPoolHandlerSupport(AbstractThreadPoolRuntime runtime) { - this.runtime = runtime; - } - - /** - * A callback will be invoked and the Executor will be set up when the web container has been started. - * @param executor Thread-pool executor in Undertow container. - */ - @Override - public void setExecutor(Executor executor) { - this.executor = executor; - } - - private final long noRejectCount = -1L; - - @Override - public ThreadPoolBaseInfo simpleInfo() { - ThreadPoolBaseInfo poolBaseInfo = new ThreadPoolBaseInfo(); - XnioWorker xnioWorker = (XnioWorker) executor; - try { - int coreSize = xnioWorker.getOption(Options.WORKER_TASK_CORE_THREADS); - int maximumPoolSize = xnioWorker.getOption(Options.WORKER_TASK_MAX_THREADS); - int keepAliveTime = xnioWorker.getOption(Options.WORKER_TASK_KEEPALIVE); - poolBaseInfo.setCoreSize(coreSize); - poolBaseInfo.setMaximumSize(maximumPoolSize); - poolBaseInfo.setKeepAliveTime((long) keepAliveTime); - poolBaseInfo.setRejectedName("RejectedExecutionException"); - poolBaseInfo.setQueueType("org.jboss.threads.EnhancedQueueExecutor.TaskNode:FIFO"); - - EnhancedQueueExecutor enhancedQueueExecutor = - (EnhancedQueueExecutor) ReflectUtil.getFieldValue( - ReflectUtil.getFieldValue(xnioWorker, "taskPool"), "executor"); - - Method getMaximumQueueSize = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getMaximumQueueSize"); - ReflectionUtils.makeAccessible(getMaximumQueueSize); - int queueCapacity = (int) ReflectionUtils.invokeMethod(getMaximumQueueSize, enhancedQueueExecutor); - poolBaseInfo.setQueueCapacity(queueCapacity); - } catch (Exception ex) { - log.error("The undertow container failed to get thread pool parameters.", ex); - } - return poolBaseInfo; - } - - @Override - public ThreadPoolParameter getWebThreadPoolParameter() { - ThreadPoolParameterInfo parameterInfo = null; - try { - parameterInfo = new ThreadPoolParameterInfo(); - XnioWorker xnioWorker = (XnioWorker) executor; - int minThreads = xnioWorker.getOption(Options.WORKER_TASK_CORE_THREADS); - int maxThreads = xnioWorker.getOption(Options.WORKER_TASK_MAX_THREADS); - long keepAliveTime = xnioWorker.getOption(Options.WORKER_TASK_KEEPALIVE); - parameterInfo.setCoreSize(minThreads); - parameterInfo.setMaxSize(maxThreads); - parameterInfo.setKeepAliveTime(keepAliveTime); - } catch (Exception ex) { - log.error("Failed to get the undertow thread pool parameter.", ex); - } - return parameterInfo; - } - - @Override - public ThreadPoolRunStateInfo getWebRunStateInfo() { - ThreadPoolRunStateInfo stateInfo = new ThreadPoolRunStateInfo(); - XnioWorker xnioWorker = (XnioWorker) executor; - Field field = ReflectionUtils.findField(XnioWorker.class, "taskPool"); - ReflectionUtils.makeAccessible(field); - Object fieldObject = ReflectionUtils.getField(field, xnioWorker); - Method getCorePoolSize = ReflectionUtils.findMethod(fieldObject.getClass(), "getCorePoolSize"); - ReflectionUtils.makeAccessible(getCorePoolSize); - int corePoolSize = (int) ReflectionUtils.invokeMethod(getCorePoolSize, fieldObject); - Method getMaximumPoolSize = ReflectionUtils.findMethod(fieldObject.getClass(), "getMaximumPoolSize"); - ReflectionUtils.makeAccessible(getMaximumPoolSize); - int maximumPoolSize = (int) ReflectionUtils.invokeMethod(getMaximumPoolSize, fieldObject); - Method getPoolSize = ReflectionUtils.findMethod(fieldObject.getClass(), "getPoolSize"); - ReflectionUtils.makeAccessible(getPoolSize); - int poolSize = (int) ReflectionUtils.invokeMethod(getPoolSize, fieldObject); - Method getActiveCount = ReflectionUtils.findMethod(fieldObject.getClass(), "getActiveCount"); - ReflectionUtils.makeAccessible(getActiveCount); - int activeCount = (int) ReflectionUtils.invokeMethod(getActiveCount, fieldObject); - - Field executorFiled = ReflectionUtils.findField(fieldObject.getClass(), "executor"); - ReflectionUtils.makeAccessible(executorFiled); - EnhancedQueueExecutor enhancedQueueExecutor = (EnhancedQueueExecutor) ReflectionUtils.getField(executorFiled, fieldObject); - - Method getLargestPoolSize = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getLargestPoolSize"); - ReflectionUtils.makeAccessible(getLargestPoolSize); - int largestPoolSize = (int) ReflectionUtils.invokeMethod(getLargestPoolSize, enhancedQueueExecutor); - - Method getQueueSize = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getQueueSize"); - ReflectionUtils.makeAccessible(getQueueSize); - int queueSize = (int) ReflectionUtils.invokeMethod(getQueueSize, enhancedQueueExecutor); - - Method getMaximumQueueSize = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getMaximumQueueSize"); - ReflectionUtils.makeAccessible(getMaximumQueueSize); - int queueCapacity = (int) ReflectionUtils.invokeMethod(getMaximumQueueSize, enhancedQueueExecutor); - - int remainingCapacity = queueCapacity - queueSize; - - Method getCompletedTaskCount = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getCompletedTaskCount"); - ReflectionUtils.makeAccessible(getCompletedTaskCount); - long completedTaskCount = (long) ReflectionUtils.invokeMethod(getCompletedTaskCount, enhancedQueueExecutor); - - Method getHandoffExecutor = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getHandoffExecutor"); - ReflectionUtils.makeAccessible(getHandoffExecutor); - Executor handoffExecutor = (Executor) ReflectionUtils.invokeMethod(getHandoffExecutor, enhancedQueueExecutor); - - activeCount = Math.max(activeCount, 0); - String currentLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + ""; - String peakLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + ""; - stateInfo.setCoreSize(corePoolSize); - stateInfo.setPoolSize(poolSize); - stateInfo.setMaximumSize(maximumPoolSize); - stateInfo.setActiveSize(activeCount); - stateInfo.setCurrentLoad(currentLoad); - stateInfo.setPeakLoad(peakLoad); - long rejectCount = fieldObject instanceof DynamicThreadPoolExecutor - ? ((DynamicThreadPoolExecutor) fieldObject).getRejectCountNum() - : -noRejectCount; - stateInfo.setRejectCount(rejectCount); - stateInfo.setClientLastRefreshTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - stateInfo.setTimestamp(System.currentTimeMillis()); - - stateInfo.setQueueType("org.jboss.threads.EnhancedQueueExecutor.TaskNode:FIFO"); - stateInfo.setQueueSize(queueSize); - stateInfo.setQueueCapacity(queueCapacity); - stateInfo.setQueueRemainingCapacity(remainingCapacity); - stateInfo.setLargestPoolSize(largestPoolSize); - stateInfo.setCompletedTaskCount(completedTaskCount); - stateInfo.setRejectedName(handoffExecutor.getClass().getName()); - - return runtime.supplement(stateInfo); - } - - @Override - public void updateWebThreadPool(ThreadPoolParameterInfo threadPoolParameterInfo) { - try { - XnioWorker xnioWorker = (XnioWorker) executor; - Integer coreSize = threadPoolParameterInfo.corePoolSizeAdapt(); - Integer maxSize = threadPoolParameterInfo.maximumPoolSizeAdapt(); - int keepAliveTime = threadPoolParameterInfo.getKeepAliveTime().intValue(); - int originalCoreSize = xnioWorker.getOption(Options.WORKER_TASK_CORE_THREADS); - int originalMaximumPoolSize = xnioWorker.getOption(Options.WORKER_TASK_MAX_THREADS); - int originalKeepAliveTime = xnioWorker.getOption(Options.WORKER_TASK_KEEPALIVE); - xnioWorker.setOption(Options.WORKER_TASK_CORE_THREADS, coreSize); - xnioWorker.setOption(Options.WORKER_TASK_MAX_THREADS, maxSize); - xnioWorker.setOption(Options.WORKER_TASK_KEEPALIVE, keepAliveTime); - log.info("[Undertow] Changed web thread pool. corePoolSize: {}, maximumPoolSize: {}, keepAliveTime: {}", - String.format(ChangeThreadPoolConstants.CHANGE_DELIMITER, originalCoreSize, coreSize), - String.format(ChangeThreadPoolConstants.CHANGE_DELIMITER, originalMaximumPoolSize, maxSize), - String.format(ChangeThreadPoolConstants.CHANGE_DELIMITER, originalKeepAliveTime, keepAliveTime)); - } catch (Exception ex) { - log.error("Failed to modify the undertow thread pool parameter.", ex); - } - } - - @Override - public WebContainerEnum getWebContainerType() { - return WebContainerEnum.UNDERTOW; - } -} diff --git a/threadpool/console-new/.eslintignore b/threadpool/console-new/.eslintignore deleted file mode 100644 index 4fa47a37..00000000 --- a/threadpool/console-new/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -/.git -/.vscode -node_modules -build -public diff --git a/threadpool/console-new/.eslintrc.js b/threadpool/console-new/.eslintrc.js deleted file mode 100644 index 92c71e51..00000000 --- a/threadpool/console-new/.eslintrc.js +++ /dev/null @@ -1,32 +0,0 @@ -module.exports = { - env: { - browser: true, - es2021: true, - node: true, - }, - root: true, - extends: ['eslint:recommended', 'react-app', 'plugin:prettier/recommended', 'plugin:@typescript-eslint/recommended'], - overrides: [], - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - ecmaFeatures: { - jsx: true, - }, - }, - plugins: ['react', '@typescript-eslint'], - rules: { - eqeqeq: 2, - 'no-alert': 2, - 'no-undef': 2, - 'prefer-const': 0, - 'no-use-before-define': 2, - 'react-hooks/exhaustive-deps': 2, - '@typescript-eslint/no-explicit-any': 0, - '@typescript-eslint/no-non-null-assertion': 0, - '@typescript-eslint/no-var-requires': 0, - 'import/no-anonymous-default-export': 0, - 'jsx-a11y/anchor-is-valid': 0, - }, -}; diff --git a/threadpool/console-new/.gitignore b/threadpool/console-new/.gitignore deleted file mode 100644 index 58b21fe5..00000000 --- a/threadpool/console-new/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -# /build - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/threadpool/console-new/.prettierignore b/threadpool/console-new/.prettierignore deleted file mode 100644 index 473d9c18..00000000 --- a/threadpool/console-new/.prettierignore +++ /dev/null @@ -1,4 +0,0 @@ - /.git -node_modules -build -src/lib/* \ No newline at end of file diff --git a/threadpool/console-new/.prettierrc.js b/threadpool/console-new/.prettierrc.js deleted file mode 100644 index f9d533a1..00000000 --- a/threadpool/console-new/.prettierrc.js +++ /dev/null @@ -1,33 +0,0 @@ -module.exports = { - // 1.一行代码的最大字符数,默认是80(printWidth: ) - printWidth: 120, - // 2.tab宽度为2空格(tabWidth: ) - tabWidth: 2, - // 3.是否使用tab来缩进,我们使用空格(useTabs: ) - useTabs: false, - // 4.结尾是否添加分号,false的情况下只会在一些导致ASI错误的其工况下在开头加分号,我选择无分号结尾的风格(semi: ) - semi: true, - // 5.使用单引号(singleQuote: ) - singleQuote: true, - // 6.object对象中key值是否加引号(quoteProps: "")as-needed只有在需求要的情况下加引号,consistent是有一个需要引号就统一加,preserve是保留用户输入的引号 - quoteProps: 'as-needed', - // 7.在jsx文件中的引号需要单独设置(jsxSingleQuote: ) - jsxSingleQuote: false, - // 8.尾部逗号设置,es5是尾部逗号兼容es5,none就是没有尾部逗号,all是指所有可能的情况,需要node8和es2017以上的环境。(trailingComma: "") - trailingComma: 'es5', - // 9.object对象里面的key和value值和括号间的空格(bracketSpacing: ) - bracketSpacing: true, - // 10.jsx标签多行属性写法时,尖括号是否另起一行(jsxBracketSameLine: ) - jsxBracketSameLine: false, - // 11.箭头函数单个参数的情况是否省略括号,默认always是总是带括号(arrowParens: "") - arrowParens: 'avoid', - // 12.range是format执行的范围,可以选执行一个文件的一部分,默认的设置是整个文件(rangeStart: rangeEnd: ) - rangeStart: 0, - rangeEnd: Infinity, - // 18. vue script和style标签中是否缩进,开启可能会破坏编辑器的代码折叠 - vueIndentScriptAndStyle: false, - // 19. endOfLine: "" 行尾换行符,默认是lf, - endOfLine: 'auto', - // 20.embeddedLanguageFormatting: "off",默认是auto,控制被引号包裹的代码是否进行格式化 - embeddedLanguageFormatting: 'off', -}; diff --git a/threadpool/console-new/README.md b/threadpool/console-new/README.md deleted file mode 100644 index b87cb004..00000000 --- a/threadpool/console-new/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Getting Started with Create React App - -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). - -## Available Scripts - -In the project directory, you can run: - -### `npm start` - -Runs the app in the development mode.\ -Open [http://localhost:3000](http://localhost:3000) to view it in the browser. - -The page will reload if you make edits.\ -You will also see any lint errors in the console. - -### `npm test` - -Launches the test runner in the interactive watch mode.\ -See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. - -### `npm run build` - -Builds the app for production to the `build` folder.\ -It correctly bundles React in production mode and optimizes the build for the best performance. - -The build is minified and the filenames include the hashes.\ -Your app is ready to be deployed! - -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. - -### `npm run eject` - -**Note: this is a one-way operation. Once you `eject`, you can’t go back!** - -If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. - -Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. - -You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. - -## Learn More - -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). - -To learn React, check out the [React documentation](https://reactjs.org/). diff --git a/threadpool/console-new/craco.config.js b/threadpool/console-new/craco.config.js deleted file mode 100644 index f06ec6af..00000000 --- a/threadpool/console-new/craco.config.js +++ /dev/null @@ -1,60 +0,0 @@ -const CracoLessPlugin = require('craco-less'); -const lessModuleRegex = /\.module\.less$/; -const path = require('path'); -const basePath = path.resolve(__dirname, '.'); -const resolve = dir => path.resolve(basePath, dir); - -module.exports = { - plugins: [ - { - plugin: CracoLessPlugin, - options: { - // less loader options - lessLoaderOptions: { - lessOptions: { - // modifyVars: { "@primary-color": "#1DA57A" }, - javascriptEnabled: true, - }, - }, - - // A callback function that receives two arguments: the webpack rule, - // and the context. You must return an updated rule object. - modifyLessRule: lessRule => { - lessRule.test = lessModuleRegex; - lessRule.exclude = /node_modules|antd\.css/; - return lessRule; - }, - - // Passing an options object to configure the css-loaders - cssLoaderOptions: { - modules: { localIdentName: '[local]_[hash:base64:5]' }, - }, - }, - }, - ], - webpack: { - alias: { - '@': resolve('src'), - }, - }, - devServer: { - port: 3000, - headers: { - 'Access-Control-Allow-Origin': '*', - }, - proxy: { - '/hippo4j/v1/cs': { - target: 'http://console.hippo4j.cn:6691/hippo4j/v1/cs', - pathRewrite: { '^/hippo4j/v1/cs': '' }, - changeOrigin: true, - secure: false, - onProxyReq: proxyReq => { - console.log(`Proxying request to: ${proxyReq.path}`); - }, - onProxyRes: proxyRes => { - console.log(`Received response with status: ${proxyRes.statusCode}`); - }, - }, - }, - }, -}; diff --git a/threadpool/console-new/package.json b/threadpool/console-new/package.json deleted file mode 100644 index 9e516ae0..00000000 --- a/threadpool/console-new/package.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "name": "threadpool-console", - "version": "0.1.0", - "private": true, - "dependencies": { - "@ahooksjs/use-url-state": "^3.5.1", - "@ant-design/happy-work-theme": "^1.0.0", - "@ant-design/icons": "^5.2.6", - "@tanem/react-nprogress": "^5.0.51", - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", - "ahooks": "^3.7.8", - "antd": "^5.4.7", - "buffer": "^6.0.3", - "classnames": "^2.3.2", - "dayjs": "^1.11.9", - "echarts": "^5.4.3", - "echarts-for-react": "^3.0.2", - "i18next": "^23.5.1", - "i18next-browser-languagedetector": "^7.1.0", - "lodash": "^4.17.21", - "qs": "^6.11.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-i18next": "^13.2.2", - "react-router-dom": "^6.11.1", - "react-scripts": "5.0.1", - "web-vitals": "^2.1.4" - }, - "scripts": { - "start": "craco start", - "build": "craco build", - "test": "react-scripts test", - "eject": "react-scripts eject", - "lint": "eslint -c .eslintrc.js src --ext .ts,.tsx,.js,.jsx --fix", - "format": "prettier --write src/" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "devDependencies": { - "@craco/craco": "^7.1.0", - "@types/http-errors": "^2.0.1", - "@types/jest": "^27.5.2", - "@types/lodash": "^4.14.198", - "@types/node": "^16.18.26", - "@types/react": "^18.2.6", - "@types/react-dom": "^18.2.4", - "@typescript-eslint/eslint-plugin": "^5.59.2", - "@typescript-eslint/parser": "^5.59.2", - "babel-eslint": "^10.1.0", - "craco-alias": "^3.0.1", - "craco-css-modules": "^1.0.5", - "craco-less": "^2.0.0", - "craco-sass-resources-loader": "^1.1.0", - "eslint": "^8.40.0", - "eslint-config-airbnb": "^19.0.4", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.32.2", - "http-proxy-middleware": "^2.0.6", - "husky": "^8.0.0", - "less-loader": "^11.1.0", - "lint-staged": "^13.2.2", - "prettier": "^2.8.8", - "styled-components": "^6.0.0-rc.1", - "typescript": "^4.9.5" - }, - "cracoConfig": "./craco.config.js", - "lint-staged": { - "src/**/*.{ts,tsx,js,jsx}": [ - "eslint -c .eslintrc.js --fix" - ] - } -} diff --git a/threadpool/console-new/public/favicon.ico b/threadpool/console-new/public/favicon.ico deleted file mode 100644 index 264e6fc6..00000000 Binary files a/threadpool/console-new/public/favicon.ico and /dev/null differ diff --git a/threadpool/console-new/public/index.html b/threadpool/console-new/public/index.html deleted file mode 100644 index 515b177d..00000000 --- a/threadpool/console-new/public/index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - Dashboard - - - -
- - - diff --git a/threadpool/console-new/public/logo192.png b/threadpool/console-new/public/logo192.png deleted file mode 100644 index fc44b0a3..00000000 Binary files a/threadpool/console-new/public/logo192.png and /dev/null differ diff --git a/threadpool/console-new/public/logo512.png b/threadpool/console-new/public/logo512.png deleted file mode 100644 index a4e47a65..00000000 Binary files a/threadpool/console-new/public/logo512.png and /dev/null differ diff --git a/threadpool/console-new/public/manifest.json b/threadpool/console-new/public/manifest.json deleted file mode 100644 index 080d6c77..00000000 --- a/threadpool/console-new/public/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "short_name": "React App", - "name": "Create React App Sample", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/threadpool/console-new/public/robots.txt b/threadpool/console-new/public/robots.txt deleted file mode 100644 index e9e57dc4..00000000 --- a/threadpool/console-new/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/threadpool/console-new/src/App.tsx b/threadpool/console-new/src/App.tsx deleted file mode 100644 index 7ac3dc57..00000000 --- a/threadpool/console-new/src/App.tsx +++ /dev/null @@ -1,61 +0,0 @@ -// import { Suspense } from 'react'; -import LayoutCom from './components/layout-com'; -import { Routes, Route, Link } from 'react-router-dom'; -import routeList from './route'; -import { MenuProps } from 'antd'; -import { useTran } from './hooks'; -import { STR_MAP } from './config/i18n/locales/constants'; -import IconFont from './components/icon'; -import { HappyProvider } from '@ant-design/happy-work-theme'; - -type MenuItem = Required['items'][number]; - -const App = () => { - const sideMenuList: MenuItem[] = [ - { - label: useTran(STR_MAP.DYNAMIC_THREAD_POOL), - key: STR_MAP.DYNAMIC_THREAD_POOL, - icon: , - children: [ - { - label: {useTran(STR_MAP.THREAD_POOL_MANAGE)}, - key: '/thread-poll/index', - }, - ], - }, - { - label: {useTran(STR_MAP.TENANT_MANAGE)}, - key: '/tenant', - icon: , - }, - { - label: {useTran(STR_MAP.PROJECT_MANAGE)}, - key: '/item', - icon: , - }, - { - label: {useTran(STR_MAP.USER_MANAGE)}, - key: '/user', - icon: , - }, - { - label: {useTran(STR_MAP.LOG_MANAGE)}, - key: '/log', - icon: , - }, - ]; - - return ( - - - - {routeList.map(item => ( - - ))} - - - - ); -}; - -export default App; diff --git a/threadpool/console-new/src/components/header/index.module.less b/threadpool/console-new/src/components/header/index.module.less deleted file mode 100644 index 384d8337..00000000 --- a/threadpool/console-new/src/components/header/index.module.less +++ /dev/null @@ -1,14 +0,0 @@ -.header-wrapper { - display: flex; - width: 100%; - justify-content: space-between; - .logo { - display: flex; - flex-direction: column; - width: 50px; - img { - flex: 1; - object-fit: contain; - } - } -} diff --git a/threadpool/console-new/src/components/header/index.tsx b/threadpool/console-new/src/components/header/index.tsx deleted file mode 100644 index 8f90676a..00000000 --- a/threadpool/console-new/src/components/header/index.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import React, { useContext } from 'react'; -import style from './index.module.less'; -import { UserOutlined } from '@ant-design/icons'; -import { Avatar, Button, Col, Dropdown, Row, Switch } from 'antd'; -import { MyContext } from '@/context'; -import IconFont from '@/components/icon'; -import { LANG_NAME, MyStoreValues, THEME_NAME } from '@/typings'; -import { useNavigate } from 'react-router-dom'; - -const HeaderChild = () => { - const { lang, themeName, setLang, setThemeName } = useContext(MyContext); - const navigate = useNavigate(); - // console.log('setLang:::', setLang); - // setLang && setLang(LANG_NAME.EN); - - const items = [ - { - key: '1', - label: ( - - 1st menu - - ), - }, - { - key: '2', - label: ( - - 2nd menu - - ), - }, - { - key: '3', - label: navigate('/login')}>登出, - }, - ]; - - return ( -
-
navigate('/home')}> - -
-
- - - - - } style={{ cursor: 'pointer' }} /> - - - - - - - { - setThemeName && setThemeName(e ? THEME_NAME.DARK : THEME_NAME.DEFAULT); - }} - > - - -
-
- ); -}; -export default HeaderChild; diff --git a/threadpool/console-new/src/components/icon/index.tsx b/threadpool/console-new/src/components/icon/index.tsx deleted file mode 100644 index 03b8cc0c..00000000 --- a/threadpool/console-new/src/components/icon/index.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { createFromIconfontCN } from '@ant-design/icons'; -import React from 'react'; - -const MyIcon = createFromIconfontCN({ - scriptUrl: '//at.alicdn.com/t/c/font_4254722_vw34zn7su2.js', // 在 iconfont.cn 上生成 -}); - -type MyComponentProps = React.HTMLProps & { type: string }; - -const IconFont: React.FC = props => { - return ; -}; - -export default IconFont; diff --git a/threadpool/console-new/src/components/layout-com/index.module.less b/threadpool/console-new/src/components/layout-com/index.module.less deleted file mode 100644 index dc82a2cc..00000000 --- a/threadpool/console-new/src/components/layout-com/index.module.less +++ /dev/null @@ -1,24 +0,0 @@ -.container { - width: 100vw; - height: 100vh; - .header { - height: 48px; - box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.01), 0 3px 6px 3px rgba(0, 0, 0, 0.01), 0 2px 6px 0 rgba(0, 0, 0, 0.03); - padding: 0 20px; - display: flex; - align-items: center; - } - .sider { - padding-top: 24px; - } - .content { - border-radius: 12px 12px 0 0; - flex: 1; - padding: 16px; - overflow-y: auto; - } - .pureContent { - border-radius: unset; - padding: 0; - } -} diff --git a/threadpool/console-new/src/components/layout-com/index.tsx b/threadpool/console-new/src/components/layout-com/index.tsx deleted file mode 100644 index 17f19b40..00000000 --- a/threadpool/console-new/src/components/layout-com/index.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { useState, useContext, ReactNode, useEffect, useMemo } from 'react'; -import { DefaultTheme, ThemeContext } from 'styled-components'; -import { Layout, Menu, MenuProps } from 'antd'; -import HeaderChild from '../header'; -import style from './index.module.less'; -import { useLocation } from 'react-router-dom'; -import classNames from 'classnames'; -type MenuItem = Required['items'][number]; - -const { Header, Sider, Content } = Layout; - -interface ILayoutCom { - children?: ReactNode; - sideMenuList: MenuItem[]; -} -const LayoutCom = (props: ILayoutCom) => { - const { sideMenuList, children } = props; - const myThemes: DefaultTheme = useContext(ThemeContext); - const [currentKey, setCurrentKey] = useState(''); - - const location = useLocation(); - useEffect(() => { - setCurrentKey(location.pathname); - }, [location]); - - const onClick = (e: any) => { - setCurrentKey(e.key); - }; - - useEffect(() => { - document.body.style.backgroundColor = myThemes.backgroundColor.bg1; - }, [myThemes]); - - const isHeader = useMemo(() => { - const isHeader = location.pathname !== '/login'; - return isHeader; - }, [location]); - - const isSider = useMemo(() => { - const isSider = location.pathname !== '/login'; - return isSider; - }, [location]); - - return ( -
- {isHeader && ( -
- -
- )} - - {isSider && ( - - - - )} - - {children} - - -
- ); -}; - -export default LayoutCom; diff --git a/threadpool/console-new/src/components/table/index.module.less b/threadpool/console-new/src/components/table/index.module.less deleted file mode 100644 index e69de29b..00000000 diff --git a/threadpool/console-new/src/components/table/index.tsx b/threadpool/console-new/src/components/table/index.tsx deleted file mode 100644 index ed5df78c..00000000 --- a/threadpool/console-new/src/components/table/index.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import React from 'react'; -import { Space, Table, Tag } from 'antd'; -import type { ColumnsType } from 'antd/es/table'; - -interface DataType { - key: string; - name: string; - age: number; - address: string; - tags: string[]; -} - -const columns: ColumnsType = [ - { - title: 'Name', - dataIndex: 'name', - key: 'name', - render: text => {text}, - }, - { - title: 'Age', - dataIndex: 'age', - key: 'age', - }, - { - title: 'Address', - dataIndex: 'address', - key: 'address', - }, - { - title: 'Tags', - key: 'tags', - dataIndex: 'tags', - render: (_, { tags }) => ( - <> - {tags.map(tag => { - let color = tag.length > 5 ? 'geekblue' : 'green'; - if (tag === 'loser') { - color = 'volcano'; - } - return ( - - {tag.toUpperCase()} - - ); - })} - - ), - }, - { - title: 'Action', - key: 'action', - render: (_, record) => ( - - Invite {record.name} - Delete - - ), - }, -]; - -const data: DataType[] = [ - { - key: '1', - name: 'John Brown', - age: 32, - address: 'New York No. 1 Lake Park', - tags: ['nice', 'developer'], - }, - { - key: '2', - name: 'Jim Green', - age: 42, - address: 'London No. 1 Lake Park', - tags: ['loser'], - }, - { - key: '3', - name: 'Joe Black', - age: 32, - address: 'Sydney No. 1 Lake Park', - tags: ['cool', 'teacher'], - }, -]; - -const TableBox: React.FC = () => ; - -export default TableBox; diff --git a/threadpool/console-new/src/components/theme-com/index.tsx b/threadpool/console-new/src/components/theme-com/index.tsx deleted file mode 100644 index 0b23f105..00000000 --- a/threadpool/console-new/src/components/theme-com/index.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import React, { useContext, useEffect, useState } from 'react'; -import { DefaultTheme, ThemeProvider } from 'styled-components'; -import { ConfigProvider, theme } from 'antd'; -import { darkAlgorithm } from '../../config/theme/dark-algorithm'; -import { defaultAlgorithm } from '../../config/theme/default-algnorithm'; -import { lightDefaultTheme, darkDefaultTheme } from '../../config/theme'; -import { MyContext } from '../../context'; -import zhCN from 'antd/es/locale/zh_CN'; -import { THEME_NAME } from '@/typings'; - -interface ThemeProps { - children: React.ReactNode; -} - -const ThemeComponent = ({ children }: ThemeProps) => { - const [themes, setThemes] = useState(defaultAlgorithm); - const [myThemes, setMyThemes] = useState(lightDefaultTheme); - const { themeName } = useContext(MyContext); - - const changeMode = (themeName: THEME_NAME) => { - if (themeName === THEME_NAME.DARK) { - darkAlgorithm.algorithm = theme.darkAlgorithm; - setThemes(darkAlgorithm); - setMyThemes(darkDefaultTheme); - } else { - defaultAlgorithm.algorithm = theme.defaultAlgorithm; - setThemes(defaultAlgorithm); - setMyThemes(lightDefaultTheme); - } - }; - - useEffect(() => { - changeMode(themeName); - }, [themeName]); - - return ( - - {children} - - ); -}; -export default ThemeComponent; diff --git a/threadpool/console-new/src/components/with-button/index.tsx b/threadpool/console-new/src/components/with-button/index.tsx deleted file mode 100644 index 0ec5c460..00000000 --- a/threadpool/console-new/src/components/with-button/index.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Button, ButtonProps } from 'antd'; -import React from 'react'; -import { SearchOutlined, PlusOutlined, RedoOutlined } from '@ant-design/icons'; - -function withSearchIconButton

(WrappedComponent: React.ComponentType

) { - return function EnhancedComponent(props: P) { - return } {...props} />; - }; -} - -function withAddIconButton

(WrappedComponent: React.ComponentType

) { - return function EnhancedComponent(props: P) { - return } {...props}>; - }; -} - -function withResetIconButton

(WrappedComponent: React.ComponentType

) { - return function EnhancedComponent(props: P) { - return }>; - }; -} - -export const SearchButton = withSearchIconButton(Button); - -export const AddButton = withAddIconButton(Button); - -export const ResetButton = withResetIconButton(Button); diff --git a/threadpool/console-new/src/config/i18n/index.ts b/threadpool/console-new/src/config/i18n/index.ts deleted file mode 100644 index be5b198c..00000000 --- a/threadpool/console-new/src/config/i18n/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -// i18n.js - -import i18n from 'i18next'; -import { initReactI18next } from 'react-i18next'; -import zh from './locales/zh'; -import en from './locales/en'; -import LanguageDetector from 'i18next-browser-languagedetector'; - -i18n - .use(LanguageDetector) - .use(initReactI18next) - .init({ - resources: { - zh: { - translation: zh, - }, - en: { - translation: en, - }, - }, - // debug: true, - fallbackLng: 'zh', // 默认语言 - interpolation: { - escapeValue: false, // 不转义HTML标签 - }, - }); - -export default i18n; diff --git a/threadpool/console-new/src/config/i18n/locales/constants.ts b/threadpool/console-new/src/config/i18n/locales/constants.ts deleted file mode 100644 index 613fda9d..00000000 --- a/threadpool/console-new/src/config/i18n/locales/constants.ts +++ /dev/null @@ -1,36 +0,0 @@ -export enum STR_MAP { - GLOBAL_TITLE = 'globalTitle', - DYNAMIC_THREAD_POOL = 'dynamicThreadPool', - THREAD_POOL_MANAGE = 'threadPoolManage', - PROJECT = 'project', - SEARCH = 'search', - ADD = 'add', - SERIAL_NUMBER = 'serialNumber', - TENANTRY = 'tenantry', - THREAD_POOL = 'threadPool', - CORE_THREAD = 'coreThread', - MAXIMUM_THREAD = 'maximumThread', - QUEUE_TYPE = 'queueType', - QUEUE_CAPACITY = 'queueCapacity', - REJECTION_STRATEGY = 'rejectionStrategy', - EXECUTION_TIMEOUT = 'executionTimeout', - ALARM_OR_NOT = 'alarmOrNot', - CREATION_TIME = 'creationTime', - UPDATE_TIME = 'updateTime', - EDIT = 'edit', - TENANT_MANAGE = 'tenantManage', - LOG_MANAGE = 'logManage', - PROJECT_MANAGE = 'projectManage', - USER_MANAGE = 'userManage', - LOGIN_SUCCESSFUL = 'loginSuccessful', - USER_INPUT_MESSAGE = 'userInputMessage', - USRE_NAME = 'username', - PASSWORD_INPUT_MESSAGE = 'passwordInputMessage', - REMERBER_PASSWORD = 'rememberPassWord', - FORGOT_PASSWORD = 'forgotPassword', - ACCOUNT_PASSWORD_LOGIN = 'accountPasswordLogin', - PASSWOR = 'password', - LOGIN = 'login', - PHONE_LOGIN = 'phoneLogin', - ALARM_EDITING_SUCCESS = 'alarmEditingSuccess', -} diff --git a/threadpool/console-new/src/config/i18n/locales/en.ts b/threadpool/console-new/src/config/i18n/locales/en.ts deleted file mode 100644 index 978f5e0b..00000000 --- a/threadpool/console-new/src/config/i18n/locales/en.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { STR_MAP } from './constants'; - -const enTranslationMap: { [key: string]: string } = { - [STR_MAP.DYNAMIC_THREAD_POOL]: 'Dynamic thread pool', - [STR_MAP.THREAD_POOL_MANAGE]: 'Thread pool management', - [STR_MAP.PROJECT]: 'project', - [STR_MAP.SEARCH]: 'search', - [STR_MAP.ADD]: 'add', - [STR_MAP.SERIAL_NUMBER]: 'number', - [STR_MAP.TENANTRY]: 'tenantry', - [STR_MAP.THREAD_POOL]: 'thread pool', - [STR_MAP.CORE_THREAD]: 'core thread', - [STR_MAP.MAXIMUM_THREAD]: 'maximum thread', - [STR_MAP.QUEUE_TYPE]: 'queue type', - [STR_MAP.QUEUE_CAPACITY]: 'queue capacity', - [STR_MAP.REJECTION_STRATEGY]: 'rejection strategy', - [STR_MAP.EXECUTION_TIMEOUT]: 'execution timeout', - [STR_MAP.ALARM_OR_NOT]: 'alarm or not', - [STR_MAP.CREATION_TIME]: 'creation time', - [STR_MAP.UPDATE_TIME]: 'update time', - [STR_MAP.EDIT]: 'edit', - [STR_MAP.TENANT_MANAGE]: 'tenant management', - [STR_MAP.PROJECT_MANAGE]: 'project management', - [STR_MAP.USER_MANAGE]: 'user management', - [STR_MAP.LOG_MANAGE]: 'log management', - [STR_MAP.LOGIN_SUCCESSFUL]: 'login successful', - [STR_MAP.USER_INPUT_MESSAGE]: 'please enter your username', - [STR_MAP.USRE_NAME]: 'username', - [STR_MAP.PASSWORD_INPUT_MESSAGE]: 'please enter password', - [STR_MAP.REMERBER_PASSWORD]: 'remember the password', - [STR_MAP.FORGOT_PASSWORD]: 'forgot password', - [STR_MAP.ACCOUNT_PASSWORD_LOGIN]: 'account password login', - [STR_MAP.GLOBAL_TITLE]: `The world's best thread pool management tool`, - [STR_MAP.PASSWOR]: 'password', - [STR_MAP.LOGIN]: 'login', - [STR_MAP.PHONE_LOGIN]: 'Mobile login', - [STR_MAP.ALARM_EDITING_SUCCESS]: 'alarm editing success', -}; - -export default enTranslationMap; diff --git a/threadpool/console-new/src/config/i18n/locales/zh.ts b/threadpool/console-new/src/config/i18n/locales/zh.ts deleted file mode 100644 index 5acde9dd..00000000 --- a/threadpool/console-new/src/config/i18n/locales/zh.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { STR_MAP } from './constants'; - -const zhTranslationMap: { [key: string]: string } = { - [STR_MAP.DYNAMIC_THREAD_POOL]: '动态线程池', - [STR_MAP.THREAD_POOL_MANAGE]: '线程池管理', - [STR_MAP.PROJECT]: '项目', - [STR_MAP.SEARCH]: '搜索', - [STR_MAP.ADD]: '添加', - [STR_MAP.SERIAL_NUMBER]: '序号', - [STR_MAP.TENANTRY]: '租户', - [STR_MAP.THREAD_POOL]: '线程池', - [STR_MAP.CORE_THREAD]: '核心线程', - [STR_MAP.MAXIMUM_THREAD]: '最大线程', - [STR_MAP.QUEUE_TYPE]: '队列类型', - [STR_MAP.QUEUE_CAPACITY]: '队列容量', - [STR_MAP.REJECTION_STRATEGY]: '拒绝策略', - [STR_MAP.EXECUTION_TIMEOUT]: '执行超时', - [STR_MAP.ALARM_OR_NOT]: '是否报警', - [STR_MAP.CREATION_TIME]: '创建时间', - [STR_MAP.UPDATE_TIME]: '更新时间', - [STR_MAP.EDIT]: '操作', - [STR_MAP.TENANT_MANAGE]: '租户管理', - [STR_MAP.PROJECT_MANAGE]: '项目管理', - [STR_MAP.USER_MANAGE]: '用户权限', - [STR_MAP.LOG_MANAGE]: '日志管理', - [STR_MAP.LOGIN_SUCCESSFUL]: '登录成功', - [STR_MAP.USER_INPUT_MESSAGE]: '请输入用户名', - [STR_MAP.USRE_NAME]: '用户名', - [STR_MAP.PASSWORD_INPUT_MESSAGE]: '请输入密码', - [STR_MAP.REMERBER_PASSWORD]: '记住密码', - [STR_MAP.FORGOT_PASSWORD]: '忘记密码', - [STR_MAP.ACCOUNT_PASSWORD_LOGIN]: '账号密码登录', - [STR_MAP.GLOBAL_TITLE]: `全球最好用的线程池管理工具`, - [STR_MAP.PASSWOR]: '密码', - [STR_MAP.LOGIN]: '登录', - [STR_MAP.PHONE_LOGIN]: '手机号登录', - [STR_MAP.ALARM_EDITING_SUCCESS]: '报警编辑成功', -}; - -export default zhTranslationMap; diff --git a/threadpool/console-new/src/config/theme/dark-algorithm.ts b/threadpool/console-new/src/config/theme/dark-algorithm.ts deleted file mode 100644 index dcd15994..00000000 --- a/threadpool/console-new/src/config/theme/dark-algorithm.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { theme } from 'antd'; -import { darkDefaultTheme } from '.'; -export const darkAlgorithm = { - token: { - colorPrimary: darkDefaultTheme.primary, - fontSize: 14, - fontSizeHeading1: 18, - }, - components: { - Layout: { - bodyBg: darkDefaultTheme.backgroundColor.bg1, - headerBg: darkDefaultTheme.backgroundColor.bgHeader, - triggerBg: darkDefaultTheme.backgroundColor.bg1, - triggerColor: darkDefaultTheme.fontColor.fc1, - }, - Button: { - // fontSize: 14, - }, - Table: { - // borderRadius: 0, - // borderRadiusLG: 0, - // padding: 10, - // paddingXS: 5, - // margin: 0, - // cellFontSize: 12, - // colorBorderSecondary: darkDefaultTheme.borderColor.bl1, - // paddingContentVerticalLG: 4, - }, - Modal: { - borderRadiusLG: 2, - borderRadiusSM: 2, - colorText: darkDefaultTheme.fontColor.fc3, - borderRadius: 2, - paddingContentHorizontalLG: 0, - paddingMD: 0, - }, - Menu: { - itemBg: darkDefaultTheme.backgroundColor.bg1, - // itemSelectedBg: darkDefaultTheme.primary, - // itemSelectedColor: darkDefaultTheme.fontColor.fc1, - activeBarWidth: 0, - activeBarHeight: 0, - activeBarBorderWidth: 0, - // subMenuItemBorderRadius: 8, - // horizontalItemBorderRadius: 8, - // itemBorderRadius: 8, - }, - }, - algorithm: theme.darkAlgorithm, -}; diff --git a/threadpool/console-new/src/config/theme/default-algnorithm.ts b/threadpool/console-new/src/config/theme/default-algnorithm.ts deleted file mode 100644 index f9c6e766..00000000 --- a/threadpool/console-new/src/config/theme/default-algnorithm.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { theme } from 'antd'; -import { lightDefaultTheme } from '.'; -export const defaultAlgorithm = { - token: { - colorPrimary: lightDefaultTheme.primary, - fontSize: 14, - fontSizeHeading1: 18, - }, - components: { - Layout: { - bodyBg: lightDefaultTheme.backgroundColor.bg1, - headerBg: lightDefaultTheme.backgroundColor.bgHeader, - triggerBg: lightDefaultTheme.backgroundColor.bg1, - triggerColor: lightDefaultTheme.fontColor.fc1, - }, - Button: { - // fontSize: 14, - }, - Table: { - // padding: 10, - // paddingXS: 5, - // margin: 0, - // cellFontSize: 12, - // colorBorderSecondary: lightDefaultTheme.borderColor.bl1, - // paddingContentVerticalLG: 4, - }, - Modal: { - // borderRadiusLG: 2, - // borderRadiusSM: 2, - // colorText: lightDefaultTheme.fontColor.fc3, - // borderRadius: 2, - // paddingContentHorizontalLG: 0, - // paddingMD: 0, - }, - Menu: { - itemBg: lightDefaultTheme.backgroundColor.bg1, - // itemSelectedBg: lightDefaultTheme.primary, - // itemSelectedColor: lightDefaultTheme.fontColor.fc1, - activeBarWidth: 0, - activeBarHeight: 0, - activeBarBorderWidth: 0, - // subMenuItemBorderRadius: 8, - // horizontalItemBorderRadius: 8, - // itemBorderRadius: 8, - }, - }, - algorithm: theme.defaultAlgorithm, -}; diff --git a/threadpool/console-new/src/config/theme/default-theme.d.ts b/threadpool/console-new/src/config/theme/default-theme.d.ts deleted file mode 100644 index 5c137cf6..00000000 --- a/threadpool/console-new/src/config/theme/default-theme.d.ts +++ /dev/null @@ -1,46 +0,0 @@ -import 'styled-components'; -// and extend them! -declare module 'styled-components' { - export interface DefaultTheme { - primary: string; - - // 基本固定颜色,如有颜色按钮,文字颜色 - baseColor: { - bc1: string; - bc2: string; - bc3: string; - bc4: string; - bc5: string; - }; - // 字体颜色 - fontColor: { - fc1: string; - fc2: string; - fc3: string; - fc4: string; - fc5: string; - fc6: string; - }; - // 边框颜色 line - borderColor: { - bl1: string; - bl2: string; - bl3: string; - }; - // 背景色 - backgroundColor: { - bgHeader: string; - bgContent: string; - bg1: string; - bg2: string; - bg3: string; - bg4: string; - bg5: string; - bg6: string; - }; - hoverColor: { - hc1: string; - hc2: string; - }; - } -} diff --git a/threadpool/console-new/src/config/theme/index.ts b/threadpool/console-new/src/config/theme/index.ts deleted file mode 100644 index 7e40b52d..00000000 --- a/threadpool/console-new/src/config/theme/index.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { DefaultTheme } from 'styled-components'; - -export const lightDefaultTheme: DefaultTheme = { - primary: '#1890ff', - baseColor: { - // 前两个是固定的,用于,有颜色按钮 字体颜色等固定不会变的颜色值 - bc1: '#fff', - bc2: '#000000', - bc3: '#ED2D00', - bc4: '#10CC55', - bc5: '#3094f1', - }, - fontColor: { - fc1: '#333', - fc2: '#000', - fc3: '#666', - fc4: '#D2E0F4', - fc5: '#000000', - fc6: '#FFFFFF', - }, - borderColor: { - bl1: '#E2E2E2', - bl2: '#d8dbe2', - bl3: '#B5BDCE', - }, - backgroundColor: { - bgHeader: '#fff', - bgContent: '#fff', - // main bgc - bg1: '#ebebf2', - // app or head bgc - bg2: '#fff', - // title的及表格头部背景极 - bg3: '#EDEDED', - bg5: '#F8F8F8', - bg4: '#F6F6F6', - bg6: 'rgba(0, 0, 0, 0.70)', - }, - hoverColor: { - hc1: 'rgba(24, 144, 255, 0)', - // 表格的hover及选 中 - hc2: '#F5F8FA', - }, -}; - -export const darkDefaultTheme: DefaultTheme = { - primary: '#0d68a8', - baseColor: { - bc1: '#fff', - bc2: '#000000', - bc3: '#FF3D3D', - bc4: '#10CC55', - bc5: '#3094f1', - // 固定为白色,有颜色按钮文字颜色 fixedcolor - }, - fontColor: { - fc1: '#ffffff', - fc2: '#B4B6B8', - fc3: '#555555', - fc4: '#666666', - fc5: '#FFFFFF', - fc6: '#FFFFFF', - }, - borderColor: { - bl1: '#6A6A6A', - bl2: '#4A4B51', - bl3: '#424242', - }, - backgroundColor: { - bgHeader: '#141414', - bgContent: '#141414', - // 大面积色 - bg1: '#141414', - // tab顶部颜色 - bg2: '#323337', - // title 颜色 - bg3: '#2A2B2E', - bg5: '#4A4B51', - // 菜单选中 - bg4: '#0F3C66', - // 锁定背景色 - bg6: 'rgba(255, 255, 255, 0.70)', - // bg3: "rgba(255, 255, 255, 0.70)", - // bg4: "rgba(250, 250, 250, 1)", - }, - hoverColor: { - hc1: 'rgba(24, 144, 255, 0)', - hc2: '#2A2B2E', - }, -}; diff --git a/threadpool/console-new/src/context/index.tsx b/threadpool/console-new/src/context/index.tsx deleted file mode 100644 index 928aef94..00000000 --- a/threadpool/console-new/src/context/index.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import React, { createContext, useState, ReactNode, useEffect } from 'react'; -import { ConfigProvider, theme } from 'antd'; -import { DefaultTheme, ThemeProvider } from 'styled-components'; -import enUS from 'antd/locale/en_US'; -import zhCN from 'antd/locale/zh_CN'; -import { darkDefaultTheme, lightDefaultTheme } from '@/config/theme'; -import { defaultAlgorithm } from '@/config/theme/default-algnorithm'; -import { darkAlgorithm } from '@/config/theme/dark-algorithm'; -import { useTranslation } from 'react-i18next'; -import { useLocalStorageState } from 'ahooks'; -import { LANG_NAME, MyStoreValues, THEME_NAME } from '@/typings'; - -export const MyContext = createContext({}); - -export const MyStore: React.FC<{ - children: ReactNode; -}> = ({ children }) => { - const [themeName, setThemeName] = useLocalStorageState('current-mode', { - defaultValue: THEME_NAME.DEFAULT, - }); - const [lang, setLang] = useLocalStorageState('current-lang', { - defaultValue: LANG_NAME.ZH, - }); - const [themes, setThemes] = useState(defaultAlgorithm); - const [myThemes, setMyThemes] = useState(lightDefaultTheme); - - const { i18n } = useTranslation(); - - const changeMode = (themeName: THEME_NAME) => { - if (themeName === THEME_NAME.DARK) { - darkAlgorithm.algorithm = theme.darkAlgorithm; - // for ant change mode - setThemes(darkAlgorithm); - // for custome use mode - setMyThemes(darkDefaultTheme); - } else { - defaultAlgorithm.algorithm = theme.defaultAlgorithm; - setThemes(defaultAlgorithm); - setMyThemes(lightDefaultTheme); - } - }; - - useEffect(() => { - changeMode(themeName as THEME_NAME); - }, [themeName]); - - useEffect(() => { - i18n.changeLanguage(lang); - }, [lang, i18n]); - - return ( - - - {children} - - - ); -}; diff --git a/threadpool/console-new/src/hooks/index.ts b/threadpool/console-new/src/hooks/index.ts deleted file mode 100644 index 1a4b2837..00000000 --- a/threadpool/console-new/src/hooks/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './useTransLate'; -export * from './useFormToUrl'; diff --git a/threadpool/console-new/src/hooks/useFormToUrl.ts b/threadpool/console-new/src/hooks/useFormToUrl.ts deleted file mode 100644 index 664d54c3..00000000 --- a/threadpool/console-new/src/hooks/useFormToUrl.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { useEffect, useMemo, useState } from 'react'; -import { parse } from 'qs'; -import useUrlState from '@ahooksjs/use-url-state'; -import { FormInstance } from 'antd'; - -export function useFormStateToUrl>( - form: FormInstance, - params?: T -): { - urlState: any; - isFirstMount: boolean; - handleSetUrlState: () => void; -} { - const [state, setState] = useState(); - const [urlState, setUrlState] = useUrlState(); - const [count, setCount] = useState(0); - - useEffect(() => { - const url = window.location.search.split('?')[1] ?? null; - const urlParams = parse(url) as T; - const result: Partial = {}; - setState(urlParams); - for (const key in params) { - if (Object.prototype.hasOwnProperty.call(params, key)) { - const paramValue = urlParams[key]; - if (paramValue ?? false) { - if (typeof params[key] === 'number') { - const parsedValue = parseFloat(paramValue); - if (!isNaN(parsedValue)) { - result[key] = parsedValue as T[keyof T]; - } - } else { - result[key] = paramValue as T[keyof T]; - } - } - } - } - form.setFieldsValue(result); - setCount(count => count + 1); - }, [setState, setCount, form, params]); - - const handleSetUrlState = () => { - const values = form.getFieldsValue(); - setUrlState({ ...state, ...values }); - }; - - const isFirstMount = useMemo(() => { - return count === 1; - }, [count]); - - return { urlState, isFirstMount, handleSetUrlState }; -} diff --git a/threadpool/console-new/src/hooks/useTransLate.ts b/threadpool/console-new/src/hooks/useTransLate.ts deleted file mode 100644 index de37118e..00000000 --- a/threadpool/console-new/src/hooks/useTransLate.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { useTranslation } from 'react-i18next'; - -export const useTran = (str: string): string => { - const { t } = useTranslation(); - return t(str); -}; diff --git a/threadpool/console-new/src/hooks/useUrlSet.ts b/threadpool/console-new/src/hooks/useUrlSet.ts deleted file mode 100644 index 7669d5f3..00000000 --- a/threadpool/console-new/src/hooks/useUrlSet.ts +++ /dev/null @@ -1,18 +0,0 @@ -import useUrlState from '@ahooksjs/use-url-state'; - -export const useUrlSet = (options: { form: any }) => { - const { form } = options; - const [state, setState] = useUrlState({}); - - const setUrl = () => { - const params = form.getFieldsValue(); - Object.keys(params).forEach(key => { - if (!params[key]) { - params[key] = undefined; - } - }); - setState({ ...params }); - }; - - return { setUrl }; -}; diff --git a/threadpool/console-new/src/index.module.less b/threadpool/console-new/src/index.module.less deleted file mode 100644 index 2c8e92dd..00000000 --- a/threadpool/console-new/src/index.module.less +++ /dev/null @@ -1,3 +0,0 @@ -body { - background-color: #ebebf2; -} diff --git a/threadpool/console-new/src/index.tsx b/threadpool/console-new/src/index.tsx deleted file mode 100644 index f46fb217..00000000 --- a/threadpool/console-new/src/index.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React, { Suspense } from 'react'; -import ReactDOM from 'react-dom/client'; -import App from './App'; -import { BrowserRouter } from 'react-router-dom'; -import { MyStore } from './context'; -import './config/i18n'; -import 'antd/dist/reset.css'; -import { Spin } from 'antd'; - -const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); - -root.render( - - - {/* theme context */} - - {/* theme config context */} - }> - - - - - -); diff --git a/threadpool/console-new/src/page/about/index.tsx b/threadpool/console-new/src/page/about/index.tsx deleted file mode 100644 index ef9d24f7..00000000 --- a/threadpool/console-new/src/page/about/index.tsx +++ /dev/null @@ -1,4 +0,0 @@ -const About = () => { - return

About
; -}; -export default About; diff --git a/threadpool/console-new/src/page/about/router.tsx b/threadpool/console-new/src/page/about/router.tsx deleted file mode 100644 index 0a680a55..00000000 --- a/threadpool/console-new/src/page/about/router.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { IRouterList } from '@/typings'; -import About from '.'; - -const routerList: IRouterList[] = [ - { - path: '/about', - component: About, - }, -]; - -export default routerList; diff --git a/threadpool/console-new/src/page/home/components/detail/index.tsx b/threadpool/console-new/src/page/home/components/detail/index.tsx deleted file mode 100644 index 2d4cd32b..00000000 --- a/threadpool/console-new/src/page/home/components/detail/index.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import React from 'react'; - -const HomeDetail = () => { - return <>; -}; -export default HomeDetail; diff --git a/threadpool/console-new/src/page/home/constans.ts b/threadpool/console-new/src/page/home/constans.ts deleted file mode 100644 index 9f36b36d..00000000 --- a/threadpool/console-new/src/page/home/constans.ts +++ /dev/null @@ -1 +0,0 @@ -export const Map = {}; diff --git a/threadpool/console-new/src/page/home/index.tsx b/threadpool/console-new/src/page/home/index.tsx deleted file mode 100644 index e323cfaa..00000000 --- a/threadpool/console-new/src/page/home/index.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { Button, Calendar } from 'antd'; -import dayjs from 'dayjs'; -import { useTranslation } from 'react-i18next'; - -const Home = () => { - const { t } = useTranslation(); - - return ( -
- - -
- ); -}; - -export default Home; diff --git a/threadpool/console-new/src/page/home/router.tsx b/threadpool/console-new/src/page/home/router.tsx deleted file mode 100644 index 938c7fab..00000000 --- a/threadpool/console-new/src/page/home/router.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import Home from './index'; -import { IRouterList } from '@/typings'; - -const routerList: IRouterList[] = [{ path: '/home', component: Home }]; -export default routerList; diff --git a/threadpool/console-new/src/page/home/service.ts b/threadpool/console-new/src/page/home/service.ts deleted file mode 100644 index a8d772dd..00000000 --- a/threadpool/console-new/src/page/home/service.ts +++ /dev/null @@ -1,9 +0,0 @@ -const fetchData = async () => { - await new Promise(resolve => { - resolve(100); - }); -}; - -const service = { fetchData }; - -export default service; diff --git a/threadpool/console-new/src/page/home/type.ts b/threadpool/console-new/src/page/home/type.ts deleted file mode 100644 index c4dbf016..00000000 --- a/threadpool/console-new/src/page/home/type.ts +++ /dev/null @@ -1,3 +0,0 @@ -export enum CON { - NAME = '1', -} diff --git a/threadpool/console-new/src/page/item/create.tsx b/threadpool/console-new/src/page/item/create.tsx deleted file mode 100644 index f04fa140..00000000 --- a/threadpool/console-new/src/page/item/create.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import { useRequest } from 'ahooks'; -import { Form, Modal, Input, Select, notification } from 'antd'; -import React, { useEffect } from 'react'; -import { fetchTenantOptions } from '../tenant/service'; -import { fetchAddItem, fetchUpdateItem } from './service'; - -interface IProps { - type: string; - data: any; - visible: boolean; - onClose: () => void; - reset: () => void; -} - -const ItemCreate: React.FC = props => { - const { visible, onClose, data, type, reset } = props; - const [form] = Form.useForm(); - const tenantRequest = useRequest(fetchTenantOptions, { - ready: !!type, - }); - const updateRequest = useRequest(fetchUpdateItem, { - manual: true, - onSuccess: () => { - notification.success({ message: '更新成功' }); - form.resetFields(); - onClose(); - reset(); - }, - onError: err => { - notification.error({ message: err.message }); - }, - }); - const addRequest = useRequest(fetchAddItem, { - manual: true, - onSuccess: () => { - notification.success({ message: '创建成功' }); - form.resetFields(); - onClose(); - reset(); - }, - onError: err => { - notification.error({ message: err.message }); - }, - }); - const onSave = () => { - form - .validateFields() - .then(values => { - addRequest.run({ ...values }); - }) - .catch(info => { - console.log('Validate Failed:', info); - }); - }; - const onUpdate = () => { - form - .validateFields() - .then(values => { - updateRequest.run({ id: data.id, ...values }); - }) - .catch(info => { - console.log('Validate Failed:', info); - }); - }; - useEffect(() => { - if (type === 'edit') { - form.setFieldsValue({ - ...data, - }); - } - }, [type, data, form]); - - return ( - -
- - - - - - - - - - - - - -
- ); -}; - -export default ItemCreate; diff --git a/threadpool/console-new/src/page/item/index.module.less b/threadpool/console-new/src/page/item/index.module.less deleted file mode 100644 index a160df88..00000000 --- a/threadpool/console-new/src/page/item/index.module.less +++ /dev/null @@ -1,5 +0,0 @@ -.tenant_wrapper { - .opreate_btn { - padding: 0px; - } -} diff --git a/threadpool/console-new/src/page/item/index.tsx b/threadpool/console-new/src/page/item/index.tsx deleted file mode 100644 index 4d35bac8..00000000 --- a/threadpool/console-new/src/page/item/index.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import { useAntdTable, useRequest } from 'ahooks'; -import { Button, Form, Input, Row, Space, Table, Col, Modal, notification, message } from 'antd'; -import { SearchOutlined, EditOutlined } from '@ant-design/icons'; -import React, { useState } from 'react'; -import { fetchDeleteItem, fetchItemList } from './service'; -import { useUrlSet } from '@/hooks/useUrlSet'; -import style from './index.module.less'; -import ItemCreate from './create'; - -const baseColumns = [ - { - title: '序号', - dataIndex: 'index', - with: 200, - }, - { - title: '租户', - dataIndex: 'tenantId', - with: 200, - }, - { - title: '项目', - dataIndex: 'itemId', - with: 200, - }, - { - title: '项目', - dataIndex: 'itemId', - }, - { - title: '项目名称', - dataIndex: 'itemName', - with: 200, - }, - { - title: '负责人', - dataIndex: 'owner', - with: 200, - }, - { - title: '修改时间', - dataIndex: 'gmtModified', - }, -]; - -const Tenant: React.FC = () => { - const [editVisible, setEditVisible] = useState(false); - const [type, setType] = useState('add'); - const [curItem, setCurItem] = useState({}); - const [form] = Form.useForm(); - const { setUrl } = useUrlSet({ form }); - const { tableProps, search } = useAntdTable(fetchItemList, { form }); - const deleteRequest = useRequest(fetchDeleteItem, { manual: true }); - - const handleSearch = () => { - setUrl(); - search.submit(); - }; - const handleDelete = (item: any) => { - Modal.confirm({ - title: '提示', - content: `此操作将删除 ${item.itemId}, 是否继续?`, - onOk: async () => { - try { - const res = await deleteRequest.runAsync(item.itemId); - if (res && res.success) { - notification.success({ message: '删除成功' }); - search.reset(); - } - } catch (e: any) { - message.error(e.message || '服务器开小差啦~'); - } - }, - }); - }; - const actions = (type: string, item?: any) => { - switch (type) { - case 'add': - setType('add'); - setEditVisible(true); - break; - case 'edit': - setType('edit'); - setCurItem(item); - setEditVisible(true); - break; - case 'delete': - handleDelete(item); - break; - default: - break; - } - }; - const handleClose = () => { - setEditVisible(false); - }; - - return ( -
-
- -
- - - - - - - - - - - - - - - - -
{ - return ( - - - - - ); - }, - }, - ]} - /> - {editVisible && ( - search.reset()} - /> - )} - - ); -}; - -export default Tenant; diff --git a/threadpool/console-new/src/page/item/router.tsx b/threadpool/console-new/src/page/item/router.tsx deleted file mode 100644 index c11cce05..00000000 --- a/threadpool/console-new/src/page/item/router.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { lazy } from 'react'; -import { IRouterList } from '@/typings'; - -const ItemManage = lazy(() => import('./index')); - -const routerList: IRouterList[] = [{ path: '/item', component: () => }]; - -export default routerList; diff --git a/threadpool/console-new/src/page/item/service.ts b/threadpool/console-new/src/page/item/service.ts deleted file mode 100644 index 0e8bbdf9..00000000 --- a/threadpool/console-new/src/page/item/service.ts +++ /dev/null @@ -1,77 +0,0 @@ -import request from '@/utils'; - -const fetchItemList = async ( - pageProps: { current: number; pageSize: number }, - formData: { tencent: string | number } -): Promise<{ total: number; list: Array }> => { - const res: any = await request('/hippo4j/v1/cs/item/query/page', { - method: 'POST', - body: { - ...formData, - current: pageProps.current, - size: pageProps.pageSize, - desc: true, - }, - }); - if (res && res.success) { - return { - total: res.data.total, - list: res.data.records.map((item: any, index: number) => ({ index: index + 1, ...item })), - }; - } - throw new Error(res.message || '服务器开小差啦~'); -}; - -const fetchAddItem = async (params: { - itemDesc: string; // 项目简介 - itemId: string; // 项目 - itemName: string; // 项目名称 - owner: string; // 负责人 - tenantId: string; // 租户 - tenantDesc?: string; - tenantName?: string; -}) => { - const res = await request('/hippo4j/v1/cs/item/save', { - method: 'POST', - body: { ...params }, - }); - if (res && res.success) { - return res; - } - throw new Error(res.message || '服务器开小差啦~'); -}; - -const fetchUpdateItem = async (params: { - id: string; - itemDesc: string; // 项目简介 - itemId: string; // 项目 - itemName: string; // 项目名称 - owner: string; // 负责人 - tenantId: string; // 租户 - tenantDesc?: string; - tenantName?: string; -}) => { - const res = await request('/hippo4j/v1/cs/item/update', { - method: 'POST', - body: { ...params }, - }); - - if (res && res.success) { - return res; - } - throw new Error(res.message || '服务器开小差啦~'); -}; - -const fetchDeleteItem = async (id: string) => { - const url = 'hippo4j/v1/cs/item/delete/prescription/' + id; - const res = await request(url, { - method: 'DELETE', - }); - - if (res && res.success) { - return res; - } - throw new Error(res.message || '服务器开小差啦~'); -}; - -export { fetchItemList, fetchAddItem, fetchDeleteItem, fetchUpdateItem }; diff --git a/threadpool/console-new/src/page/log/detail.tsx b/threadpool/console-new/src/page/log/detail.tsx deleted file mode 100644 index fd753f20..00000000 --- a/threadpool/console-new/src/page/log/detail.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Descriptions, Modal } from 'antd'; -import React from 'react'; - -const LogDetail: React.FC<{ - data: any; - visible: boolean; - onClose: () => void; -}> = props => { - const { visible, onClose, data } = props; - return ( - - - - {data.category} - - - {data.bizNo} - - - {data.operator} - - - {data.createTime} - - - {data.action} - - - - ); -}; - -export default LogDetail; diff --git a/threadpool/console-new/src/page/log/index.module.less b/threadpool/console-new/src/page/log/index.module.less deleted file mode 100644 index a160df88..00000000 --- a/threadpool/console-new/src/page/log/index.module.less +++ /dev/null @@ -1,5 +0,0 @@ -.tenant_wrapper { - .opreate_btn { - padding: 0px; - } -} diff --git a/threadpool/console-new/src/page/log/index.tsx b/threadpool/console-new/src/page/log/index.tsx deleted file mode 100644 index eb120e05..00000000 --- a/threadpool/console-new/src/page/log/index.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import { useAntdTable } from 'ahooks'; -import { Button, Form, Input, Row, Space, Table, Col } from 'antd'; -import { SearchOutlined, RedoOutlined } from '@ant-design/icons'; -import React, { useState } from 'react'; -import { fetchLogList } from './service'; -import { useUrlSet } from '@/hooks/useUrlSet'; -import style from './index.module.less'; -import LogDetail from './detail'; - -const baseColumns = [ - { - title: '序号', - dataIndex: 'id', - width: 100, - // fixed: 'left', - }, - { - title: '业务类型', - dataIndex: 'category', - width: 200, - }, - { - title: '业务标识', - dataIndex: 'bizNo', - width: 380, - }, - { - title: '日志内容', - dataIndex: 'action', - width: 380, - }, - { - title: '操作人', - dataIndex: 'operator', - width: 100, - }, - { - title: '操作时间', - dataIndex: 'createTime', - width: 200, - }, -]; - -const Tenant: React.FC = () => { - const [visible, setVisible] = useState(false); - const [form] = Form.useForm(); - const { setUrl } = useUrlSet({ form }); - const { tableProps, search } = useAntdTable(fetchLogList, { form }); - const [curItems, setCurItems] = useState({}); - const handleSearch = () => { - setUrl(); - search.submit(); - }; - const handleDetail = (item: any) => { - setVisible(!visible); - setCurItems(item); - }; - const handleClose = () => { - setVisible(false); - }; - - return ( -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
{ - return ( - - ); - }, - }, - ]} - /> - - - ); -}; - -export default Tenant; diff --git a/threadpool/console-new/src/page/log/router.tsx b/threadpool/console-new/src/page/log/router.tsx deleted file mode 100644 index d778e8be..00000000 --- a/threadpool/console-new/src/page/log/router.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { lazy } from 'react'; -import { IRouterList } from '@/typings'; - -const LogManage = lazy(() => import('./index')); - -const routerList: IRouterList[] = [{ path: '/log', component: () => }]; - -export default routerList; diff --git a/threadpool/console-new/src/page/log/service.ts b/threadpool/console-new/src/page/log/service.ts deleted file mode 100644 index d135380c..00000000 --- a/threadpool/console-new/src/page/log/service.ts +++ /dev/null @@ -1,24 +0,0 @@ -import request from '@/utils'; - -const fetchLogList = async ( - pageProps: { current: number; pageSize: number }, - formData: { category: string | number; bizNo: string; operator: string } -): Promise<{ total: number; list: Array }> => { - const res: any = await request('/hippo4j/v1/cs/log/query/page', { - method: 'POST', - body: { - ...formData, - current: pageProps.current, - size: pageProps.pageSize, - }, - }); - if (res && res.success) { - return { - total: res.data.total, - list: res.data.records.map((item: any, index: number) => ({ id: index + 1, ...item })), - }; - } - throw new Error(res.msg || '服务器开小差啦~'); -}; - -export { fetchLogList }; diff --git a/threadpool/console-new/src/page/login/index.module.less b/threadpool/console-new/src/page/login/index.module.less deleted file mode 100644 index c3d1ecad..00000000 --- a/threadpool/console-new/src/page/login/index.module.less +++ /dev/null @@ -1,37 +0,0 @@ -.login-wrapper { - display: grid; - grid-template-columns: 1fr 550px; - grid-template-rows: 1fr; - height: 100%; - .login-bgi { - background: url('https://gw.alipayobjects.com/zos/rmsportal/FfdJeJRQWjEeGTpqgBKj.png') no-repeat fixed center center; - background-size: contain; - } - .login-form-wrapper { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - .img-wrapper { - width: 50px; - display: flex; - flex-direction: column; - img { - flex: 1; - object-fit: contain; - } - } - .tip { - margin-block-start: 12px; - margin-block-end: 36px; - } - .form-content { - width: 330px; - .login-edit { - display: flex; - justify-content: space-between; - align-items: center; - } - } - } -} diff --git a/threadpool/console-new/src/page/login/index.tsx b/threadpool/console-new/src/page/login/index.tsx deleted file mode 100644 index a3eaf635..00000000 --- a/threadpool/console-new/src/page/login/index.tsx +++ /dev/null @@ -1,148 +0,0 @@ -import { useCallback, useMemo, useState } from 'react'; -import { Typography, Tabs, TabsProps, Form, Input, Checkbox, Button, message } from 'antd'; -import service from './service'; -import { LockOutlined, UserOutlined } from '@ant-design/icons'; -import style from './index.module.less'; -import { useRequest } from 'ahooks'; -import { encrypt, genKey, setToken } from '@/utils'; -import { useNavigate } from 'react-router-dom'; -import { STR_MAP } from '@/config/i18n/locales/constants'; -import { useTranslation } from 'react-i18next'; - -const { Paragraph } = Typography; - -enum TABS_KEY { - LOGIN = 'login', - PHONE = 'phoneLogin', -} - -const Login = () => { - const [form] = Form.useForm(); - const navigate = useNavigate(); - const { validateFields } = form; - const [rememberMe, setRememberMe] = useState(1); - const { t } = useTranslation(); - - const { run, loading } = useRequest(service.fetchLogin, { - manual: true, - onSuccess: res => { - if (res) { - message.success(t(STR_MAP.LOGIN_SUCCESSFUL)); - navigate('/thread-poll/index'); - setToken(res?.data); - } - }, - }); - - const handleLogin = useCallback(() => { - validateFields() - .then(async values => { - const { password, username } = values; - let key = genKey(); - let encodePassword = await encrypt(password, key); - key = key.split('').reverse().join(''); - run({ - password: encodePassword, - tag: key, - username, - rememberMe, - }); - }) - .catch(err => console.log('err:::', err)); - }, [validateFields, run, rememberMe]); - - const formNode = useMemo( - () => ( -
- - } - size="large" - allowClear - > - - - } - size="large" - allowClear - > - - -
- { - setRememberMe(Number(e.target.checked)); - }} - > - {t(STR_MAP.REMERBER_PASSWORD)} - - {t(STR_MAP.FORGOT_PASSWORD)} -
-
- - - - - ), - [form, loading, rememberMe, handleLogin, t] - ); - - const items: TabsProps['items'] = [ - { - key: TABS_KEY.LOGIN, - label: t(STR_MAP.ACCOUNT_PASSWORD_LOGIN), - children: formNode, - }, - { - key: TABS_KEY.PHONE, - label: t(STR_MAP.PHONE_LOGIN), - children: formNode, - }, - ]; - return ( -
-
-
-
- -
- {t(STR_MAP.GLOBAL_TITLE)} -
- -
-
-
- ); -}; -export default Login; diff --git a/threadpool/console-new/src/page/login/router.ts b/threadpool/console-new/src/page/login/router.ts deleted file mode 100644 index 143acaaf..00000000 --- a/threadpool/console-new/src/page/login/router.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { IRouterList } from '@/typings'; -import Login from '.'; - -const routerList: IRouterList[] = [{ path: '/login', component: Login }]; - -export default routerList; diff --git a/threadpool/console-new/src/page/login/service.ts b/threadpool/console-new/src/page/login/service.ts deleted file mode 100644 index 0e9c9426..00000000 --- a/threadpool/console-new/src/page/login/service.ts +++ /dev/null @@ -1,13 +0,0 @@ -import request from '@/utils'; - -const fetchLogin = async (body: any) => { - const { data } = await request<{ data: string; roles: string[] }>('/hippo4j/v1/cs/auth/login', { - method: 'POST', - body, - }); - return data; -}; - -export default { - fetchLogin, -}; diff --git a/threadpool/console-new/src/page/search/index.tsx b/threadpool/console-new/src/page/search/index.tsx deleted file mode 100644 index 85f3e74d..00000000 --- a/threadpool/console-new/src/page/search/index.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React from 'react'; -import { EyeInvisibleOutlined, EyeTwoTone } from '@ant-design/icons'; -import { Button, Input, Space } from 'antd'; - -const Search: React.FC = () => { - const [passwordVisible, setPasswordVisible] = React.useState(false); - - return ( - - - (visible ? : )} - /> - - - - - - - ); -}; - -export default Search; diff --git a/threadpool/console-new/src/page/tenant/create.tsx b/threadpool/console-new/src/page/tenant/create.tsx deleted file mode 100644 index ee4c065e..00000000 --- a/threadpool/console-new/src/page/tenant/create.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { useRequest } from 'ahooks'; -import { Form, Modal, Input, notification } from 'antd'; -import React, { useEffect } from 'react'; -import { fetchAddTenant, fetchUpdateTenant } from './service'; - -interface IProps { - type: string; - data: any; - visible: boolean; - onClose: () => void; - reset: () => void; -} - -const TenantCreate: React.FC = props => { - const { visible, onClose, data, type, reset } = props; - const [form] = Form.useForm(); - const updateRequest = useRequest(fetchUpdateTenant, { - manual: true, - onSuccess: () => { - notification.success({ message: '更新成功' }); - form.resetFields(); - onClose(); - reset(); - }, - onError: err => { - notification.error({ message: err.message }); - }, - }); - const addRequest = useRequest(fetchAddTenant, { - manual: true, - onSuccess: () => { - notification.success({ message: '创建成功' }); - form.resetFields(); - onClose(); - reset(); - }, - onError: err => { - notification.error({ message: err.message }); - }, - }); - const onSave = () => { - form - .validateFields() - .then(values => { - addRequest.run({ ...values }); - }) - .catch(info => { - console.log('Validate Failed:', info); - }); - }; - const onUpdate = () => { - form - .validateFields() - .then(values => { - updateRequest.run({ id: data.id, ...values }); - }) - .catch(info => { - console.log('Validate Failed:', info); - }); - }; - useEffect(() => { - if (type === 'edit') { - form.setFieldsValue({ - ...data, - }); - } - }, [type, data, form]); - - return ( - -
- - - - - - - - - - - - - -
- ); -}; - -export default TenantCreate; diff --git a/threadpool/console-new/src/page/tenant/index.module.less b/threadpool/console-new/src/page/tenant/index.module.less deleted file mode 100644 index a160df88..00000000 --- a/threadpool/console-new/src/page/tenant/index.module.less +++ /dev/null @@ -1,5 +0,0 @@ -.tenant_wrapper { - .opreate_btn { - padding: 0px; - } -} diff --git a/threadpool/console-new/src/page/tenant/index.tsx b/threadpool/console-new/src/page/tenant/index.tsx deleted file mode 100644 index 1651531c..00000000 --- a/threadpool/console-new/src/page/tenant/index.tsx +++ /dev/null @@ -1,146 +0,0 @@ -import React, { useState } from 'react'; -import { useAntdTable, useRequest } from 'ahooks'; -import { Button, Form, Input, Row, Space, Table, Col, Modal, notification, message } from 'antd'; -import { SearchOutlined, EditOutlined } from '@ant-design/icons'; -import { useUrlSet } from '@/hooks/useUrlSet'; -import { fetchDeleteTenant, fetchTenantList } from './service'; -import style from './index.module.less'; -import TenantCreate from './create'; - -const baseColumns = [ - { - title: '序号', - dataIndex: 'index', - }, - { - title: '租户', - dataIndex: 'tenantId', - }, - { - title: '租户名称', - dataIndex: 'tenantName', - }, - { - title: '负责人', - dataIndex: 'owner', - }, - { - title: '修改时间', - dataIndex: 'gmtModified', - }, -]; - -const Tenant: React.FC = () => { - const [editVisible, setEditVisible] = useState(false); - const [curItem, setCurItem] = useState({}); - const [type, setType] = useState('add'); - const [form] = Form.useForm(); - const { setUrl } = useUrlSet({ form }); - const { tableProps, search } = useAntdTable(fetchTenantList, { form }); - const deleteRequest = useRequest(fetchDeleteTenant, { manual: true }); - - const handleSearch = () => { - setUrl(); - search.submit(); - }; - const handleDelete = (item: any) => { - Modal.confirm({ - title: '提示', - content: `此操作将删除 ${item.tenantId},是否继续?`, - onOk: async () => { - try { - const res = await deleteRequest.runAsync(item.tenantId); - if (res && res.success) { - notification.success({ message: '删除成功' }); - search.reset(); - } - } catch (e: any) { - message.error(e.message || '服务器开小差啦~'); - } - }, - }); - }; - const actions = (type: string, item?: any) => { - switch (type) { - case 'add': - setType('add'); - setEditVisible(true); - break; - case 'edit': - setType('edit'); - setCurItem(item); - setEditVisible(true); - break; - case 'delete': - handleDelete(item); - break; - default: - break; - } - }; - const handleClose = () => { - setEditVisible(false); - }; - - return ( -
-
- -
- - - - - - - - - - - - - - - - -
{ - return ( - - - - - ); - }, - }, - ]} - /> - {editVisible && ( - search.reset()} - /> - )} - - ); -}; - -export default Tenant; diff --git a/threadpool/console-new/src/page/tenant/router.tsx b/threadpool/console-new/src/page/tenant/router.tsx deleted file mode 100644 index d61681ae..00000000 --- a/threadpool/console-new/src/page/tenant/router.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { lazy } from 'react'; -import { IRouterList } from '@/typings'; - -const Tenant = lazy(() => import('./index')); - -const routerList: IRouterList[] = [{ path: '/tenant', component: () => }]; - -export default routerList; diff --git a/threadpool/console-new/src/page/tenant/service.ts b/threadpool/console-new/src/page/tenant/service.ts deleted file mode 100644 index 31dfc940..00000000 --- a/threadpool/console-new/src/page/tenant/service.ts +++ /dev/null @@ -1,84 +0,0 @@ -import request from '@/utils'; - -const fetchTenantOptions = async (tencent: string) => { - const res: any = await request('/hippo4j/v1/cs/tenant/query/page', { - method: 'POST', - body: { - tencent, - current: 1, - size: 10, - desc: true, - }, - }); - if (res && res.success) { - return res.data && res.data.records.map((item: any) => ({ value: item.tenantId, label: item.tenantId })); - } - throw new Error(res.message || '服务器开小差啦~'); -}; - -const fetchTenantList = async ( - pageProps: { current: number; pageSize: number }, - formData: { tencent: string | number } -): Promise<{ total: number; list: Array }> => { - const res: any = await request('/hippo4j/v1/cs/tenant/query/page', { - method: 'POST', - body: { - ...formData, - current: pageProps.current, - size: pageProps.pageSize, - desc: true, - }, - }); - if (res && res.success) { - return { - total: res.data.total, - list: res.data.records.map((item: any, index: number) => ({ index: index + 1, ...item })), - }; - } - throw new Error(res.message || '服务器开小差啦~'); -}; - -const fetchAddTenant = async (params: { - tenantDesc: string; // 项目简介 - tenantId: string; // 项目 - tenantName: string; // 项目名称 - owner: string; // 负责人 -}) => { - const res = await request('/hippo4j/v1/cs/tenant/save', { - method: 'POST', - body: { ...params }, - }); - if (res && res.success) { - return res; - } - throw new Error(res.message || '服务器开小差啦~'); -}; - -const fetchUpdateTenant = async (params: { - tenantDesc: string; // 项目简介 - tenantId: string; // 项目 - tenantName: string; // 项目名称 - owner: string; // 负责人 -}) => { - const res = await request('hippo4j/v1/cs/tenant/update', { - method: 'POST', - body: { ...params }, - }); - if (res && res.success) { - return res; - } - throw new Error(res.message || '服务器开小差啦~'); -}; - -const fetchDeleteTenant = async (id: string) => { - const url = 'hippo4j/v1/cs/item/delete/prescription/' + id; - const res = await request(url, { - method: 'DELETE', - }); - if (res && res.success) { - return res; - } - throw new Error(res.message || '服务器开小差啦~'); -}; - -export { fetchTenantOptions, fetchTenantList, fetchAddTenant, fetchDeleteTenant, fetchUpdateTenant }; diff --git a/threadpool/console-new/src/page/thread-pool-monitor/index.module.less b/threadpool/console-new/src/page/thread-pool-monitor/index.module.less deleted file mode 100644 index e69de29b..00000000 diff --git a/threadpool/console-new/src/page/thread-pool-monitor/index.tsx b/threadpool/console-new/src/page/thread-pool-monitor/index.tsx deleted file mode 100644 index ee7f0f2b..00000000 --- a/threadpool/console-new/src/page/thread-pool-monitor/index.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import * as echarts from 'echarts/core'; -import { GridComponent } from 'echarts/components'; -import { LineChart } from 'echarts/charts'; -import { UniversalTransition } from 'echarts/features'; -import { CanvasRenderer } from 'echarts/renderers'; -import { useEffect } from 'react'; -echarts.use([GridComponent, LineChart, CanvasRenderer, UniversalTransition]); - -const ThreadPoolMonitor = () => { - useEffect(() => { - let chartDom = document.getElementById('main'); - let myChart = echarts.init(chartDom); - let option; - option = { - xAxis: { - type: 'category', - data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], - }, - yAxis: { - type: 'value', - }, - series: [ - { - data: [150, 230, 224, 218, 135, 147, 260], - type: 'line', - }, - ], - }; - option && myChart.setOption(option); - }); - return
; -}; - -export default ThreadPoolMonitor; diff --git a/threadpool/console-new/src/page/thread-pool-monitor/router.ts b/threadpool/console-new/src/page/thread-pool-monitor/router.ts deleted file mode 100644 index 13e1e53b..00000000 --- a/threadpool/console-new/src/page/thread-pool-monitor/router.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IRouterList } from '@/typings'; -import ThreadPoolMonitor from '.'; - -const routerList: IRouterList[] = [ - { - path: '/echarts', - component: ThreadPoolMonitor, - }, -]; - -export default routerList; diff --git a/threadpool/console-new/src/page/thread-pool/constants.ts b/threadpool/console-new/src/page/thread-pool/constants.ts deleted file mode 100644 index 8ed76cdf..00000000 --- a/threadpool/console-new/src/page/thread-pool/constants.ts +++ /dev/null @@ -1,23 +0,0 @@ -export const QUEUE_TYPE_MAP: { [key: string]: string } = { - '1': 'ArrayBlockingQueue', - '2': 'LinkedBlockingQueue', - '3': 'LinkedBlockingDeque', - '4': 'SynchronousQueue', - '5': 'LinkedTransferQueue', - '6': 'PriorityBlockingQueue', - '9': 'ResizableLinkedBlockingQueue', -}; - -export const REJECT_TYPE_MAP: { [key: string]: string } = { - '1': 'CallerRunsPolicy', - '2': 'AbortPolicy', - '3': 'DiscardPolicy', - '4': 'DiscardOldestPolicy', - '5': 'RunsOldestTaskPolicy', - '6': 'SyncPutQueuePolicy', -}; - -export const paramsType = { project: 0, thpool: 0 }; -export const eBtnStyle = { - padding: '0 6px', -}; diff --git a/threadpool/console-new/src/page/thread-pool/index.tsx b/threadpool/console-new/src/page/thread-pool/index.tsx deleted file mode 100644 index 4072244f..00000000 --- a/threadpool/console-new/src/page/thread-pool/index.tsx +++ /dev/null @@ -1,186 +0,0 @@ -import { Button, Form, Select, Space, Switch, Table, Typography, message } from 'antd'; -import { useFormStateToUrl, useTran } from '@/hooks'; -import { STR_MAP } from '@/config/i18n/locales/constants'; -import { ColumnProps } from 'antd/es/table'; -import { SearchButton, AddButton } from '@/components/with-button'; -import { useAntdTable } from 'ahooks'; -import service from './service'; -import { Result, Record } from './type'; -import { QUEUE_TYPE_MAP, REJECT_TYPE_MAP, eBtnStyle, paramsType } from './constants'; -import { useTranslation } from 'react-i18next'; -import request from '@/utils'; -const { Title } = Typography; -const { Item } = Form; - -interface CustomTableParams { - pageSize: number; - current: number; - tpId: string; - itemId: string; -} - -const ThreadPoll = () => { - const [form] = Form.useForm(); - const { handleSetUrlState } = useFormStateToUrl<{ project: number; thpool: number }>(form, paramsType); - const { t } = useTranslation(); - - const columns: ColumnProps[] = [ - { - title: useTran(STR_MAP.SERIAL_NUMBER), - dataIndex: '', - render: (col, num, index) => { - return index + 1; - }, - fixed: 'left', - width: 80, - }, - { - title: useTran(STR_MAP.PROJECT), - dataIndex: 'tenantId', - width: 150, - }, - { - title: useTran(STR_MAP.THREAD_POOL), - dataIndex: 'tpId', - width: 150, - }, - { - title: useTran(STR_MAP.CORE_THREAD), - dataIndex: 'coreSize', - render: col => {col}, - width: 100, - }, - { - title: useTran(STR_MAP.MAXIMUM_THREAD), - dataIndex: 'maxSize', - render: col => {col}, - width: 100, - }, - { - title: useTran(STR_MAP.QUEUE_TYPE), - dataIndex: 'queueType', - render: (col: number) => QUEUE_TYPE_MAP[String(col)], - width: 150, - }, - { - title: useTran(STR_MAP.QUEUE_CAPACITY), - dataIndex: 'capacity', - width: 150, - }, - { - title: useTran(STR_MAP.REJECTION_STRATEGY), - dataIndex: 'rejectedType', - render: (col: number) => REJECT_TYPE_MAP[String(col)] ?? 'CustomRejectedPolicy_' + col, - width: 150, - }, - { - title: useTran(STR_MAP.EXECUTION_TIMEOUT), - dataIndex: 'executeTimeOut', - render: (col: number) => col ?? 0, - width: 100, - }, - { - title: useTran(STR_MAP.ALARM_OR_NOT), - dataIndex: 'isAlarm', - render: (col: number, row) => ( - handleAlarm({ id: row?.id, alarm: Number(!col) })} /> - ), - width: 100, - }, - { - title: useTran(STR_MAP.CREATION_TIME), - dataIndex: 'gmtCreate', - width: 150, - align: 'center', - }, - { - title: useTran(STR_MAP.UPDATE_TIME), - dataIndex: 'gmtModified', - width: 150, - align: 'center', - }, - { - title: useTran(STR_MAP.EDIT), - dataIndex: 'eidt', - fixed: 'right', - width: 150, - render: () => ( - <> - - - - ), - }, - ]; - - const getTableData = (params: CustomTableParams): Promise => { - const { pageSize, current } = params; - return service.fetchThreadPoolTable({ - current, - size: pageSize, - tpId: '', - itemId: '', - }); - }; - - const { tableProps, search } = useAntdTable(getTableData, { - defaultPageSize: 5, - form: form, - }); - - const { submit } = search; - - const handleAlarm = async (params: { id: string; alarm: number }) => { - const { id, alarm } = params; - request(`/hippo4j/v1/cs/thread/pool/alarm/enable/${id}/${alarm}`, { - method: 'post', - }) - .then(res => { - if (res.success) { - message.success(t(STR_MAP.ALARM_EDITING_SUCCESS)); - submit(); - } - }) - .catch(err => { - console.log('err:::', err); - }); - }; - - return ( - - {useTran(STR_MAP.THREAD_POOL_MANAGE)} -
- - - - - - - - - - - - { - submit(); - handleSetUrlState(); - }} - > - {useTran(STR_MAP.SEARCH)} - - {useTran(STR_MAP.ADD)} - - - -
- - ); -}; -export default ThreadPoll; diff --git a/threadpool/console-new/src/page/thread-pool/router.ts b/threadpool/console-new/src/page/thread-pool/router.ts deleted file mode 100644 index a981458d..00000000 --- a/threadpool/console-new/src/page/thread-pool/router.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IRouterList } from '@/typings'; -import ThreadPoll from '.'; - -const routerList: IRouterList[] = [ - { - path: '/thread-poll/index', - component: ThreadPoll, - }, -]; - -export default routerList; diff --git a/threadpool/console-new/src/page/thread-pool/service.ts b/threadpool/console-new/src/page/thread-pool/service.ts deleted file mode 100644 index c1fd99c4..00000000 --- a/threadpool/console-new/src/page/thread-pool/service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import request from '@/utils'; -import { Result, ThreadPoolTableBody, ThreadPoolTableRes } from './type'; - -const fetchThreadPoolTable = async (body: ThreadPoolTableBody): Promise => { - const { data } = await request('/hippo4j/v1/cs/thread/pool/query/page', { - method: 'POST', - body, - }); - return { - total: data?.total, - list: data?.records, - }; -}; - -export default { - fetchThreadPoolTable, -}; diff --git a/threadpool/console-new/src/page/thread-pool/type.ts b/threadpool/console-new/src/page/thread-pool/type.ts deleted file mode 100644 index 2be9b23b..00000000 --- a/threadpool/console-new/src/page/thread-pool/type.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { Params } from 'ahooks/lib/useAntdTable/types'; - -// body -export interface ThreadPoolTableBody { - /** - * current page - */ - current: number; - /** - * project id - */ - itemId?: string; - /** - * page size - */ - size: number; - /** - *tenant Id - */ - tenantId?: string; - /** - * thread pool ID - */ - tpId?: string; -} - -export interface Record { - /** - * 是否超时 - */ - allowCoreThreadTimeOut?: number; - /** - * 队列容量 - */ - capacity?: number; - /** - * 容量报警 - */ - capacityAlarm?: number; - /** - * 核心线程数 - */ - coreSize?: number; - /** - * 执行超市 - */ - executeTimeOut?: number; - /** - * 创建时间 - */ - gmtCreate?: string; - /** - * 修改时间 - */ - gmtModified?: string; - /** - * ID - */ - id: string; - /** - * 是否报警 - */ - isAlarm?: number; - /** - * 项目ID - */ - itemId?: string; - /** - * 空闲回收 - */ - keepAliveTime?: number; - /** - * 活跃度报警 - */ - livenessAlarm?: number; - /** - * 最大线程数 - */ - maxSize?: number; - /** - * 队列名称 - */ - queueName?: null; - /** - * 队列类型 - */ - queueType?: number; - /** - * 拒绝策略类型 - */ - rejectedType?: number; - /** - * 租户ID - */ - tenantId?: string; - /** - * 线程池ID - */ - tpId?: string; -} - -export interface ThreadPoolTableRes { - countId: null; - current: number; - desc: boolean; - hitCount: boolean; - itemId: string; - maxLimit: null; - optimizeCountSql: boolean; - orders: string[]; - pages: number; - records: Record[]; - searchCount: boolean; - size: number; - tenantId: string; - total: number; - tpId: string; -} - -export interface Result { - total: number; - list: Record[]; -} diff --git a/threadpool/console-new/src/page/user/create.tsx b/threadpool/console-new/src/page/user/create.tsx deleted file mode 100644 index 6a397a3b..00000000 --- a/threadpool/console-new/src/page/user/create.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import { useRequest } from 'ahooks'; -import { Form, Modal, Input, notification, Select, Checkbox, message } from 'antd'; -import React, { useEffect } from 'react'; -import { fetchAddUser, fetchUpdateUser } from './service'; -import { fetchTenantOptions } from '../tenant/service'; - -interface IProps { - type: string; - data: any; - visible: boolean; - onClose: () => void; - reset: () => void; -} - -const ROLE_OPTIONS = [ - { - label: 'ROLE_USER', - value: 'ROLE_USER', - }, - { - label: 'ROLE_ADMIN', - value: 'ROLE_ADMIN', - }, - { - label: 'ROLE_MANAGE', - value: 'ROLE_MANAGE', - }, -]; - -const UserCreate: React.FC = props => { - const { visible, onClose, data, type, reset } = props; - const [form] = Form.useForm(); - const tenantRequest = useRequest(fetchTenantOptions, { - ready: !!type, - }); - const updateRequest = useRequest(fetchUpdateUser, { - manual: true, - onSuccess: () => { - notification.success({ message: '更新成功' }); - form.resetFields(); - onClose(); - reset(); - }, - onError: err => { - message.error(err.message); - }, - }); - const addRequest = useRequest(fetchAddUser, { - manual: true, - onSuccess: () => { - notification.success({ message: '创建成功' }); - form.resetFields(); - onClose(); - reset(); - }, - onError: err => { - message.error(err.message); - }, - }); - const onSave = () => { - form - .validateFields() - .then(values => { - addRequest.run({ ...values }); - }) - .catch(info => { - console.log('Validate Failed:', info); - }); - }; - const onUpdate = () => { - form - .validateFields() - .then(values => { - updateRequest.run({ id: data.id, ...values }); - }) - .catch(info => { - console.log('Validate Failed:', info); - }); - }; - useEffect(() => { - if (type === 'edit') { - form.setFieldsValue({ - ...data, - }); - } - }, [type, data, form]); - - return ( - -
- - - - - - - - - - - - - - - - - - - - - -
- { - return ( - - - - - ); - }, - }, - ]} - /> - {editVisible && ( - search.reset()} - /> - )} - - ); -}; - -export default Tenant; diff --git a/threadpool/console-new/src/page/user/router.tsx b/threadpool/console-new/src/page/user/router.tsx deleted file mode 100644 index a84862be..00000000 --- a/threadpool/console-new/src/page/user/router.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { lazy } from 'react'; -import { IRouterList } from '@/typings'; - -const UserManage = lazy(() => import('./index')); - -const routerList: IRouterList[] = [{ path: '/user', component: () => }]; - -export default routerList; diff --git a/threadpool/console-new/src/page/user/service.ts b/threadpool/console-new/src/page/user/service.ts deleted file mode 100644 index 6c9c5e33..00000000 --- a/threadpool/console-new/src/page/user/service.ts +++ /dev/null @@ -1,84 +0,0 @@ -import request from '@/utils'; - -const fetchUserList = async ( - pageProps: { current: number; pageSize: number }, - formData: { tencent: string | number } -): Promise<{ total: number; list: Array }> => { - const res: any = await request('/hippo4j/v1/cs/auth/users/page', { - method: 'POST', - body: { - ...formData, - current: pageProps.current, - size: pageProps.pageSize, - }, - }); - if (res && res.success) { - return { - total: res.data.total, - list: res.data.records.map((item: any, index: number) => ({ index: index + 1, ...item })), - }; - } - throw new Error(res.message || '服务器开小差啦~'); -}; - -const fetchAddUser = async (params: { - password?: string; - permission?: string; - role: string; - userName: string; - tempResources: Array; - tenant: Array; - resources?: Array<{ resource: string; action: 'rw' }>; -}) => { - const { tempResources = [] } = params; - const res = await request('/hippo4j/v1/cs/auth/users/add', { - method: 'POST', - body: { - ...params, - tempResources: tempResources.length > 0 ? true : false, - resources: tempResources.map(item => ({ resource: item, action: 'rw' })), - }, - }); - - if (res && res.success) { - return res; - } - throw new Error(res.message || '服务器开小差啦~'); -}; - -const fetchUpdateUser = async (params: { - password?: string; - permission?: string; - role: string; - userName: string; - tempResources: Array; - resources?: Array<{ resource: string; action: 'rw' }>; -}) => { - const { tempResources = [] } = params; - if (tempResources.length > 0) { - params.resources = tempResources.map(item => ({ resource: item, action: 'rw' })); - } - const res = await request('/hippo4j/v1/cs/auth/users/update', { - method: 'PUT', - body: { ...params }, - }); - - if (res && res.success) { - return res; - } - throw new Error(res.message || '服务器开小差啦~'); -}; - -const fetchDeleteUser = async (id: string) => { - const url = '/hippo4j/v1/cs/auth/users/remove/' + id; - const res = await request(url, { - method: 'DELETE', - }); - - if (res && res.success) { - return res; - } - throw new Error(res.message || '服务器开小差啦~'); -}; - -export { fetchUserList, fetchAddUser, fetchDeleteUser, fetchUpdateUser }; diff --git a/threadpool/console-new/src/react-app-env.d.ts b/threadpool/console-new/src/react-app-env.d.ts deleted file mode 100644 index 817d7ec8..00000000 --- a/threadpool/console-new/src/react-app-env.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -declare module '*.less'; -declare module 'crypto-js'; diff --git a/threadpool/console-new/src/route/index.tsx b/threadpool/console-new/src/route/index.tsx deleted file mode 100644 index 082299a4..00000000 --- a/threadpool/console-new/src/route/index.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { IRouterList } from '@/typings'; -import homeRouter from '@/page/home/router'; -import aboutRouter from '@/page/about/router'; -import ThreadPoolRouter from '@/page/thread-pool/router'; -import tenantRouter from '@/page/tenant/router'; -import LoginRouter from '@/page/login/router'; -import itemRouter from '@/page/item/router'; -import userRouter from '@/page/user/router'; -import logRouter from '@/page/log/router'; -import ThreadPoolMonitorRouter from '@/page/thread-pool-monitor/router'; - -const routerList: IRouterList[] = [ - ...homeRouter, - ...aboutRouter, - ...tenantRouter, - ...ThreadPoolRouter, - ...LoginRouter, - ...itemRouter, - ...userRouter, - ...logRouter, - ...ThreadPoolMonitorRouter, -]; -export default routerList; diff --git a/threadpool/console-new/src/typings/index.ts b/threadpool/console-new/src/typings/index.ts deleted file mode 100644 index d7610df2..00000000 --- a/threadpool/console-new/src/typings/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { ReactNode } from 'react'; -import React from 'react'; - -export enum THEME_NAME { - DEFAULT = 'default', - DARK = 'dark', -} - -export enum LANG_NAME { - ZH = 'zh', - EN = 'en', -} - -export type IRouterList = { - path: string; - component: () => React.JSX.Element; -}; - -export type IMenuList = { - label: string | ReactNode; - key: string; - icon?: ReactNode; -}; - -export interface MyStoreValues { - themeName?: THEME_NAME | undefined; - lang?: LANG_NAME; - setThemeName?: (name: THEME_NAME) => void; - setLang?: (lang: LANG_NAME) => void; -} diff --git a/threadpool/console-new/src/utils/common/index.ts b/threadpool/console-new/src/utils/common/index.ts deleted file mode 100644 index ff90c55b..00000000 --- a/threadpool/console-new/src/utils/common/index.ts +++ /dev/null @@ -1,89 +0,0 @@ -import Cookie from 'js-cookie'; -import { Buffer } from 'buffer'; -import _ from 'lodash'; - -// is plain object -const TokenKey = 'Admin-Token'; -const isPlainObject = (obj: { [key: string]: any }): boolean => { - let proto, Ctor; - if (!obj || typeof obj !== 'object') return false; - proto = Object.getPrototypeOf(obj); - if (!proto) return true; - Ctor = Object.prototype.hasOwnProperty.call(proto, 'constructor') && proto.constructor; - return typeof Ctor === 'function' && Ctor === Object; // insure is new by Object or {} -}; - -const setToken = (token: string) => { - localStorage.setItem(TokenKey, token); - Cookie.set(TokenKey, token); -}; - -const removeToken = () => { - localStorage.removeItem(TokenKey); - Cookie.remove(TokenKey); -}; - -const getToken = () => { - return localStorage.getItem(TokenKey) || Cookie.get(TokenKey); -}; - -/** - * @description 忽略 object 中 value 为空的元素 - * @param obj - * @returns - */ -const filterEmptyField = (obj: { [key: string]: any }) => { - return _.omitBy(obj, isEmpty); -}; - -/** - * @description 判断基本类型是否为空 - * @param value - * @returns - */ -const isNilValue = (value: any) => { - return value === undefined || value === '' || value === null || Number.isNaN(value); -}; - -/** - * @description 判断对值「基本类型/对象」是否为空 - * @param value - * @returns - */ -const isEmpty = (value: any) => { - return typeof value === 'object' ? _.isEmpty(value) : isNilValue(value); -}; - -function genKey() { - let chars = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; - let result = ''; - for (let i = 16; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)]; - return result; -} - -async function encrypt(msg: string, key: any) { - try { - let pwd = Buffer.from(key); - const cryptoKey = await window.crypto.subtle.importKey('raw', pwd, { name: 'AES-GCM' }, false, ['encrypt']); - const iv = window.crypto.getRandomValues(new Uint8Array(12)); - const encodedMsg = new TextEncoder().encode(msg); - const encryptedData = await window.crypto.subtle.encrypt( - { - name: 'AES-GCM', - iv: iv, - }, - cryptoKey, - encodedMsg - ); - const encryptedArray = new Uint8Array(encryptedData); - const totalLength = iv.length + encryptedArray.length; - const combinedArray = new Uint8Array(totalLength); - combinedArray.set(iv); - combinedArray.set(encryptedArray, iv.length); - return btoa(String.fromCharCode(...combinedArray)); - } catch (e) { - return null; - } -} - -export { isPlainObject, isEmpty, filterEmptyField, setToken, removeToken, getToken, genKey, encrypt }; diff --git a/threadpool/console-new/src/utils/index.ts b/threadpool/console-new/src/utils/index.ts deleted file mode 100644 index 15fcf852..00000000 --- a/threadpool/console-new/src/utils/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import request from './request'; -export * from './common'; -export default request; diff --git a/threadpool/console-new/src/utils/request/index.ts b/threadpool/console-new/src/utils/request/index.ts deleted file mode 100644 index 8be98ef4..00000000 --- a/threadpool/console-new/src/utils/request/index.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { getToken, isPlainObject } from '../common'; -import { notification, message } from 'antd'; -import Qs from 'qs'; - -type HttpMethods = 'POST' | 'post' | 'GET' | 'get' | 'DELETE' | 'delete' | 'PUT' | 'put'; - -interface HeaderConfig extends Record { - Accept?: string; - 'Content-Type'?: string; -} - -interface RequestOptions { - headers?: HeaderConfig; - method?: HttpMethods; - params?: { [key: string]: any } | null; - body?: { [key: string]: any } | null; - timeout?: number; - credentials?: boolean; - moda?: 'cors' | 'same-origin'; - cache?: 'no-cache' | 'default' | 'force-cache'; - customize?: boolean; - responseType?: 'TEXT' | 'JSON' | 'BLOB' | 'ARRAYBUFFER'; -} - -type Response = { - success: boolean; - data: T; - module?: T; - msg?: string; - status?: number; - message?: string; - code?: string | number; -}; - -let baseURL = ''; - -const inital: RequestOptions = { - method: 'GET', - params: null, - body: null, - headers: { - 'Content-Type': 'application/json', - }, - // headers, - credentials: true, - responseType: 'JSON', - cache: 'no-cache', -}; -const env = process.env.NODE_ENV || 'development'; - -enum IENV_ENUM { - DEVELOPMENT = 'development', - TEST = 'test', - PRODUCTION = 'production', -} - -switch (env) { - case IENV_ENUM.DEVELOPMENT: - baseURL = ''; - break; - case IENV_ENUM.TEST: - baseURL = ''; - break; - case IENV_ENUM.PRODUCTION: - baseURL = ''; - break; -} - -const codeMessage: { [key: string]: string } = { - '200': '请求已成功被服务器处理,并返回了请求的内容。', - '201': '请求已成功,并且服务器创建了一个新的资源作为响应。', - '202': '一个请求已进入后台排队', - '204': '请求已成功处理,但响应中没有返回任何内容。', - '400': '客户端发送的请求有错误,服务器无法处理。', - '401': '客户端需要提供有效的身份验证信息,以便访问受保护的资源。', - '403': '服务器理解了请求,但拒绝执行该请求。', - '404': '服务器未找到请求的资源。', - '500': '服务器在处理请求时发生了未知的错误。', -}; - -function request(url: string, config: RequestOptions): Promise> { - if (config === null || typeof config !== 'object') { - config = {}; - } - if (config.headers && isPlainObject(config.headers)) { - config.headers = Object.assign({}, inital.headers, config.headers); - if (!config.headers?.Authorization) { - config.headers.Authorization = getToken(); - } - } else { - config.headers = { Authorization: getToken(), 'Content-Type': 'application/json' }; - } - - let { method, params, body, headers, credentials, responseType } = Object.assign({}, inital, config) as any; - if (typeof url !== 'string') throw new TypeError('url is not an string'); - if (!/^http(s?):\/\//i.test(url)) url = baseURL + url; - if (params !== null) { - if (isPlainObject(params)) { - params = Qs.stringify(params); - } - url += `${url.includes('?') ? '&' : '?'}${params}`; - } - if (body !== null) { - if (isPlainObject(body)) { - let contentType = headers['Content-Type'] || 'application/json'; - if (contentType.includes('urlencoded')) body = Qs.stringify(body); - if (contentType.includes('json')) body = JSON.stringify(body); - } - } - credentials = credentials ? 'include' : 'same-origin'; - method = method.toUpperCase(); - responseType = responseType.toUpperCase(); - config = { - ...config, - method, - credentials, - responseType, - }; - if (/^(POST|PUT|PATCH)$/i.test(method)) { - config.body = body; - } else { - config.body = null; - } - - return fetch(url, config as any).then(function onfulfilled(response) { - let { status, statusText } = response; - if (status >= 200 && status < 400) { - let result; - switch (responseType) { - case 'TEXT': - result = response.text(); - break; - case 'JSON': - result = response.json(); - break; - case 'BLOB': - result = response.blob(); - break; - case 'ARRAYBUFFER': - result = response.arrayBuffer(); - break; - } - result?.then(res => { - if (!res?.success) { - notification.error({ - message: res.message, - }); - } - }); - return result; - } - let tip = codeMessage[String(status)]; - notification.error({ - message: tip, - }); - return Promise.reject({ - code: 'STATUS ERROR', - status, - statusText, - }).catch(function onrejected(reason) { - if (!navigator.onLine) { - message.error('好像断网了'); - } - return Promise.reject(reason); - }); - }); -} - -export default request; diff --git a/threadpool/console-new/tsconfig.json b/threadpool/console-new/tsconfig.json deleted file mode 100644 index aa0b6d24..00000000 --- a/threadpool/console-new/tsconfig.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "compilerOptions": { - "target": "es2015", - "lib": ["dom", "dom.iterable", "esnext"], - "typeRoots": ["node_modules/@types", "src/typings"], - "allowJs": true, - "skipLibCheck": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "baseUrl": "./", - "paths": { - // 路径映射,相对于baseUrl - "@/*": ["src/*"] - } - }, - "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx"] -} diff --git a/threadpool/console-new/yarn.lock b/threadpool/console-new/yarn.lock deleted file mode 100644 index 733dd0f8..00000000 --- a/threadpool/console-new/yarn.lock +++ /dev/null @@ -1,11216 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@adobe/css-tools@^4.0.1": - version "4.3.1" - resolved "https://registry.npmmirror.com/@adobe/css-tools/-/css-tools-4.3.1.tgz#abfccb8ca78075a2b6187345c26243c1a0842f28" - integrity sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg== - -"@ahooksjs/use-url-state@^3.5.1": - version "3.5.1" - resolved "https://registry.npmmirror.com/@ahooksjs/use-url-state/-/use-url-state-3.5.1.tgz#c3ad04e98cbcbc8f9eba476bcbd3237e9809aa5b" - integrity sha512-XTrOLZKOAXahDD1Evg+aSN6qNzoh/FuvRKbUtB/0RhYvz57tyXRPbED0KXK4h2C3ZyHUKBJcVCSDcd6EsTyMyQ== - dependencies: - ahooks "^3.4.1" - query-string "^6.9.0" - tslib "^2.4.1" - -"@alloc/quick-lru@^5.2.0": - version "5.2.0" - resolved "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" - integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@ant-design/colors@^7.0.0": - version "7.0.0" - resolved "https://registry.npmmirror.com/@ant-design/colors/-/colors-7.0.0.tgz#eb7eecead124c3533aea05d61254f0a17f2b61b3" - integrity sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg== - dependencies: - "@ctrl/tinycolor" "^3.4.0" - -"@ant-design/cssinjs@^1.16.0", "@ant-design/cssinjs@^1.16.1": - version "1.17.0" - resolved "https://registry.npmmirror.com/@ant-design/cssinjs/-/cssinjs-1.17.0.tgz#a3f69cf5131539b76ccdbfced43d242557599fea" - integrity sha512-MgGCZ6sfD3yQB0XW0hN4jgixMxApTlDYyct+pc7fRZNO4CaqWWm/9iXkkljNR27lyWLZmm+XiDfcIOo1bnrnMA== - dependencies: - "@babel/runtime" "^7.11.1" - "@emotion/hash" "^0.8.0" - "@emotion/unitless" "^0.7.5" - classnames "^2.3.1" - csstype "^3.0.10" - rc-util "^5.35.0" - stylis "^4.0.13" - -"@ant-design/happy-work-theme@^1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@ant-design/happy-work-theme/-/happy-work-theme-1.0.0.tgz#b18e2d2cb37df496def5c5773c146885c6cac87c" - integrity sha512-BKuz5PZkGZwXqzDwTE9fiHYlpKdDyoGnApEih2MG1GF79/a/YekxBc4tdqocykDtWzt3z1wwmHv8AiB7EUTWsQ== - dependencies: - "@ant-design/cssinjs" "^1.16.1" - "@babel/runtime" "^7.18.3" - "@ctrl/tinycolor" "^3.6.0" - classnames "^2.3.2" - rc-motion "^2.7.3" - rc-util "^5.33.0" - -"@ant-design/icons-svg@^4.3.0": - version "4.3.1" - resolved "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz#4b2f65a17d4d32b526baa6414aca2117382bf8da" - integrity sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g== - -"@ant-design/icons@^5.2.2", "@ant-design/icons@^5.2.6": - version "5.2.6" - resolved "https://registry.npmmirror.com/@ant-design/icons/-/icons-5.2.6.tgz#2d4a9a37f531eb2a20cebec01d6fb69cf593900d" - integrity sha512-4wn0WShF43TrggskBJPRqCD0fcHbzTYjnaoskdiJrVHg86yxoZ8ZUqsXvyn4WUqehRiFKnaclOhqk9w4Ui2KVw== - dependencies: - "@ant-design/colors" "^7.0.0" - "@ant-design/icons-svg" "^4.3.0" - "@babel/runtime" "^7.11.2" - classnames "^2.2.6" - rc-util "^5.31.1" - -"@ant-design/react-slick@~1.0.0": - version "1.0.2" - resolved "https://registry.npmmirror.com/@ant-design/react-slick/-/react-slick-1.0.2.tgz#241bb412aeacf7ff5d50c61fa5db66773fde6b56" - integrity sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ== - dependencies: - "@babel/runtime" "^7.10.4" - classnames "^2.2.5" - json2mq "^0.2.0" - resize-observer-polyfill "^1.5.1" - throttle-debounce "^5.0.0" - -"@apideck/better-ajv-errors@^0.3.1": - version "0.3.6" - resolved "https://registry.npmmirror.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz#957d4c28e886a64a8141f7522783be65733ff097" - integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== - dependencies: - json-schema "^0.4.0" - jsonpointer "^5.0.0" - leven "^3.1.0" - -"@babel/cli@^7.21.0": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/cli/-/cli-7.23.0.tgz#1d7f37c44d4117c67df46749e0c86e11a58cc64b" - integrity sha512-17E1oSkGk2IwNILM4jtfAvgjt+ohmpfBky8aLerUfYZhiPNg7ca+CRCxZn8QDxwNhV/upsc2VHBCqGFIR+iBfA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.17" - commander "^4.0.1" - convert-source-map "^2.0.0" - fs-readdir-recursive "^1.1.0" - glob "^7.2.0" - make-dir "^2.1.0" - slash "^2.0.0" - optionalDependencies: - "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" - chokidar "^3.4.0" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.8.3": - version "7.22.13" - resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== - dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" - -"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.20", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.22.20" - resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" - integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== - -"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.21.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/core/-/core-7.23.0.tgz#f8259ae0e52a123eb40f552551e647b506a94d83" - integrity sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.0" - "@babel/parser" "^7.23.0" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.0" - "@babel/types" "^7.23.0" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/eslint-parser@^7.16.3": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz#263f059c476e29ca4972481a17b8b660cb025a34" - integrity sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg== - dependencies: - "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" - eslint-visitor-keys "^2.1.0" - semver "^6.3.1" - -"@babel/generator@^7.23.0", "@babel/generator@^7.7.2": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== - dependencies: - "@babel/types" "^7.23.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" - integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== - dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" - integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.15" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - semver "^6.3.1" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" - integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - regexpu-core "^5.3.1" - semver "^6.3.1" - -"@babel/helper-define-polyfill-provider@^0.4.2": - version "0.4.2" - resolved "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" - integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== - dependencies: - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-plugin-utils" "^7.22.5" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - -"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": - version "7.22.20" - resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-member-expression-to-functions@^7.22.15": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" - integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== - dependencies: - "@babel/types" "^7.23.0" - -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-optimise-call-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" - integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": - version "7.22.20" - resolved "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" - integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-wrap-function" "^7.22.20" - -"@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": - version "7.22.20" - resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" - integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-member-expression-to-functions" "^7.22.15" - "@babel/helper-optimise-call-expression" "^7.22.5" - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" - integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.22.15": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== - -"@babel/helper-wrap-function@^7.22.20": - version "7.22.20" - resolved "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" - integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== - dependencies: - "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.15" - "@babel/types" "^7.22.19" - -"@babel/helpers@^7.23.0": - version "7.23.1" - resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15" - integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== - dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.0" - "@babel/types" "^7.23.0" - -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0", "@babel/parser@^7.7.0": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" - integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" - integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.15" - -"@babel/plugin-external-helpers@^7.18.6": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.22.5.tgz#92b0705b74756123f289388320e0e12c407fdf9a" - integrity sha512-ngnNEWxmykPk82mH4ajZT0qTztr3Je6hrMuKAslZVM8G1YZTENJSYwrIGtt6KOtznug3exmAtF4so/nPqJuA4A== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-decorators@^7.16.4": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.0.tgz#66d9014173b3267a9ced3e69935138bc64ffb5c8" - integrity sha512-kYsT+f5ARWF6AdFmqoEEp+hpqxEB8vGmRWfw2aj78M2vTwS2uHW91EF58iFm1Z9U8Y/RrLu2XKJn46P9ca1b0w== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.20" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/plugin-syntax-decorators" "^7.22.10" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.16.0": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-proposal-optional-chaining@^7.16.0": - version "7.21.0" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.16.0": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": - version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" - integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-decorators@^7.22.10": - version "7.22.10" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz#7d83ea04d893c442b78ebf4c3cbac59a7211deff" - integrity sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-flow@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz#163b820b9e7696ce134df3ee716d9c0c98035859" - integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-import-assertions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" - integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-import-attributes@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" - integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.22.5", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" - integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-async-generator-functions@^7.22.15": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz#3b153af4a6b779f340d5b80d3f634f55820aefa3" - integrity sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-transform-async-to-generator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" - integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== - dependencies: - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" - -"@babel/plugin-transform-block-scoped-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" - integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-block-scoping@^7.22.15": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" - integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-class-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" - integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-class-static-block@^7.22.11": - version "7.22.11" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" - integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.11" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-transform-classes@^7.22.15": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" - integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" - "@babel/helper-split-export-declaration" "^7.22.6" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" - integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.5" - -"@babel/plugin-transform-destructuring@^7.22.15": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" - integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-dotall-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" - integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-duplicate-keys@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" - integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-dynamic-import@^7.22.11": - version "7.22.11" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" - integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-transform-exponentiation-operator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" - integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-export-namespace-from@^7.22.11": - version "7.22.11" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" - integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-transform-flow-strip-types@^7.16.0": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz#0bb17110c7bf5b35a60754b2f00c58302381dee2" - integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-flow" "^7.22.5" - -"@babel/plugin-transform-for-of@^7.22.15": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" - integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" - integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== - dependencies: - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-json-strings@^7.22.11": - version "7.22.11" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" - integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-transform-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" - integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-logical-assignment-operators@^7.22.11": - version "7.22.11" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" - integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-transform-member-expression-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" - integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-modules-amd@^7.22.5": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" - integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== - dependencies: - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-modules-commonjs@^7.22.15", "@babel/plugin-transform-modules-commonjs@^7.23.0": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" - integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== - dependencies: - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - -"@babel/plugin-transform-modules-systemjs@^7.22.11": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" - integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== - dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/plugin-transform-modules-umd@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" - integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== - dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" - integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-new-target@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" - integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": - version "7.22.11" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" - integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-transform-numeric-separator@^7.22.11": - version "7.22.11" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" - integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-transform-object-rest-spread@^7.22.15": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" - integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== - dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.15" - -"@babel/plugin-transform-object-super@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" - integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" - -"@babel/plugin-transform-optional-catch-binding@^7.22.11": - version "7.22.11" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" - integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-transform-optional-chaining@^7.22.15": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" - integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.22.15": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" - integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-private-methods@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" - integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-private-property-in-object@^7.22.11": - version "7.22.11" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" - integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.11" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" - integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-react-constant-elements@^7.12.1": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz#6dfa7c1c37f7d7279e417ceddf5a04abb8bb9c29" - integrity sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" - integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-react-jsx-development@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" - integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.22.5" - -"@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6" - integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/types" "^7.22.15" - -"@babel/plugin-transform-react-pure-annotations@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" - integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-regenerator@^7.22.10": - version "7.22.10" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" - integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - regenerator-transform "^0.15.2" - -"@babel/plugin-transform-reserved-words@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" - integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-runtime@^7.16.4": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz#3a625c4c05a39e932d7d34f5d4895cdd0172fdc9" - integrity sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g== - dependencies: - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.5" - babel-plugin-polyfill-corejs3 "^0.8.3" - babel-plugin-polyfill-regenerator "^0.5.2" - semver "^6.3.1" - -"@babel/plugin-transform-shorthand-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" - integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-spread@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" - integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - -"@babel/plugin-transform-sticky-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" - integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-template-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" - integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-typeof-symbol@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" - integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-typescript@^7.22.15": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" - integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-typescript" "^7.22.5" - -"@babel/plugin-transform-unicode-escapes@^7.22.10": - version "7.22.10" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" - integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-unicode-property-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" - integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-unicode-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" - integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-unicode-sets-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" - integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.20.2": - version "7.22.20" - resolved "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.22.20.tgz#de9e9b57e1127ce0a2f580831717f7fb677ceedb" - integrity sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg== - dependencies: - "@babel/compat-data" "^7.22.20" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.22.5" - "@babel/plugin-syntax-import-attributes" "^7.22.5" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.22.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.15" - "@babel/plugin-transform-async-to-generator" "^7.22.5" - "@babel/plugin-transform-block-scoped-functions" "^7.22.5" - "@babel/plugin-transform-block-scoping" "^7.22.15" - "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-class-static-block" "^7.22.11" - "@babel/plugin-transform-classes" "^7.22.15" - "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.22.15" - "@babel/plugin-transform-dotall-regex" "^7.22.5" - "@babel/plugin-transform-duplicate-keys" "^7.22.5" - "@babel/plugin-transform-dynamic-import" "^7.22.11" - "@babel/plugin-transform-exponentiation-operator" "^7.22.5" - "@babel/plugin-transform-export-namespace-from" "^7.22.11" - "@babel/plugin-transform-for-of" "^7.22.15" - "@babel/plugin-transform-function-name" "^7.22.5" - "@babel/plugin-transform-json-strings" "^7.22.11" - "@babel/plugin-transform-literals" "^7.22.5" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" - "@babel/plugin-transform-member-expression-literals" "^7.22.5" - "@babel/plugin-transform-modules-amd" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.15" - "@babel/plugin-transform-modules-systemjs" "^7.22.11" - "@babel/plugin-transform-modules-umd" "^7.22.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.22.5" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" - "@babel/plugin-transform-numeric-separator" "^7.22.11" - "@babel/plugin-transform-object-rest-spread" "^7.22.15" - "@babel/plugin-transform-object-super" "^7.22.5" - "@babel/plugin-transform-optional-catch-binding" "^7.22.11" - "@babel/plugin-transform-optional-chaining" "^7.22.15" - "@babel/plugin-transform-parameters" "^7.22.15" - "@babel/plugin-transform-private-methods" "^7.22.5" - "@babel/plugin-transform-private-property-in-object" "^7.22.11" - "@babel/plugin-transform-property-literals" "^7.22.5" - "@babel/plugin-transform-regenerator" "^7.22.10" - "@babel/plugin-transform-reserved-words" "^7.22.5" - "@babel/plugin-transform-shorthand-properties" "^7.22.5" - "@babel/plugin-transform-spread" "^7.22.5" - "@babel/plugin-transform-sticky-regex" "^7.22.5" - "@babel/plugin-transform-template-literals" "^7.22.5" - "@babel/plugin-transform-typeof-symbol" "^7.22.5" - "@babel/plugin-transform-unicode-escapes" "^7.22.10" - "@babel/plugin-transform-unicode-property-regex" "^7.22.5" - "@babel/plugin-transform-unicode-regex" "^7.22.5" - "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" - "@babel/preset-modules" "0.1.6-no-external-plugins" - "@babel/types" "^7.22.19" - babel-plugin-polyfill-corejs2 "^0.4.5" - babel-plugin-polyfill-corejs3 "^0.8.3" - babel-plugin-polyfill-regenerator "^0.5.2" - core-js-compat "^3.31.0" - semver "^6.3.1" - -"@babel/preset-modules@0.1.6-no-external-plugins": - version "0.1.6-no-external-plugins" - resolved "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" - integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0", "@babel/preset-react@^7.18.6": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/preset-react/-/preset-react-7.22.15.tgz#9a776892b648e13cc8ca2edf5ed1264eea6b6afc" - integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-transform-react-display-name" "^7.22.5" - "@babel/plugin-transform-react-jsx" "^7.22.15" - "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.22.5" - -"@babel/preset-typescript@^7.16.0", "@babel/preset-typescript@^7.21.0": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz#cc6602d13e7e5b2087c811912b87cf937a9129d9" - integrity sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.23.0" - "@babel/plugin-transform-typescript" "^7.22.15" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - -"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.19.4", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.15", "@babel/runtime@^7.22.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.23.1" - resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.1.tgz#72741dc4d413338a91dcb044a86f3c0bc402646d" - integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/traverse@^7.21.2", "@babel/traverse@^7.23.0", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" - integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.23.0" - resolved "https://registry.npmmirror.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@craco/craco@^7.1.0": - version "7.1.0" - resolved "https://registry.npmmirror.com/@craco/craco/-/craco-7.1.0.tgz#12bd394c7f0334e214302e4d35a1768f68042fbb" - integrity sha512-oRAcPIKYrfPXp9rSzlsDNeOaVtDiKhoyqSXUoqiK24jCkHr4T8m/a2f74yXIzCbIheoUWDOIfWZyRgFgT+cpqA== - dependencies: - autoprefixer "^10.4.12" - cosmiconfig "^7.0.1" - cosmiconfig-typescript-loader "^1.0.0" - cross-spawn "^7.0.3" - lodash "^4.17.21" - semver "^7.3.7" - webpack-merge "^5.8.0" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@csstools/normalize.css@*": - version "12.0.0" - resolved "https://registry.npmmirror.com/@csstools/normalize.css/-/normalize.css-12.0.0.tgz#a9583a75c3f150667771f30b60d9f059473e62c4" - integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg== - -"@csstools/postcss-cascade-layers@^1.1.1": - version "1.1.1" - resolved "https://registry.npmmirror.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz#8a997edf97d34071dd2e37ea6022447dd9e795ad" - integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== - dependencies: - "@csstools/selector-specificity" "^2.0.2" - postcss-selector-parser "^6.0.10" - -"@csstools/postcss-color-function@^1.1.1": - version "1.1.1" - resolved "https://registry.npmmirror.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz#2bd36ab34f82d0497cfacdc9b18d34b5e6f64b6b" - integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -"@csstools/postcss-font-format-keywords@^1.0.1": - version "1.0.1" - resolved "https://registry.npmmirror.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a" - integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-hwb-function@^1.0.2": - version "1.0.2" - resolved "https://registry.npmmirror.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b" - integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-ic-unit@^1.0.1": - version "1.0.1" - resolved "https://registry.npmmirror.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz#28237d812a124d1a16a5acc5c3832b040b303e58" - integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -"@csstools/postcss-is-pseudo-class@^2.0.7": - version "2.0.7" - resolved "https://registry.npmmirror.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1" - integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== - dependencies: - "@csstools/selector-specificity" "^2.0.0" - postcss-selector-parser "^6.0.10" - -"@csstools/postcss-nested-calc@^1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz#d7e9d1d0d3d15cf5ac891b16028af2a1044d0c26" - integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-normalize-display-values@^1.0.1": - version "1.0.1" - resolved "https://registry.npmmirror.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3" - integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-oklab-function@^1.1.1": - version "1.1.1" - resolved "https://registry.npmmirror.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz#88cee0fbc8d6df27079ebd2fa016ee261eecf844" - integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": - version "1.3.0" - resolved "https://registry.npmmirror.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa" - integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-stepped-value-functions@^1.0.1": - version "1.0.1" - resolved "https://registry.npmmirror.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz#f8772c3681cc2befed695e2b0b1d68e22f08c4f4" - integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-text-decoration-shorthand@^1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz#ea96cfbc87d921eca914d3ad29340d9bcc4c953f" - integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-trigonometric-functions@^1.0.2": - version "1.0.2" - resolved "https://registry.npmmirror.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz#94d3e4774c36d35dcdc88ce091336cb770d32756" - integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-unset-value@^1.0.2": - version "1.0.2" - resolved "https://registry.npmmirror.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz#c99bb70e2cdc7312948d1eb41df2412330b81f77" - integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== - -"@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": - version "2.2.0" - resolved "https://registry.npmmirror.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" - integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== - -"@ctrl/tinycolor@^3.4.0", "@ctrl/tinycolor@^3.6.0": - version "3.6.1" - resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31" - integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA== - -"@emotion/hash@^0.8.0": - version "0.8.0" - resolved "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== - -"@emotion/is-prop-valid@^1.2.1": - version "1.2.1" - resolved "https://registry.npmmirror.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" - integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== - dependencies: - "@emotion/memoize" "^0.8.1" - -"@emotion/memoize@^0.8.1": - version "0.8.1" - resolved "https://registry.npmmirror.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" - integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== - -"@emotion/unitless@^0.7.5": - version "0.7.5" - resolved "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@emotion/unitless@^0.8.0": - version "0.8.1" - resolved "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" - integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.8.2" - resolved "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.8.2.tgz#26585b7c0ba36362893d3a3c206ee0c57c389616" - integrity sha512-0MGxAVt1m/ZK+LTJp/j0qF7Hz97D9O/FH9Ms3ltnyIdDD57cbb1ACIQTkbHvNXtWDv5TPq7w5Kq56+cNukbo7g== - -"@eslint/eslintrc@^2.1.2": - version "2.1.2" - resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" - integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.50.0": - version "8.50.0" - resolved "https://registry.npmmirror.com/@eslint/js/-/js-8.50.0.tgz#9e93b850f0f3fa35f5fa59adfd03adae8488e484" - integrity sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ== - -"@humanwhocodes/config-array@^0.11.11": - version "0.11.11" - resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" - integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^27.5.1": - version "27.5.1" - resolved "https://registry.npmmirror.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" - integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - -"@jest/console@^28.1.3": - version "28.1.3" - resolved "https://registry.npmmirror.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" - integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - slash "^3.0.0" - -"@jest/core@^27.5.1": - version "27.5.1" - resolved "https://registry.npmmirror.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" - integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/reporters" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^27.5.1" - jest-config "^27.5.1" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-resolve-dependencies "^27.5.1" - jest-runner "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - jest-watcher "^27.5.1" - micromatch "^4.0.4" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^27.5.1": - version "27.5.1" - resolved "https://registry.npmmirror.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" - integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== - dependencies: - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.npmmirror.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/fake-timers@^27.5.1": - version "27.5.1" - resolved "https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" - integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== - dependencies: - "@jest/types" "^27.5.1" - "@sinonjs/fake-timers" "^8.0.1" - "@types/node" "*" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -"@jest/globals@^27.5.1": - version "27.5.1" - resolved "https://registry.npmmirror.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" - integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/types" "^27.5.1" - expect "^27.5.1" - -"@jest/reporters@^27.5.1": - version "27.5.1" - resolved "https://registry.npmmirror.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" - integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-haste-map "^27.5.1" - jest-resolve "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^8.1.0" - -"@jest/schemas@^28.1.3": - version "28.1.3" - resolved "https://registry.npmmirror.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" - integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== - dependencies: - "@sinclair/typebox" "^0.24.1" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/source-map@^27.5.1": - version "27.5.1" - resolved "https://registry.npmmirror.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" - integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.9" - source-map "^0.6.0" - -"@jest/test-result@^27.5.1": - version "27.5.1" - resolved "https://registry.npmmirror.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" - integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== - dependencies: - "@jest/console" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-result@^28.1.3": - version "28.1.3" - resolved "https://registry.npmmirror.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" - integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== - dependencies: - "@jest/console" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^27.5.1": - version "27.5.1" - resolved "https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" - integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== - dependencies: - "@jest/test-result" "^27.5.1" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-runtime "^27.5.1" - -"@jest/transform@^27.5.1": - version "27.5.1" - resolved "https://registry.npmmirror.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" - integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.5.1" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-regex-util "^27.5.1" - jest-util "^27.5.1" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.npmmirror.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - -"@jest/types@^28.1.3": - version "28.1.3" - resolved "https://registry.npmmirror.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" - integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== - dependencies: - "@jest/schemas" "^28.1.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.npmmirror.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== - -"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": - version "2.1.8-no-fsevents.3" - resolved "https://registry.npmmirror.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" - integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== - -"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": - version "5.1.1-v1" - resolved "https://registry.npmmirror.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" - integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== - dependencies: - eslint-scope "5.1.1" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@pmmmwh/react-refresh-webpack-plugin@^0.5.3": - version "0.5.11" - resolved "https://registry.npmmirror.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz#7c2268cedaa0644d677e8c4f377bc8fb304f714a" - integrity sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ== - dependencies: - ansi-html-community "^0.0.8" - common-path-prefix "^3.0.0" - core-js-pure "^3.23.3" - error-stack-parser "^2.0.6" - find-up "^5.0.0" - html-entities "^2.1.0" - loader-utils "^2.0.4" - schema-utils "^3.0.0" - source-map "^0.7.3" - -"@rc-component/color-picker@~1.4.1": - version "1.4.1" - resolved "https://registry.npmmirror.com/@rc-component/color-picker/-/color-picker-1.4.1.tgz#dcab0b660e9c4ed63a7582db68ed4a77c862cb93" - integrity sha512-vh5EWqnsayZa/JwUznqDaPJz39jznx/YDbyBuVJntv735tKXKwEUZZb2jYEldOg+NKWZwtALjGMrNeGBmqFoEw== - dependencies: - "@babel/runtime" "^7.10.1" - "@ctrl/tinycolor" "^3.6.0" - classnames "^2.2.6" - rc-util "^5.30.0" - -"@rc-component/context@^1.4.0": - version "1.4.0" - resolved "https://registry.npmmirror.com/@rc-component/context/-/context-1.4.0.tgz#dc6fb021d6773546af8f016ae4ce9aea088395e8" - integrity sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w== - dependencies: - "@babel/runtime" "^7.10.1" - rc-util "^5.27.0" - -"@rc-component/mini-decimal@^1.0.1": - version "1.1.0" - resolved "https://registry.npmmirror.com/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz#7b7a362b14a0a54cb5bc6fd2b82731f29f11d9b0" - integrity sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ== - dependencies: - "@babel/runtime" "^7.18.0" - -"@rc-component/mutate-observer@^1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz#ee53cc88b78aade3cd0653609215a44779386fd8" - integrity sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw== - dependencies: - "@babel/runtime" "^7.18.0" - classnames "^2.3.2" - rc-util "^5.24.4" - -"@rc-component/portal@^1.0.0-8", "@rc-component/portal@^1.0.0-9", "@rc-component/portal@^1.0.2", "@rc-component/portal@^1.1.0", "@rc-component/portal@^1.1.1": - version "1.1.2" - resolved "https://registry.npmmirror.com/@rc-component/portal/-/portal-1.1.2.tgz#55db1e51d784e034442e9700536faaa6ab63fc71" - integrity sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg== - dependencies: - "@babel/runtime" "^7.18.0" - classnames "^2.3.2" - rc-util "^5.24.4" - -"@rc-component/tour@~1.10.0": - version "1.10.0" - resolved "https://registry.npmmirror.com/@rc-component/tour/-/tour-1.10.0.tgz#b05bc327438f1c583439e2d2dcc10ec0530aea19" - integrity sha512-voV0BKaTJbewB9LLgAHQ7tAGG7rgDkKQkZo82xw2gIk542hY+o7zwoqdN16oHhIKk7eG/xi+mdXrONT62Dt57A== - dependencies: - "@babel/runtime" "^7.18.0" - "@rc-component/portal" "^1.0.0-9" - "@rc-component/trigger" "^1.3.6" - classnames "^2.3.2" - rc-util "^5.24.4" - -"@rc-component/trigger@^1.0.4", "@rc-component/trigger@^1.16.0", "@rc-component/trigger@^1.3.6", "@rc-component/trigger@^1.5.0", "@rc-component/trigger@^1.6.2", "@rc-component/trigger@^1.7.0": - version "1.17.0" - resolved "https://registry.npmmirror.com/@rc-component/trigger/-/trigger-1.17.0.tgz#4d9522ae3ceb482dc4c35cbb1f84021bd94d7414" - integrity sha512-KN+lKHCi7L4kjuA9DU2PnwZxtIyes6R1wsexp0/Rnjr/ITELsPuC9kpzDK1+7AZMarDXUAHUdDGS2zUNEx2P0g== - dependencies: - "@babel/runtime" "^7.18.3" - "@rc-component/portal" "^1.1.0" - classnames "^2.3.2" - rc-align "^4.0.0" - rc-motion "^2.0.0" - rc-resize-observer "^1.3.1" - rc-util "^5.33.0" - -"@remix-run/router@1.9.0": - version "1.9.0" - resolved "https://registry.npmmirror.com/@remix-run/router/-/router-1.9.0.tgz#9033238b41c4cbe1e961eccb3f79e2c588328cf6" - integrity sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA== - -"@rollup/plugin-babel@^5.2.0": - version "5.3.1" - resolved "https://registry.npmmirror.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" - integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@rollup/pluginutils" "^3.1.0" - -"@rollup/plugin-node-resolve@^11.2.1": - version "11.2.1" - resolved "https://registry.npmmirror.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60" - integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - "@types/resolve" "1.17.1" - builtin-modules "^3.1.0" - deepmerge "^4.2.2" - is-module "^1.0.0" - resolve "^1.19.0" - -"@rollup/plugin-replace@^2.4.1": - version "2.4.2" - resolved "https://registry.npmmirror.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" - integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - magic-string "^0.25.7" - -"@rollup/pluginutils@^3.1.0": - version "3.1.0" - resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" - integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== - dependencies: - "@types/estree" "0.0.39" - estree-walker "^1.0.1" - picomatch "^2.2.2" - -"@rushstack/eslint-patch@^1.1.0": - version "1.5.0" - resolved "https://registry.npmmirror.com/@rushstack/eslint-patch/-/eslint-patch-1.5.0.tgz#5143b0da9c536bfe8beddfeb68bb8b5d647cc7a3" - integrity sha512-EF3948ckf3f5uPgYbQ6GhyA56Dmv8yg0+ir+BroRjwdxyZJsekhZzawOecC2rOTPCz173t7ZcR1HHZu0dZgOCw== - -"@sinclair/typebox@^0.24.1": - version "0.24.51" - resolved "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" - integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sinonjs/commons@^1.7.0": - version "1.8.6" - resolved "https://registry.npmmirror.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" - integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^8.0.1": - version "8.1.0" - resolved "https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" - integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@surma/rollup-plugin-off-main-thread@^2.2.3": - version "2.2.3" - resolved "https://registry.npmmirror.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" - integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== - dependencies: - ejs "^3.1.6" - json5 "^2.2.0" - magic-string "^0.25.0" - string.prototype.matchall "^4.0.6" - -"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": - version "5.4.0" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" - integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== - -"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": - version "5.4.0" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" - integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== - -"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": - version "5.0.1" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" - integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== - -"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": - version "5.0.1" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" - integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== - -"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": - version "5.4.0" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" - integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== - -"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": - version "5.4.0" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" - integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== - -"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": - version "5.4.0" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" - integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== - -"@svgr/babel-plugin-transform-svg-component@^5.5.0": - version "5.5.0" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" - integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== - -"@svgr/babel-preset@^5.5.0": - version "5.5.0" - resolved "https://registry.npmmirror.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" - integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" - "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" - "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" - "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" - "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" - "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" - "@svgr/babel-plugin-transform-svg-component" "^5.5.0" - -"@svgr/core@^5.5.0": - version "5.5.0" - resolved "https://registry.npmmirror.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" - integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== - dependencies: - "@svgr/plugin-jsx" "^5.5.0" - camelcase "^6.2.0" - cosmiconfig "^7.0.0" - -"@svgr/hast-util-to-babel-ast@^5.5.0": - version "5.5.0" - resolved "https://registry.npmmirror.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" - integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== - dependencies: - "@babel/types" "^7.12.6" - -"@svgr/plugin-jsx@^5.5.0": - version "5.5.0" - resolved "https://registry.npmmirror.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" - integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== - dependencies: - "@babel/core" "^7.12.3" - "@svgr/babel-preset" "^5.5.0" - "@svgr/hast-util-to-babel-ast" "^5.5.0" - svg-parser "^2.0.2" - -"@svgr/plugin-svgo@^5.5.0": - version "5.5.0" - resolved "https://registry.npmmirror.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" - integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== - dependencies: - cosmiconfig "^7.0.0" - deepmerge "^4.2.2" - svgo "^1.2.2" - -"@svgr/webpack@^5.5.0": - version "5.5.0" - resolved "https://registry.npmmirror.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" - integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== - dependencies: - "@babel/core" "^7.12.3" - "@babel/plugin-transform-react-constant-elements" "^7.12.1" - "@babel/preset-env" "^7.12.1" - "@babel/preset-react" "^7.12.5" - "@svgr/core" "^5.5.0" - "@svgr/plugin-jsx" "^5.5.0" - "@svgr/plugin-svgo" "^5.5.0" - loader-utils "^2.0.0" - -"@tanem/react-nprogress@^5.0.51": - version "5.0.51" - resolved "https://registry.npmmirror.com/@tanem/react-nprogress/-/react-nprogress-5.0.51.tgz#6cbdb52a0a27ecf845f61d809ef6fd45b063662d" - integrity sha512-YxNUCpznuBVA+PhjEzFmxaa1czXgU+5Ojchw5JBK7DQS6SHIgNudpFohWpNBWMu2KWByGJ2OLH2OwbM/XyP18Q== - dependencies: - "@babel/runtime" "^7.22.15" - hoist-non-react-statics "^3.3.2" - -"@testing-library/dom@^8.5.0": - version "8.20.1" - resolved "https://registry.npmmirror.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f" - integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.12.5" - "@types/aria-query" "^5.0.1" - aria-query "5.1.3" - chalk "^4.1.0" - dom-accessibility-api "^0.5.9" - lz-string "^1.5.0" - pretty-format "^27.0.2" - -"@testing-library/jest-dom@^5.16.5": - version "5.17.0" - resolved "https://registry.npmmirror.com/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz#5e97c8f9a15ccf4656da00fecab505728de81e0c" - integrity sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg== - dependencies: - "@adobe/css-tools" "^4.0.1" - "@babel/runtime" "^7.9.2" - "@types/testing-library__jest-dom" "^5.9.1" - aria-query "^5.0.0" - chalk "^3.0.0" - css.escape "^1.5.1" - dom-accessibility-api "^0.5.6" - lodash "^4.17.15" - redent "^3.0.0" - -"@testing-library/react@^13.4.0": - version "13.4.0" - resolved "https://registry.npmmirror.com/@testing-library/react/-/react-13.4.0.tgz#6a31e3bf5951615593ad984e96b9e5e2d9380966" - integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw== - dependencies: - "@babel/runtime" "^7.12.5" - "@testing-library/dom" "^8.5.0" - "@types/react-dom" "^18.0.0" - -"@testing-library/user-event@^13.5.0": - version "13.5.0" - resolved "https://registry.npmmirror.com/@testing-library/user-event/-/user-event-13.5.0.tgz#69d77007f1e124d55314a2b73fd204b333b13295" - integrity sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg== - dependencies: - "@babel/runtime" "^7.12.5" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.npmmirror.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/aria-query@^5.0.1": - version "5.0.2" - resolved "https://registry.npmmirror.com/@types/aria-query/-/aria-query-5.0.2.tgz#6f1225829d89794fd9f891989c9ce667422d7f64" - integrity sha512-PHKZuMN+K5qgKIWhBodXzQslTo5P+K/6LqeKXS6O/4liIDdZqaX5RXrCK++LAw+y/nptN48YmUMFiQHRSWYwtQ== - -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.20.2" - resolved "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.2.tgz#215db4f4a35d710256579784a548907237728756" - integrity sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.5" - resolved "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.5.tgz#281f4764bcbbbc51fdded0f25aa587b4ce14da95" - integrity sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.2" - resolved "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.2.tgz#843e9f1f47c957553b0c374481dc4772921d6a6b" - integrity sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.20.2" - resolved "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.20.2.tgz#4ddf99d95cfdd946ff35d2b65c978d9c9bf2645d" - integrity sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw== - dependencies: - "@babel/types" "^7.20.7" - -"@types/body-parser@*": - version "1.19.3" - resolved "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" - integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/bonjour@^3.5.9": - version "3.5.11" - resolved "https://registry.npmmirror.com/@types/bonjour/-/bonjour-3.5.11.tgz#fbaa46a1529ea5c5e46cde36e4be6a880db55b84" - integrity sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg== - dependencies: - "@types/node" "*" - -"@types/connect-history-api-fallback@^1.3.5": - version "1.5.1" - resolved "https://registry.npmmirror.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz#6e5e3602d93bda975cebc3449e1a318340af9e20" - integrity sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw== - dependencies: - "@types/express-serve-static-core" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.36" - resolved "https://registry.npmmirror.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" - integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== - dependencies: - "@types/node" "*" - -"@types/eslint-scope@^3.7.3": - version "3.7.5" - resolved "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.5.tgz#e28b09dbb1d9d35fdfa8a884225f00440dfc5a3e" - integrity sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": - version "8.44.3" - resolved "https://registry.npmmirror.com/@types/eslint/-/eslint-8.44.3.tgz#96614fae4875ea6328f56de38666f582d911d962" - integrity sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^1.0.0": - version "1.0.2" - resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.2.tgz#ff02bc3dc8317cd668dfec247b750ba1f1d62453" - integrity sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA== - -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.npmmirror.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== - -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.37" - resolved "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz#7e4b7b59da9142138a2aaa7621f5abedce8c7320" - integrity sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*", "@types/express@^4.17.13": - version "4.17.18" - resolved "https://registry.npmmirror.com/@types/express/-/express-4.17.18.tgz#efabf5c4495c1880df1bdffee604b143b29c4a95" - integrity sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/graceful-fs@^4.1.2": - version "4.1.7" - resolved "https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.7.tgz#30443a2e64fd51113bc3e2ba0914d47109695e2a" - integrity sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw== - dependencies: - "@types/node" "*" - -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - -"@types/http-errors@*", "@types/http-errors@^2.0.1": - version "2.0.2" - resolved "https://registry.npmmirror.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" - integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== - -"@types/http-proxy@^1.17.8": - version "1.17.12" - resolved "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.12.tgz#86e849e9eeae0362548803c37a0a1afc616bd96b" - integrity sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@*": - version "29.5.5" - resolved "https://registry.npmmirror.com/@types/jest/-/jest-29.5.5.tgz#727204e06228fe24373df9bae76b90f3e8236a2a" - integrity sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/jest@^27.5.2": - version "27.5.2" - resolved "https://registry.npmmirror.com/@types/jest/-/jest-27.5.2.tgz#ec49d29d926500ffb9fd22b84262e862049c026c" - integrity sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA== - dependencies: - jest-matcher-utils "^27.0.0" - pretty-format "^27.0.0" - -"@types/js-cookie@^2.x.x": - version "2.2.7" - resolved "https://registry.npmmirror.com/@types/js-cookie/-/js-cookie-2.2.7.tgz#226a9e31680835a6188e887f3988e60c04d3f6a3" - integrity sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA== - -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.13" - resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" - integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmmirror.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/lodash@^4.14.198": - version "4.14.199" - resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.199.tgz#c3edb5650149d847a277a8961a7ad360c474e9bf" - integrity sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg== - -"@types/mime@*": - version "3.0.1" - resolved "https://registry.npmmirror.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== - -"@types/mime@^1": - version "1.3.2" - resolved "https://registry.npmmirror.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== - -"@types/node@*": - version "20.7.0" - resolved "https://registry.npmmirror.com/@types/node/-/node-20.7.0.tgz#c03de4572f114a940bc2ca909a33ddb2b925e470" - integrity sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg== - -"@types/node@^16.18.26": - version "16.18.54" - resolved "https://registry.npmmirror.com/@types/node/-/node-16.18.54.tgz#4a63bdcea5b714f546aa27406a1c60621236a132" - integrity sha512-oTmGy68gxZZ21FhTJVVvZBYpQHEBZxHKTsGshobMqm9qWpbqdZsA5jvsuPZcHu0KwpmLrOHWPdEfg7XDpNT9UA== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/prettier@^2.1.5": - version "2.7.3" - resolved "https://registry.npmmirror.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" - integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== - -"@types/prop-types@*": - version "15.7.7" - resolved "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.7.tgz#f9361f7b87fd5d8188b2c998db0a1f47e9fb391a" - integrity sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog== - -"@types/q@^1.5.1": - version "1.5.6" - resolved "https://registry.npmmirror.com/@types/q/-/q-1.5.6.tgz#a6edffe8283910e46dc7a573621f928e6b47fa56" - integrity sha512-IKjZ8RjTSwD4/YG+2gtj7BPFRB/lNbWKTiSj3M7U/TD2B7HfYCxvp2Zz6xA2WIY7pAuL1QOUPw8gQRbUrrq4fQ== - -"@types/qs@*": - version "6.9.8" - resolved "https://registry.npmmirror.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" - integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.4": - version "18.2.7" - resolved "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.2.7.tgz#67222a08c0a6ae0a0da33c3532348277c70abb63" - integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^18.2.6": - version "18.2.23" - resolved "https://registry.npmmirror.com/@types/react/-/react-18.2.23.tgz#60ad6cf4895e93bed858db0e03bcc4ff97d0410e" - integrity sha512-qHLW6n1q2+7KyBEYnrZpcsAmU/iiCh9WGCKgXvMxx89+TYdJWRjZohVIo9XTcoLhfX3+/hP0Pbulu3bCZQ9PSA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/resolve@1.17.1": - version "1.17.1" - resolved "https://registry.npmmirror.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" - integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== - dependencies: - "@types/node" "*" - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.npmmirror.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/scheduler@*": - version "0.16.4" - resolved "https://registry.npmmirror.com/@types/scheduler/-/scheduler-0.16.4.tgz#fedc3e5b15c26dc18faae96bf1317487cb3658cf" - integrity sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ== - -"@types/semver@^7.3.12": - version "7.5.3" - resolved "https://registry.npmmirror.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" - integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== - -"@types/send@*": - version "0.17.2" - resolved "https://registry.npmmirror.com/@types/send/-/send-0.17.2.tgz#af78a4495e3c2b79bfbdac3955fdd50e03cc98f2" - integrity sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-index@^1.9.1": - version "1.9.2" - resolved "https://registry.npmmirror.com/@types/serve-index/-/serve-index-1.9.2.tgz#cb26e775678a8526b73a5d980a147518740aaecd" - integrity sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig== - dependencies: - "@types/express" "*" - -"@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.3" - resolved "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.3.tgz#2cfacfd1fd4520bbc3e292cca432d5e8e2e3ee61" - integrity sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg== - dependencies: - "@types/http-errors" "*" - "@types/mime" "*" - "@types/node" "*" - -"@types/sockjs@^0.3.33": - version "0.3.34" - resolved "https://registry.npmmirror.com/@types/sockjs/-/sockjs-0.3.34.tgz#43e10e549b36d2ba2589278f00f81b5d7ccda167" - integrity sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g== - dependencies: - "@types/node" "*" - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/stylis@^4.0.2": - version "4.2.1" - resolved "https://registry.npmmirror.com/@types/stylis/-/stylis-4.2.1.tgz#867fcb0f81719d9ecef533fdda03e32083b959f6" - integrity sha512-OSaMrXUKxVigGlKRrET39V2xdhzlztQ9Aqumn1WbCBKHOi9ry7jKSd7rkyj0GzmWaU960Rd+LpOFpLfx5bMQAg== - -"@types/testing-library__jest-dom@^5.9.1": - version "5.14.9" - resolved "https://registry.npmmirror.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz#0fb1e6a0278d87b6737db55af5967570b67cb466" - integrity sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw== - dependencies: - "@types/jest" "*" - -"@types/trusted-types@^2.0.2": - version "2.0.4" - resolved "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.4.tgz#2b38784cd16957d3782e8e2b31c03bc1d13b4d65" - integrity sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ== - -"@types/ws@^8.5.5": - version "8.5.6" - resolved "https://registry.npmmirror.com/@types/ws/-/ws-8.5.6.tgz#e9ad51f0ab79b9110c50916c9fcbddc36d373065" - integrity sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg== - dependencies: - "@types/node" "*" - -"@types/yargs-parser@*": - version "21.0.1" - resolved "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" - integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== - -"@types/yargs@^16.0.0": - version "16.0.6" - resolved "https://registry.npmmirror.com/@types/yargs/-/yargs-16.0.6.tgz#cc0c63684d68d23498cf0b5f32aa4c3fb437c638" - integrity sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A== - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^17.0.8": - version "17.0.25" - resolved "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.25.tgz#3edd102803c97356fb4c805b2bbaf7dfc9ab6abc" - integrity sha512-gy7iPgwnzNvxgAEi2bXOHWCVOG6f7xsprVJH4MjlAWeBmJ7vh/Y1kwMtUrs64ztf24zVIRCpr3n/z6gm9QIkgg== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@^5.5.0", "@typescript-eslint/eslint-plugin@^5.59.2": - version "5.62.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" - integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== - dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/type-utils" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/experimental-utils@^5.0.0": - version "5.62.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz#14559bf73383a308026b427a4a6129bae2146741" - integrity sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw== - dependencies: - "@typescript-eslint/utils" "5.62.0" - -"@typescript-eslint/parser@^5.5.0", "@typescript-eslint/parser@^5.59.2": - version "5.62.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== - dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - -"@typescript-eslint/type-utils@5.62.0": - version "5.62.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" - integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== - dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== - -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.58.0": - version "5.62.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== - dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" - -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== - -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== - -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== - -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== - -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== - -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" - -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abab@^2.0.3, abab@^2.0.5: - version "2.0.6" - resolved "https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn-walk@^8.0.2, acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== - -address@^1.0.1, address@^1.1.2: - version "1.2.2" - resolved "https://registry.npmmirror.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== - -adjust-sourcemap-loader@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" - integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== - dependencies: - loader-utils "^2.0.0" - regex-parser "^2.2.11" - -agent-base@6: - version "6.0.2" - resolved "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ahooks-v3-count@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/ahooks-v3-count/-/ahooks-v3-count-1.0.0.tgz#ddeb392e009ad6e748905b3cbf63a9fd8262ca80" - integrity sha512-V7uUvAwnimu6eh/PED4mCDjE7tokeZQLKlxg9lCTMPhN+NjsSbtdacByVlR1oluXQzD3MOw55wylDmQo4+S9ZQ== - -ahooks@^3.4.1, ahooks@^3.7.8: - version "3.7.8" - resolved "https://registry.npmmirror.com/ahooks/-/ahooks-3.7.8.tgz#3fa3c491cd153e884a32b0c4192fc72cf84c4332" - integrity sha512-e/NMlQWoCjaUtncNFIZk3FG1ImSkV/JhScQSkTqnftakRwdfZWSw6zzoWSG9OMYqPNs2MguDYBUFFC6THelWXA== - dependencies: - "@babel/runtime" "^7.21.0" - "@types/js-cookie" "^2.x.x" - ahooks-v3-count "^1.0.0" - dayjs "^1.9.1" - intersection-observer "^0.12.0" - js-cookie "^2.x.x" - lodash "^4.17.21" - resize-observer-polyfill "^1.5.1" - screenfull "^5.0.0" - tslib "^2.4.1" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0: - version "8.12.0" - resolved "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: - version "4.3.2" - resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-escapes@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" - integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== - dependencies: - type-fest "^1.0.2" - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.npmmirror.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.0.0, ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -antd@^5.4.7: - version "5.9.3" - resolved "https://registry.npmmirror.com/antd/-/antd-5.9.3.tgz#7829fc7e1ccd78f634aab12283ee1f8e567e767e" - integrity sha512-a7gY6hfsjoDLOENHKzjXZgmAxi1hDdsuIvYm6YMTctb08EhTEXCZoeFOekwz9S0vrTcdSpUMblRWsiwuYRdPYg== - dependencies: - "@ant-design/colors" "^7.0.0" - "@ant-design/cssinjs" "^1.16.0" - "@ant-design/icons" "^5.2.2" - "@ant-design/react-slick" "~1.0.0" - "@babel/runtime" "^7.18.3" - "@ctrl/tinycolor" "^3.6.0" - "@rc-component/color-picker" "~1.4.1" - "@rc-component/mutate-observer" "^1.1.0" - "@rc-component/tour" "~1.10.0" - "@rc-component/trigger" "^1.16.0" - classnames "^2.2.6" - copy-to-clipboard "^3.2.0" - dayjs "^1.11.1" - qrcode.react "^3.1.0" - rc-cascader "~3.17.0" - rc-checkbox "~3.1.0" - rc-collapse "~3.7.1" - rc-dialog "~9.2.0" - rc-drawer "~6.4.1" - rc-dropdown "~4.1.0" - rc-field-form "~1.38.1" - rc-image "~7.2.0" - rc-input "~1.2.1" - rc-input-number "~8.1.0" - rc-mentions "~2.8.0" - rc-menu "~9.12.0" - rc-motion "^2.9.0" - rc-notification "~5.1.1" - rc-pagination "~3.6.1" - rc-picker "~3.14.1" - rc-progress "~3.5.1" - rc-rate "~2.12.0" - rc-resize-observer "^1.3.1" - rc-segmented "~2.2.2" - rc-select "~14.9.0" - rc-slider "~10.2.1" - rc-steps "~6.0.1" - rc-switch "~4.1.0" - rc-table "~7.34.0" - rc-tabs "~12.12.1" - rc-textarea "~1.4.0" - rc-tooltip "~6.0.1" - rc-tree "~5.7.12" - rc-tree-select "~5.13.0" - rc-upload "~4.3.4" - rc-util "^5.37.0" - scroll-into-view-if-needed "^3.0.3" - throttle-debounce "^5.0.0" - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@5.1.3: - version "5.1.3" - resolved "https://registry.npmmirror.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== - dependencies: - deep-equal "^2.0.5" - -aria-query@^5.0.0, aria-query@^5.1.3: - version "5.3.0" - resolved "https://registry.npmmirror.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.npmmirror.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-includes@^3.1.6: - version "3.1.7" - resolved "https://registry.npmmirror.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-string "^1.0.7" - -array-tree-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" - integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlastindex@^1.2.2: - version "1.2.3" - resolved "https://registry.npmmirror.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" - integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" - -array.prototype.flat@^1.3.1: - version "1.3.2" - resolved "https://registry.npmmirror.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.1: - version "1.3.2" - resolved "https://registry.npmmirror.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.reduce@^1.0.6: - version "1.0.6" - resolved "https://registry.npmmirror.com/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz#63149931808c5fc1e1354814923d92d45f7d96d5" - integrity sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" - -array.prototype.tosorted@^1.1.1: - version "1.1.2" - resolved "https://registry.npmmirror.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" - integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" - -arraybuffer.prototype.slice@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" - integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" - is-shared-array-buffer "^1.0.2" - -asap@~2.0.6: - version "2.0.6" - resolved "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.npmmirror.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== - -async-validator@^4.1.0: - version "4.2.5" - resolved "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339" - integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== - -async@^3.2.3: - version "3.2.4" - resolved "https://registry.npmmirror.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - -asynciterator.prototype@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" - integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== - dependencies: - has-symbols "^1.0.3" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -auto-css-modules-webpack-plugin@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/auto-css-modules-webpack-plugin/-/auto-css-modules-webpack-plugin-1.1.1.tgz#e4e239ff922aef11f6cc92902fc689440450bac8" - integrity sha512-Jm4Z2xlaxAO/eHO+ysMqr1fPEdBdfVnP18Y5KjQT43sq244iiKwYflYMIdifugF6NTpFKD0nzUjARlJ1esMeVQ== - dependencies: - acorn-walk "^8.0.2" - -autoprefixer@^10.4.12, autoprefixer@^10.4.13: - version "10.4.16" - resolved "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" - integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== - dependencies: - browserslist "^4.21.10" - caniuse-lite "^1.0.30001538" - fraction.js "^4.3.6" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -axe-core@^4.6.2: - version "4.8.2" - resolved "https://registry.npmmirror.com/axe-core/-/axe-core-4.8.2.tgz#2f6f3cde40935825cf4465e3c1c9e77b240ff6ae" - integrity sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g== - -axobject-query@^3.1.1: - version "3.2.1" - resolved "https://registry.npmmirror.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== - dependencies: - dequal "^2.0.3" - -babel-eslint@^10.1.0: - version "10.1.0" - resolved "https://registry.npmmirror.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" - integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - eslint-visitor-keys "^1.0.0" - resolve "^1.12.0" - -babel-jest@^27.4.2, babel-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" - integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== - dependencies: - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-loader@^8.2.3: - version "8.3.0" - resolved "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" - integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-macros@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== - dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" - -babel-plugin-named-asset-import@^0.3.8: - version "0.3.8" - resolved "https://registry.npmmirror.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" - integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== - -babel-plugin-polyfill-corejs2@^0.4.5: - version "0.4.5" - resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" - integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== - dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.2" - semver "^6.3.1" - -babel-plugin-polyfill-corejs3@^0.8.3: - version "0.8.4" - resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz#1fac2b1dcef6274e72b3c72977ed8325cb330591" - integrity sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" - core-js-compat "^3.32.2" - -babel-plugin-polyfill-regenerator@^0.5.2: - version "0.5.2" - resolved "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" - integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" - -babel-plugin-transform-react-remove-prop-types@^0.4.24: - version "0.4.24" - resolved "https://registry.npmmirror.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" - integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" - integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== - dependencies: - babel-plugin-jest-hoist "^27.5.1" - babel-preset-current-node-syntax "^1.0.0" - -babel-preset-react-app@^10.0.1: - version "10.0.1" - resolved "https://registry.npmmirror.com/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz#ed6005a20a24f2c88521809fa9aea99903751584" - integrity sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg== - dependencies: - "@babel/core" "^7.16.0" - "@babel/plugin-proposal-class-properties" "^7.16.0" - "@babel/plugin-proposal-decorators" "^7.16.4" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" - "@babel/plugin-proposal-numeric-separator" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.0" - "@babel/plugin-proposal-private-methods" "^7.16.0" - "@babel/plugin-transform-flow-strip-types" "^7.16.0" - "@babel/plugin-transform-react-display-name" "^7.16.0" - "@babel/plugin-transform-runtime" "^7.16.4" - "@babel/preset-env" "^7.16.4" - "@babel/preset-react" "^7.16.0" - "@babel/preset-typescript" "^7.16.0" - "@babel/runtime" "^7.16.3" - babel-plugin-macros "^3.1.0" - babel-plugin-transform-react-remove-prop-types "^0.4.24" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -bfj@^7.0.2: - version "7.1.0" - resolved "https://registry.npmmirror.com/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b" - integrity sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw== - dependencies: - bluebird "^3.7.2" - check-types "^11.2.3" - hoopy "^0.1.4" - jsonpath "^1.1.1" - tryer "^1.0.1" - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -bonjour-service@^1.0.11: - version "1.1.1" - resolved "https://registry.npmmirror.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" - integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== - dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" - fast-deep-equal "^3.1.3" - multicast-dns "^7.2.5" - -boolbase@^1.0.0, boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9: - version "4.21.11" - resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.11.tgz#35f74a3e51adc4d193dcd76ea13858de7b8fecb8" - integrity sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ== - dependencies: - caniuse-lite "^1.0.30001538" - electron-to-chromium "^1.4.526" - node-releases "^2.0.13" - update-browserslist-db "^1.0.13" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -builtin-modules@^3.1.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0, camelcase@^6.2.1: - version "6.3.0" - resolved "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -camelize@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" - integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538: - version "1.0.30001539" - resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz#325a387ab1ed236df2c12dc6cd43a4fff9903a44" - integrity sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA== - -case-sensitive-paths-webpack-plugin@^2.4.0: - version "2.4.0" - resolved "https://registry.npmmirror.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" - integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== - -chalk@5.3.0: - version "5.3.0" - resolved "https://registry.npmmirror.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - -chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -char-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e" - integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== - -check-types@^11.2.3: - version "11.2.3" - resolved "https://registry.npmmirror.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" - integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== - -chokidar@^3.4.0, chokidar@^3.4.2, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.npmmirror.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -cjs-module-lexer@^1.0.0: - version "1.2.3" - resolved "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" - integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== - -classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2: - version "2.3.2" - resolved "https://registry.npmmirror.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== - -clean-css@^5.2.2: - version "5.3.2" - resolved "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== - dependencies: - source-map "~0.6.0" - -cli-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" - integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== - dependencies: - restore-cursor "^4.0.0" - -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== - dependencies: - slice-ansi "^5.0.0" - string-width "^5.0.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.npmmirror.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" - -collect-v8-coverage@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" - integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colord@^2.9.1: - version "2.9.3" - resolved "https://registry.npmmirror.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -colorette@^2.0.10, colorette@^2.0.20: - version "2.0.20" - resolved "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@11.0.0: - version "11.0.0" - resolved "https://registry.npmmirror.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" - integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^4.0.0, commander@^4.0.1: - version "4.1.1" - resolved "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -common-path-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" - integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== - -common-tags@^1.8.0: - version "1.8.2" - resolved "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" - integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -compute-scroll-into-view@^3.0.2: - version "3.0.3" - resolved "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz#c418900a5c56e2b04b885b54995df164535962b1" - integrity sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -confusing-browser-globals@^1.0.10, confusing-browser-globals@^1.0.11: - version "1.0.11" - resolved "https://registry.npmmirror.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" - integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== - -connect-history-api-fallback@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" - integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.5" - resolved "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -copy-anything@^2.0.1: - version "2.0.6" - resolved "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" - integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== - dependencies: - is-what "^3.14.1" - -copy-to-clipboard@^3.2.0: - version "3.3.3" - resolved "https://registry.npmmirror.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" - integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== - dependencies: - toggle-selection "^1.0.6" - -core-js-compat@^3.31.0, core-js-compat@^3.32.2: - version "3.32.2" - resolved "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.32.2.tgz#8047d1a8b3ac4e639f0d4f66d4431aa3b16e004c" - integrity sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ== - dependencies: - browserslist "^4.21.10" - -core-js-pure@^3.23.3: - version "3.32.2" - resolved "https://registry.npmmirror.com/core-js-pure/-/core-js-pure-3.32.2.tgz#b7dbdac528625cf87eb0523b532eb61551b9a6d1" - integrity sha512-Y2rxThOuNywTjnX/PgA5vWM6CZ9QB9sz9oGeCixV8MqXZO70z/5SHzf9EeBrEBK0PN36DnEBBu9O/aGWzKuMZQ== - -core-js@^3.19.2: - version "3.32.2" - resolved "https://registry.npmmirror.com/core-js/-/core-js-3.32.2.tgz#172fb5949ef468f93b4be7841af6ab1f21992db7" - integrity sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig-typescript-loader@^1.0.0: - version "1.0.9" - resolved "https://registry.npmmirror.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz#69c523f7e8c3d9f27f563d02bbeadaf2f27212d3" - integrity sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g== - dependencies: - cosmiconfig "^7" - ts-node "^10.7.0" - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -cosmiconfig@^7, cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: - version "7.1.0" - resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -craco-alias@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/craco-alias/-/craco-alias-3.0.1.tgz#45e5cb338b222a7f62d17e398b54aff7cf1572af" - integrity sha512-N+Qaf/Gr/f3o5ZH2TQjMu5NhR9PnT1ZYsfejpNvZPpB0ujdrhsSr4Ct6GVjnV5ostCVquhTKJpIVBKyL9qDQYA== - -craco-css-modules@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/craco-css-modules/-/craco-css-modules-1.0.5.tgz#defbd3eb49db09f02ae82579dd3a95ae5fb11e75" - integrity sha512-Dt7w9GEXmY6lUSxh7g4ft+11NyOY3ZgwUZu0Aq9imTrFRKa65rsu00SA2rZ/UDPzCfagwvcY7VdHMOA2BKDoBw== - dependencies: - auto-css-modules-webpack-plugin "^1.1.1" - -craco-less@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/craco-less/-/craco-less-2.0.0.tgz#a2df18c32e97ebf00f62c3f2ea4cd97035f5f640" - integrity sha512-980mQaZVrC4ZsvOwvud6/AgvW7fLY3mW5m5+gR4sw4krxszgHb+qoRyOjqsYPD0F4oUmQoSiZSrlYY/bFGD9kQ== - dependencies: - less "^4.1.1" - less-loader "^7.3.0" - -craco-sass-resources-loader@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/craco-sass-resources-loader/-/craco-sass-resources-loader-1.1.0.tgz#b9d584e28896785e329856b5796735e8e487e09c" - integrity sha512-JRRpuK5xKoaH3Zch/geGhoVrE5b/b4MTV2wOUFA+otZ5ANn+58+UQmA+RYSUubJFR+62i2leo8n8RMZFNSMpLg== - dependencies: - sass-resources-loader "^2.0.0" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -css-blank-pseudo@^3.0.3: - version "3.0.3" - resolved "https://registry.npmmirror.com/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561" - integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== - dependencies: - postcss-selector-parser "^6.0.9" - -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== - -css-declaration-sorter@^6.3.1: - version "6.4.1" - resolved "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71" - integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== - -css-has-pseudo@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73" - integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== - dependencies: - postcss-selector-parser "^6.0.9" - -css-loader@^6.5.1: - version "6.8.1" - resolved "https://registry.npmmirror.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" - integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.21" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.3" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.3.8" - -css-minimizer-webpack-plugin@^3.2.0: - version "3.4.1" - resolved "https://registry.npmmirror.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" - integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== - dependencies: - cssnano "^5.0.6" - jest-worker "^27.0.2" - postcss "^8.3.5" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - -css-prefers-color-scheme@^6.0.3: - version "6.0.3" - resolved "https://registry.npmmirror.com/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349" - integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.npmmirror.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== - -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== - dependencies: - boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-to-react-native@^3.2.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" - integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.npmmirror.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" - -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-what@^3.2.1: - version "3.4.2" - resolved "https://registry.npmmirror.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" - integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== - -css-what@^6.0.1: - version "6.1.0" - resolved "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -css.escape@^1.5.1: - version "1.5.1" - resolved "https://registry.npmmirror.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" - integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== - -cssdb@^7.1.0: - version "7.7.2" - resolved "https://registry.npmmirror.com/cssdb/-/cssdb-7.7.2.tgz#fbebd90edfc6af129fda4fd986f9dd604a209094" - integrity sha512-pQPYP7/kch4QlkTcLuUNiNL2v/E+O+VIdotT+ug62/+2B2/jkzs5fMM6RHCzGCZ9C82pODEMSIzRRUzJOrl78g== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.npmmirror.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== - -cssnano@^5.0.6: - version "5.1.15" - resolved "https://registry.npmmirror.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== - dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" - -csso@^4.0.2, csso@^4.2.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.npmmirror.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csstype@^3.0.10, csstype@^3.0.2, csstype@^3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.npmmirror.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -dayjs@^1.11.1, dayjs@^1.11.9, dayjs@^1.9.1: - version "1.11.10" - resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" - integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== - -debug@2.6.9, debug@^2.6.0: - version "2.6.9" - resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.2.6, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decimal.js@^10.2.1: - version "10.4.3" - resolved "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== - -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -deep-equal@^2.0.5: - version "2.2.2" - resolved "https://registry.npmmirror.com/deep-equal/-/deep-equal-2.2.2.tgz#9b2635da569a13ba8e1cc159c2f744071b115daa" - integrity sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - es-get-iterator "^1.1.3" - get-intrinsic "^1.2.1" - is-arguments "^1.1.1" - is-array-buffer "^3.0.2" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -define-data-property@^1.0.1: - version "1.1.0" - resolved "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" - integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== - dependencies: - get-intrinsic "^1.2.1" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -detect-port-alt@^1.1.6: - version "1.1.6" - resolved "https://registry.npmmirror.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" - integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== - dependencies: - address "^1.0.1" - debug "^2.6.0" - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -diff-sequences@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" - integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - -dns-packet@^5.2.2: - version "5.6.1" - resolved "https://registry.npmmirror.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" - integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== - dependencies: - "@leichtgewicht/ip-codec" "^2.0.1" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: - version "0.5.16" - resolved "https://registry.npmmirror.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" - integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== - -dom-align@^1.7.0: - version "1.12.4" - resolved "https://registry.npmmirror.com/dom-align/-/dom-align-1.12.4.tgz#3503992eb2a7cfcb2ed3b2a6d21e0b9c00d54511" - integrity sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw== - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-serializer@0: - version "0.2.2" - resolved "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domelementtype@1: - version "1.3.1" - resolved "https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^2.5.2, domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dotenv-expand@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" - integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== - -dotenv@^10.0.0: - version "10.0.0" - resolved "https://registry.npmmirror.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== - -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -echarts-for-react@^3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/echarts-for-react/-/echarts-for-react-3.0.2.tgz#ac5859157048a1066d4553e34b328abb24f2b7c1" - integrity sha512-DRwIiTzx8JfwPOVgGttDytBqdp5VzCSyMRIxubgU/g2n9y3VLUmF2FK7Icmg/sNVkv4+rktmrLN9w22U2yy3fA== - dependencies: - fast-deep-equal "^3.1.3" - size-sensor "^1.0.1" - -echarts@^5.4.3: - version "5.4.3" - resolved "https://registry.npmmirror.com/echarts/-/echarts-5.4.3.tgz#f5522ef24419164903eedcfd2b506c6fc91fb20c" - integrity sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA== - dependencies: - tslib "2.3.0" - zrender "5.4.4" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -ejs@^3.1.6: - version "3.1.9" - resolved "https://registry.npmmirror.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" - integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== - dependencies: - jake "^10.8.5" - -electron-to-chromium@^1.4.526: - version "1.4.529" - resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.529.tgz#8c3377a05e5737f899770d14524dd8e2e4cb2351" - integrity sha512-6uyPyXTo8lkv8SWAmjKFbG42U073TXlzD4R8rW3EzuznhFS2olCIAfjjQtV2dV2ar/vRF55KUd3zQYnCB0dd3A== - -emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.npmmirror.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== - -emittery@^0.8.1: - version "0.8.1" - resolved "https://registry.npmmirror.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -enhanced-resolve@^5.15.0: - version "5.15.0" - resolved "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -errno@^0.1.1: - version "0.1.8" - resolved "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -error-stack-parser@^2.0.6: - version "2.1.4" - resolved "https://registry.npmmirror.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" - integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== - dependencies: - stackframe "^1.3.4" - -es-abstract@^1.17.2, es-abstract@^1.22.1: - version "1.22.2" - resolved "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" - integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.2" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.1" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.12" - is-weakref "^1.0.2" - object-inspect "^1.12.3" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - safe-array-concat "^1.0.1" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.8" - string.prototype.trimend "^1.0.7" - string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.11" - -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== - -es-get-iterator@^1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" - -es-iterator-helpers@^1.0.12: - version "1.0.15" - resolved "https://registry.npmmirror.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" - integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== - dependencies: - asynciterator.prototype "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.1" - es-abstract "^1.22.1" - es-set-tostringtag "^2.0.1" - function-bind "^1.1.1" - get-intrinsic "^1.2.1" - globalthis "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - iterator.prototype "^1.1.2" - safe-array-concat "^1.0.1" - -es-module-lexer@^1.2.1: - version "1.3.1" - resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" - integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== - -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^1.8.1: - version "1.14.3" - resolved "https://registry.npmmirror.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -escodegen@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" - integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-airbnb-base@^15.0.0: - version "15.0.0" - resolved "https://registry.npmmirror.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" - integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== - dependencies: - confusing-browser-globals "^1.0.10" - object.assign "^4.1.2" - object.entries "^1.1.5" - semver "^6.3.0" - -eslint-config-airbnb@^19.0.4: - version "19.0.4" - resolved "https://registry.npmmirror.com/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz#84d4c3490ad70a0ffa571138ebcdea6ab085fdc3" - integrity sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew== - dependencies: - eslint-config-airbnb-base "^15.0.0" - object.assign "^4.1.2" - object.entries "^1.1.5" - -eslint-config-prettier@^8.8.0: - version "8.10.0" - resolved "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" - integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== - -eslint-config-react-app@^7.0.1: - version "7.0.1" - resolved "https://registry.npmmirror.com/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz#73ba3929978001c5c86274c017ea57eb5fa644b4" - integrity sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA== - dependencies: - "@babel/core" "^7.16.0" - "@babel/eslint-parser" "^7.16.3" - "@rushstack/eslint-patch" "^1.1.0" - "@typescript-eslint/eslint-plugin" "^5.5.0" - "@typescript-eslint/parser" "^5.5.0" - babel-preset-react-app "^10.0.1" - confusing-browser-globals "^1.0.11" - eslint-plugin-flowtype "^8.0.3" - eslint-plugin-import "^2.25.3" - eslint-plugin-jest "^25.3.0" - eslint-plugin-jsx-a11y "^6.5.1" - eslint-plugin-react "^7.27.1" - eslint-plugin-react-hooks "^4.3.0" - eslint-plugin-testing-library "^5.0.1" - -eslint-import-resolver-node@^0.3.7: - version "0.3.9" - resolved "https://registry.npmmirror.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.8.0: - version "2.8.0" - resolved "https://registry.npmmirror.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== - dependencies: - debug "^3.2.7" - -eslint-plugin-flowtype@^8.0.3: - version "8.0.3" - resolved "https://registry.npmmirror.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz#e1557e37118f24734aa3122e7536a038d34a4912" - integrity sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ== - dependencies: - lodash "^4.17.21" - string-natural-compare "^3.0.1" - -eslint-plugin-import@^2.25.3: - version "2.28.1" - resolved "https://registry.npmmirror.com/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz#63b8b5b3c409bfc75ebaf8fb206b07ab435482c4" - integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== - dependencies: - array-includes "^3.1.6" - array.prototype.findlastindex "^1.2.2" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.8.0" - has "^1.0.3" - is-core-module "^2.13.0" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.6" - object.groupby "^1.0.0" - object.values "^1.1.6" - semver "^6.3.1" - tsconfig-paths "^3.14.2" - -eslint-plugin-jest@^25.3.0: - version "25.7.0" - resolved "https://registry.npmmirror.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz#ff4ac97520b53a96187bad9c9814e7d00de09a6a" - integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== - dependencies: - "@typescript-eslint/experimental-utils" "^5.0.0" - -eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@^6.7.1: - version "6.7.1" - resolved "https://registry.npmmirror.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" - integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== - dependencies: - "@babel/runtime" "^7.20.7" - aria-query "^5.1.3" - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - ast-types-flow "^0.0.7" - axe-core "^4.6.2" - axobject-query "^3.1.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - has "^1.0.3" - jsx-ast-utils "^3.3.3" - language-tags "=1.0.5" - minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - semver "^6.3.0" - -eslint-plugin-prettier@^4.2.1: - version "4.2.1" - resolved "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-react-hooks@^4.3.0: - version "4.6.0" - resolved "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== - -eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.32.2: - version "7.33.2" - resolved "https://registry.npmmirror.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" - integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== - dependencies: - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - array.prototype.tosorted "^1.1.1" - doctrine "^2.1.0" - es-iterator-helpers "^1.0.12" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - object.hasown "^1.1.2" - object.values "^1.1.6" - prop-types "^15.8.1" - resolve "^2.0.0-next.4" - semver "^6.3.1" - string.prototype.matchall "^4.0.8" - -eslint-plugin-testing-library@^5.0.1: - version "5.11.1" - resolved "https://registry.npmmirror.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz#5b46cdae96d4a78918711c0b4792f90088e62d20" - integrity sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw== - dependencies: - "@typescript-eslint/utils" "^5.58.0" - -eslint-scope@5.1.1, eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^1.0.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-webpack-plugin@^3.1.1: - version "3.2.0" - resolved "https://registry.npmmirror.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c" - integrity sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w== - dependencies: - "@types/eslint" "^7.29.0 || ^8.4.1" - jest-worker "^28.0.2" - micromatch "^4.0.5" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - -eslint@^8.3.0, eslint@^8.40.0: - version "8.50.0" - resolved "https://registry.npmmirror.com/eslint/-/eslint-8.50.0.tgz#2ae6015fee0240fcd3f83e1e25df0287f487d6b2" - integrity sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.50.0" - "@humanwhocodes/config-array" "^0.11.11" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@1.2.2: - version "1.2.2" - resolved "https://registry.npmmirror.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" - integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1, estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" - integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -eventemitter3@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@7.2.0: - version "7.2.0" - resolved "https://registry.npmmirror.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" - integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" - integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== - dependencies: - "@jest/types" "^27.5.1" - jest-get-type "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - -expect@^29.0.0: - version "29.7.0" - resolved "https://registry.npmmirror.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - -express@^4.17.3: - version "4.18.2" - resolved "https://registry.npmmirror.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.3.0" - resolved "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - -fast-glob@^3.2.12, fast-glob@^3.2.9: - version "3.3.1" - resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -file-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.npmmirror.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -filelist@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" - integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== - dependencies: - minimatch "^5.0.1" - -filesize@^8.0.6: - version "8.0.7" - resolved "https://registry.npmmirror.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" - integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -filter-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" - integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.1.0" - resolved "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" - integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== - dependencies: - flatted "^3.2.7" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.7: - version "3.2.9" - resolved "https://registry.npmmirror.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" - integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== - -follow-redirects@^1.0.0: - version "1.15.3" - resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" - integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -fork-ts-checker-webpack-plugin@^6.5.0: - version "6.5.3" - resolved "https://registry.npmmirror.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" - integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" - deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" - minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^4.3.6: - version "4.3.6" - resolved "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" - integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^9.0.0, fs-extra@^9.0.1: - version "9.1.0" - resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-monkey@^1.0.4: - version "1.0.5" - resolved "https://registry.npmmirror.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" - integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== - -fs-readdir-recursive@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" - -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.2" - resolved "https://registry.npmmirror.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" - integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0, get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@7.1.6: - version "7.1.6" - resolved "https://registry.npmmirror.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: - version "7.2.3" - resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.22.0" - resolved "https://registry.npmmirror.com/globals/-/globals-13.22.0.tgz#0c9fcb9c48a2494fbb5edbfee644285543eba9d8" - integrity sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.0.4, globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -harmony-reflect@^1.4.6: - version "1.6.2" - resolved "https://registry.npmmirror.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" - integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hoopy@^0.1.4: - version "0.1.4" - resolved "https://registry.npmmirror.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" - integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.npmmirror.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-entities@^2.1.0, html-entities@^2.3.2: - version "2.4.0" - resolved "https://registry.npmmirror.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" - integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -html-minifier-terser@^6.0.2: - version "6.1.0" - resolved "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-parse-stringify@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" - integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== - dependencies: - void-elements "3.1.0" - -html-webpack-plugin@^5.5.0: - version "5.5.3" - resolved "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz#72270f4a78e222b5825b296e5e3e1328ad525a3e" - integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -http-proxy-middleware@^2.0.3, http-proxy-middleware@^2.0.6: - version "2.0.6" - resolved "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.npmmirror.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - -husky@^8.0.0: - version "8.0.3" - resolved "https://registry.npmmirror.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" - integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== - -i18next-browser-languagedetector@^7.1.0: - version "7.1.0" - resolved "https://registry.npmmirror.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.1.0.tgz#01876fac51f86b78975e79b48ccb62e2313a2d7d" - integrity sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA== - dependencies: - "@babel/runtime" "^7.19.4" - -i18next@^23.5.1: - version "23.5.1" - resolved "https://registry.npmmirror.com/i18next/-/i18next-23.5.1.tgz#7f7c35ffaa907618d9489f106d5006b09fbca3d3" - integrity sha512-JelYzcaCoFDaa+Ysbfz2JsGAKkrHiMG6S61+HLBUEIPaF40WMwW9hCPymlQGrP+wWawKxKPuSuD71WZscCsWHg== - dependencies: - "@babel/runtime" "^7.22.5" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -idb@^7.0.1: - version "7.1.1" - resolved "https://registry.npmmirror.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" - integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== - -identity-obj-proxy@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" - integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== - dependencies: - harmony-reflect "^1.4.6" - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -image-size@~0.5.0: - version "0.5.5" - resolved "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" - integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== - -immer@^9.0.7: - version "9.0.21" - resolved "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" - integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== - -import-fresh@^3.1.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@^1.3.5: - version "1.3.8" - resolved "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -internal-slot@^1.0.4, internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - -intersection-observer@^0.12.0: - version "0.12.2" - resolved "https://registry.npmmirror.com/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375" - integrity sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.1.0" - resolved "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" - integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== - -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== - dependencies: - has-tostringtag "^1.0.0" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.13.0, is-core-module@^2.9.0: - version "2.13.0" - resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== - dependencies: - call-bind "^1.0.2" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-generator-function@^1.0.10: - version "1.0.10" - resolved "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-map@^2.0.1, is-map@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== - -is-root@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - -is-set@^2.0.1, is-set@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== - dependencies: - which-typed-array "^1.1.11" - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-weakset@^2.0.1: - version "2.0.2" - resolved "https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" - integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -is-what@^3.14.1: - version "3.14.1" - resolved "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" - integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.1" - resolved "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.6" - resolved "https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" - integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== - dependencies: - define-properties "^1.2.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.4" - set-function-name "^2.0.1" - -jake@^10.8.5: - version "10.8.7" - resolved "https://registry.npmmirror.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" - integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== - dependencies: - async "^3.2.3" - chalk "^4.0.2" - filelist "^1.0.4" - minimatch "^3.1.2" - -jest-changed-files@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" - integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== - dependencies: - "@jest/types" "^27.5.1" - execa "^5.0.0" - throat "^6.0.1" - -jest-circus@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" - integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - throat "^6.0.1" - -jest-cli@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" - integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== - dependencies: - "@jest/core" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - prompts "^2.0.1" - yargs "^16.2.0" - -jest-config@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" - integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== - dependencies: - "@babel/core" "^7.8.0" - "@jest/test-sequencer" "^27.5.1" - "@jest/types" "^27.5.1" - babel-jest "^27.5.1" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.9" - jest-circus "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-get-type "^27.5.1" - jest-jasmine2 "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runner "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^27.5.1" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" - integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.npmmirror.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" - integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== - dependencies: - detect-newline "^3.0.0" - -jest-each@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" - integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - jest-get-type "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - -jest-environment-jsdom@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" - integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - jsdom "^16.6.0" - -jest-environment-node@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" - integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -jest-get-type@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" - integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-haste-map@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" - integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== - dependencies: - "@jest/types" "^27.5.1" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^27.5.1" - jest-serializer "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - micromatch "^4.0.4" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.3.2" - -jest-jasmine2@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" - integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - throat "^6.0.1" - -jest-leak-detector@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" - integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== - dependencies: - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" - integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== - dependencies: - chalk "^4.0.0" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" - integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.5.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-message-util@^28.1.3: - version "28.1.3" - resolved "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" - integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^28.1.3" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" - integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" - integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== - -jest-regex-util@^28.0.0: - version "28.0.2" - resolved "https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" - integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== - -jest-resolve-dependencies@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" - integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== - dependencies: - "@jest/types" "^27.5.1" - jest-regex-util "^27.5.1" - jest-snapshot "^27.5.1" - -jest-resolve@^27.4.2, jest-resolve@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" - integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-pnp-resolver "^1.2.2" - jest-util "^27.5.1" - jest-validate "^27.5.1" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-runner@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" - integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.8.1" - graceful-fs "^4.2.9" - jest-docblock "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-haste-map "^27.5.1" - jest-leak-detector "^27.5.1" - jest-message-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runtime "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runtime@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" - integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/globals" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-serializer@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" - integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.9" - -jest-snapshot@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" - integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== - dependencies: - "@babel/core" "^7.7.2" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^27.5.1" - graceful-fs "^4.2.9" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - jest-haste-map "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - natural-compare "^1.4.0" - pretty-format "^27.5.1" - semver "^7.3.2" - -jest-util@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" - integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^28.1.3: - version "28.1.3" - resolved "https://registry.npmmirror.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" - integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.npmmirror.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" - integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== - dependencies: - "@jest/types" "^27.5.1" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^27.5.1" - leven "^3.1.0" - pretty-format "^27.5.1" - -jest-watch-typeahead@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz#b4a6826dfb9c9420da2f7bc900de59dad11266a9" - integrity sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw== - dependencies: - ansi-escapes "^4.3.1" - chalk "^4.0.0" - jest-regex-util "^28.0.0" - jest-watcher "^28.0.0" - slash "^4.0.0" - string-length "^5.0.1" - strip-ansi "^7.0.1" - -jest-watcher@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" - integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== - dependencies: - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^27.5.1" - string-length "^4.0.1" - -jest-watcher@^28.0.0: - version "28.1.3" - resolved "https://registry.npmmirror.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" - integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== - dependencies: - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^28.1.3" - string-length "^4.0.1" - -jest-worker@^26.2.1: - version "26.6.2" - resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^28.0.2: - version "28.1.3" - resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" - integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^27.4.3: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" - integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== - dependencies: - "@jest/core" "^27.5.1" - import-local "^3.0.2" - jest-cli "^27.5.1" - -jiti@^1.18.2: - version "1.20.0" - resolved "https://registry.npmmirror.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" - integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== - -js-cookie@^2.x.x: - version "2.2.1" - resolved "https://registry.npmmirror.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" - integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsdom@^16.6.0: - version "16.7.0" - resolved "https://registry.npmmirror.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-schema@^0.4.0: - version "0.4.0" - resolved "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json2mq@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" - integrity sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA== - dependencies: - string-convert "^0.2.0" - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2, json5@^2.2.0, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonpath@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" - integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== - dependencies: - esprima "1.2.2" - static-eval "2.0.2" - underscore "1.12.1" - -jsonpointer@^5.0.0: - version "5.0.1" - resolved "https://registry.npmmirror.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" - integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: - version "3.3.5" - resolved "https://registry.npmmirror.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -keyv@^4.5.3: - version "4.5.3" - resolved "https://registry.npmmirror.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" - integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== - dependencies: - json-buffer "3.0.1" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -klona@^2.0.4, klona@^2.0.5: - version "2.0.6" - resolved "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - -language-subtag-registry@~0.3.2: - version "0.3.22" - resolved "https://registry.npmmirror.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== - -language-tags@=1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== - dependencies: - language-subtag-registry "~0.3.2" - -launch-editor@^2.6.0: - version "2.6.0" - resolved "https://registry.npmmirror.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" - integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== - dependencies: - picocolors "^1.0.0" - shell-quote "^1.7.3" - -less-loader@^11.1.0: - version "11.1.3" - resolved "https://registry.npmmirror.com/less-loader/-/less-loader-11.1.3.tgz#1bb62d6ca9bf00a177c02793b54baac40f9be694" - integrity sha512-A5b7O8dH9xpxvkosNrP0dFp2i/dISOJa9WwGF3WJflfqIERE2ybxh1BFDj5CovC2+jCE4M354mk90hN6ziXlVw== - -less-loader@^7.3.0: - version "7.3.0" - resolved "https://registry.npmmirror.com/less-loader/-/less-loader-7.3.0.tgz#f9d6d36d18739d642067a05fb5bd70c8c61317e5" - integrity sha512-Mi8915g7NMaLlgi77mgTTQvK022xKRQBIVDSyfl3ErTuBhmZBQab0mjeJjNNqGbdR+qrfTleKXqbGI4uEFavxg== - dependencies: - klona "^2.0.4" - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -less@^4.1.1: - version "4.2.0" - resolved "https://registry.npmmirror.com/less/-/less-4.2.0.tgz#cbefbfaa14a4cd388e2099b2b51f956e1465c450" - integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA== - dependencies: - copy-anything "^2.0.1" - parse-node-version "^1.0.1" - tslib "^2.3.0" - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - make-dir "^2.1.0" - mime "^1.4.1" - needle "^3.1.0" - source-map "~0.6.0" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lilconfig@2.1.0, lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lint-staged@^13.2.2: - version "13.3.0" - resolved "https://registry.npmmirror.com/lint-staged/-/lint-staged-13.3.0.tgz#7965d72a8d6a6c932f85e9c13ccf3596782d28a5" - integrity sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ== - dependencies: - chalk "5.3.0" - commander "11.0.0" - debug "4.3.4" - execa "7.2.0" - lilconfig "2.1.0" - listr2 "6.6.1" - micromatch "4.0.5" - pidtree "0.6.0" - string-argv "0.3.2" - yaml "2.3.1" - -listr2@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/listr2/-/listr2-6.6.1.tgz#08b2329e7e8ba6298481464937099f4a2cd7f95d" - integrity sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg== - dependencies: - cli-truncate "^3.1.0" - colorette "^2.0.20" - eventemitter3 "^5.0.1" - log-update "^5.0.1" - rfdc "^1.3.0" - wrap-ansi "^8.1.0" - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -loader-utils@^2.0.0, loader-utils@^2.0.4: - version "2.0.4" - resolved "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.npmmirror.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.npmmirror.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-update@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/log-update/-/log-update-5.0.1.tgz#9e928bf70cb183c1f0c9e91d9e6b7115d597ce09" - integrity sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== - dependencies: - ansi-escapes "^5.0.0" - cli-cursor "^4.0.0" - slice-ansi "^5.0.0" - strip-ansi "^7.0.1" - wrap-ansi "^8.0.1" - -loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lz-string@^1.5.0: - version "1.5.0" - resolved "https://registry.npmmirror.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" - integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== - -magic-string@^0.25.0, magic-string@^0.25.7: - version "0.25.9" - resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - dependencies: - sourcemap-codec "^1.4.8" - -make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memfs@^3.1.2, memfs@^3.4.3: - version "3.6.0" - resolved "https://registry.npmmirror.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" - integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== - dependencies: - fs-monkey "^1.0.4" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@4.0.5, micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0, mime@^1.4.1: - version "1.6.0" - resolved "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -mini-css-extract-plugin@^2.4.5: - version "2.7.6" - resolved "https://registry.npmmirror.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" - integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== - dependencies: - schema-utils "^4.0.0" - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mkdirp@~0.5.1: - version "0.5.6" - resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns@^7.2.5: - version "7.2.5" - resolved "https://registry.npmmirror.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" - integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== - dependencies: - dns-packet "^5.2.2" - thunky "^1.0.2" - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -needle@^3.1.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/needle/-/needle-3.2.0.tgz#07d240ebcabfd65c76c03afae7f6defe6469df44" - integrity sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ== - dependencies: - debug "^3.2.6" - iconv-lite "^0.6.3" - sax "^1.2.4" - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-forge@^1: - version "1.3.1" - resolved "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.npmmirror.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== - dependencies: - path-key "^4.0.0" - -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -nwsapi@^2.2.0: - version "2.2.7" - resolved "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" - integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== - -object-assign@^4.0.1, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.2, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.5, object.entries@^1.1.6: - version "1.1.7" - resolved "https://registry.npmmirror.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" - integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -object.fromentries@^2.0.6: - version "2.0.7" - resolved "https://registry.npmmirror.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" - integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -object.getownpropertydescriptors@^2.1.0: - version "2.1.7" - resolved "https://registry.npmmirror.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz#7a466a356cd7da4ba8b9e94ff6d35c3eeab5d56a" - integrity sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g== - dependencies: - array.prototype.reduce "^1.0.6" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - safe-array-concat "^1.0.0" - -object.groupby@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" - integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - -object.hasown@^1.1.2: - version "1.1.3" - resolved "https://registry.npmmirror.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" - integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== - dependencies: - define-properties "^1.2.0" - es-abstract "^1.22.1" - -object.values@^1.1.0, object.values@^1.1.6: - version "1.1.7" - resolved "https://registry.npmmirror.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" - integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -open@^8.0.9, open@^8.4.0: - version "8.4.2" - resolved "https://registry.npmmirror.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== - dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.npmmirror.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.0.0, parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-node-version@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" - integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@0.6.0: - version "0.6.0" - resolved "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pirates@^4.0.1, pirates@^4.0.4: - version "4.0.6" - resolved "https://registry.npmmirror.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - -postcss-attribute-case-insensitive@^5.0.2: - version "5.0.2" - resolved "https://registry.npmmirror.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" - integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-browser-comments@^4: - version "4.0.0" - resolved "https://registry.npmmirror.com/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz#bcfc86134df5807f5d3c0eefa191d42136b5e72a" - integrity sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg== - -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.npmmirror.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-clamp@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" - integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-color-functional-notation@^4.2.4: - version "4.2.4" - resolved "https://registry.npmmirror.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" - integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-color-hex-alpha@^8.0.4: - version "8.0.4" - resolved "https://registry.npmmirror.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz#c66e2980f2fbc1a63f5b079663340ce8b55f25a5" - integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-color-rebeccapurple@^7.1.1: - version "7.1.1" - resolved "https://registry.npmmirror.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0" - integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.npmmirror.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - colord "^2.9.1" - postcss-value-parser "^4.2.0" - -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmmirror.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-custom-media@^8.0.2: - version "8.0.2" - resolved "https://registry.npmmirror.com/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz#c8f9637edf45fef761b014c024cee013f80529ea" - integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-custom-properties@^12.1.10: - version "12.1.11" - resolved "https://registry.npmmirror.com/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz#d14bb9b3989ac4d40aaa0e110b43be67ac7845cf" - integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-custom-selectors@^6.0.3: - version "6.0.3" - resolved "https://registry.npmmirror.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz#1ab4684d65f30fed175520f82d223db0337239d9" - integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-dir-pseudo-class@^6.0.5: - version "6.0.5" - resolved "https://registry.npmmirror.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c" - integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== - -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== - -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== - -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== - -postcss-double-position-gradients@^3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91" - integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -postcss-env-function@^4.0.6: - version "4.0.6" - resolved "https://registry.npmmirror.com/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a" - integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-flexbugs-fixes@^5.0.2: - version "5.0.2" - resolved "https://registry.npmmirror.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" - integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== - -postcss-focus-visible@^6.0.4: - version "6.0.4" - resolved "https://registry.npmmirror.com/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e" - integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== - dependencies: - postcss-selector-parser "^6.0.9" - -postcss-focus-within@^5.0.4: - version "5.0.4" - resolved "https://registry.npmmirror.com/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20" - integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== - dependencies: - postcss-selector-parser "^6.0.9" - -postcss-font-variant@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" - integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== - -postcss-gap-properties@^3.0.5: - version "3.0.5" - resolved "https://registry.npmmirror.com/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff" - integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== - -postcss-image-set-function@^4.0.7: - version "4.0.7" - resolved "https://registry.npmmirror.com/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f" - integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-import@^15.1.0: - version "15.1.0" - resolved "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" - integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-initial@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" - integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== - -postcss-js@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" - integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== - dependencies: - camelcase-css "^2.0.1" - -postcss-lab-function@^4.2.1: - version "4.2.1" - resolved "https://registry.npmmirror.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98" - integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -postcss-load-config@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" - integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== - dependencies: - lilconfig "^2.0.5" - yaml "^2.1.1" - -postcss-loader@^6.2.1: - version "6.2.1" - resolved "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" - integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.5" - -postcss-logical@^5.0.4: - version "5.0.4" - resolved "https://registry.npmmirror.com/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73" - integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== - -postcss-media-minmax@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" - integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== - -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.npmmirror.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== - dependencies: - postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" - -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.npmmirror.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" - -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== - dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.npmmirror.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== - dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.npmmirror.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.3: - version "4.0.3" - resolved "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" - integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== - dependencies: - postcss-selector-parser "^6.0.11" - -postcss-nesting@^10.2.0: - version "10.2.0" - resolved "https://registry.npmmirror.com/postcss-nesting/-/postcss-nesting-10.2.0.tgz#0b12ce0db8edfd2d8ae0aaf86427370b898890be" - integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== - dependencies: - "@csstools/selector-specificity" "^2.0.0" - postcss-selector-parser "^6.0.10" - -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== - -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== - dependencies: - normalize-url "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize@^10.0.1: - version "10.0.1" - resolved "https://registry.npmmirror.com/postcss-normalize/-/postcss-normalize-10.0.1.tgz#464692676b52792a06b06880a176279216540dd7" - integrity sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA== - dependencies: - "@csstools/normalize.css" "*" - postcss-browser-comments "^4" - sanitize.css "*" - -postcss-opacity-percentage@^1.1.2: - version "1.1.3" - resolved "https://registry.npmmirror.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz#5b89b35551a556e20c5d23eb5260fbfcf5245da6" - integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== - -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmmirror.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-overflow-shorthand@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e" - integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-page-break@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" - integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== - -postcss-place@^7.0.5: - version "7.0.5" - resolved "https://registry.npmmirror.com/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4" - integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-preset-env@^7.0.1: - version "7.8.3" - resolved "https://registry.npmmirror.com/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz#2a50f5e612c3149cc7af75634e202a5b2ad4f1e2" - integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== - dependencies: - "@csstools/postcss-cascade-layers" "^1.1.1" - "@csstools/postcss-color-function" "^1.1.1" - "@csstools/postcss-font-format-keywords" "^1.0.1" - "@csstools/postcss-hwb-function" "^1.0.2" - "@csstools/postcss-ic-unit" "^1.0.1" - "@csstools/postcss-is-pseudo-class" "^2.0.7" - "@csstools/postcss-nested-calc" "^1.0.0" - "@csstools/postcss-normalize-display-values" "^1.0.1" - "@csstools/postcss-oklab-function" "^1.1.1" - "@csstools/postcss-progressive-custom-properties" "^1.3.0" - "@csstools/postcss-stepped-value-functions" "^1.0.1" - "@csstools/postcss-text-decoration-shorthand" "^1.0.0" - "@csstools/postcss-trigonometric-functions" "^1.0.2" - "@csstools/postcss-unset-value" "^1.0.2" - autoprefixer "^10.4.13" - browserslist "^4.21.4" - css-blank-pseudo "^3.0.3" - css-has-pseudo "^3.0.4" - css-prefers-color-scheme "^6.0.3" - cssdb "^7.1.0" - postcss-attribute-case-insensitive "^5.0.2" - postcss-clamp "^4.1.0" - postcss-color-functional-notation "^4.2.4" - postcss-color-hex-alpha "^8.0.4" - postcss-color-rebeccapurple "^7.1.1" - postcss-custom-media "^8.0.2" - postcss-custom-properties "^12.1.10" - postcss-custom-selectors "^6.0.3" - postcss-dir-pseudo-class "^6.0.5" - postcss-double-position-gradients "^3.1.2" - postcss-env-function "^4.0.6" - postcss-focus-visible "^6.0.4" - postcss-focus-within "^5.0.4" - postcss-font-variant "^5.0.0" - postcss-gap-properties "^3.0.5" - postcss-image-set-function "^4.0.7" - postcss-initial "^4.0.1" - postcss-lab-function "^4.2.1" - postcss-logical "^5.0.4" - postcss-media-minmax "^5.0.0" - postcss-nesting "^10.2.0" - postcss-opacity-percentage "^1.1.2" - postcss-overflow-shorthand "^3.0.4" - postcss-page-break "^3.0.4" - postcss-place "^7.0.5" - postcss-pseudo-class-any-link "^7.1.6" - postcss-replace-overflow-wrap "^4.0.0" - postcss-selector-not "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-pseudo-class-any-link@^7.1.6: - version "7.1.6" - resolved "https://registry.npmmirror.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab" - integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-replace-overflow-wrap@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" - integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== - -postcss-selector-not@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz#8f0a709bf7d4b45222793fc34409be407537556d" - integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.13" - resolved "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== - dependencies: - postcss-value-parser "^4.2.0" - svgo "^2.7.0" - -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^7.0.35: - version "7.0.39" - resolved "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" - integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== - dependencies: - picocolors "^0.2.1" - source-map "^0.6.1" - -postcss@^8.3.5, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.4: - version "8.4.30" - resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.30.tgz#0e0648d551a606ef2192a26da4cabafcc09c1aa7" - integrity sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^2.8.8: - version "2.8.8" - resolved "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - -pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: - version "5.6.0" - resolved "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" - integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== - -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: - version "27.5.1" - resolved "https://registry.npmmirror.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -pretty-format@^28.1.3: - version "28.1.3" - resolved "https://registry.npmmirror.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" - integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== - dependencies: - "@jest/schemas" "^28.1.3" - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -pretty-format@^29.0.0, pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.npmmirror.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -promise@^8.1.0: - version "8.3.0" - resolved "https://registry.npmmirror.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" - integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== - dependencies: - asap "~2.0.6" - -prompts@^2.0.1, prompts@^2.4.2: - version "2.4.2" - resolved "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.npmmirror.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== - -qrcode.react@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/qrcode.react/-/qrcode.react-3.1.0.tgz#5c91ddc0340f768316fbdb8fff2765134c2aecd8" - integrity sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q== - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -qs@^6.11.2: - version "6.11.2" - resolved "https://registry.npmmirror.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== - dependencies: - side-channel "^1.0.4" - -query-string@^6.9.0: - version "6.14.1" - resolved "https://registry.npmmirror.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" - integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== - dependencies: - decode-uri-component "^0.2.0" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -raf@^3.4.1: - version "3.4.1" - resolved "https://registry.npmmirror.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" - integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== - dependencies: - performance-now "^2.1.0" - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc-align@^4.0.0: - version "4.0.15" - resolved "https://registry.npmmirror.com/rc-align/-/rc-align-4.0.15.tgz#2bbd665cf85dfd0b0244c5a752b07565e9098577" - integrity sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - dom-align "^1.7.0" - rc-util "^5.26.0" - resize-observer-polyfill "^1.5.1" - -rc-cascader@~3.17.0: - version "3.17.0" - resolved "https://registry.npmmirror.com/rc-cascader/-/rc-cascader-3.17.0.tgz#92804dd64b9d03c9159926910b4c18ae5b7d456b" - integrity sha512-8O5Eq/NteRuBaaUIb+ZsTEkNKM3BwWKizsFlSpukCVa2ELqrdMyslbe/OdxtuFlyJIqGyWF5rS2Q+fd0Rpvmgw== - dependencies: - "@babel/runtime" "^7.12.5" - array-tree-filter "^2.1.0" - classnames "^2.3.1" - rc-select "~14.9.0" - rc-tree "~5.7.0" - rc-util "^5.35.0" - -rc-checkbox@~3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/rc-checkbox/-/rc-checkbox-3.1.0.tgz#6be0d9d8de2cc96fb5e37f9036a1c3e360d0a42d" - integrity sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.3.2" - rc-util "^5.25.2" - -rc-collapse@~3.7.1: - version "3.7.1" - resolved "https://registry.npmmirror.com/rc-collapse/-/rc-collapse-3.7.1.tgz#bda1f7f80adccf3433c1c15d4d9f9ca09910c727" - integrity sha512-N/7ejyiTf3XElNJBBpxqnZBUuMsQWEOPjB2QkfNvZ/Ca54eAvJXuOD1EGbCWCk2m7v/MSxku7mRpdeaLOCd4Gg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.3.4" - rc-util "^5.27.0" - -rc-dialog@~9.2.0: - version "9.2.0" - resolved "https://registry.npmmirror.com/rc-dialog/-/rc-dialog-9.2.0.tgz#94236a410a3698f2aefcb34e49cec8f7064c7235" - integrity sha512-dL2tklMou/QfK77+0CTH3FTnKCvIiYv9Df7PfFfg8YVXhYAGmuIkV4ooQYHAIR4juL3Ywcm5oQflF2vDDuGlUg== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/portal" "^1.0.0-8" - classnames "^2.2.6" - rc-motion "^2.3.0" - rc-util "^5.21.0" - -rc-drawer@~6.4.1: - version "6.4.1" - resolved "https://registry.npmmirror.com/rc-drawer/-/rc-drawer-6.4.1.tgz#823b0072c1b50136ea9d35b37dd21cffcbdaf96d" - integrity sha512-QIbNMjiZy322o9uEpJHsSZ5rS/zuxqam3lYVPDzjztoqsoDzTNNxWN77QVpOfQ0UC9/87+qu25zocJ+O9bK2Tg== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/portal" "^1.1.1" - classnames "^2.2.6" - rc-motion "^2.6.1" - rc-util "^5.36.0" - -rc-dropdown@~4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/rc-dropdown/-/rc-dropdown-4.1.0.tgz#418a68939631520de80d0865d02b440eeeb4168e" - integrity sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw== - dependencies: - "@babel/runtime" "^7.18.3" - "@rc-component/trigger" "^1.7.0" - classnames "^2.2.6" - rc-util "^5.17.0" - -rc-field-form@~1.38.1: - version "1.38.2" - resolved "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-1.38.2.tgz#1eafac98eb84d47dc3b55de98ed50751d9852dd2" - integrity sha512-O83Oi1qPyEv31Sg+Jwvsj6pXc8uQI2BtIAkURr5lvEYHVggXJhdU/nynK8wY1gbw0qR48k731sN5ON4egRCROA== - dependencies: - "@babel/runtime" "^7.18.0" - async-validator "^4.1.0" - rc-util "^5.32.2" - -rc-image@~7.2.0: - version "7.2.0" - resolved "https://registry.npmmirror.com/rc-image/-/rc-image-7.2.0.tgz#81feabf9b381b0f10f362f1e35d66f7ddb400ab2" - integrity sha512-5Ug2hCVl6VcT0osR5XaZQ4zclTMEWPnbn3b4/TS/MR1QjRpEACLNFUzBGwr5mbAVhzvLWX5YZf4vO10xUA5IUA== - dependencies: - "@babel/runtime" "^7.11.2" - "@rc-component/portal" "^1.0.2" - classnames "^2.2.6" - rc-dialog "~9.2.0" - rc-motion "^2.6.2" - rc-util "^5.34.1" - -rc-input-number@~8.1.0: - version "8.1.0" - resolved "https://registry.npmmirror.com/rc-input-number/-/rc-input-number-8.1.0.tgz#c6f304b80d0caa8da948f39a41bf04793bbfd0c1" - integrity sha512-bdHgduOxuN0lrhzgPmoKbhRD4GLIzVcddVz972/JHPHr7oLwPX5xDb9w4bXhuMzyT2VzQy7nggRCfH3yAl09oA== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/mini-decimal" "^1.0.1" - classnames "^2.2.5" - rc-input "~1.2.1" - rc-util "^5.28.0" - -rc-input@~1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/rc-input/-/rc-input-1.2.1.tgz#446843225348d99c78a0967299cb74e385ce8fb0" - integrity sha512-nQRmBvEFoGi+SNRDavccZ8ueyhFgmxkWqIt4aDyuNJgUZF12HJKIwDhAafUM7N+g7PyuW9FH3pf3zPHzdiCWbA== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-util "^5.18.1" - -rc-mentions@~2.8.0: - version "2.8.0" - resolved "https://registry.npmmirror.com/rc-mentions/-/rc-mentions-2.8.0.tgz#e96cdf331e7bf1a8944ee4c6801b13f33d9b70c8" - integrity sha512-LBMkO6bSGhEvS1CvMK978qGN82tI+mzk7l/uTiQJH+UDiwpvq+pxK4DxU5b6Q1T5LW6bn2pSua9RaZKZrDoBOw== - dependencies: - "@babel/runtime" "^7.22.5" - "@rc-component/trigger" "^1.5.0" - classnames "^2.2.6" - rc-input "~1.2.1" - rc-menu "~9.12.0" - rc-textarea "~1.4.0" - rc-util "^5.34.1" - -rc-menu@~9.12.0: - version "9.12.0" - resolved "https://registry.npmmirror.com/rc-menu/-/rc-menu-9.12.0.tgz#4d5c9c57a7658d50256a4000c3bc6260021c7541" - integrity sha512-Apr/fRf5EcqWJ4nphHV6dTGZcLPaPzwY44q9hAtLJysY4rkC9Eg+ekj3uFx6opPWVruV2sJNWq/Po+HHtO48CA== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/trigger" "^1.6.2" - classnames "2.x" - rc-motion "^2.4.3" - rc-overflow "^1.3.1" - rc-util "^5.27.0" - -rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4, rc-motion@^2.6.0, rc-motion@^2.6.1, rc-motion@^2.6.2, rc-motion@^2.7.3, rc-motion@^2.9.0: - version "2.9.0" - resolved "https://registry.npmmirror.com/rc-motion/-/rc-motion-2.9.0.tgz#9e18a1b8d61e528a97369cf9a7601e9b29205710" - integrity sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-util "^5.21.0" - -rc-notification@~5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/rc-notification/-/rc-notification-5.1.1.tgz#62b38890575a1726ed6c1dd0e10caf4ce45a9e69" - integrity sha512-BPnded/WmWFE57ubqhVCgRSuedfQQNeSOYqdwppyr2B/Wt909gYFKyWAkFJVXuppAjsOGop05a93UaxjmUFdkg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.6.0" - rc-util "^5.20.1" - -rc-overflow@^1.3.1: - version "1.3.2" - resolved "https://registry.npmmirror.com/rc-overflow/-/rc-overflow-1.3.2.tgz#72ee49e85a1308d8d4e3bd53285dc1f3e0bcce2c" - integrity sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-resize-observer "^1.0.0" - rc-util "^5.37.0" - -rc-pagination@~3.6.1: - version "3.6.1" - resolved "https://registry.npmmirror.com/rc-pagination/-/rc-pagination-3.6.1.tgz#2db6678a57cd2f4f29d6c0416e282543af52d0df" - integrity sha512-R/sUnKKXx1Nm4kZfUKS3YKa7yEPF1ZkVB/AynQaHt+nMER7h9wPTfliDJFdYo+RM/nk2JD4Yc5QpUq8fIQHeug== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - rc-util "^5.32.2" - -rc-picker@~3.14.1: - version "3.14.3" - resolved "https://registry.npmmirror.com/rc-picker/-/rc-picker-3.14.3.tgz#7ab16b5190cc7aba169fc82f8b7aa06276048365" - integrity sha512-41tVGgYnO1eXiVFTmhOkAyXqJSNTbNgmEGYxzsGzrhnH905yug9Z+6P0DYRaBC829xLxPA8GYpeWtGmm3OMQfw== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/trigger" "^1.5.0" - classnames "^2.2.1" - rc-util "^5.30.0" - -rc-progress@~3.5.1: - version "3.5.1" - resolved "https://registry.npmmirror.com/rc-progress/-/rc-progress-3.5.1.tgz#a3cdfd2fe04eb5c3d43fa1c69e7dd70c73b102ae" - integrity sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - rc-util "^5.16.1" - -rc-rate@~2.12.0: - version "2.12.0" - resolved "https://registry.npmmirror.com/rc-rate/-/rc-rate-2.12.0.tgz#0182deffed3b009cdcc61660da8746c39ed91ed5" - integrity sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-util "^5.0.1" - -rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.3.1: - version "1.3.1" - resolved "https://registry.npmmirror.com/rc-resize-observer/-/rc-resize-observer-1.3.1.tgz#b61b9f27048001243617b81f95e53d7d7d7a6a3d" - integrity sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg== - dependencies: - "@babel/runtime" "^7.20.7" - classnames "^2.2.1" - rc-util "^5.27.0" - resize-observer-polyfill "^1.5.1" - -rc-segmented@~2.2.2: - version "2.2.2" - resolved "https://registry.npmmirror.com/rc-segmented/-/rc-segmented-2.2.2.tgz#a34f12ce6c0975fc3042ae7656bcd18e1744798e" - integrity sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-motion "^2.4.4" - rc-util "^5.17.0" - -rc-select@~14.9.0: - version "14.9.0" - resolved "https://registry.npmmirror.com/rc-select/-/rc-select-14.9.0.tgz#586a19bd55535b81096bb392dd06bb1e0631d06b" - integrity sha512-vbIhK1MBA12MRdxXbiylSCTPKsWV8WmeN7OyATk9I0LsuIVwe/kBAUNH02am1ryjoylbK+AH309a6X1AflGRSw== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/trigger" "^1.5.0" - classnames "2.x" - rc-motion "^2.0.1" - rc-overflow "^1.3.1" - rc-util "^5.16.1" - rc-virtual-list "^3.5.2" - -rc-slider@~10.2.1: - version "10.2.1" - resolved "https://registry.npmmirror.com/rc-slider/-/rc-slider-10.2.1.tgz#9b571d19f740adcacdde271f44901a47717fd8da" - integrity sha512-l355C/65iV4UFp7mXq5xBTNX2/tF2g74VWiTVlTpNp+6vjE/xaHHNiQq5Af+Uu28uUiqCuH/QXs5HfADL9KJ/A== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-util "^5.27.0" - -rc-steps@~6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/rc-steps/-/rc-steps-6.0.1.tgz#c2136cd0087733f6d509209a84a5c80dc29a274d" - integrity sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g== - dependencies: - "@babel/runtime" "^7.16.7" - classnames "^2.2.3" - rc-util "^5.16.1" - -rc-switch@~4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/rc-switch/-/rc-switch-4.1.0.tgz#f37d81b4e0c5afd1274fd85367b17306bf25e7d7" - integrity sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg== - dependencies: - "@babel/runtime" "^7.21.0" - classnames "^2.2.1" - rc-util "^5.30.0" - -rc-table@~7.34.0: - version "7.34.4" - resolved "https://registry.npmmirror.com/rc-table/-/rc-table-7.34.4.tgz#027a1052846fffb1ff38b2e0df95acb0ac508254" - integrity sha512-os+i88Y2AO/6dNkOgJkKSHgXYaZZGnuOEEe+nyaq5IRgvAQNhLysUjXt2objtBeFDEZR8TqXrajwBNRUwunmdw== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/context" "^1.4.0" - classnames "^2.2.5" - rc-resize-observer "^1.1.0" - rc-util "^5.36.0" - rc-virtual-list "^3.11.1" - -rc-tabs@~12.12.1: - version "12.12.1" - resolved "https://registry.npmmirror.com/rc-tabs/-/rc-tabs-12.12.1.tgz#8639297bfcbbf77ca05f71d73fc3d31bd05e04d8" - integrity sha512-e10VBjEkECdPl4XZSs9to81SE+mgclBTM7J8/LMsFqmJoi05Tci91bRnmeeDtrcOCx2PuZdJv57XUlC4d8PEIw== - dependencies: - "@babel/runtime" "^7.11.2" - classnames "2.x" - rc-dropdown "~4.1.0" - rc-menu "~9.12.0" - rc-motion "^2.6.2" - rc-resize-observer "^1.0.0" - rc-util "^5.34.1" - -rc-textarea@~1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/rc-textarea/-/rc-textarea-1.4.0.tgz#5833676f81f71a842220a0311c48caab07643349" - integrity sha512-CiqK+uyoJlnfufbC0kwfHJpfElhQacuDSNyNQ/xGnA/QMaJLDbgmqRT8QmX0T0KD/ws/hy6qqRaGJSsrRR5uiQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - rc-input "~1.2.1" - rc-resize-observer "^1.0.0" - rc-util "^5.27.0" - -rc-tooltip@~6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/rc-tooltip/-/rc-tooltip-6.0.1.tgz#6a5e33bd6c3f6afe8851ea90e7af43e5c26b3cc6" - integrity sha512-MdvPlsD1fDSxKp9+HjXrc/CxLmA/s11QYIh1R7aExxfodKP7CZA++DG1AjrW80F8IUdHYcR43HAm0Y2BYPelHA== - dependencies: - "@babel/runtime" "^7.11.2" - "@rc-component/trigger" "^1.0.4" - classnames "^2.3.1" - -rc-tree-select@~5.13.0: - version "5.13.0" - resolved "https://registry.npmmirror.com/rc-tree-select/-/rc-tree-select-5.13.0.tgz#ca332f08476c2fdf7fe2154a6320f8f686ef34c8" - integrity sha512-g01JU9EdE7j/9KfDKtmvFqJ7ZDNIYDzkpmAXllbTBFoRNhWJBjW1x/dCZLVG+IdZeIz8SKJkgZzCf1CUZrzV/Q== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-select "~14.9.0" - rc-tree "~5.7.0" - rc-util "^5.16.1" - -rc-tree@~5.7.0, rc-tree@~5.7.12: - version "5.7.12" - resolved "https://registry.npmmirror.com/rc-tree/-/rc-tree-5.7.12.tgz#6910e551390963708936c2cbf925f9deff4a6d76" - integrity sha512-LXA5nY2hG5koIAlHW5sgXgLpOMz+bFRbnZZ+cCg0tQs4Wv1AmY7EDi1SK7iFXhslYockbqUerQan82jljoaItg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.0.1" - rc-util "^5.16.1" - rc-virtual-list "^3.5.1" - -rc-upload@~4.3.4: - version "4.3.5" - resolved "https://registry.npmmirror.com/rc-upload/-/rc-upload-4.3.5.tgz#12fc69b2af74d08646a104828831bcaf44076eda" - integrity sha512-EHlKJbhkgFSQHliTj9v/2K5aEuFwfUQgZARzD7AmAPOneZEPiCNF3n6PEWIuqz9h7oq6FuXgdR67sC5BWFxJbA== - dependencies: - "@babel/runtime" "^7.18.3" - classnames "^2.2.5" - rc-util "^5.2.0" - -rc-util@^5.0.1, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.2.0, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.24.4, rc-util@^5.25.2, rc-util@^5.26.0, rc-util@^5.27.0, rc-util@^5.28.0, rc-util@^5.30.0, rc-util@^5.31.1, rc-util@^5.32.2, rc-util@^5.33.0, rc-util@^5.34.1, rc-util@^5.35.0, rc-util@^5.36.0, rc-util@^5.37.0: - version "5.37.0" - resolved "https://registry.npmmirror.com/rc-util/-/rc-util-5.37.0.tgz#6df9a55cb469b41b6995530a45b5f3dd3219a4ea" - integrity sha512-cPMV8DzaHI1KDaS7XPRXAf4J7mtBqjvjikLpQieaeOO7+cEbqY2j7Kso/T0R0OiEZTNcLS/8Zl9YrlXiO9UbjQ== - dependencies: - "@babel/runtime" "^7.18.3" - react-is "^16.12.0" - -rc-virtual-list@^3.11.1, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2: - version "3.11.2" - resolved "https://registry.npmmirror.com/rc-virtual-list/-/rc-virtual-list-3.11.2.tgz#eb859c2257233aff10864f041e5bcc89f7814bb7" - integrity sha512-MTFLL2LOHr3+/+r+WjTIs6j8XmJE6EqdOsJvCH8SWig7qyik3aljCEImUtw5tdWR0tQhXUfbv7P7nZaLY91XPg== - dependencies: - "@babel/runtime" "^7.20.0" - classnames "^2.2.6" - rc-resize-observer "^1.0.0" - rc-util "^5.36.0" - -react-app-polyfill@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz#95221e0a9bd259e5ca6b177c7bb1cb6768f68fd7" - integrity sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w== - dependencies: - core-js "^3.19.2" - object-assign "^4.1.1" - promise "^8.1.0" - raf "^3.4.1" - regenerator-runtime "^0.13.9" - whatwg-fetch "^3.6.2" - -react-dev-utils@^12.0.1: - version "12.0.1" - resolved "https://registry.npmmirror.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" - integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== - dependencies: - "@babel/code-frame" "^7.16.0" - address "^1.1.2" - browserslist "^4.18.1" - chalk "^4.1.2" - cross-spawn "^7.0.3" - detect-port-alt "^1.1.6" - escape-string-regexp "^4.0.0" - filesize "^8.0.6" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^6.5.0" - global-modules "^2.0.0" - globby "^11.0.4" - gzip-size "^6.0.0" - immer "^9.0.7" - is-root "^2.1.0" - loader-utils "^3.2.0" - open "^8.4.0" - pkg-up "^3.1.0" - prompts "^2.4.2" - react-error-overlay "^6.0.11" - recursive-readdir "^2.2.2" - shell-quote "^1.7.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.npmmirror.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - -react-error-overlay@^6.0.11: - version "6.0.11" - resolved "https://registry.npmmirror.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" - integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== - -react-i18next@^13.2.2: - version "13.2.2" - resolved "https://registry.npmmirror.com/react-i18next/-/react-i18next-13.2.2.tgz#b1e78ed66a54f4bc819616f68b98221e1b1a1936" - integrity sha512-+nFUkbRByFwnrfDcYqvzBuaeZb+nACHx+fAWN/pZMddWOCJH5hoc21+Sa/N/Lqi6ne6/9wC/qRGOoQhJa6IkEQ== - dependencies: - "@babel/runtime" "^7.22.5" - html-parse-stringify "^3.0.1" - -react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -react-refresh@^0.11.0: - version "0.11.0" - resolved "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" - integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== - -react-router-dom@^6.11.1: - version "6.16.0" - resolved "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-6.16.0.tgz#86f24658da35eb66727e75ecbb1a029e33ee39d9" - integrity sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg== - dependencies: - "@remix-run/router" "1.9.0" - react-router "6.16.0" - -react-router@6.16.0: - version "6.16.0" - resolved "https://registry.npmmirror.com/react-router/-/react-router-6.16.0.tgz#abbf3d5bdc9c108c9b822a18be10ee004096fb81" - integrity sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA== - dependencies: - "@remix-run/router" "1.9.0" - -react-scripts@5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/react-scripts/-/react-scripts-5.0.1.tgz#6285dbd65a8ba6e49ca8d651ce30645a6d980003" - integrity sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ== - dependencies: - "@babel/core" "^7.16.0" - "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" - "@svgr/webpack" "^5.5.0" - babel-jest "^27.4.2" - babel-loader "^8.2.3" - babel-plugin-named-asset-import "^0.3.8" - babel-preset-react-app "^10.0.1" - bfj "^7.0.2" - browserslist "^4.18.1" - camelcase "^6.2.1" - case-sensitive-paths-webpack-plugin "^2.4.0" - css-loader "^6.5.1" - css-minimizer-webpack-plugin "^3.2.0" - dotenv "^10.0.0" - dotenv-expand "^5.1.0" - eslint "^8.3.0" - eslint-config-react-app "^7.0.1" - eslint-webpack-plugin "^3.1.1" - file-loader "^6.2.0" - fs-extra "^10.0.0" - html-webpack-plugin "^5.5.0" - identity-obj-proxy "^3.0.0" - jest "^27.4.3" - jest-resolve "^27.4.2" - jest-watch-typeahead "^1.0.0" - mini-css-extract-plugin "^2.4.5" - postcss "^8.4.4" - postcss-flexbugs-fixes "^5.0.2" - postcss-loader "^6.2.1" - postcss-normalize "^10.0.1" - postcss-preset-env "^7.0.1" - prompts "^2.4.2" - react-app-polyfill "^3.0.0" - react-dev-utils "^12.0.1" - react-refresh "^0.11.0" - resolve "^1.20.0" - resolve-url-loader "^4.0.0" - sass-loader "^12.3.0" - semver "^7.3.5" - source-map-loader "^3.0.0" - style-loader "^3.3.1" - tailwindcss "^3.0.2" - terser-webpack-plugin "^5.2.5" - webpack "^5.64.4" - webpack-dev-server "^4.6.0" - webpack-manifest-plugin "^4.0.2" - workbox-webpack-plugin "^6.4.1" - optionalDependencies: - fsevents "^2.3.2" - -react@^18.2.0: - version "18.2.0" - resolved "https://registry.npmmirror.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - -readable-stream@^2.0.1: - version "2.3.8" - resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6: - version "3.6.2" - resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.npmmirror.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== - dependencies: - minimatch "^3.0.5" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -reflect.getprototypeof@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" - integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" - -regenerate-unicode-properties@^10.1.0: - version "10.1.1" - resolved "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" - integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.9: - version "0.13.11" - resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== - -regenerator-transform@^0.15.2: - version "0.15.2" - resolved "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" - integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== - dependencies: - "@babel/runtime" "^7.8.4" - -regex-parser@^2.2.11: - version "2.2.11" - resolved "https://registry.npmmirror.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" - integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== - -regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: - version "1.5.1" - resolved "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" - -regexpu-core@^5.3.1: - version "5.3.2" - resolved "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== - dependencies: - "@babel/regjsgen" "^0.8.0" - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== - dependencies: - jsesc "~0.5.0" - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resize-observer-polyfill@^1.5.1: - version "1.5.1" - resolved "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" - integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-url-loader@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" - integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== - dependencies: - adjust-sourcemap-loader "^4.0.0" - convert-source-map "^1.7.0" - loader-utils "^2.0.0" - postcss "^7.0.35" - source-map "0.6.1" - -resolve.exports@^1.1.0: - version "1.1.1" - resolved "https://registry.npmmirror.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" - integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== - -resolve@^1.1.7, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.4: - version "1.22.6" - resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" - integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.4: - version "2.0.0-next.4" - resolved "https://registry.npmmirror.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" - integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.npmmirror.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup-plugin-terser@^7.0.0: - version "7.0.2" - resolved "https://registry.npmmirror.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" - integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== - dependencies: - "@babel/code-frame" "^7.10.4" - jest-worker "^26.2.1" - serialize-javascript "^4.0.0" - terser "^5.0.0" - -rollup@^2.43.1: - version "2.79.1" - resolved "https://registry.npmmirror.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" - integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== - optionalDependencies: - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.0.0, safe-array-concat@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" - integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sanitize.css@*: - version "13.0.0" - resolved "https://registry.npmmirror.com/sanitize.css/-/sanitize.css-13.0.0.tgz#2675553974b27964c75562ade3bd85d79879f173" - integrity sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA== - -sass-loader@^12.3.0: - version "12.6.0" - resolved "https://registry.npmmirror.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb" - integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== - dependencies: - klona "^2.0.4" - neo-async "^2.6.2" - -sass-resources-loader@^2.0.0: - version "2.2.5" - resolved "https://registry.npmmirror.com/sass-resources-loader/-/sass-resources-loader-2.2.5.tgz#75131cdb26bae51fcffc007d8155d57b5e825ca7" - integrity sha512-po8rfETH9cOQACWxubT/1CCu77KjxwRtCDm6QAXZH99aUHBydwSoxdIjC40SGp/dcS/FkSNJl0j1VEojGZqlvQ== - dependencies: - async "^3.2.3" - chalk "^4.1.0" - glob "^7.1.6" - loader-utils "^2.0.0" - -sax@^1.2.4, sax@~1.2.4: - version "1.2.4" - resolved "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" - integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -screenfull@^5.0.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/screenfull/-/screenfull-5.2.0.tgz#6533d524d30621fc1283b9692146f3f13a93d1ba" - integrity sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA== - -scroll-into-view-if-needed@^3.0.3: - version "3.1.0" - resolved "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz#fa9524518c799b45a2ef6bbffb92bcad0296d01f" - integrity sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ== - dependencies: - compute-scroll-into-view "^3.0.2" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== - dependencies: - node-forge "^1" - -semver@^5.6.0: - version "5.7.2" - resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: - version "7.5.4" - resolved "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.npmmirror.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== - dependencies: - randombytes "^2.1.0" - -serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -set-function-name@^2.0.0, set-function-name@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== - dependencies: - define-data-property "^1.0.1" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.7.3: - version "1.8.1" - resolved "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -size-sensor@^1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/size-sensor/-/size-sensor-1.0.2.tgz#b8f8da029683cf2b4e22f12bf8b8f0a1145e8471" - integrity sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw== - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -sockjs@^0.3.24: - version "0.3.24" - resolved "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -source-list-map@^2.0.0, source-list-map@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - -source-map-js@^1.0.1, source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-loader@^3.0.0: - version "3.0.2" - resolved "https://registry.npmmirror.com/source-map-loader/-/source-map-loader-3.0.2.tgz#af23192f9b344daa729f6772933194cc5fa54fee" - integrity sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg== - dependencies: - abab "^2.0.5" - iconv-lite "^0.6.3" - source-map-js "^1.0.1" - -source-map-support@^0.5.6, source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -source-map@^0.8.0-beta.0: - version "0.8.0-beta.0" - resolved "https://registry.npmmirror.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" - integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== - dependencies: - whatwg-url "^7.0.0" - -sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -stackframe@^1.3.4: - version "1.3.4" - resolved "https://registry.npmmirror.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" - integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== - -static-eval@2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" - integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== - dependencies: - escodegen "^1.8.1" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== - -string-argv@0.3.2: - version "0.3.2" - resolved "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - -string-convert@^0.2.0: - version "0.2.1" - resolved "https://registry.npmmirror.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" - integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A== - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-length@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/string-length/-/string-length-5.0.1.tgz#3d647f497b6e8e8d41e422f7e0b23bc536c8381e" - integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow== - dependencies: - char-regex "^2.0.0" - strip-ansi "^7.0.1" - -string-natural-compare@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" - integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.0, string-width@^5.0.1: - version "5.1.2" - resolved "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: - version "4.0.10" - resolved "https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" - integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - regexp.prototype.flags "^1.5.0" - set-function-name "^2.0.0" - side-channel "^1.0.4" - -string.prototype.trim@^1.2.8: - version "1.2.8" - resolved "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string.prototype.trimend@^1.0.7: - version "1.0.7" - resolved "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string.prototype.trimstart@^1.0.7: - version "1.0.7" - resolved "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" - integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -stringify-object@^3.3.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" - integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-comments@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b" - integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -style-loader@^3.3.1: - version "3.3.3" - resolved "https://registry.npmmirror.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" - integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== - -styled-components@^6.0.0-rc.1: - version "6.0.8" - resolved "https://registry.npmmirror.com/styled-components/-/styled-components-6.0.8.tgz#90617ad60de39772e03a81c8f3b8e66c12f51c44" - integrity sha512-AwI02MTWZwqjzfXgR5QcbmcSn5xVjY4N2TLjSuYnmuBGF3y7GicHz3ysbpUq2EMJP5M8/Nc22vcmF3V3WNZDFA== - dependencies: - "@babel/cli" "^7.21.0" - "@babel/core" "^7.21.0" - "@babel/helper-module-imports" "^7.18.6" - "@babel/plugin-external-helpers" "^7.18.6" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.7" - "@babel/preset-env" "^7.20.2" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.21.0" - "@babel/traverse" "^7.21.2" - "@emotion/is-prop-valid" "^1.2.1" - "@emotion/unitless" "^0.8.0" - "@types/stylis" "^4.0.2" - css-to-react-native "^3.2.0" - csstype "^3.1.2" - postcss "^8.4.23" - shallowequal "^1.1.0" - stylis "^4.3.0" - tslib "^2.5.0" - -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== - dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" - -stylis@^4.0.13, stylis@^4.3.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/stylis/-/stylis-4.3.0.tgz#abe305a669fc3d8777e10eefcfc73ad861c5588c" - integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ== - -sucrase@^3.32.0: - version "3.34.0" - resolved "https://registry.npmmirror.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" - integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "7.1.6" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.0.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" - integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-parser@^2.0.2: - version "2.0.4" - resolved "https://registry.npmmirror.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" - integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== - -svgo@^1.2.2: - version "1.3.2" - resolved "https://registry.npmmirror.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" - stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" - -svgo@^2.7.0: - version "2.8.0" - resolved "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - stable "^0.1.8" - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -tailwindcss@^3.0.2: - version "3.3.3" - resolved "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.3.3.tgz#90da807393a2859189e48e9e7000e6880a736daf" - integrity sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w== - dependencies: - "@alloc/quick-lru" "^5.2.0" - arg "^5.0.2" - chokidar "^3.5.3" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.2.12" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.18.2" - lilconfig "^2.1.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" - postcss-import "^15.1.0" - postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - resolve "^1.22.2" - sucrase "^3.32.0" - -tapable@^1.0.0: - version "1.1.3" - resolved "https://registry.npmmirror.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -temp-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" - integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== - -tempy@^0.6.0: - version "0.6.0" - resolved "https://registry.npmmirror.com/tempy/-/tempy-0.6.0.tgz#65e2c35abc06f1124a97f387b08303442bde59f3" - integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== - dependencies: - is-stream "^2.0.0" - temp-dir "^2.0.0" - type-fest "^0.16.0" - unique-string "^2.0.0" - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.npmmirror.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.7: - version "5.3.9" - resolved "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" - integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.17" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.16.8" - -terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: - version "5.20.0" - resolved "https://registry.npmmirror.com/terser/-/terser-5.20.0.tgz#ea42aea62578703e33def47d5c5b93c49772423e" - integrity sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -throat@^6.0.1: - version "6.0.2" - resolved "https://registry.npmmirror.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" - integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== - -throttle-debounce@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.0.tgz#a17a4039e82a2ed38a5e7268e4132d6960d41933" - integrity sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg== - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toggle-selection@^1.0.6: - version "1.0.6" - resolved "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" - integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tough-cookie@^4.0.0: - version "4.1.3" - resolved "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== - dependencies: - punycode "^2.1.0" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -tryer@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" - integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -ts-node@^10.7.0: - version "10.9.1" - resolved "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsconfig-paths@^3.14.2: - version "3.14.2" - resolved "https://registry.npmmirror.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@2.3.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" - integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.3, tslib@^2.3.0, tslib@^2.4.1, tslib@^2.5.0: - version "2.6.2" - resolved "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.16.0: - version "0.16.0" - resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" - integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^1.0.2: - version "1.4.0" - resolved "https://registry.npmmirror.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" - -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@^4.9.5: - version "4.9.5" - resolved "https://registry.npmmirror.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -underscore@1.12.1: - version "1.12.1" - resolved "https://registry.npmmirror.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" - integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== - -upath@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" - -utila@~0.4: - version "0.4.0" - resolved "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-to-istanbul@^8.1.0: - version "8.1.1" - resolved "https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" - integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -void-elements@3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" - integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7: - version "1.0.8" - resolved "https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.npmmirror.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -web-vitals@^2.1.4: - version "2.1.4" - resolved "https://registry.npmmirror.com/web-vitals/-/web-vitals-2.1.4.tgz#76563175a475a5e835264d373704f9dde718290c" - integrity sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg== - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@^4.6.0: - version "4.15.1" - resolved "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" - integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.5" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.13.0" - -webpack-manifest-plugin@^4.0.2: - version "4.1.1" - resolved "https://registry.npmmirror.com/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz#10f8dbf4714ff93a215d5a45bcc416d80506f94f" - integrity sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow== - dependencies: - tapable "^2.0.0" - webpack-sources "^2.2.0" - -webpack-merge@^5.8.0: - version "5.9.0" - resolved "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" - integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack-sources@^2.2.0: - version "2.3.1" - resolved "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd" - integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== - dependencies: - source-list-map "^2.0.1" - source-map "^0.6.1" - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.64.4: - version "5.88.2" - resolved "https://registry.npmmirror.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" - integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" - acorn "^8.7.1" - acorn-import-assertions "^1.9.0" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.15.0" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.2.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-fetch@^3.6.2: - version "3.6.19" - resolved "https://registry.npmmirror.com/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz#caefd92ae630b91c07345537e67f8354db470973" - integrity sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw== - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== - dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" - is-async-function "^2.0.0" - is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" - is-generator-function "^1.0.10" - is-regex "^1.1.4" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== - dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" - -which-typed-array@^1.1.11, which-typed-array@^1.1.9: - version "1.1.11" - resolved "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -which@^1.3.1: - version "1.3.1" - resolved "https://registry.npmmirror.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wildcard@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" - integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== - -word-wrap@~1.2.3: - version "1.2.5" - resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -workbox-background-sync@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-background-sync/-/workbox-background-sync-6.6.1.tgz#08d603a33717ce663e718c30cc336f74909aff2f" - integrity sha512-trJd3ovpWCvzu4sW0E8rV3FUyIcC0W8G+AZ+VcqzzA890AsWZlUGOTSxIMmIHVusUw/FDq1HFWfy/kC/WTRqSg== - dependencies: - idb "^7.0.1" - workbox-core "6.6.1" - -workbox-broadcast-update@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-broadcast-update/-/workbox-broadcast-update-6.6.1.tgz#0fad9454cf8e4ace0c293e5617c64c75d8a8c61e" - integrity sha512-fBhffRdaANdeQ1V8s692R9l/gzvjjRtydBOvR6WCSB0BNE2BacA29Z4r9/RHd9KaXCPl6JTdI9q0bR25YKP8TQ== - dependencies: - workbox-core "6.6.1" - -workbox-build@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-build/-/workbox-build-6.6.1.tgz#6010e9ce550910156761448f2dbea8cfcf759cb0" - integrity sha512-INPgDx6aRycAugUixbKgiEQBWD0MPZqU5r0jyr24CehvNuLPSXp/wGOpdRJmts656lNiXwqV7dC2nzyrzWEDnw== - dependencies: - "@apideck/better-ajv-errors" "^0.3.1" - "@babel/core" "^7.11.1" - "@babel/preset-env" "^7.11.0" - "@babel/runtime" "^7.11.2" - "@rollup/plugin-babel" "^5.2.0" - "@rollup/plugin-node-resolve" "^11.2.1" - "@rollup/plugin-replace" "^2.4.1" - "@surma/rollup-plugin-off-main-thread" "^2.2.3" - ajv "^8.6.0" - common-tags "^1.8.0" - fast-json-stable-stringify "^2.1.0" - fs-extra "^9.0.1" - glob "^7.1.6" - lodash "^4.17.20" - pretty-bytes "^5.3.0" - rollup "^2.43.1" - rollup-plugin-terser "^7.0.0" - source-map "^0.8.0-beta.0" - stringify-object "^3.3.0" - strip-comments "^2.0.1" - tempy "^0.6.0" - upath "^1.2.0" - workbox-background-sync "6.6.1" - workbox-broadcast-update "6.6.1" - workbox-cacheable-response "6.6.1" - workbox-core "6.6.1" - workbox-expiration "6.6.1" - workbox-google-analytics "6.6.1" - workbox-navigation-preload "6.6.1" - workbox-precaching "6.6.1" - workbox-range-requests "6.6.1" - workbox-recipes "6.6.1" - workbox-routing "6.6.1" - workbox-strategies "6.6.1" - workbox-streams "6.6.1" - workbox-sw "6.6.1" - workbox-window "6.6.1" - -workbox-cacheable-response@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-cacheable-response/-/workbox-cacheable-response-6.6.1.tgz#284c2b86be3f4fd191970ace8c8e99797bcf58e9" - integrity sha512-85LY4veT2CnTCDxaVG7ft3NKaFbH6i4urZXgLiU4AiwvKqS2ChL6/eILiGRYXfZ6gAwDnh5RkuDbr/GMS4KSag== - dependencies: - workbox-core "6.6.1" - -workbox-core@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-core/-/workbox-core-6.6.1.tgz#7184776d4134c5ed2f086878c882728fc9084265" - integrity sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw== - -workbox-expiration@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-expiration/-/workbox-expiration-6.6.1.tgz#a841fa36676104426dbfb9da1ef6a630b4f93739" - integrity sha512-qFiNeeINndiOxaCrd2DeL1Xh1RFug3JonzjxUHc5WkvkD2u5abY3gZL1xSUNt3vZKsFFGGORItSjVTVnWAZO4A== - dependencies: - idb "^7.0.1" - workbox-core "6.6.1" - -workbox-google-analytics@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-google-analytics/-/workbox-google-analytics-6.6.1.tgz#a07a6655ab33d89d1b0b0a935ffa5dea88618c5d" - integrity sha512-1TjSvbFSLmkpqLcBsF7FuGqqeDsf+uAXO/pjiINQKg3b1GN0nBngnxLcXDYo1n/XxK4N7RaRrpRlkwjY/3ocuA== - dependencies: - workbox-background-sync "6.6.1" - workbox-core "6.6.1" - workbox-routing "6.6.1" - workbox-strategies "6.6.1" - -workbox-navigation-preload@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-navigation-preload/-/workbox-navigation-preload-6.6.1.tgz#61a34fe125558dd88cf09237f11bd966504ea059" - integrity sha512-DQCZowCecO+wRoIxJI2V6bXWK6/53ff+hEXLGlQL4Rp9ZaPDLrgV/32nxwWIP7QpWDkVEtllTAK5h6cnhxNxDA== - dependencies: - workbox-core "6.6.1" - -workbox-precaching@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-precaching/-/workbox-precaching-6.6.1.tgz#dedeeba10a2d163d990bf99f1c2066ac0d1a19e2" - integrity sha512-K4znSJ7IKxCnCYEdhNkMr7X1kNh8cz+mFgx9v5jFdz1MfI84pq8C2zG+oAoeE5kFrUf7YkT5x4uLWBNg0DVZ5A== - dependencies: - workbox-core "6.6.1" - workbox-routing "6.6.1" - workbox-strategies "6.6.1" - -workbox-range-requests@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-range-requests/-/workbox-range-requests-6.6.1.tgz#ddaf7e73af11d362fbb2f136a9063a4c7f507a39" - integrity sha512-4BDzk28govqzg2ZpX0IFkthdRmCKgAKreontYRC5YsAPB2jDtPNxqx3WtTXgHw1NZalXpcH/E4LqUa9+2xbv1g== - dependencies: - workbox-core "6.6.1" - -workbox-recipes@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-recipes/-/workbox-recipes-6.6.1.tgz#ea70d2b2b0b0bce8de0a9d94f274d4a688e69fae" - integrity sha512-/oy8vCSzromXokDA+X+VgpeZJvtuf8SkQ8KL0xmRivMgJZrjwM3c2tpKTJn6PZA6TsbxGs3Sc7KwMoZVamcV2g== - dependencies: - workbox-cacheable-response "6.6.1" - workbox-core "6.6.1" - workbox-expiration "6.6.1" - workbox-precaching "6.6.1" - workbox-routing "6.6.1" - workbox-strategies "6.6.1" - -workbox-routing@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-routing/-/workbox-routing-6.6.1.tgz#cba9a1c7e0d1ea11e24b6f8c518840efdc94f581" - integrity sha512-j4ohlQvfpVdoR8vDYxTY9rA9VvxTHogkIDwGdJ+rb2VRZQ5vt1CWwUUZBeD/WGFAni12jD1HlMXvJ8JS7aBWTg== - dependencies: - workbox-core "6.6.1" - -workbox-strategies@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-strategies/-/workbox-strategies-6.6.1.tgz#38d0f0fbdddba97bd92e0c6418d0b1a2ccd5b8bf" - integrity sha512-WQLXkRnsk4L81fVPkkgon1rZNxnpdO5LsO+ws7tYBC6QQQFJVI6v98klrJEjFtZwzw/mB/HT5yVp7CcX0O+mrw== - dependencies: - workbox-core "6.6.1" - -workbox-streams@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-streams/-/workbox-streams-6.6.1.tgz#b2f7ba7b315c27a6e3a96a476593f99c5d227d26" - integrity sha512-maKG65FUq9e4BLotSKWSTzeF0sgctQdYyTMq529piEN24Dlu9b6WhrAfRpHdCncRS89Zi2QVpW5V33NX8PgH3Q== - dependencies: - workbox-core "6.6.1" - workbox-routing "6.6.1" - -workbox-sw@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-sw/-/workbox-sw-6.6.1.tgz#d4c4ca3125088e8b9fd7a748ed537fa0247bd72c" - integrity sha512-R7whwjvU2abHH/lR6kQTTXLHDFU2izht9kJOvBRYK65FbwutT4VvnUAJIgHvfWZ/fokrOPhfoWYoPCMpSgUKHQ== - -workbox-webpack-plugin@^6.4.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.1.tgz#4f81cc1ad4e5d2cd7477a86ba83c84ee2d187531" - integrity sha512-zpZ+ExFj9NmiI66cFEApyjk7hGsfJ1YMOaLXGXBoZf0v7Iu6hL0ZBe+83mnDq3YYWAfA3fnyFejritjOHkFcrA== - dependencies: - fast-json-stable-stringify "^2.1.0" - pretty-bytes "^5.4.1" - upath "^1.2.0" - webpack-sources "^1.4.3" - workbox-build "6.6.1" - -workbox-window@6.6.1: - version "6.6.1" - resolved "https://registry.npmmirror.com/workbox-window/-/workbox-window-6.6.1.tgz#f22a394cbac36240d0dadcbdebc35f711bb7b89e" - integrity sha512-wil4nwOY58nTdCvif/KEZjQ2NP8uk3gGeRNy2jPBbzypU4BT4D9L8xiwbmDBpZlSgJd2xsT9FvSNU0gsxV51JQ== - dependencies: - "@types/trusted-types" "^2.0.2" - workbox-core "6.6.1" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@^7.4.6: - version "7.5.9" - resolved "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.13.0: - version "8.14.2" - resolved "https://registry.npmmirror.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" - integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@2.3.1: - version "2.3.1" - resolved "https://registry.npmmirror.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== - -yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yaml@^2.1.1: - version "2.3.2" - resolved "https://registry.npmmirror.com/yaml/-/yaml-2.3.2.tgz#f522db4313c671a0ca963a75670f1c12ea909144" - integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zrender@5.4.4: - version "5.4.4" - resolved "https://registry.npmmirror.com/zrender/-/zrender-5.4.4.tgz#8854f1d95ecc82cf8912f5a11f86657cb8c9e261" - integrity sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw== - dependencies: - tslib "2.3.0" diff --git a/threadpool/console/.editorconfig b/threadpool/console/.editorconfig deleted file mode 100755 index 3454886e..00000000 --- a/threadpool/console/.editorconfig +++ /dev/null @@ -1,14 +0,0 @@ -# https://editorconfig.org -root = true - -[*] -charset = utf-8 -indent_style = space -indent_size = 2 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true - -[*.md] -insert_final_newline = false -trim_trailing_whitespace = false diff --git a/threadpool/console/.env.development b/threadpool/console/.env.development deleted file mode 100755 index adc11b58..00000000 --- a/threadpool/console/.env.development +++ /dev/null @@ -1,17 +0,0 @@ -# just a flag -ENV = 'development' - -# base api -VUE_APP_BASE_API = '' - -# no mock api -VUE_APP_API = '' - -# vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable, -# to control whether the babel-plugin-dynamic-import-node plugin is enabled. -# It only does one thing by converting all import() to require(). -# This configuration can significantly increase the speed of hot updates, -# when you have a large number of pages. -# Detail: https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/babel-preset-app/index.js - -VUE_CLI_BABEL_TRANSPILE_MODULES = true diff --git a/threadpool/console/.env.production b/threadpool/console/.env.production deleted file mode 100755 index 517e6999..00000000 --- a/threadpool/console/.env.production +++ /dev/null @@ -1,5 +0,0 @@ -# just a flag -ENV = 'production' - -# base api -VUE_APP_BASE_API = '' diff --git a/threadpool/console/.env.staging b/threadpool/console/.env.staging deleted file mode 100755 index a8793a09..00000000 --- a/threadpool/console/.env.staging +++ /dev/null @@ -1,8 +0,0 @@ -NODE_ENV = production - -# just a flag -ENV = 'staging' - -# base api -VUE_APP_BASE_API = '/stage-api' - diff --git a/threadpool/console/.eslintignore b/threadpool/console/.eslintignore deleted file mode 100755 index b8e7312d..00000000 --- a/threadpool/console/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -build/*.js -src/assets -public -dist -*.vue diff --git a/threadpool/console/.eslintrc.js b/threadpool/console/.eslintrc.js deleted file mode 100755 index 3925885a..00000000 --- a/threadpool/console/.eslintrc.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - root: true, - parserOptions: { - parser: 'babel-eslint', - sourceType: 'module', - }, - env: { - browser: true, - node: true, - es6: true, - }, - extends: ['plugin:vue/recommended', 'eslint:recommended', 'prettier'], - rules: { - 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, - 'no-console': process.env.NODE_ENV === 'production' ? 2 : 0, - }, -}; diff --git a/threadpool/console/.gitignore b/threadpool/console/.gitignore deleted file mode 100755 index 128a7ac9..00000000 --- a/threadpool/console/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -.DS_Store -node_modules/ -dist/ -npm-debug.log* -yarn-debug.log* -yarn-error.log* -**/*.log - -tests/**/coverage/ -tests/e2e/reports -selenium-debug.log - -# Editor directories and files -.idea -# .vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.local - -package-lock.json -yarn.lock diff --git a/threadpool/console/.prettierrc.js b/threadpool/console/.prettierrc.js deleted file mode 100644 index 9c7c0494..00000000 --- a/threadpool/console/.prettierrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - singleQuote: true, - trailingComma: 'all', - printWidth: 100, -}; diff --git a/threadpool/console/.travis.yml b/threadpool/console/.travis.yml deleted file mode 100755 index f4be7a08..00000000 --- a/threadpool/console/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: 10 -script: npm run test -notifications: - email: false diff --git a/threadpool/console/README.md b/threadpool/console/README.md deleted file mode 100755 index 18d9719a..00000000 --- a/threadpool/console/README.md +++ /dev/null @@ -1,23 +0,0 @@ -## 说明 - -该项目由 [datax-web-ui](https://github.com/WeiYe-Jing/datax-web-ui)、[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin) 修改而来。 - -## Build Setup - -运行: - -``` -npm install [ 慢的话用 npm install --registry https://registry.npm.taobao.org] -``` - -启动: - -``` -npm run dev -``` - -打包: - -``` -npm run build:prod -``` diff --git a/threadpool/console/babel.config.js b/threadpool/console/babel.config.js deleted file mode 100755 index ba179669..00000000 --- a/threadpool/console/babel.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - presets: [ - '@vue/app' - ] -} diff --git a/threadpool/console/jest.config.js b/threadpool/console/jest.config.js deleted file mode 100755 index 143cdc86..00000000 --- a/threadpool/console/jest.config.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = { - moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], - transform: { - '^.+\\.vue$': 'vue-jest', - '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': - 'jest-transform-stub', - '^.+\\.jsx?$': 'babel-jest' - }, - moduleNameMapper: { - '^@/(.*)$': '/src/$1' - }, - snapshotSerializers: ['jest-serializer-vue'], - testMatch: [ - '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' - ], - collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'], - coverageDirectory: '/tests/unit/coverage', - // 'collectCoverage': true, - 'coverageReporters': [ - 'lcov', - 'text-summary' - ], - testURL: 'http://localhost/' -} diff --git a/threadpool/console/package.json b/threadpool/console/package.json deleted file mode 100755 index 505a900b..00000000 --- a/threadpool/console/package.json +++ /dev/null @@ -1,111 +0,0 @@ -{ - "name": "vue-element-admin", - "version": "4.2.1", - "description": "hippo4j console ui", - "author": "jingwk", - "license": "MIT", - "scripts": { - "dev": "vue-cli-service serve", - "build:prod": "vue-cli-service build", - "build:stage": "vue-cli-service build --mode staging", - "preview": "node build/index.js --preview", - "lint": "eslint --ext .js,.vue src", - "test:unit": "jest --clearCache && vue-cli-service test:unit", - "test:ci": "npm run lint && npm run test:unit", - "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml", - "new": "plop" - }, - "husky": { - "hooks": { - "pre-commit": "lint-staged" - } - }, - "lint-staged": { - "src/**/*.{js,vue}": [ - "eslint --fix", - "git add" - ] - }, - "keywords": [ - "vue", - "admin", - "dashboard", - "element-ui", - "boilerplate", - "admin-template", - "management-system" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/PanJiaChen/vue-element-admin.git" - }, - "bugs": { - "url": "https://github.com/PanJiaChen/vue-element-admin/issues" - }, - "dependencies": { - "axios": ">=0.18.1", - "buffer": "^6.0.3", - "clipboard": "2.0.4", - "codemirror": "5.45.0", - "core-js": "^3.26.0", - "crypto": "^1.0.1", - "echarts": "^5.2.2", - "element-ui": "^2.15.7", - "fuse.js": "3.4.4", - "js-cookie": "2.2.0", - "jsonlint": "1.6.3", - "normalize.css": "7.0.0", - "nprogress": "0.2.0", - "path-to-regexp": "2.4.0", - "prettier": "^2.5.1", - "screenfull": "4.2.0", - "vue": "2.6.10", - "vue-cookie": "^1.1.4", - "vue-count-to": "1.0.13", - "vue-i18n": "^6.1.3", - "vue-router": "3.0.2", - "vue-splitpane": "1.0.4", - "vue2-jsoneditor": "^1.0.6", - "vuedraggable": "2.20.0", - "vuex": "3.1.0" - }, - "devDependencies": { - "@babel/core": "7.0.0", - "@babel/register": "7.0.0", - "@vue/cli-plugin-babel": "~4", - "@vue/cli-plugin-eslint": "3.5.1", - "@vue/cli-plugin-unit-jest": "3.5.3", - "@vue/cli-service": "3.5.3", - "@vue/test-utils": "1.0.0-beta.29", - "autoprefixer": "^9.5.1", - "babel-core": "7.0.0-bridge.0", - "babel-eslint": "10.0.1", - "babel-jest": "23.6.0", - "chalk": "2.4.2", - "chokidar": "2.1.5", - "connect": "3.6.6", - "eslint": "5.15.3", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-vue": "5.2.2", - "html-webpack-plugin": "3.2.0", - "lint-staged": "8.1.5", - "plop": "2.3.0", - "runjs": "^4.3.2", - "sass": "^1.48.0", - "sass-loader": "^8.0.0", - "script-ext-html-webpack-plugin": "2.1.3", - "script-loader": "0.7.2", - "serve-static": "^1.13.2", - "svg-sprite-loader": "4.1.3", - "svgo": "1.2.0", - "vue-template-compiler": "2.6.10" - }, - "engines": { - "node": ">=8.9", - "npm": ">= 3.0.0" - }, - "browserslist": [ - "> 1%", - "last 2 versions" - ] -} diff --git a/threadpool/console/plopfile.js b/threadpool/console/plopfile.js deleted file mode 100755 index 9f3147e2..00000000 --- a/threadpool/console/plopfile.js +++ /dev/null @@ -1,7 +0,0 @@ -const viewGenerator = require('./plop-templates/view/prompt') -const componentGenerator = require('./plop-templates/component/prompt') - -module.exports = function(plop) { - plop.setGenerator('view', viewGenerator) - plop.setGenerator('component', componentGenerator) -} diff --git a/threadpool/console/postcss.config.js b/threadpool/console/postcss.config.js deleted file mode 100755 index 961986e2..00000000 --- a/threadpool/console/postcss.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - plugins: { - autoprefixer: {} - } -} diff --git a/threadpool/console/public/favicon.ico b/threadpool/console/public/favicon.ico deleted file mode 100644 index 264e6fc6..00000000 Binary files a/threadpool/console/public/favicon.ico and /dev/null differ diff --git a/threadpool/console/public/hippo4j.gif b/threadpool/console/public/hippo4j.gif deleted file mode 100644 index fdbd32c6..00000000 Binary files a/threadpool/console/public/hippo4j.gif and /dev/null differ diff --git a/threadpool/console/public/index.html b/threadpool/console/public/index.html deleted file mode 100755 index e9185009..00000000 --- a/threadpool/console/public/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - <%= webpackConfig.name %> - - -
- - - diff --git a/threadpool/console/src/App.vue b/threadpool/console/src/App.vue deleted file mode 100755 index 0ec05356..00000000 --- a/threadpool/console/src/App.vue +++ /dev/null @@ -1,44 +0,0 @@ - - - diff --git a/threadpool/console/src/api/dashborad.js b/threadpool/console/src/api/dashborad.js deleted file mode 100755 index 742f175a..00000000 --- a/threadpool/console/src/api/dashborad.js +++ /dev/null @@ -1,38 +0,0 @@ -import request from '@/utils/request' - -// dashborad - -export function chartInfo() { - return request({ - url: '/hippo4j/v1/cs/dashboard', - method: 'get' - }) -} - -export function lineChart() { - return request({ - url: '/hippo4j/v1/cs/dashboard/line/chart', - method: 'get' - }) -} - -export function pieChart() { - return request({ - url: '/hippo4j/v1/cs/dashboard/pie/chart', - method: 'get' - }) -} - -export function tenantChart() { - return request({ - url: '/hippo4j/v1/cs/dashboard/tenant/chart', - method: 'get' - }) -} - -export function ranking() { - return request({ - url: '/hippo4j/v1/cs/dashboard/ranking', - method: 'get' - }) -} diff --git a/threadpool/console/src/api/hippo4j-adapterThreadPool.js b/threadpool/console/src/api/hippo4j-adapterThreadPool.js deleted file mode 100755 index 95b90b53..00000000 --- a/threadpool/console/src/api/hippo4j-adapterThreadPool.js +++ /dev/null @@ -1,24 +0,0 @@ -import request from '@/utils/request' - -export function list(data) { - return request({ - url: '/hippo4j/v1/cs/adapter/thread-pool/query?mark=' + data.mark + '&tenant=' + data.tenantId + '&item=' + data.itemId + '&threadPoolKey=' + data.threadPoolKey, - method: 'get' - }) -} - -export function listKey(data) { - return request({ - url: '/hippo4j/v1/cs/adapter/thread-pool/query/key?mark=' + data.mark + '&tenant=' + data.tenantId + '&item=' + data.itemId, - method: 'get' - }) -} - -export function updatePool(data) { - return request({ - url: '/hippo4j/v1/cs/adapter/thread-pool/update', - method: 'post', - data - }) -} - diff --git a/threadpool/console/src/api/hippo4j-instance.js b/threadpool/console/src/api/hippo4j-instance.js deleted file mode 100755 index 901b746d..00000000 --- a/threadpool/console/src/api/hippo4j-instance.js +++ /dev/null @@ -1,41 +0,0 @@ -import request from '@/utils/request' - -export function list(listArray) { - return request({ - url: '/hippo4j/v1/cs/thread/pool/list/instance/' + listArray[0] + '/' + listArray[1], - method: 'get' - }) -} - -export function tenantList(data) { - return request({ - url: '/hippo4j/v1/cs/item/query/page', - method: 'post', - data - }) -} - -export function updated(data) { - return request({ - url: '/hippo4j/v1/cs/configs?identify=' + data.identify, - method: 'post', - data - }) -} - -export function created(data) { - return request({ - url: '/hippo4j/v1/cs/thread/pool/save_or_update', - method: 'post', - data - }) -} - -export function deleted(data) { - return request({ - url: '/hippo4j/v1/cs/thread/pool/delete', - method: 'delete', - data - }) -} - diff --git a/threadpool/console/src/api/hippo4j-item.js b/threadpool/console/src/api/hippo4j-item.js deleted file mode 100755 index 47e5c579..00000000 --- a/threadpool/console/src/api/hippo4j-item.js +++ /dev/null @@ -1,48 +0,0 @@ -import request from '@/utils/request'; - -export function list(data) { - return request({ - url: '/hippo4j/v1/cs/item/query/page', - method: 'post', - data, - }); -} - -export function tenantList(data) { - return request({ - url: '/hippo4j/v1/cs/item/query/page', - method: 'post', - data, - }); -} - -export function updated(data) { - return request({ - url: '/hippo4j/v1/cs/item/update', - method: 'post', - data, - }); -} - -export function created(data) { - return request({ - url: '/hippo4j/v1/cs/item/save', - method: 'post', - data, - }); -} - -export function deleted(data) { - return request({ - url: '/hippo4j/v1/cs/item/delete/' + data[0] + '/' + data[1], - method: 'delete', - }); -} - -export function getJobProjectList(params) { - return request({ - url: 'v1/cs/jobProject/list', - method: 'get', - params, - }); -} diff --git a/threadpool/console/src/api/hippo4j-log.js b/threadpool/console/src/api/hippo4j-log.js deleted file mode 100755 index 01aee534..00000000 --- a/threadpool/console/src/api/hippo4j-log.js +++ /dev/null @@ -1,9 +0,0 @@ -import request from '@/utils/request'; - -export function list(data) { - return request({ - url: '/hippo4j/v1/cs/log/query/page', - method: 'post', - data, - }); -} diff --git a/threadpool/console/src/api/hippo4j-monitor.js b/threadpool/console/src/api/hippo4j-monitor.js deleted file mode 100755 index 286a7e66..00000000 --- a/threadpool/console/src/api/hippo4j-monitor.js +++ /dev/null @@ -1,25 +0,0 @@ -import request from '@/utils/request'; - -export function list(data) { - return request({ - url: '/hippo4j/v1/cs/log/query/page', - method: 'post', - data, - }); -} - -export function active(data) { - return request({ - url: '/hippo4j/v1/cs/monitor/info', - method: 'post', - data, - }); -} - -export function lastTaskCountFun(data) { - return request({ - url: '/hippo4j/v1/cs/monitor/last/task/count', - method: 'post', - data, - }); -} diff --git a/threadpool/console/src/api/hippo4j-notify.js b/threadpool/console/src/api/hippo4j-notify.js deleted file mode 100755 index 87dcae17..00000000 --- a/threadpool/console/src/api/hippo4j-notify.js +++ /dev/null @@ -1,48 +0,0 @@ -import request from '@/utils/request'; - -export function list(data) { - return request({ - url: '/hippo4j/v1/cs/notify/query/page', - method: 'post', - data, - }); -} - -export function tenantList(data) { - return request({ - url: '/hippo4j/v1/cs/item/query/page', - method: 'post', - data, - }); -} - -export function updated(data) { - return request({ - url: '/hippo4j/v1/cs/notify/update', - method: 'post', - data, - }); -} - -export function created(data) { - return request({ - url: '/hippo4j/v1/cs/notify/save', - method: 'post', - data, - }); -} - -export function deleted(data) { - return request({ - url: '/hippo4j/v1/cs/notify/remove', - method: 'delete', - data, - }); -} - -export function enable(data) { - return request({ - url: '/hippo4j/v1/cs/notify/enable/' + data.id + '/' + data.enable, - method: 'post', - }); -} diff --git a/threadpool/console/src/api/hippo4j-tenant.js b/threadpool/console/src/api/hippo4j-tenant.js deleted file mode 100755 index 5cd9b367..00000000 --- a/threadpool/console/src/api/hippo4j-tenant.js +++ /dev/null @@ -1,32 +0,0 @@ -import request from '@/utils/request'; - -export function list(data) { - return request({ - url: '/hippo4j/v1/cs/tenant/query/page', - method: 'post', - data, - }); -} - -export function updated(data) { - return request({ - url: '/hippo4j/v1/cs/tenant/update', - method: 'post', - data, - }); -} - -export function created(data) { - return request({ - url: '/hippo4j/v1/cs/tenant/save', - method: 'post', - data, - }); -} - -export function deleted(data) { - return request({ - url: '/hippo4j/v1/cs/tenant/delete/' + data, - method: 'delete', - }); -} diff --git a/threadpool/console/src/api/hippo4j-threadPool.js b/threadpool/console/src/api/hippo4j-threadPool.js deleted file mode 100755 index 25304e76..00000000 --- a/threadpool/console/src/api/hippo4j-threadPool.js +++ /dev/null @@ -1,114 +0,0 @@ -import request from '@/utils/request'; - -export function list(data) { - return request({ - url: '/hippo4j/v1/cs/thread/pool/query/page', - method: 'post', - data, - }); -} - -export function listClient(data) { - return request({ - url: '/hippo4j/v1/cs/thread/pool/list/client/instance/' + data.itemId + '?mark=' + data.mark, - method: 'get', - data, - }); -} - -export function info(data) { - return request({ - url: - '/hippo4j/v1/cs/configs?tpId=' + - data.tpId + - '&itemId=' + - data.itemId + - '&namespace=' + - data.tenantId + - '&instanceId=' + - data.identify, - method: 'get', - }); -} - -export function runState(data) { - return request({ - url: - '/hippo4j/v1/cs/thread/pool/run/state/' + data.tpId + '?clientAddress=' + data.clientAddress, - method: 'get', - }); -} - -export function runThreadState(data) { - return request({ - url: - '/hippo4j/v1/cs/thread/pool/run/thread/state/' + - data.tpId + - '?clientAddress=' + - data.clientAddress, - method: 'get', - }); -} - -export function webBaseInfo(data) { - return request({ - // async: false, - url: '/hippo4j/v1/cs/thread/pool/web/base/info' + '?clientAddress=' + data.clientAddress, - method: 'get', - }); -} - -export function webBaseState(data) { - return request({ - // async: false, - url: '/hippo4j/v1/cs/thread/pool/web/run/state' + '?clientAddress=' + data.clientAddress, - method: 'get', - }); -} - -export function webUpdatePool(data) { - return request({ - url: '/hippo4j/v1/cs/thread/pool/web/update/pool', - method: 'post', - data, - }); -} - -export function tenantList(data) { - return request({ - url: '/hippo4j/v1/cs/item/query/page', - method: 'post', - data, - }); -} - -export function updated(data) { - return request({ - url: '/hippo4j/v1/cs/thread/pool/save_or_update', - method: 'post', - data, - }); -} - -export function created(data) { - return request({ - url: '/hippo4j/v1/cs/thread/pool/save_or_update', - method: 'post', - data, - }); -} - -export function deleted(data) { - return request({ - url: '/hippo4j/v1/cs/thread/pool/delete', - method: 'delete', - data, - }); -} - -export function alarmEnable(data) { - return request({ - url: '/hippo4j/v1/cs/thread/pool/alarm/enable/' + data.id + '/' + data.isAlarm, - method: 'post', - }); -} diff --git a/threadpool/console/src/api/hippo4j-user.js b/threadpool/console/src/api/hippo4j-user.js deleted file mode 100755 index e44e51bd..00000000 --- a/threadpool/console/src/api/hippo4j-user.js +++ /dev/null @@ -1,40 +0,0 @@ -import request from '@/utils/request' - -export function getList(data) { - return request({ - url: '/hippo4j/v1/cs/auth/users/page', - method: 'post', - data - }) -} - -export function updateUser(data) { - return request({ - url: '/hippo4j/v1/cs/auth/users/update', - method: 'put', - data - }) -} - -export function createUser(data) { - return request({ - url: '/hippo4j/v1/cs/auth/users/add', - method: 'post', - data - }) -} - -export function deleteUser(name) { - return request({ - url: '/hippo4j/v1/cs/auth/users/remove/' + name, - method: 'delete' - }) -} - -export function getCurrentUser(name) { - return request({ - url: '/hippo4j/v1/cs/auth/users/info/' + name, - method: 'get' - - }) -} diff --git a/threadpool/console/src/api/metadata-query.js b/threadpool/console/src/api/metadata-query.js deleted file mode 100644 index 51ec2ac8..00000000 --- a/threadpool/console/src/api/metadata-query.js +++ /dev/null @@ -1,54 +0,0 @@ -import request from '@/utils/request' - -export function getTables(params) { - return request({ - url: '/api/metadata/getTables', - method: 'get', - params - }) -} - -// 获取schema -export function getTableSchema(params) { - return request({ - url: '/api/metadata/getDBSchema', - method: 'get', - params - }) -} - -// 获取字段 -export function getColumns(params) { - return request({ - url: '/api/metadata/getColumns', - method: 'get', - params - }) -} - -// 根据sql获取字段 -export function getColumnsByQuerySql(params) { - return request({ - url: '/api/metadata/getColumnsByQuerySql', - method: 'get', - params - }) -} - -// 根据datasourceID、tablename创建表【目标端】 -export function createTable(params) { - return request({ - url: '/api/metadata/createTable', - method: 'post', - params - }) -} - -// 判断字段是否存在,存在,即更新值,否则添加字段 -export function updateColumnsValue(query) { - return request({ - url: '/api/metadata/updateColumnsValue', - method: 'post', - data: query - }) -} diff --git a/threadpool/console/src/api/remote-search.js b/threadpool/console/src/api/remote-search.js deleted file mode 100755 index c7e19117..00000000 --- a/threadpool/console/src/api/remote-search.js +++ /dev/null @@ -1,17 +0,0 @@ -import request from '@/utils/request' - -export function searchUser(name) { - return request({ - url: '/search/user', - method: 'get', - params: { name } - }) -} - -export function transactionList(query) { - return request({ - url: '/transaction/list', - method: 'get', - params: query - }) -} diff --git a/threadpool/console/src/api/role.js b/threadpool/console/src/api/role.js deleted file mode 100755 index f6a983f1..00000000 --- a/threadpool/console/src/api/role.js +++ /dev/null @@ -1,38 +0,0 @@ -import request from '@/utils/request' - -export function getRoutes() { - return request({ - url: '/routes', - method: 'get' - }) -} - -export function getRoles() { - return request({ - url: '/roles', - method: 'get' - }) -} - -export function addRole(data) { - return request({ - url: '/role', - method: 'post', - data - }) -} - -export function updateRole(id, data) { - return request({ - url: `/role/${id}`, - method: 'put', - data - }) -} - -export function deleteRole(id) { - return request({ - url: `/role/${id}`, - method: 'delete' - }) -} diff --git a/threadpool/console/src/api/user.js b/threadpool/console/src/api/user.js deleted file mode 100755 index d49cff65..00000000 --- a/threadpool/console/src/api/user.js +++ /dev/null @@ -1,23 +0,0 @@ -import request from '@/utils/request' - -export function login(data) { - return request({ - url: '/hippo4j/v1/cs/auth/login', - method: 'post', - data - }) -} - -export function getInfo() { - return request({ - url: '/hippo4j/v1/cs/user/info', - method: 'get' - }) -} - -export function logout() { - return request({ - url: '/hippo4j/v1/cs/user/logout', - method: 'post' - }) -} diff --git a/threadpool/console/src/api/verify.js b/threadpool/console/src/api/verify.js deleted file mode 100644 index 4d996d55..00000000 --- a/threadpool/console/src/api/verify.js +++ /dev/null @@ -1,27 +0,0 @@ -import request from '@/utils/request' - -export function list(data) { - return request({ - url: '/hippo4j/v1/cs/configs/verify/query/application/page', - method: 'post', - data - }) -} - -export function verify(data) { - return request({ - url: '/hippo4j/v1/cs/configs/verify', - method: 'post', - data - }) -} - -export function applicationDetail(data){ - return request({ - url: '/hippo4j/v1/cs/configs/verify/query/application/detail?id='+data, - method: 'get', - data - }) -} - - diff --git a/threadpool/console/src/assets/401_images/401.gif b/threadpool/console/src/assets/401_images/401.gif deleted file mode 100755 index cd6e0d94..00000000 Binary files a/threadpool/console/src/assets/401_images/401.gif and /dev/null differ diff --git a/threadpool/console/src/assets/404_images/404.png b/threadpool/console/src/assets/404_images/404.png deleted file mode 100755 index 3d8e2305..00000000 Binary files a/threadpool/console/src/assets/404_images/404.png and /dev/null differ diff --git a/threadpool/console/src/assets/404_images/404_cloud.png b/threadpool/console/src/assets/404_images/404_cloud.png deleted file mode 100755 index c6281d09..00000000 Binary files a/threadpool/console/src/assets/404_images/404_cloud.png and /dev/null differ diff --git a/threadpool/console/src/assets/custom-theme/fonts/element-icons.ttf b/threadpool/console/src/assets/custom-theme/fonts/element-icons.ttf deleted file mode 100755 index 570a3e11..00000000 Binary files a/threadpool/console/src/assets/custom-theme/fonts/element-icons.ttf and /dev/null differ diff --git a/threadpool/console/src/assets/custom-theme/fonts/element-icons.woff b/threadpool/console/src/assets/custom-theme/fonts/element-icons.woff deleted file mode 100755 index c2bcc005..00000000 Binary files a/threadpool/console/src/assets/custom-theme/fonts/element-icons.woff and /dev/null differ diff --git a/threadpool/console/src/assets/custom-theme/index.css b/threadpool/console/src/assets/custom-theme/index.css deleted file mode 100755 index 61bc2705..00000000 --- a/threadpool/console/src/assets/custom-theme/index.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";.custom-theme .fade-in-linear-enter-active,.custom-theme .fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .fade-in-linear-enter,.custom-theme .fade-in-linear-leave,.custom-theme .fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-linear-enter-active,.custom-theme .el-fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .el-fade-in-linear-enter,.custom-theme .el-fade-in-linear-leave,.custom-theme .el-fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-enter-active,.custom-theme .el-fade-in-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-fade-in-enter,.custom-theme .el-fade-in-leave-active{opacity:0}.custom-theme .el-zoom-in-center-enter-active,.custom-theme .el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-zoom-in-center-enter,.custom-theme .el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.custom-theme .el-zoom-in-top-enter-active,.custom-theme .el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center top;transform-origin:center top}.custom-theme .el-zoom-in-top-enter,.custom-theme .el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-bottom-enter-active,.custom-theme .el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center bottom;transform-origin:center bottom}.custom-theme .el-zoom-in-bottom-enter,.custom-theme .el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-left-enter-active,.custom-theme .el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:top left;transform-origin:top left}.custom-theme .el-zoom-in-left-enter,.custom-theme .el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.custom-theme .collapse-transition{-webkit-transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out;transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out}.custom-theme .horizontal-collapse-transition{-webkit-transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out;transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out}.custom-theme .el-list-enter-active,.custom-theme .el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.custom-theme .el-list-enter,.custom-theme .el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.custom-theme .el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}@font-face{font-family:element-icons;src:url(element-icons.woff?t=1508751886602) format("woff"),url(element-icons.ttf?t=1508751886602) format("truetype");font-weight:400;font-style:normal}.custom-theme [class*=" el-icon-"],.custom-theme [class^=el-icon-]{font-family:element-icons!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;vertical-align:baseline;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.custom-theme .el-icon-upload:before{content:"\e60d"}.custom-theme .el-icon-error:before{content:"\e62c"}.custom-theme .el-icon-success:before{content:"\e62d"}.custom-theme .el-icon-warning:before{content:"\e62e"}.custom-theme .el-icon-sort-down:before{content:"\e630"}.custom-theme .el-icon-sort-up:before{content:"\e631"}.custom-theme .el-icon-arrow-left:before{content:"\e600"}.custom-theme .el-icon-circle-plus:before{content:"\e601"}.custom-theme .el-icon-circle-plus-outline:before{content:"\e602"}.custom-theme .el-icon-arrow-down:before{content:"\e603"}.custom-theme .el-icon-arrow-right:before{content:"\e604"}.custom-theme .el-icon-arrow-up:before{content:"\e605"}.custom-theme .el-icon-back:before{content:"\e606"}.custom-theme .el-icon-circle-close:before{content:"\e607"}.custom-theme .el-icon-date:before{content:"\e608"}.custom-theme .el-icon-circle-close-outline:before{content:"\e609"}.custom-theme .el-icon-caret-left:before{content:"\e60a"}.custom-theme .el-icon-caret-bottom:before{content:"\e60b"}.custom-theme .el-icon-caret-top:before{content:"\e60c"}.custom-theme .el-icon-caret-right:before{content:"\e60e"}.custom-theme .el-icon-close:before{content:"\e60f"}.custom-theme .el-icon-d-arrow-left:before{content:"\e610"}.custom-theme .el-icon-check:before{content:"\e611"}.custom-theme .el-icon-delete:before{content:"\e612"}.custom-theme .el-icon-d-arrow-right:before{content:"\e613"}.custom-theme .el-icon-document:before{content:"\e614"}.custom-theme .el-icon-d-caret:before{content:"\e615"}.custom-theme .el-icon-edit-outline:before{content:"\e616"}.custom-theme .el-icon-download:before{content:"\e617"}.custom-theme .el-icon-goods:before{content:"\e618"}.custom-theme .el-icon-search:before{content:"\e619"}.custom-theme .el-icon-info:before{content:"\e61a"}.custom-theme .el-icon-message:before{content:"\e61b"}.custom-theme .el-icon-edit:before{content:"\e61c"}.custom-theme .el-icon-location:before{content:"\e61d"}.custom-theme .el-icon-loading:before{content:"\e61e"}.custom-theme .el-icon-location-outline:before{content:"\e61f"}.custom-theme .el-icon-menu:before{content:"\e620"}.custom-theme .el-icon-minus:before{content:"\e621"}.custom-theme .el-icon-bell:before{content:"\e622"}.custom-theme .el-icon-mobile-phone:before{content:"\e624"}.custom-theme .el-icon-news:before{content:"\e625"}.custom-theme .el-icon-more:before{content:"\e646"}.custom-theme .el-icon-more-outline:before{content:"\e626"}.custom-theme .el-icon-phone:before{content:"\e627"}.custom-theme .el-icon-phone-outline:before{content:"\e628"}.custom-theme .el-icon-picture:before{content:"\e629"}.custom-theme .el-icon-picture-outline:before{content:"\e62a"}.custom-theme .el-icon-plus:before{content:"\e62b"}.custom-theme .el-icon-printer:before{content:"\e62f"}.custom-theme .el-icon-rank:before{content:"\e632"}.custom-theme .el-icon-refresh:before{content:"\e633"}.custom-theme .el-icon-question:before{content:"\e634"}.custom-theme .el-icon-remove:before{content:"\e635"}.custom-theme .el-icon-share:before{content:"\e636"}.custom-theme .el-icon-star-on:before{content:"\e637"}.custom-theme .el-icon-setting:before{content:"\e638"}.custom-theme .el-icon-circle-check:before{content:"\e639"}.custom-theme .el-icon-service:before{content:"\e63a"}.custom-theme .el-icon-sold-out:before{content:"\e63b"}.custom-theme .el-icon-remove-outline:before{content:"\e63c"}.custom-theme .el-icon-star-off:before{content:"\e63d"}.custom-theme .el-icon-circle-check-outline:before{content:"\e63e"}.custom-theme .el-icon-tickets:before{content:"\e63f"}.custom-theme .el-icon-sort:before{content:"\e640"}.custom-theme .el-icon-zoom-in:before{content:"\e641"}.custom-theme .el-icon-time:before{content:"\e642"}.custom-theme .el-icon-view:before{content:"\e643"}.custom-theme .el-icon-upload2:before{content:"\e644"}.custom-theme .el-icon-zoom-out:before{content:"\e645"}.custom-theme .el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.custom-theme .el-icon--right{margin-left:5px}.custom-theme .el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}@keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:" ";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .el-select-dropdown{position:absolute;z-index:1001;border:solid 1px #dfe4ed;border-radius:4px;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:5px 0}.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:#262729;background-color:#fff}.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:#f5f7fa}.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after{position:absolute;right:20px;font-family:element-icons;content:"\E611";font-size:12px;font-weight:700;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.custom-theme .el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.custom-theme .el-select-dropdown .popper__arrow{-webkit-transform:translateX(-400%);transform:translateX(-400%)}.custom-theme .el-select-dropdown.is-arrow-fixed .popper__arrow{-webkit-transform:translateX(-200%);transform:translateX(-200%)}.custom-theme .el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.custom-theme .el-select-dropdown__wrap{max-height:274px}.custom-theme .el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-tag{background-color:rgba(38,39,41,.1);display:inline-block;padding:0 10px;height:32px;line-height:30px;font-size:12px;color:#262729;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid rgba(38,39,41,.2);white-space:nowrap}.custom-theme .el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:18px;width:18px;line-height:18px;vertical-align:middle;top:-1px;right:-5px;color:#262729}.custom-theme .el-tag .el-icon-close::before{display:block}.custom-theme .el-tag .el-icon-close:hover{background-color:#262729;color:#fff}.custom-theme .el-tag--info{background-color:rgba(10,118,164,.1);border-color:rgba(10,118,164,.2);color:#0a76a4}.custom-theme .el-tag--info.is-hit{border-color:#0a76a4}.custom-theme .el-tag--info .el-tag__close{color:#0a76a4}.custom-theme .el-tag--info .el-tag__close:hover{background-color:#0a76a4;color:#fff}.custom-theme .el-tag--success{background-color:rgba(64,145,103,.1);border-color:rgba(64,145,103,.2);color:#409167}.custom-theme .el-tag--success.is-hit{border-color:#409167}.custom-theme .el-tag--success .el-tag__close{color:#409167}.custom-theme .el-tag--success .el-tag__close:hover{background-color:#409167;color:#fff}.custom-theme .el-tag--warning{background-color:rgba(157,164,8,.1);border-color:rgba(157,164,8,.2);color:#9da408}.custom-theme .el-tag--warning.is-hit{border-color:#9da408}.custom-theme .el-tag--warning .el-tag__close{color:#9da408}.custom-theme .el-tag--warning .el-tag__close:hover{background-color:#9da408;color:#fff}.custom-theme .el-tag--danger{background-color:rgba(179,69,14,.1);border-color:rgba(179,69,14,.2);color:#b3450e}.custom-theme .el-tag--danger.is-hit{border-color:#b3450e}.custom-theme .el-tag--danger .el-tag__close{color:#b3450e}.custom-theme .el-tag--danger .el-tag__close:hover{background-color:#b3450e;color:#fff}.custom-theme .el-tag--medium{height:28px;line-height:26px}.custom-theme .el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--small{height:24px;padding:0 8px;line-height:22px}.custom-theme .el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--mini{height:20px;padding:0 5px;line-height:19px}.custom-theme .el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.custom-theme .el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#5a5e66;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.custom-theme .el-select-dropdown__item.is-disabled{color:#b4bccc;cursor:not-allowed}.custom-theme .el-select-dropdown__item.is-disabled:hover{background-color:#fff}.custom-theme .el-select-dropdown__item.hover,.custom-theme .el-select-dropdown__item:hover{background-color:#f5f7fa}.custom-theme .el-select-dropdown__item.selected{color:#262729;font-weight:700}.custom-theme .el-select-dropdown__item span{line-height:34px!important}.custom-theme .el-select-group{margin:0;padding:0}.custom-theme .el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.custom-theme .el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.custom-theme .el-select-group__wrap:not(:last-of-type)::after{content:'';position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#dfe4ed}.custom-theme .el-select-group__title{padding-left:20px;font-size:12px;color:#0a76a4;line-height:30px}.custom-theme .el-select-group .el-select-dropdown__item{padding-left:20px}.custom-theme .el-scrollbar{overflow:hidden;position:relative}.custom-theme .el-scrollbar:active>.el-scrollbar__bar,.custom-theme .el-scrollbar:focus>.el-scrollbar__bar,.custom-theme .el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.custom-theme .el-scrollbar__wrap{overflow:scroll;height:100%}.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.custom-theme .el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(135,141,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.custom-theme .el-scrollbar__thumb:hover{background-color:rgba(135,141,153,.5)}.custom-theme .el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.custom-theme .el-scrollbar__bar.is-vertical{width:6px;top:2px}.custom-theme .el-scrollbar__bar.is-vertical>div{width:100%}.custom-theme .el-scrollbar__bar.is-horizontal{height:6px;left:2px}.custom-theme .el-scrollbar__bar.is-horizontal>div{height:100%}.custom-theme .el-select{display:inline-block;position:relative}.custom-theme .el-select:hover .el-input__inner{border-color:#b4bccc}.custom-theme .el-select .el-input__inner{cursor:pointer;padding-right:35px}.custom-theme .el-select .el-input__inner:focus{border-color:#262729}.custom-theme .el-select .el-input .el-select__caret{color:#b4bccc;font-size:14px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);line-height:16px;cursor:pointer}.custom-theme .el-select .el-input .el-select__caret.is-reverse{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.custom-theme .el-select .el-input .el-select__caret.is-show-close{font-size:14px;text-align:center;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);border-radius:100%;color:#b4bccc;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-select .el-input .el-select__caret.is-show-close:hover{color:#878d99}.custom-theme .el-select .el-input.is-disabled .el-input__inner{cursor:not-allowed}.custom-theme .el-select .el-input.is-disabled .el-input__inner:hover{border-color:#dfe4ed}.custom-theme .el-select>.el-input{display:block}.custom-theme .el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:#666;font-size:14px;vertical-align:baseline;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.custom-theme .el-select__input.is-mini{height:14px}.custom-theme .el-select__close{cursor:pointer;position:absolute;top:8px;z-index:1000;right:25px;color:#b4bccc;line-height:18px;font-size:14px}.custom-theme .el-select__close:hover{color:#878d99}.custom-theme .el-select__tags{position:absolute;line-height:normal;white-space:normal;z-index:1;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.custom-theme .el-select .el-tag__close{margin-top:-2px}.custom-theme .el-select .el-tag{-webkit-box-sizing:border-box;box-sizing:border-box;border-color:transparent;margin:3px 0 3px 6px;background-color:#f0f2f5}.custom-theme .el-select .el-tag__close.el-icon-close{background-color:#b4bccc;right:-7px;color:#fff}.custom-theme .el-select .el-tag__close.el-icon-close:hover{background-color:#878d99}.custom-theme .el-select .el-tag__close.el-icon-close::before{display:block;-webkit-transform:translate(0,.5px);transform:translate(0,.5px)}.custom-theme .el-select__tag{display:inline-block;height:24px;line-height:24px;font-size:14px;border-radius:4px;color:#fff;background-color:#262729}.custom-theme .el-select__tag .el-icon-close{font-size:14px}.custom-theme .el-pagination{white-space:nowrap;padding:2px 5px;color:#2d2f33;font-weight:700}.custom-theme .el-pagination::after,.custom-theme .el-pagination::before{display:table;content:""}.custom-theme .el-pagination::after{clear:both}.custom-theme .el-pagination button,.custom-theme .el-pagination span:not([class*=suffix]){display:inline-block;font-size:13px;min-width:35.5px;height:28px;line-height:28px;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-pagination .el-input__inner{text-align:center}.custom-theme .el-pagination .el-input__suffix{right:0;-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-pagination .el-select .el-input{width:100px;margin:0 5px}.custom-theme .el-pagination .el-select .el-input .el-input__inner{padding-right:25px;border-radius:3px;height:28px}.custom-theme .el-pagination button{border:none;padding:0 6px;background:0 0}.custom-theme .el-pagination button:focus{outline:0}.custom-theme .el-pagination button:hover{color:#262729}.custom-theme .el-pagination button.disabled{color:#b4bccc;background-color:#fff;cursor:not-allowed}.custom-theme .el-pagination .btn-next,.custom-theme .el-pagination .btn-prev{background:center center no-repeat;background-size:16px;background-color:#fff;cursor:pointer;margin:0;color:#2d2f33}.custom-theme .el-pagination .btn-next .el-icon,.custom-theme .el-pagination .btn-prev .el-icon{display:block;font-size:12px}.custom-theme .el-pagination .btn-prev{padding-right:12px}.custom-theme .el-pagination .btn-next{padding-left:12px}.custom-theme .el-pagination--small .btn-next,.custom-theme .el-pagination--small .btn-prev,.custom-theme .el-pagination--small .el-pager li,.custom-theme .el-pagination--small .el-pager li:last-child{border-color:transparent;font-size:12px;line-height:22px;height:22px;min-width:22px}.custom-theme .el-pagination--small .arrow.disabled{visibility:hidden}.custom-theme .el-pagination__sizes{margin:0 10px 0 0;font-weight:400;color:#5a5e66}.custom-theme .el-pagination__sizes .el-input .el-input__inner{font-size:13px;padding-left:8px}.custom-theme .el-pagination__sizes .el-input .el-input__inner:hover{border-color:#262729}.custom-theme .el-pagination__total{margin-right:10px;font-weight:400;color:#5a5e66}.custom-theme .el-pagination__jump{margin-left:24px;font-weight:400;color:#5a5e66}.custom-theme .el-pagination__jump .el-input__inner{padding:0 3px}.custom-theme .el-pagination__rightwrapper{float:right}.custom-theme .el-pagination__editor{line-height:18px;padding:0 2px;height:28px;text-align:center;margin:0 2px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:3px;-moz-appearance:textfield}.custom-theme .el-pagination__editor.el-input{width:50px}.custom-theme .el-pagination__editor.el-input .el-input__inner{height:28px}.custom-theme .el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.custom-theme .el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.custom-theme .el-pager{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;list-style:none;display:inline-block;vertical-align:top;font-size:0;padding:0;margin:0}.custom-theme .el-pager .el-icon-more::before{vertical-align:-4px}.custom-theme .el-pager li{padding:0 4px;background:#fff;vertical-align:top;display:inline-block;font-size:13px;min-width:35.5px;height:28px;line-height:28px;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;margin:0}.custom-theme .el-pager li.btn-quicknext,.custom-theme .el-pager li.btn-quickprev{line-height:28px;color:#2d2f33}.custom-theme .el-pager li.btn-quickprev:hover{cursor:pointer}.custom-theme .el-pager li.btn-quicknext:hover{cursor:pointer}.custom-theme .el-pager li.active+li{border-left:0}.custom-theme .el-pager li:hover{color:#262729}.custom-theme .el-pager li.active{color:#262729;cursor:default}.custom-theme .v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.custom-theme .v-modal-leave{-webkit-animation:v-modal-out .2s ease forwards;animation:v-modal-out .2s ease forwards}@-webkit-keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{100%{opacity:0}}@keyframes v-modal-out{100%{opacity:0}}.custom-theme .v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.custom-theme .el-dialog{position:relative;margin:0 auto 50px;background:#fff;border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.3);box-shadow:0 1px 3px rgba(0,0,0,.3);-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.custom-theme .el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.custom-theme .el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.custom-theme .el-dialog__header{padding:15px;padding-bottom:10px}.custom-theme .el-dialog__headerbtn{position:absolute;top:15px;right:15px;padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:16px}.custom-theme .el-dialog__headerbtn .el-dialog__close{color:#0a76a4}.custom-theme .el-dialog__headerbtn:focus .el-dialog__close,.custom-theme .el-dialog__headerbtn:hover .el-dialog__close{color:#262729}.custom-theme .el-dialog__title{line-height:24px;font-size:18px;color:#2d2f33}.custom-theme .el-dialog__body{padding:30px 20px;color:#5a5e66;line-height:24px;font-size:14px}.custom-theme .el-dialog__footer{padding:15px;padding-top:10px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-dialog--center{text-align:center}.custom-theme .el-dialog--center .el-dialog__header{padding-top:30px}.custom-theme .el-dialog--center .el-dialog__body{text-align:initial;padding:25px 27px 30px}.custom-theme .el-dialog--center .el-dialog__footer{text-align:inherit;padding-bottom:30px}.custom-theme .dialog-fade-enter-active{-webkit-animation:dialog-fade-in .3s;animation:dialog-fade-in .3s}.custom-theme .dialog-fade-leave-active{-webkit-animation:dialog-fade-out .3s;animation:dialog-fade-out .3s}@-webkit-keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-scrollbar{overflow:hidden;position:relative}.custom-theme .el-scrollbar:active>.el-scrollbar__bar,.custom-theme .el-scrollbar:focus>.el-scrollbar__bar,.custom-theme .el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.custom-theme .el-scrollbar__wrap{overflow:scroll;height:100%}.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.custom-theme .el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(135,141,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.custom-theme .el-scrollbar__thumb:hover{background-color:rgba(135,141,153,.5)}.custom-theme .el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.custom-theme .el-scrollbar__bar.is-vertical{width:6px;top:2px}.custom-theme .el-scrollbar__bar.is-vertical>div{width:100%}.custom-theme .el-scrollbar__bar.is-horizontal{height:6px;left:2px}.custom-theme .el-scrollbar__bar.is-horizontal>div{height:100%}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:" ";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .el-autocomplete{position:relative;display:inline-block}.custom-theme .el-autocomplete-suggestion{margin:5px 0;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:4px}.custom-theme .el-autocomplete-suggestion.el-popper .popper__arrow{left:24px!important}.custom-theme .el-autocomplete-suggestion__wrap{max-height:280px;padding:10px 0;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto;background-color:#fff;border:1px solid #dfe4ed;border-radius:4px}.custom-theme .el-autocomplete-suggestion__list{margin:0;padding:0}.custom-theme .el-autocomplete-suggestion li{padding:0 20px;margin:0;line-height:34px;cursor:pointer;color:#5a5e66;font-size:14px;list-style:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.custom-theme .el-autocomplete-suggestion li:hover{background-color:#f5f7fa}.custom-theme .el-autocomplete-suggestion li.highlighted{background-color:#f5f7fa}.custom-theme .el-autocomplete-suggestion li.divider{margin-top:6px;border-top:1px solid #000}.custom-theme .el-autocomplete-suggestion li.divider:last-child{margin-bottom:-6px}.custom-theme .el-autocomplete-suggestion.is-loading li{text-align:center;height:100px;line-height:100px;font-size:20px;color:#999}.custom-theme .el-autocomplete-suggestion.is-loading li::after{display:inline-block;content:"";height:100%;vertical-align:middle}.custom-theme .el-autocomplete-suggestion.is-loading li:hover{background-color:#fff}.custom-theme .el-autocomplete-suggestion.is-loading .el-icon-loading{vertical-align:middle}.custom-theme .el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-color:#d8dce5;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button+.el-button{margin-left:10px}.custom-theme .el-button.is-round{padding:12px 20px}.custom-theme .el-button:focus,.custom-theme .el-button:hover{color:#262729;border-color:#bebebf;background-color:#e9e9ea}.custom-theme .el-button:active{color:#222325;border-color:#222325;outline:0}.custom-theme .el-button::-moz-focus-inner{border:0}.custom-theme .el-button [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-button.is-plain:focus,.custom-theme .el-button.is-plain:hover{background:#fff;border-color:#262729;color:#262729}.custom-theme .el-button.is-plain:active{background:#fff;border-color:#222325;color:#222325;outline:0}.custom-theme .el-button.is-active{color:#222325;border-color:#222325}.custom-theme .el-button.is-disabled,.custom-theme .el-button.is-disabled:focus,.custom-theme .el-button.is-disabled:hover{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5}.custom-theme .el-button.is-disabled.el-button--text{background-color:transparent}.custom-theme .el-button.is-disabled.is-plain,.custom-theme .el-button.is-disabled.is-plain:focus,.custom-theme .el-button.is-disabled.is-plain:hover{background-color:#fff;border-color:#e6ebf5;color:#b4bccc}.custom-theme .el-button.is-loading{position:relative;pointer-events:none}.custom-theme .el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.custom-theme .el-button.is-round{border-radius:20px;padding:12px 23px}.custom-theme .el-button--primary{color:#fff;background-color:#262729;border-color:#262729}.custom-theme .el-button--primary:focus,.custom-theme .el-button--primary:hover{background:#515254;border-color:#515254;color:#fff}.custom-theme .el-button--primary:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-active{background:#222325;border-color:#222325;color:#fff}.custom-theme .el-button--primary.is-disabled,.custom-theme .el-button--primary.is-disabled:active,.custom-theme .el-button--primary.is-disabled:focus,.custom-theme .el-button--primary.is-disabled:hover{color:#fff;background-color:#939394;border-color:#939394}.custom-theme .el-button--primary.is-plain{color:#262729;background:#e9e9ea;border-color:#a8a9a9}.custom-theme .el-button--primary.is-plain:focus,.custom-theme .el-button--primary.is-plain:hover{background:#262729;border-color:#262729;color:#fff}.custom-theme .el-button--primary.is-plain:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-plain.is-disabled,.custom-theme .el-button--primary.is-plain.is-disabled:active,.custom-theme .el-button--primary.is-plain.is-disabled:focus,.custom-theme .el-button--primary.is-plain.is-disabled:hover{color:#7d7d7f;background-color:#e9e9ea;border-color:#d4d4d4}.custom-theme .el-button--success{color:#fff;background-color:#409167;border-color:#409167}.custom-theme .el-button--success:focus,.custom-theme .el-button--success:hover{background:#66a785;border-color:#66a785;color:#fff}.custom-theme .el-button--success:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-active{background:#3a835d;border-color:#3a835d;color:#fff}.custom-theme .el-button--success.is-disabled,.custom-theme .el-button--success.is-disabled:active,.custom-theme .el-button--success.is-disabled:focus,.custom-theme .el-button--success.is-disabled:hover{color:#fff;background-color:#a0c8b3;border-color:#a0c8b3}.custom-theme .el-button--success.is-plain{color:#409167;background:#ecf4f0;border-color:#b3d3c2}.custom-theme .el-button--success.is-plain:focus,.custom-theme .el-button--success.is-plain:hover{background:#409167;border-color:#409167;color:#fff}.custom-theme .el-button--success.is-plain:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-plain.is-disabled,.custom-theme .el-button--success.is-plain.is-disabled:active,.custom-theme .el-button--success.is-plain.is-disabled:focus,.custom-theme .el-button--success.is-plain.is-disabled:hover{color:#8cbda4;background-color:#ecf4f0;border-color:#d9e9e1}.custom-theme .el-button--warning{color:#fff;background-color:#9da408;border-color:#9da408}.custom-theme .el-button--warning:focus,.custom-theme .el-button--warning:hover{background:#b1b639;border-color:#b1b639;color:#fff}.custom-theme .el-button--warning:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-active{background:#8d9407;border-color:#8d9407;color:#fff}.custom-theme .el-button--warning.is-disabled,.custom-theme .el-button--warning.is-disabled:active,.custom-theme .el-button--warning.is-disabled:focus,.custom-theme .el-button--warning.is-disabled:hover{color:#fff;background-color:#ced284;border-color:#ced284}.custom-theme .el-button--warning.is-plain{color:#9da408;background:#f5f6e6;border-color:#d8db9c}.custom-theme .el-button--warning.is-plain:focus,.custom-theme .el-button--warning.is-plain:hover{background:#9da408;border-color:#9da408;color:#fff}.custom-theme .el-button--warning.is-plain:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-plain.is-disabled,.custom-theme .el-button--warning.is-plain.is-disabled:active,.custom-theme .el-button--warning.is-plain.is-disabled:focus,.custom-theme .el-button--warning.is-plain.is-disabled:hover{color:#c4c86b;background-color:#f5f6e6;border-color:#ebedce}.custom-theme .el-button--danger{color:#fff;background-color:#b3450e;border-color:#b3450e}.custom-theme .el-button--danger:focus,.custom-theme .el-button--danger:hover{background:#c26a3e;border-color:#c26a3e;color:#fff}.custom-theme .el-button--danger:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-active{background:#a13e0d;border-color:#a13e0d;color:#fff}.custom-theme .el-button--danger.is-disabled,.custom-theme .el-button--danger.is-disabled:active,.custom-theme .el-button--danger.is-disabled:focus,.custom-theme .el-button--danger.is-disabled:hover{color:#fff;background-color:#d9a287;border-color:#d9a287}.custom-theme .el-button--danger.is-plain{color:#b3450e;background:#f7ece7;border-color:#e1b59f}.custom-theme .el-button--danger.is-plain:focus,.custom-theme .el-button--danger.is-plain:hover{background:#b3450e;border-color:#b3450e;color:#fff}.custom-theme .el-button--danger.is-plain:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-plain.is-disabled,.custom-theme .el-button--danger.is-plain.is-disabled:active,.custom-theme .el-button--danger.is-plain.is-disabled:focus,.custom-theme .el-button--danger.is-plain.is-disabled:hover{color:#d18f6e;background-color:#f7ece7;border-color:#f0dacf}.custom-theme .el-button--info{color:#fff;background-color:#0a76a4;border-color:#0a76a4}.custom-theme .el-button--info:focus,.custom-theme .el-button--info:hover{background:#3b91b6;border-color:#3b91b6;color:#fff}.custom-theme .el-button--info:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-active{background:#096a94;border-color:#096a94;color:#fff}.custom-theme .el-button--info.is-disabled,.custom-theme .el-button--info.is-disabled:active,.custom-theme .el-button--info.is-disabled:focus,.custom-theme .el-button--info.is-disabled:hover{color:#fff;background-color:#85bbd2;border-color:#85bbd2}.custom-theme .el-button--info.is-plain{color:#0a76a4;background:#e7f1f6;border-color:#9dc8db}.custom-theme .el-button--info.is-plain:focus,.custom-theme .el-button--info.is-plain:hover{background:#0a76a4;border-color:#0a76a4;color:#fff}.custom-theme .el-button--info.is-plain:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-plain.is-disabled,.custom-theme .el-button--info.is-plain.is-disabled:active,.custom-theme .el-button--info.is-plain.is-disabled:focus,.custom-theme .el-button--info.is-plain.is-disabled:hover{color:#6cadc8;background-color:#e7f1f6;border-color:#cee4ed}.custom-theme .el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button--medium.is-round{padding:10px 20px}.custom-theme .el-button--small{padding:9px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--small.is-round{padding:9px 15px}.custom-theme .el-button--mini{padding:7px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--mini.is-round{padding:7px 15px}.custom-theme .el-button--text{border:none;color:#262729;background:0 0;padding-left:0;padding-right:0}.custom-theme .el-button--text:focus,.custom-theme .el-button--text:hover{color:#515254;border-color:transparent;background-color:transparent}.custom-theme .el-button--text:active{color:#222325;border-color:transparent;background-color:transparent}.custom-theme .el-button-group{display:inline-block;vertical-align:middle}.custom-theme .el-button-group::after,.custom-theme .el-button-group::before{display:table;content:""}.custom-theme .el-button-group::after{clear:both}.custom-theme .el-button-group .el-button{float:left;position:relative}.custom-theme .el-button-group .el-button+.el-button{margin-left:0}.custom-theme .el-button-group .el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-button-group .el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-button-group .el-button:not(:first-child):not(:last-child){border-radius:0}.custom-theme .el-button-group .el-button:not(:last-child){margin-right:-1px}.custom-theme .el-button-group .el-button:active,.custom-theme .el-button-group .el-button:focus,.custom-theme .el-button-group .el-button:hover{z-index:1}.custom-theme .el-button-group .el-button.is-active{z-index:1}.custom-theme .el-button-group .el-button--primary:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:" ";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .el-dropdown{display:inline-block;position:relative;color:#5a5e66;font-size:14px}.custom-theme .el-dropdown .el-button-group{display:block}.custom-theme .el-dropdown .el-button-group .el-button{float:none}.custom-theme .el-dropdown .el-dropdown__caret-button{padding-left:5px;padding-right:5px;position:relative;border-left:none}.custom-theme .el-dropdown .el-dropdown__caret-button::before{content:'';position:absolute;display:block;width:1px;top:5px;bottom:5px;left:0;background:rgba(255,255,255,.5)}.custom-theme .el-dropdown .el-dropdown__caret-button:hover::before{top:0;bottom:0}.custom-theme .el-dropdown .el-dropdown__caret-button .el-dropdown__icon{padding-left:0}.custom-theme .el-dropdown__icon{font-size:12px;margin:0 3px}.custom-theme .el-dropdown-menu{position:absolute;top:0;left:0;z-index:10;padding:10px 0;margin:5px 0;background-color:#fff;border:1px solid #e6ebf5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.custom-theme .el-dropdown-menu__item{list-style:none;line-height:36px;padding:0 20px;margin:0;font-size:14px;color:#5a5e66;cursor:pointer}.custom-theme .el-dropdown-menu__item:not(.is-disabled):hover{background-color:#e9e9ea;color:#515254}.custom-theme .el-dropdown-menu__item--divided{position:relative;margin-top:6px;border-top:1px solid #e6ebf5}.custom-theme .el-dropdown-menu__item--divided:before{content:'';height:6px;display:block;margin:0 -20px;background-color:#fff}.custom-theme .el-dropdown-menu__item.is-disabled{cursor:default;color:#bbb;pointer-events:none}.custom-theme .el-dropdown-menu--medium{padding:6px 0}.custom-theme .el-dropdown-menu--medium .el-dropdown-menu__item{line-height:30px;padding:0 17px;font-size:14px}.custom-theme .el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:6px}.custom-theme .el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:6px;margin:0 -17px}.custom-theme .el-dropdown-menu--small{padding:6px 0}.custom-theme .el-dropdown-menu--small .el-dropdown-menu__item{line-height:27px;padding:0 15px;font-size:13px}.custom-theme .el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:4px}.custom-theme .el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:4px;margin:0 -15px}.custom-theme .el-dropdown-menu--mini{padding:3px 0}.custom-theme .el-dropdown-menu--mini .el-dropdown-menu__item{line-height:24px;padding:0 10px;font-size:12px}.custom-theme .el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:3px}.custom-theme .el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:3px;margin:0 -10px}.custom-theme .el-menu{border-right:solid 1px #e6e6e6;list-style:none;position:relative;margin:0;padding-left:0;background-color:#fff}.custom-theme .el-menu::after,.custom-theme .el-menu::before{display:table;content:""}.custom-theme .el-menu::after{clear:both}.custom-theme .el-menu li{list-style:none}.custom-theme .el-menu--horizontal{border-right:none;border-bottom:solid 1px #e6e6e6}.custom-theme .el-menu--horizontal .el-menu-item{float:left;height:60px;line-height:60px;margin:0;cursor:pointer;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:2px solid transparent;color:#878d99}.custom-theme .el-menu--horizontal .el-menu-item a,.custom-theme .el-menu--horizontal .el-menu-item a:hover{color:inherit}.custom-theme .el-menu--horizontal .el-menu-item:focus,.custom-theme .el-menu--horizontal .el-menu-item:hover{background-color:#fff}.custom-theme .el-menu--horizontal .el-submenu{float:left;position:relative}.custom-theme .el-menu--horizontal .el-submenu:focus{outline:0}.custom-theme .el-menu--horizontal .el-submenu:focus>.el-submenu__title{color:#2d2f33}.custom-theme .el-menu--horizontal .el-submenu>.el-menu{position:absolute;top:65px;left:0;border:none;padding:5px 0;background-color:#fff;z-index:100;min-width:100%;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:2px}.custom-theme .el-menu--horizontal .el-submenu .el-submenu__title{height:60px;line-height:60px;border-bottom:2px solid transparent;color:#878d99}.custom-theme .el-menu--horizontal .el-submenu .el-submenu__title:hover{background-color:#fff}.custom-theme .el-menu--horizontal .el-submenu .el-menu-item{background-color:#fff;float:none;height:36px;line-height:36px;padding:0 10px}.custom-theme .el-menu--horizontal .el-submenu .el-submenu__icon-arrow{position:static;vertical-align:middle;margin-left:8px;margin-top:-3px}.custom-theme .el-menu--horizontal .el-menu-item:focus,.custom-theme .el-menu--horizontal .el-menu-item:hover,.custom-theme .el-menu--horizontal .el-submenu__title:hover{outline:0;color:#2d2f33}.custom-theme .el-menu--horizontal>.el-menu-item.is-active,.custom-theme .el-menu--horizontal>.el-submenu.is-active .el-submenu__title{border-bottom:2px solid #262729;color:#2d2f33}.custom-theme .el-menu--collapse{width:64px}.custom-theme .el-menu--collapse>.el-menu-item [class^=el-icon-],.custom-theme .el-menu--collapse>.el-submenu>.el-submenu__title [class^=el-icon-]{margin:0;vertical-align:middle;width:24px;text-align:center}.custom-theme .el-menu--collapse>.el-menu-item .el-submenu__icon-arrow,.custom-theme .el-menu--collapse>.el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}.custom-theme .el-menu--collapse>.el-menu-item span,.custom-theme .el-menu--collapse>.el-submenu>.el-submenu__title span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}.custom-theme .el-menu--collapse>.el-menu-item.is-active i{color:inherit}.custom-theme .el-menu--collapse .el-menu .el-submenu{min-width:200px}.custom-theme .el-menu--collapse .el-submenu{position:relative}.custom-theme .el-menu--collapse .el-submenu .el-menu{position:absolute;margin-left:5px;top:0;left:100%;z-index:10;border:1px solid #dfe4ed;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.custom-theme .el-menu--collapse .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:none;transform:none}.custom-theme .el-menu-item{height:56px;line-height:56px;font-size:14px;color:#2d2f33;padding:0 20px;cursor:pointer;position:relative;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap}.custom-theme .el-menu-item [class^=el-icon-]{margin-right:5px;width:24px;text-align:center;font-size:18px}.custom-theme .el-menu-item *{vertical-align:middle}.custom-theme .el-menu-item:first-child{margin-left:0}.custom-theme .el-menu-item:last-child{margin-right:0}.custom-theme .el-menu-item:focus,.custom-theme .el-menu-item:hover{outline:0;background-color:#e9e9ea}.custom-theme .el-menu-item i{color:#878d99}.custom-theme .el-menu-item.is-active{color:#262729}.custom-theme .el-menu-item.is-active i{color:inherit}.custom-theme .el-submenu__title{position:relative;height:56px;line-height:56px;font-size:14px;color:#2d2f33;padding:0 20px;cursor:pointer;position:relative;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap}.custom-theme .el-submenu__title *{vertical-align:middle}.custom-theme .el-submenu__title i{color:#878d99}.custom-theme .el-submenu__title:hover{background-color:#e9e9ea}.custom-theme .el-submenu .el-menu{border:none}.custom-theme .el-submenu .el-menu-item{height:50px;line-height:50px;padding:0 45px;min-width:200px}.custom-theme .el-submenu__icon-arrow{position:absolute;top:50%;right:20px;margin-top:-7px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:12px}.custom-theme .el-submenu.is-active .el-submenu__title{border-bottom-color:#262729}.custom-theme .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.custom-theme .el-submenu [class^=el-icon-]{vertical-align:middle;margin-right:5px;width:24px;text-align:center;font-size:18px}.custom-theme .el-menu-item-group>ul{padding:0}.custom-theme .el-menu-item-group__title{padding:7px 0 7px 20px;line-height:normal;font-size:12px;color:#878d99}.custom-theme .horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow{-webkit-transition:.2s;transition:.2s;opacity:0}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-input-number{position:relative;display:inline-block;width:180px;line-height:38px}.custom-theme .el-input-number .el-input{display:block}.custom-theme .el-input-number .el-input__inner{-webkit-appearance:none;padding-left:50px;padding-right:50px;text-align:center}.custom-theme .el-input-number__decrease,.custom-theme .el-input-number__increase{position:absolute;z-index:1;top:1px;width:40px;height:auto;text-align:center;background:#f5f7fa;color:#5a5e66;cursor:pointer;font-size:13px}.custom-theme .el-input-number__decrease:hover,.custom-theme .el-input-number__increase:hover{color:#262729}.custom-theme .el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled),.custom-theme .el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled){border-color:#262729}.custom-theme .el-input-number__decrease.is-disabled,.custom-theme .el-input-number__increase.is-disabled{color:#b4bccc;cursor:not-allowed}.custom-theme .el-input-number__increase{right:1px;border-radius:0 4px 4px 0;border-left:1px solid #d8dce5}.custom-theme .el-input-number__decrease{left:1px;border-radius:4px 0 0 4px;border-right:1px solid #d8dce5}.custom-theme .el-input-number.is-disabled .el-input-number__decrease,.custom-theme .el-input-number.is-disabled .el-input-number__increase{border-color:#dfe4ed;color:#dfe4ed}.custom-theme .el-input-number.is-disabled .el-input-number__decrease:hover,.custom-theme .el-input-number.is-disabled .el-input-number__increase:hover{color:#dfe4ed;cursor:not-allowed}.custom-theme .el-input-number--medium{width:200px;line-height:34px}.custom-theme .el-input-number--medium .el-input-number__decrease,.custom-theme .el-input-number--medium .el-input-number__increase{width:36px;font-size:14px}.custom-theme .el-input-number--medium .el-input__inner{padding-left:43px;padding-right:43px}.custom-theme .el-input-number--small{width:130px;line-height:30px}.custom-theme .el-input-number--small .el-input-number__decrease,.custom-theme .el-input-number--small .el-input-number__increase{width:32px;font-size:13px}.custom-theme .el-input-number--small .el-input-number__decrease [class*=el-icon],.custom-theme .el-input-number--small .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.9);transform:scale(.9)}.custom-theme .el-input-number--small .el-input__inner{padding-left:39px;padding-right:39px}.custom-theme .el-input-number--mini{width:130px;line-height:26px}.custom-theme .el-input-number--mini .el-input-number__decrease,.custom-theme .el-input-number--mini .el-input-number__increase{width:28px;font-size:12px}.custom-theme .el-input-number--mini .el-input-number__decrease [class*=el-icon],.custom-theme .el-input-number--mini .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-input-number--mini .el-input__inner{padding-left:35px;padding-right:35px}.custom-theme .el-input-number.is-without-controls .el-input__inner{padding-left:15px;padding-right:15px}.custom-theme .el-input-number.is-controls-right .el-input__inner{padding-left:15px;padding-right:50px}.custom-theme .el-input-number.is-controls-right .el-input-number__decrease,.custom-theme .el-input-number.is-controls-right .el-input-number__increase{height:auto;line-height:19px}.custom-theme .el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.custom-theme .el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-input-number.is-controls-right .el-input-number__increase{border-radius:0 4px 0 0;border-bottom:1px solid #d8dce5}.custom-theme .el-input-number.is-controls-right .el-input-number__decrease{right:1px;bottom:1px;top:auto;left:auto;border-right:none;border-left:1px solid #d8dce5;border-radius:0 0 4px 0}.custom-theme .el-input-number.is-controls-right[class*=medium] [class*=decrease],.custom-theme .el-input-number.is-controls-right[class*=medium] [class*=increase]{line-height:17px}.custom-theme .el-input-number.is-controls-right[class*=small] [class*=decrease],.custom-theme .el-input-number.is-controls-right[class*=small] [class*=increase]{line-height:15px}.custom-theme .el-input-number.is-controls-right[class*=mini] [class*=decrease],.custom-theme .el-input-number.is-controls-right[class*=mini] [class*=increase]{line-height:13px}.custom-theme .el-radio{color:#5a5e66;font-weight:500;line-height:1;position:relative;cursor:pointer;display:inline-block;white-space:nowrap;outline:0;font-size:14px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.custom-theme .el-radio.is-bordered{padding:10px 20px 10px 10px;border-radius:4px;border:1px solid #d8dce5}.custom-theme .el-radio.is-bordered.is-checked{border-color:#262729}.custom-theme .el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:#e6ebf5}.custom-theme .el-radio.is-bordered+.el-radio.is-bordered{margin-left:10px}.custom-theme .el-radio--medium.is-bordered{padding:8px 20px 8px 10px;border-radius:4px}.custom-theme .el-radio--medium.is-bordered .el-radio__label{font-size:14px}.custom-theme .el-radio--medium.is-bordered .el-radio__inner{height:14px;width:14px}.custom-theme .el-radio--small.is-bordered{padding:6px 15px 6px 10px;border-radius:3px}.custom-theme .el-radio--small.is-bordered .el-radio__label{font-size:12px}.custom-theme .el-radio--small.is-bordered .el-radio__inner{height:12px;width:12px}.custom-theme .el-radio--mini.is-bordered{padding:4px 15px 4px 10px;border-radius:3px}.custom-theme .el-radio--mini.is-bordered .el-radio__label{font-size:12px}.custom-theme .el-radio--mini.is-bordered .el-radio__inner{height:12px;width:12px}.custom-theme .el-radio+.el-radio{margin-left:30px}.custom-theme .el-radio__input{white-space:nowrap;cursor:pointer;outline:0;display:inline-block;line-height:1;position:relative;vertical-align:middle}.custom-theme .el-radio__input.is-disabled .el-radio__inner{background-color:#f5f7fa;border-color:#dfe4ed;cursor:not-allowed}.custom-theme .el-radio__input.is-disabled .el-radio__inner::after{cursor:not-allowed;background-color:#f5f7fa}.custom-theme .el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.custom-theme .el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:#f5f7fa;border-color:#dfe4ed}.custom-theme .el-radio__input.is-disabled.is-checked .el-radio__inner::after{background-color:#b4bccc}.custom-theme .el-radio__input.is-disabled+span.el-radio__label{color:#b4bccc;cursor:not-allowed}.custom-theme .el-radio__input.is-checked .el-radio__inner{border-color:#262729;background:#262729}.custom-theme .el-radio__input.is-checked .el-radio__inner::after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.custom-theme .el-radio__input.is-checked+.el-radio__label{color:#262729}.custom-theme .el-radio__input.is-focus .el-radio__inner{border-color:#262729}.custom-theme .el-radio__inner{border:1px solid #d8dce5;border-radius:100%;width:14px;height:14px;background-color:#fff;position:relative;cursor:pointer;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-radio__inner:hover{border-color:#262729}.custom-theme .el-radio__inner::after{width:4px;height:4px;border-radius:100%;background-color:#fff;content:"";position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6);transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6);transition:transform .15s cubic-bezier(.71,-.46,.88,.6);transition:transform .15s cubic-bezier(.71,-.46,.88,.6),-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6)}.custom-theme .el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.custom-theme .el-radio:focus:not(.is-focus):not(:active) .el-radio__inner{-webkit-box-shadow:0 0 2px 2px #262729;box-shadow:0 0 2px 2px #262729}.custom-theme .el-radio__label{font-size:14px;padding-left:10px}.custom-theme .el-radio-group{display:inline-block;line-height:1;vertical-align:middle;font-size:0}.custom-theme .el-radio-button{position:relative;display:inline-block;outline:0}.custom-theme .el-radio-button__inner{display:inline-block;line-height:1;white-space:nowrap;vertical-align:middle;background:#fff;border:1px solid #d8dce5;font-weight:500;border-left:0;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;position:relative;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.custom-theme .el-radio-button__inner.is-round{padding:12px 20px}.custom-theme .el-radio-button__inner:hover{color:#262729}.custom-theme .el-radio-button__inner [class*=el-icon-]{line-height:.9}.custom-theme .el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-radio-button__orig-radio{opacity:0;outline:0;position:absolute;z-index:-1;left:-999px}.custom-theme .el-radio-button__orig-radio:checked+.el-radio-button__inner{color:#fff;background-color:#262729;border-color:#262729;-webkit-box-shadow:-1px 0 0 0 #262729;box-shadow:-1px 0 0 0 #262729}.custom-theme .el-radio-button__orig-radio:disabled+.el-radio-button__inner{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5;-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner{background-color:#edf2fc}.custom-theme .el-radio-button:first-child .el-radio-button__inner{border-left:1px solid #d8dce5;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.custom-theme .el-radio-button:last-child .el-radio-button__inner{border-radius:0 4px 4px 0}.custom-theme .el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:4px}.custom-theme .el-radio-button--medium .el-radio-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.custom-theme .el-radio-button--medium .el-radio-button__inner.is-round{padding:10px 20px}.custom-theme .el-radio-button--small .el-radio-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.custom-theme .el-radio-button--small .el-radio-button__inner.is-round{padding:9px 15px}.custom-theme .el-radio-button--mini .el-radio-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.custom-theme .el-radio-button--mini .el-radio-button__inner.is-round{padding:7px 15px}.custom-theme .el-radio-button:focus:not(.is-focus):not(:active){-webkit-box-shadow:0 0 2px 2px #262729;box-shadow:0 0 2px 2px #262729}.custom-theme .el-checkbox{color:#5a5e66;font-weight:500;font-size:14px;position:relative;cursor:pointer;display:inline-block;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #d8dce5}.custom-theme .el-checkbox.is-bordered.is-checked{border-color:#262729}.custom-theme .el-checkbox.is-bordered.is-disabled{border-color:#e6ebf5;cursor:not-allowed}.custom-theme .el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small{padding:3px 15px 7px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini{padding:1px 15px 5px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox__input{white-space:nowrap;cursor:pointer;outline:0;display:inline-block;line-height:1;position:relative;vertical-align:middle}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5;cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner::after{cursor:not-allowed;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before{background-color:#b4bccc;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled+span.el-checkbox__label{color:#b4bccc;cursor:not-allowed}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner::after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.custom-theme .el-checkbox__input.is-checked+.el-checkbox__label{color:#262729}.custom-theme .el-checkbox__input.is-focus .el-checkbox__inner{border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::before{content:'';position:absolute;display:block;background-color:#fff;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::after{display:none}.custom-theme .el-checkbox__inner{display:inline-block;position:relative;border:1px solid #d8dce5;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#fff;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.custom-theme .el-checkbox__inner:hover{border-color:#262729}.custom-theme .el-checkbox__inner::after{-webkit-box-sizing:content-box;box-sizing:content-box;content:"";border:1px solid #fff;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms,-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;-webkit-transform-origin:center;transform-origin:center}.custom-theme .el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;left:-999px}.custom-theme .el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.custom-theme .el-checkbox+.el-checkbox{margin-left:30px}.custom-theme .el-checkbox-button{position:relative;display:inline-block}.custom-theme .el-checkbox-button__inner{display:inline-block;line-height:1;font-weight:500;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-left:0;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;position:relative;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button__inner.is-round{padding:12px 20px}.custom-theme .el-checkbox-button__inner:hover{color:#262729}.custom-theme .el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.custom-theme .el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;left:-999px}.custom-theme .el-checkbox-button.is-checked .el-checkbox-button__inner{color:#fff;background-color:#262729;border-color:#262729;-webkit-box-shadow:-1px 0 0 0 #7d7d7f;box-shadow:-1px 0 0 0 #7d7d7f}.custom-theme .el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5;-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #d8dce5;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.custom-theme .el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#262729}.custom-theme .el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.custom-theme .el-checkbox-group{font-size:0}.custom-theme .el-switch{display:inline-block;position:relative;font-size:14px;line-height:20px;height:20px;vertical-align:middle}.custom-theme .el-switch.is-disabled .el-switch__core,.custom-theme .el-switch.is-disabled .el-switch__label{cursor:not-allowed}.custom-theme .el-switch__label{-webkit-transition:.2s;transition:.2s;height:20px;display:inline-block;font-size:14px;font-weight:500;cursor:pointer;vertical-align:middle;color:#2d2f33}.custom-theme .el-switch__label.is-active{color:#262729}.custom-theme .el-switch__label--left{margin-right:10px}.custom-theme .el-switch__label--right{margin-left:10px}.custom-theme .el-switch__label *{line-height:1;font-size:14px;display:inline-block}.custom-theme .el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.custom-theme .el-switch__input:focus~.el-switch__core{outline:1px solid #262729}.custom-theme .el-switch__core{margin:0;display:inline-block;position:relative;width:40px;height:20px;border:1px solid #d8dce5;outline:0;border-radius:10px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#d8dce5;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s;vertical-align:middle}.custom-theme .el-switch__core .el-switch__button{position:absolute;top:1px;left:1px;border-radius:100%;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;width:16px;height:16px;background-color:#fff}.custom-theme .el-switch.is-checked .el-switch__core{border-color:#262729;background-color:#262729}.custom-theme .el-switch.is-disabled{opacity:.6}.custom-theme .el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.custom-theme .el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.custom-theme .el-switch .label-fade-enter,.custom-theme .el-switch .label-fade-leave-active{opacity:0}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:" ";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .el-select-dropdown{position:absolute;z-index:1001;border:solid 1px #dfe4ed;border-radius:4px;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:5px 0}.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:#262729;background-color:#fff}.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:#f5f7fa}.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after{position:absolute;right:20px;font-family:element-icons;content:"\E611";font-size:12px;font-weight:700;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.custom-theme .el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.custom-theme .el-select-dropdown .popper__arrow{-webkit-transform:translateX(-400%);transform:translateX(-400%)}.custom-theme .el-select-dropdown.is-arrow-fixed .popper__arrow{-webkit-transform:translateX(-200%);transform:translateX(-200%)}.custom-theme .el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.custom-theme .el-select-dropdown__wrap{max-height:274px}.custom-theme .el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-tag{background-color:rgba(38,39,41,.1);display:inline-block;padding:0 10px;height:32px;line-height:30px;font-size:12px;color:#262729;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid rgba(38,39,41,.2);white-space:nowrap}.custom-theme .el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:18px;width:18px;line-height:18px;vertical-align:middle;top:-1px;right:-5px;color:#262729}.custom-theme .el-tag .el-icon-close::before{display:block}.custom-theme .el-tag .el-icon-close:hover{background-color:#262729;color:#fff}.custom-theme .el-tag--info{background-color:rgba(10,118,164,.1);border-color:rgba(10,118,164,.2);color:#0a76a4}.custom-theme .el-tag--info.is-hit{border-color:#0a76a4}.custom-theme .el-tag--info .el-tag__close{color:#0a76a4}.custom-theme .el-tag--info .el-tag__close:hover{background-color:#0a76a4;color:#fff}.custom-theme .el-tag--success{background-color:rgba(64,145,103,.1);border-color:rgba(64,145,103,.2);color:#409167}.custom-theme .el-tag--success.is-hit{border-color:#409167}.custom-theme .el-tag--success .el-tag__close{color:#409167}.custom-theme .el-tag--success .el-tag__close:hover{background-color:#409167;color:#fff}.custom-theme .el-tag--warning{background-color:rgba(157,164,8,.1);border-color:rgba(157,164,8,.2);color:#9da408}.custom-theme .el-tag--warning.is-hit{border-color:#9da408}.custom-theme .el-tag--warning .el-tag__close{color:#9da408}.custom-theme .el-tag--warning .el-tag__close:hover{background-color:#9da408;color:#fff}.custom-theme .el-tag--danger{background-color:rgba(179,69,14,.1);border-color:rgba(179,69,14,.2);color:#b3450e}.custom-theme .el-tag--danger.is-hit{border-color:#b3450e}.custom-theme .el-tag--danger .el-tag__close{color:#b3450e}.custom-theme .el-tag--danger .el-tag__close:hover{background-color:#b3450e;color:#fff}.custom-theme .el-tag--medium{height:28px;line-height:26px}.custom-theme .el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--small{height:24px;padding:0 8px;line-height:22px}.custom-theme .el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--mini{height:20px;padding:0 5px;line-height:19px}.custom-theme .el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.custom-theme .el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#5a5e66;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.custom-theme .el-select-dropdown__item.is-disabled{color:#b4bccc;cursor:not-allowed}.custom-theme .el-select-dropdown__item.is-disabled:hover{background-color:#fff}.custom-theme .el-select-dropdown__item.hover,.custom-theme .el-select-dropdown__item:hover{background-color:#f5f7fa}.custom-theme .el-select-dropdown__item.selected{color:#262729;font-weight:700}.custom-theme .el-select-dropdown__item span{line-height:34px!important}.custom-theme .el-select-group{margin:0;padding:0}.custom-theme .el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.custom-theme .el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.custom-theme .el-select-group__wrap:not(:last-of-type)::after{content:'';position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#dfe4ed}.custom-theme .el-select-group__title{padding-left:20px;font-size:12px;color:#0a76a4;line-height:30px}.custom-theme .el-select-group .el-select-dropdown__item{padding-left:20px}.custom-theme .el-scrollbar{overflow:hidden;position:relative}.custom-theme .el-scrollbar:active>.el-scrollbar__bar,.custom-theme .el-scrollbar:focus>.el-scrollbar__bar,.custom-theme .el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.custom-theme .el-scrollbar__wrap{overflow:scroll;height:100%}.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.custom-theme .el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(135,141,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.custom-theme .el-scrollbar__thumb:hover{background-color:rgba(135,141,153,.5)}.custom-theme .el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.custom-theme .el-scrollbar__bar.is-vertical{width:6px;top:2px}.custom-theme .el-scrollbar__bar.is-vertical>div{width:100%}.custom-theme .el-scrollbar__bar.is-horizontal{height:6px;left:2px}.custom-theme .el-scrollbar__bar.is-horizontal>div{height:100%}.custom-theme .el-select{display:inline-block;position:relative}.custom-theme .el-select:hover .el-input__inner{border-color:#b4bccc}.custom-theme .el-select .el-input__inner{cursor:pointer;padding-right:35px}.custom-theme .el-select .el-input__inner:focus{border-color:#262729}.custom-theme .el-select .el-input .el-select__caret{color:#b4bccc;font-size:14px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);line-height:16px;cursor:pointer}.custom-theme .el-select .el-input .el-select__caret.is-reverse{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.custom-theme .el-select .el-input .el-select__caret.is-show-close{font-size:14px;text-align:center;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);border-radius:100%;color:#b4bccc;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-select .el-input .el-select__caret.is-show-close:hover{color:#878d99}.custom-theme .el-select .el-input.is-disabled .el-input__inner{cursor:not-allowed}.custom-theme .el-select .el-input.is-disabled .el-input__inner:hover{border-color:#dfe4ed}.custom-theme .el-select>.el-input{display:block}.custom-theme .el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:#666;font-size:14px;vertical-align:baseline;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.custom-theme .el-select__input.is-mini{height:14px}.custom-theme .el-select__close{cursor:pointer;position:absolute;top:8px;z-index:1000;right:25px;color:#b4bccc;line-height:18px;font-size:14px}.custom-theme .el-select__close:hover{color:#878d99}.custom-theme .el-select__tags{position:absolute;line-height:normal;white-space:normal;z-index:1;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.custom-theme .el-select .el-tag__close{margin-top:-2px}.custom-theme .el-select .el-tag{-webkit-box-sizing:border-box;box-sizing:border-box;border-color:transparent;margin:3px 0 3px 6px;background-color:#f0f2f5}.custom-theme .el-select .el-tag__close.el-icon-close{background-color:#b4bccc;right:-7px;color:#fff}.custom-theme .el-select .el-tag__close.el-icon-close:hover{background-color:#878d99}.custom-theme .el-select .el-tag__close.el-icon-close::before{display:block;-webkit-transform:translate(0,.5px);transform:translate(0,.5px)}.custom-theme .el-select__tag{display:inline-block;height:24px;line-height:24px;font-size:14px;border-radius:4px;color:#fff;background-color:#262729}.custom-theme .el-select__tag .el-icon-close{font-size:14px}.custom-theme .el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-color:#d8dce5;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button+.el-button{margin-left:10px}.custom-theme .el-button.is-round{padding:12px 20px}.custom-theme .el-button:focus,.custom-theme .el-button:hover{color:#262729;border-color:#bebebf;background-color:#e9e9ea}.custom-theme .el-button:active{color:#222325;border-color:#222325;outline:0}.custom-theme .el-button::-moz-focus-inner{border:0}.custom-theme .el-button [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-button.is-plain:focus,.custom-theme .el-button.is-plain:hover{background:#fff;border-color:#262729;color:#262729}.custom-theme .el-button.is-plain:active{background:#fff;border-color:#222325;color:#222325;outline:0}.custom-theme .el-button.is-active{color:#222325;border-color:#222325}.custom-theme .el-button.is-disabled,.custom-theme .el-button.is-disabled:focus,.custom-theme .el-button.is-disabled:hover{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5}.custom-theme .el-button.is-disabled.el-button--text{background-color:transparent}.custom-theme .el-button.is-disabled.is-plain,.custom-theme .el-button.is-disabled.is-plain:focus,.custom-theme .el-button.is-disabled.is-plain:hover{background-color:#fff;border-color:#e6ebf5;color:#b4bccc}.custom-theme .el-button.is-loading{position:relative;pointer-events:none}.custom-theme .el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.custom-theme .el-button.is-round{border-radius:20px;padding:12px 23px}.custom-theme .el-button--primary{color:#fff;background-color:#262729;border-color:#262729}.custom-theme .el-button--primary:focus,.custom-theme .el-button--primary:hover{background:#515254;border-color:#515254;color:#fff}.custom-theme .el-button--primary:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-active{background:#222325;border-color:#222325;color:#fff}.custom-theme .el-button--primary.is-disabled,.custom-theme .el-button--primary.is-disabled:active,.custom-theme .el-button--primary.is-disabled:focus,.custom-theme .el-button--primary.is-disabled:hover{color:#fff;background-color:#939394;border-color:#939394}.custom-theme .el-button--primary.is-plain{color:#262729;background:#e9e9ea;border-color:#a8a9a9}.custom-theme .el-button--primary.is-plain:focus,.custom-theme .el-button--primary.is-plain:hover{background:#262729;border-color:#262729;color:#fff}.custom-theme .el-button--primary.is-plain:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-plain.is-disabled,.custom-theme .el-button--primary.is-plain.is-disabled:active,.custom-theme .el-button--primary.is-plain.is-disabled:focus,.custom-theme .el-button--primary.is-plain.is-disabled:hover{color:#7d7d7f;background-color:#e9e9ea;border-color:#d4d4d4}.custom-theme .el-button--success{color:#fff;background-color:#409167;border-color:#409167}.custom-theme .el-button--success:focus,.custom-theme .el-button--success:hover{background:#66a785;border-color:#66a785;color:#fff}.custom-theme .el-button--success:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-active{background:#3a835d;border-color:#3a835d;color:#fff}.custom-theme .el-button--success.is-disabled,.custom-theme .el-button--success.is-disabled:active,.custom-theme .el-button--success.is-disabled:focus,.custom-theme .el-button--success.is-disabled:hover{color:#fff;background-color:#a0c8b3;border-color:#a0c8b3}.custom-theme .el-button--success.is-plain{color:#409167;background:#ecf4f0;border-color:#b3d3c2}.custom-theme .el-button--success.is-plain:focus,.custom-theme .el-button--success.is-plain:hover{background:#409167;border-color:#409167;color:#fff}.custom-theme .el-button--success.is-plain:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-plain.is-disabled,.custom-theme .el-button--success.is-plain.is-disabled:active,.custom-theme .el-button--success.is-plain.is-disabled:focus,.custom-theme .el-button--success.is-plain.is-disabled:hover{color:#8cbda4;background-color:#ecf4f0;border-color:#d9e9e1}.custom-theme .el-button--warning{color:#fff;background-color:#9da408;border-color:#9da408}.custom-theme .el-button--warning:focus,.custom-theme .el-button--warning:hover{background:#b1b639;border-color:#b1b639;color:#fff}.custom-theme .el-button--warning:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-active{background:#8d9407;border-color:#8d9407;color:#fff}.custom-theme .el-button--warning.is-disabled,.custom-theme .el-button--warning.is-disabled:active,.custom-theme .el-button--warning.is-disabled:focus,.custom-theme .el-button--warning.is-disabled:hover{color:#fff;background-color:#ced284;border-color:#ced284}.custom-theme .el-button--warning.is-plain{color:#9da408;background:#f5f6e6;border-color:#d8db9c}.custom-theme .el-button--warning.is-plain:focus,.custom-theme .el-button--warning.is-plain:hover{background:#9da408;border-color:#9da408;color:#fff}.custom-theme .el-button--warning.is-plain:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-plain.is-disabled,.custom-theme .el-button--warning.is-plain.is-disabled:active,.custom-theme .el-button--warning.is-plain.is-disabled:focus,.custom-theme .el-button--warning.is-plain.is-disabled:hover{color:#c4c86b;background-color:#f5f6e6;border-color:#ebedce}.custom-theme .el-button--danger{color:#fff;background-color:#b3450e;border-color:#b3450e}.custom-theme .el-button--danger:focus,.custom-theme .el-button--danger:hover{background:#c26a3e;border-color:#c26a3e;color:#fff}.custom-theme .el-button--danger:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-active{background:#a13e0d;border-color:#a13e0d;color:#fff}.custom-theme .el-button--danger.is-disabled,.custom-theme .el-button--danger.is-disabled:active,.custom-theme .el-button--danger.is-disabled:focus,.custom-theme .el-button--danger.is-disabled:hover{color:#fff;background-color:#d9a287;border-color:#d9a287}.custom-theme .el-button--danger.is-plain{color:#b3450e;background:#f7ece7;border-color:#e1b59f}.custom-theme .el-button--danger.is-plain:focus,.custom-theme .el-button--danger.is-plain:hover{background:#b3450e;border-color:#b3450e;color:#fff}.custom-theme .el-button--danger.is-plain:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-plain.is-disabled,.custom-theme .el-button--danger.is-plain.is-disabled:active,.custom-theme .el-button--danger.is-plain.is-disabled:focus,.custom-theme .el-button--danger.is-plain.is-disabled:hover{color:#d18f6e;background-color:#f7ece7;border-color:#f0dacf}.custom-theme .el-button--info{color:#fff;background-color:#0a76a4;border-color:#0a76a4}.custom-theme .el-button--info:focus,.custom-theme .el-button--info:hover{background:#3b91b6;border-color:#3b91b6;color:#fff}.custom-theme .el-button--info:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-active{background:#096a94;border-color:#096a94;color:#fff}.custom-theme .el-button--info.is-disabled,.custom-theme .el-button--info.is-disabled:active,.custom-theme .el-button--info.is-disabled:focus,.custom-theme .el-button--info.is-disabled:hover{color:#fff;background-color:#85bbd2;border-color:#85bbd2}.custom-theme .el-button--info.is-plain{color:#0a76a4;background:#e7f1f6;border-color:#9dc8db}.custom-theme .el-button--info.is-plain:focus,.custom-theme .el-button--info.is-plain:hover{background:#0a76a4;border-color:#0a76a4;color:#fff}.custom-theme .el-button--info.is-plain:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-plain.is-disabled,.custom-theme .el-button--info.is-plain.is-disabled:active,.custom-theme .el-button--info.is-plain.is-disabled:focus,.custom-theme .el-button--info.is-plain.is-disabled:hover{color:#6cadc8;background-color:#e7f1f6;border-color:#cee4ed}.custom-theme .el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button--medium.is-round{padding:10px 20px}.custom-theme .el-button--small{padding:9px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--small.is-round{padding:9px 15px}.custom-theme .el-button--mini{padding:7px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--mini.is-round{padding:7px 15px}.custom-theme .el-button--text{border:none;color:#262729;background:0 0;padding-left:0;padding-right:0}.custom-theme .el-button--text:focus,.custom-theme .el-button--text:hover{color:#515254;border-color:transparent;background-color:transparent}.custom-theme .el-button--text:active{color:#222325;border-color:transparent;background-color:transparent}.custom-theme .el-button-group{display:inline-block;vertical-align:middle}.custom-theme .el-button-group::after,.custom-theme .el-button-group::before{display:table;content:""}.custom-theme .el-button-group::after{clear:both}.custom-theme .el-button-group .el-button{float:left;position:relative}.custom-theme .el-button-group .el-button+.el-button{margin-left:0}.custom-theme .el-button-group .el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-button-group .el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-button-group .el-button:not(:first-child):not(:last-child){border-radius:0}.custom-theme .el-button-group .el-button:not(:last-child){margin-right:-1px}.custom-theme .el-button-group .el-button:active,.custom-theme .el-button-group .el-button:focus,.custom-theme .el-button-group .el-button:hover{z-index:1}.custom-theme .el-button-group .el-button.is-active{z-index:1}.custom-theme .el-button-group .el-button--primary:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-checkbox{color:#5a5e66;font-weight:500;font-size:14px;position:relative;cursor:pointer;display:inline-block;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #d8dce5}.custom-theme .el-checkbox.is-bordered.is-checked{border-color:#262729}.custom-theme .el-checkbox.is-bordered.is-disabled{border-color:#e6ebf5;cursor:not-allowed}.custom-theme .el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small{padding:3px 15px 7px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini{padding:1px 15px 5px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox__input{white-space:nowrap;cursor:pointer;outline:0;display:inline-block;line-height:1;position:relative;vertical-align:middle}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5;cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner::after{cursor:not-allowed;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before{background-color:#b4bccc;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled+span.el-checkbox__label{color:#b4bccc;cursor:not-allowed}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner::after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.custom-theme .el-checkbox__input.is-checked+.el-checkbox__label{color:#262729}.custom-theme .el-checkbox__input.is-focus .el-checkbox__inner{border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::before{content:'';position:absolute;display:block;background-color:#fff;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::after{display:none}.custom-theme .el-checkbox__inner{display:inline-block;position:relative;border:1px solid #d8dce5;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#fff;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.custom-theme .el-checkbox__inner:hover{border-color:#262729}.custom-theme .el-checkbox__inner::after{-webkit-box-sizing:content-box;box-sizing:content-box;content:"";border:1px solid #fff;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms,-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;-webkit-transform-origin:center;transform-origin:center}.custom-theme .el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;left:-999px}.custom-theme .el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.custom-theme .el-checkbox+.el-checkbox{margin-left:30px}.custom-theme .el-checkbox-button{position:relative;display:inline-block}.custom-theme .el-checkbox-button__inner{display:inline-block;line-height:1;font-weight:500;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-left:0;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;position:relative;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button__inner.is-round{padding:12px 20px}.custom-theme .el-checkbox-button__inner:hover{color:#262729}.custom-theme .el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.custom-theme .el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;left:-999px}.custom-theme .el-checkbox-button.is-checked .el-checkbox-button__inner{color:#fff;background-color:#262729;border-color:#262729;-webkit-box-shadow:-1px 0 0 0 #7d7d7f;box-shadow:-1px 0 0 0 #7d7d7f}.custom-theme .el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5;-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #d8dce5;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.custom-theme .el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#262729}.custom-theme .el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.custom-theme .el-checkbox-group{font-size:0}.custom-theme .el-tag{background-color:rgba(38,39,41,.1);display:inline-block;padding:0 10px;height:32px;line-height:30px;font-size:12px;color:#262729;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid rgba(38,39,41,.2);white-space:nowrap}.custom-theme .el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:18px;width:18px;line-height:18px;vertical-align:middle;top:-1px;right:-5px;color:#262729}.custom-theme .el-tag .el-icon-close::before{display:block}.custom-theme .el-tag .el-icon-close:hover{background-color:#262729;color:#fff}.custom-theme .el-tag--info{background-color:rgba(10,118,164,.1);border-color:rgba(10,118,164,.2);color:#0a76a4}.custom-theme .el-tag--info.is-hit{border-color:#0a76a4}.custom-theme .el-tag--info .el-tag__close{color:#0a76a4}.custom-theme .el-tag--info .el-tag__close:hover{background-color:#0a76a4;color:#fff}.custom-theme .el-tag--success{background-color:rgba(64,145,103,.1);border-color:rgba(64,145,103,.2);color:#409167}.custom-theme .el-tag--success.is-hit{border-color:#409167}.custom-theme .el-tag--success .el-tag__close{color:#409167}.custom-theme .el-tag--success .el-tag__close:hover{background-color:#409167;color:#fff}.custom-theme .el-tag--warning{background-color:rgba(157,164,8,.1);border-color:rgba(157,164,8,.2);color:#9da408}.custom-theme .el-tag--warning.is-hit{border-color:#9da408}.custom-theme .el-tag--warning .el-tag__close{color:#9da408}.custom-theme .el-tag--warning .el-tag__close:hover{background-color:#9da408;color:#fff}.custom-theme .el-tag--danger{background-color:rgba(179,69,14,.1);border-color:rgba(179,69,14,.2);color:#b3450e}.custom-theme .el-tag--danger.is-hit{border-color:#b3450e}.custom-theme .el-tag--danger .el-tag__close{color:#b3450e}.custom-theme .el-tag--danger .el-tag__close:hover{background-color:#b3450e;color:#fff}.custom-theme .el-tag--medium{height:28px;line-height:26px}.custom-theme .el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--small{height:24px;padding:0 8px;line-height:22px}.custom-theme .el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--mini{height:20px;padding:0 5px;line-height:19px}.custom-theme .el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.custom-theme .el-table{position:relative;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1;flex:1;width:100%;max-width:100%;background-color:#fff;font-size:14px;color:#5a5e66}.custom-theme .el-table__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.custom-theme .el-table__empty-text{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:color(#262729 s(16%) l(44%))}.custom-theme .el-table__expand-column .cell{padding:0;text-align:center}.custom-theme .el-table__expand-icon{position:relative;cursor:pointer;color:#666;font-size:12px;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;height:20px}.custom-theme .el-table__expand-icon--expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.custom-theme .el-table__expand-icon>.el-icon{position:absolute;left:50%;top:50%;margin-left:-5px;margin-top:-5px}.custom-theme .el-table__expanded-cell{background-color:#fff}.custom-theme .el-table__expanded-cell[class*=cell]{padding:20px 50px}.custom-theme .el-table__expanded-cell:hover{background-color:#f5f7fa!important}.custom-theme .el-table--fit{border-right:0;border-bottom:0}.custom-theme .el-table--fit td.gutter,.custom-theme .el-table--fit th.gutter{border-right-width:1px}.custom-theme .el-table thead{color:#878d99;font-weight:500}.custom-theme .el-table thead.is-group th{background:#f5f7fa}.custom-theme .el-table td,.custom-theme .el-table th{padding:12px 0;min-width:0;-webkit-box-sizing:border-box;box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;position:relative}.custom-theme .el-table td.is-center,.custom-theme .el-table th.is-center{text-align:center}.custom-theme .el-table td.is-left,.custom-theme .el-table th.is-left{text-align:left}.custom-theme .el-table td.is-right,.custom-theme .el-table th.is-right{text-align:right}.custom-theme .el-table td.gutter,.custom-theme .el-table th.gutter{width:15px;border-right-width:0;border-bottom-width:0;padding:0}.custom-theme .el-table td.is-hidden>*,.custom-theme .el-table th.is-hidden>*{visibility:hidden}.custom-theme .el-table--medium td,.custom-theme .el-table--medium th{padding:10px 0}.custom-theme .el-table--small{font-size:12px}.custom-theme .el-table--small td,.custom-theme .el-table--small th{padding:8px 0}.custom-theme .el-table--mini{font-size:12px}.custom-theme .el-table--mini td,.custom-theme .el-table--mini th{padding:6px 0}.custom-theme .el-table tr{background-color:#fff}.custom-theme .el-table tr input[type=checkbox]{margin:0}.custom-theme .el-table td,.custom-theme .el-table th.is-leaf{border-bottom:1px solid #e6ebf5}.custom-theme .el-table th.is-sortable{cursor:pointer}.custom-theme .el-table th{white-space:nowrap;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:left}.custom-theme .el-table th div{display:inline-block;padding-left:10px;padding-right:10px;line-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.custom-theme .el-table th>.cell{position:relative;word-wrap:normal;text-overflow:ellipsis;display:inline-block;vertical-align:middle;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-table th>.cell.highlight{color:#262729}.custom-theme .el-table th.required>div::before{display:inline-block;content:"";width:8px;height:8px;border-radius:50%;background:#ff4d51;margin-right:5px;vertical-align:middle}.custom-theme .el-table td div{-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-table td.gutter{width:0}.custom-theme .el-table .cell{-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all;line-height:23px;padding-left:10px;padding-right:10px}.custom-theme .el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.custom-theme .el-table td:first-child .cell,.custom-theme .el-table th:first-child .cell{padding-left:0}.custom-theme .el-table--border,.custom-theme .el-table--group{border:1px solid #e6ebf5}.custom-theme .el-table--border::after,.custom-theme .el-table--group::after,.custom-theme .el-table::before{content:'';position:absolute;background-color:#e6ebf5;z-index:1}.custom-theme .el-table--border::after,.custom-theme .el-table--group::after{top:0;right:0;width:1px;height:100%}.custom-theme .el-table::before{left:0;bottom:0;width:100%;height:1px}.custom-theme .el-table--border{border-right:none;border-bottom:none}.custom-theme .el-table--border td,.custom-theme .el-table--border th{border-right:1px solid #e6ebf5}.custom-theme .el-table--border td:first-child .cell,.custom-theme .el-table--border th:first-child .cell{padding-left:10px}.custom-theme .el-table--border .has-gutter td:nth-last-of-type(2),.custom-theme .el-table--border .has-gutter th:nth-last-of-type(2){border-right:none}.custom-theme .el-table--border th.gutter:last-of-type{border-bottom:1px solid #e6ebf5;border-bottom-width:1px}.custom-theme .el-table--border th{border-bottom:1px solid #e6ebf5}.custom-theme .el-table--hidden{visibility:hidden}.custom-theme .el-table__fixed,.custom-theme .el-table__fixed-right{position:absolute;top:0;left:0;overflow-x:hidden;-webkit-box-shadow:0 0 10px rgba(0,0,0,.12);box-shadow:0 0 10px rgba(0,0,0,.12)}.custom-theme .el-table__fixed-right::before,.custom-theme .el-table__fixed::before{content:'';position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#e6ebf5;z-index:4}.custom-theme .el-table__fixed-right-patch{position:absolute;top:-1px;right:0;background-color:#fff;border-bottom:1px solid #e6ebf5}.custom-theme .el-table__fixed-right{top:0;left:auto;right:0}.custom-theme .el-table__fixed-right .el-table__fixed-body-wrapper,.custom-theme .el-table__fixed-right .el-table__fixed-footer-wrapper,.custom-theme .el-table__fixed-right .el-table__fixed-header-wrapper{left:auto;right:0}.custom-theme .el-table__fixed-header-wrapper{position:absolute;left:0;top:0;z-index:3}.custom-theme .el-table__fixed-footer-wrapper{position:absolute;left:0;bottom:0;z-index:3}.custom-theme .el-table__fixed-footer-wrapper tbody td{border-top:1px solid #e6ebf5;background-color:#f5f7fa;color:#5a5e66}.custom-theme .el-table__fixed-body-wrapper{position:absolute;left:0;top:37px;overflow:hidden;z-index:3}.custom-theme .el-table__body-wrapper,.custom-theme .el-table__footer-wrapper,.custom-theme .el-table__header-wrapper{width:100%}.custom-theme .el-table__footer-wrapper{margin-top:-1px}.custom-theme .el-table__footer-wrapper td{border-top:1px solid #e6ebf5}.custom-theme .el-table__body,.custom-theme .el-table__footer,.custom-theme .el-table__header{table-layout:fixed}.custom-theme .el-table__footer-wrapper,.custom-theme .el-table__header-wrapper{overflow:hidden}.custom-theme .el-table__footer-wrapper tbody td,.custom-theme .el-table__header-wrapper tbody td{background-color:#f5f7fa;color:#5a5e66}.custom-theme .el-table__body-wrapper{overflow:auto;position:relative}.custom-theme .el-table__body-wrapper.is-scroll-none~.el-table__fixed,.custom-theme .el-table__body-wrapper.is-scroll-none~.el-table__fixed-right{-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-table__body-wrapper.is-scroll-left~.el-table__fixed{-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-table__body-wrapper.is-scroll-right~.el-table__fixed-right{-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-table__body-wrapper .el-table--border.is-scroll-right~.el-table__fixed-right{border-left:1px solid #e6ebf5}.custom-theme .el-table__body-wrapper .el-table--border.is-scroll-left~.el-table__fixed{border-right:1px solid #e6ebf5}.custom-theme .el-table .caret-wrapper{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:13px;width:24px;cursor:pointer;overflow:initial}.custom-theme .el-table .sort-caret{color:#0a76a4;width:14px;overflow:hidden;font-size:13px}.custom-theme .el-table .ascending .sort-caret.ascending{color:#262729}.custom-theme .el-table .descending .sort-caret.descending{color:#262729}.custom-theme .el-table .hidden-columns{visibility:hidden;position:absolute;z-index:-1}.custom-theme .el-table--striped .el-table__body tr.el-table__row--striped td{background:#fafafa}.custom-theme .el-table--striped .el-table__body tr.el-table__row--striped.current-row td{background-color:#e9e9ea}.custom-theme .el-table__body tr.hover-row.current-row>td,.custom-theme .el-table__body tr.hover-row.el-table__row--striped.current-row>td,.custom-theme .el-table__body tr.hover-row.el-table__row--striped>td,.custom-theme .el-table__body tr.hover-row>td{background-color:#e9e9ea}.custom-theme .el-table__body tr.current-row>td{background-color:#e9e9ea}.custom-theme .el-table__column-resize-proxy{position:absolute;left:200px;top:0;bottom:0;width:0;border-left:1px solid #e6ebf5;z-index:10}.custom-theme .el-table__column-filter-trigger{display:inline-block;line-height:34px;cursor:pointer}.custom-theme .el-table__column-filter-trigger i{color:#0a76a4;font-size:12px;-webkit-transform:scale(.75);transform:scale(.75)}.custom-theme .el-table--enable-row-transition .el-table__body td{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}.custom-theme .el-table--enable-row-hover .el-table__body tr:hover>td{background-color:#f5f7fa}.custom-theme .el-table--fluid-height .el-table__fixed,.custom-theme .el-table--fluid-height .el-table__fixed-right{bottom:0;overflow:hidden}.custom-theme .el-checkbox{color:#5a5e66;font-weight:500;font-size:14px;position:relative;cursor:pointer;display:inline-block;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #d8dce5}.custom-theme .el-checkbox.is-bordered.is-checked{border-color:#262729}.custom-theme .el-checkbox.is-bordered.is-disabled{border-color:#e6ebf5;cursor:not-allowed}.custom-theme .el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small{padding:3px 15px 7px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini{padding:1px 15px 5px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox__input{white-space:nowrap;cursor:pointer;outline:0;display:inline-block;line-height:1;position:relative;vertical-align:middle}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5;cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner::after{cursor:not-allowed;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before{background-color:#b4bccc;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled+span.el-checkbox__label{color:#b4bccc;cursor:not-allowed}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner::after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.custom-theme .el-checkbox__input.is-checked+.el-checkbox__label{color:#262729}.custom-theme .el-checkbox__input.is-focus .el-checkbox__inner{border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::before{content:'';position:absolute;display:block;background-color:#fff;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::after{display:none}.custom-theme .el-checkbox__inner{display:inline-block;position:relative;border:1px solid #d8dce5;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#fff;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.custom-theme .el-checkbox__inner:hover{border-color:#262729}.custom-theme .el-checkbox__inner::after{-webkit-box-sizing:content-box;box-sizing:content-box;content:"";border:1px solid #fff;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms,-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;-webkit-transform-origin:center;transform-origin:center}.custom-theme .el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;left:-999px}.custom-theme .el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.custom-theme .el-checkbox+.el-checkbox{margin-left:30px}.custom-theme .el-checkbox-button{position:relative;display:inline-block}.custom-theme .el-checkbox-button__inner{display:inline-block;line-height:1;font-weight:500;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-left:0;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;position:relative;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button__inner.is-round{padding:12px 20px}.custom-theme .el-checkbox-button__inner:hover{color:#262729}.custom-theme .el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.custom-theme .el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;left:-999px}.custom-theme .el-checkbox-button.is-checked .el-checkbox-button__inner{color:#fff;background-color:#262729;border-color:#262729;-webkit-box-shadow:-1px 0 0 0 #7d7d7f;box-shadow:-1px 0 0 0 #7d7d7f}.custom-theme .el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5;-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #d8dce5;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.custom-theme .el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#262729}.custom-theme .el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.custom-theme .el-checkbox-group{font-size:0}.custom-theme .el-tag{background-color:rgba(38,39,41,.1);display:inline-block;padding:0 10px;height:32px;line-height:30px;font-size:12px;color:#262729;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid rgba(38,39,41,.2);white-space:nowrap}.custom-theme .el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:18px;width:18px;line-height:18px;vertical-align:middle;top:-1px;right:-5px;color:#262729}.custom-theme .el-tag .el-icon-close::before{display:block}.custom-theme .el-tag .el-icon-close:hover{background-color:#262729;color:#fff}.custom-theme .el-tag--info{background-color:rgba(10,118,164,.1);border-color:rgba(10,118,164,.2);color:#0a76a4}.custom-theme .el-tag--info.is-hit{border-color:#0a76a4}.custom-theme .el-tag--info .el-tag__close{color:#0a76a4}.custom-theme .el-tag--info .el-tag__close:hover{background-color:#0a76a4;color:#fff}.custom-theme .el-tag--success{background-color:rgba(64,145,103,.1);border-color:rgba(64,145,103,.2);color:#409167}.custom-theme .el-tag--success.is-hit{border-color:#409167}.custom-theme .el-tag--success .el-tag__close{color:#409167}.custom-theme .el-tag--success .el-tag__close:hover{background-color:#409167;color:#fff}.custom-theme .el-tag--warning{background-color:rgba(157,164,8,.1);border-color:rgba(157,164,8,.2);color:#9da408}.custom-theme .el-tag--warning.is-hit{border-color:#9da408}.custom-theme .el-tag--warning .el-tag__close{color:#9da408}.custom-theme .el-tag--warning .el-tag__close:hover{background-color:#9da408;color:#fff}.custom-theme .el-tag--danger{background-color:rgba(179,69,14,.1);border-color:rgba(179,69,14,.2);color:#b3450e}.custom-theme .el-tag--danger.is-hit{border-color:#b3450e}.custom-theme .el-tag--danger .el-tag__close{color:#b3450e}.custom-theme .el-tag--danger .el-tag__close:hover{background-color:#b3450e;color:#fff}.custom-theme .el-tag--medium{height:28px;line-height:26px}.custom-theme .el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--small{height:24px;padding:0 8px;line-height:22px}.custom-theme .el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--mini{height:20px;padding:0 5px;line-height:19px}.custom-theme .el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.custom-theme .el-table-column--selection .cell{padding-left:14px;padding-right:14px}.custom-theme .el-table-filter{border:solid 1px #e6ebf5;border-radius:2px;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:2px 0}.custom-theme .el-table-filter__list{padding:5px 0;margin:0;list-style:none;min-width:100px}.custom-theme .el-table-filter__list-item{line-height:36px;padding:0 10px;cursor:pointer;font-size:14px}.custom-theme .el-table-filter__list-item:hover{background-color:#e9e9ea;color:#515254}.custom-theme .el-table-filter__list-item.is-active{background-color:#262729;color:#fff}.custom-theme .el-table-filter__content{min-width:100px}.custom-theme .el-table-filter__bottom{border-top:1px solid #e6ebf5;padding:8px}.custom-theme .el-table-filter__bottom button{background:0 0;border:none;color:#5a5e66;cursor:pointer;font-size:13px;padding:0 3px}.custom-theme .el-table-filter__bottom button:hover{color:#262729}.custom-theme .el-table-filter__bottom button:focus{outline:0}.custom-theme .el-table-filter__bottom button.is-disabled{color:#b4bccc;cursor:not-allowed}.custom-theme .el-table-filter__checkbox-group{padding:10px}.custom-theme .el-table-filter__checkbox-group label.el-checkbox{display:block;margin-bottom:8px;margin-left:5px}.custom-theme .el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.custom-theme .el-date-table{font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-date-table.is-week-mode .el-date-table__row:hover div{background-color:#edf2fc}.custom-theme .el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:#5a5e66}.custom-theme .el-date-table.is-week-mode .el-date-table__row:hover td:first-child div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.custom-theme .el-date-table.is-week-mode .el-date-table__row:hover td:last-child div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.custom-theme .el-date-table.is-week-mode .el-date-table__row.current div{background-color:#edf2fc}.custom-theme .el-date-table td{width:32px;height:30px;padding:4px 0;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;cursor:pointer;position:relative}.custom-theme .el-date-table td div{height:30px;padding:3px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-date-table td span{width:24px;height:24px;display:block;margin:0 auto;line-height:24px;position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-radius:50%}.custom-theme .el-date-table td.next-month,.custom-theme .el-date-table td.prev-month{color:#b4bccc}.custom-theme .el-date-table td.today{position:relative}.custom-theme .el-date-table td.today span{color:#262729}.custom-theme .el-date-table td.today.end-date span,.custom-theme .el-date-table td.today.start-date span{color:#fff}.custom-theme .el-date-table td.available:hover{color:#262729}.custom-theme .el-date-table td.in-range div{background-color:#edf2fc}.custom-theme .el-date-table td.in-range div:hover{background-color:#edf2fc}.custom-theme .el-date-table td.current:not(.disabled) span{color:#fff;background-color:#262729}.custom-theme .el-date-table td.end-date div,.custom-theme .el-date-table td.start-date div{color:#fff}.custom-theme .el-date-table td.end-date span,.custom-theme .el-date-table td.start-date span{background-color:#262729}.custom-theme .el-date-table td.start-date div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.custom-theme .el-date-table td.end-date div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.custom-theme .el-date-table td.disabled div{background-color:#f5f7fa;opacity:1;cursor:not-allowed;color:#b4bccc}.custom-theme .el-date-table td.week{font-size:80%;color:#5a5e66}.custom-theme .el-date-table th{padding:5px;color:#5a5e66;font-weight:400;border-bottom:solid 1px #e6ebf5}.custom-theme .el-month-table{font-size:12px;margin:-1px;border-collapse:collapse}.custom-theme .el-month-table td{text-align:center;padding:20px 3px;cursor:pointer}.custom-theme .el-month-table td.disabled .cell{background-color:#f5f7fa;cursor:not-allowed;color:#b4bccc}.custom-theme .el-month-table td.disabled .cell:hover{color:#b4bccc}.custom-theme .el-month-table td .cell{width:48px;height:32px;display:block;line-height:32px;color:#5a5e66;margin:0 auto}.custom-theme .el-month-table td .cell:hover{color:#262729}.custom-theme .el-month-table td.current:not(.disabled) .cell{color:#262729}.custom-theme .el-year-table{font-size:12px;margin:-1px;border-collapse:collapse}.custom-theme .el-year-table .el-icon{color:#2d2f33}.custom-theme .el-year-table td{text-align:center;padding:20px 3px;cursor:pointer}.custom-theme .el-year-table td.disabled .cell{background-color:#f5f7fa;cursor:not-allowed;color:#b4bccc}.custom-theme .el-year-table td.disabled .cell:hover{color:#b4bccc}.custom-theme .el-year-table td .cell{width:48px;height:32px;display:block;line-height:32px;color:#5a5e66;margin:0 auto}.custom-theme .el-year-table td .cell:hover{color:#262729}.custom-theme .el-year-table td.current:not(.disabled) .cell{color:#262729}.custom-theme .el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.custom-theme .el-time-spinner.has-seconds .el-time-spinner__wrapper:nth-child(2){margin-left:1%}.custom-theme .el-time-spinner__wrapper{max-height:190px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.custom-theme .el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.custom-theme .el-time-spinner__wrapper.is-arrow{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden}.custom-theme .el-time-spinner__wrapper.is-arrow .el-time-spinner__list{-webkit-transform:translateY(-32px);transform:translateY(-32px)}.custom-theme .el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active){background:#fff;cursor:default}.custom-theme .el-time-spinner__arrow{font-size:12px;color:#878d99;position:absolute;left:0;width:100%;z-index:1;text-align:center;height:30px;line-height:30px;cursor:pointer}.custom-theme .el-time-spinner__arrow:hover{color:#262729}.custom-theme .el-time-spinner__arrow.el-icon-arrow-up{top:10px}.custom-theme .el-time-spinner__arrow.el-icon-arrow-down{bottom:10px}.custom-theme .el-time-spinner__input.el-input{width:70%}.custom-theme .el-time-spinner__input.el-input .el-input__inner{padding:0;text-align:center}.custom-theme .el-time-spinner__list{padding:0;margin:0;list-style:none;text-align:center}.custom-theme .el-time-spinner__list::after,.custom-theme .el-time-spinner__list::before{content:'';display:block;width:100%;height:80px}.custom-theme .el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:#5a5e66}.custom-theme .el-time-spinner__item:hover:not(.disabled):not(.active){background:#f5f7fa;cursor:pointer}.custom-theme .el-time-spinner__item.active:not(.disabled){color:#2d2f33;font-weight:700}.custom-theme .el-time-spinner__item.disabled{color:#b4bccc;cursor:not-allowed}.custom-theme .fade-in-linear-enter-active,.custom-theme .fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .fade-in-linear-enter,.custom-theme .fade-in-linear-leave,.custom-theme .fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-linear-enter-active,.custom-theme .el-fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .el-fade-in-linear-enter,.custom-theme .el-fade-in-linear-leave,.custom-theme .el-fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-enter-active,.custom-theme .el-fade-in-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-fade-in-enter,.custom-theme .el-fade-in-leave-active{opacity:0}.custom-theme .el-zoom-in-center-enter-active,.custom-theme .el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-zoom-in-center-enter,.custom-theme .el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.custom-theme .el-zoom-in-top-enter-active,.custom-theme .el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center top;transform-origin:center top}.custom-theme .el-zoom-in-top-enter,.custom-theme .el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-bottom-enter-active,.custom-theme .el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center bottom;transform-origin:center bottom}.custom-theme .el-zoom-in-bottom-enter,.custom-theme .el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-left-enter-active,.custom-theme .el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:top left;transform-origin:top left}.custom-theme .el-zoom-in-left-enter,.custom-theme .el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.custom-theme .collapse-transition{-webkit-transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out;transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out}.custom-theme .horizontal-collapse-transition{-webkit-transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out;transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out}.custom-theme .el-list-enter-active,.custom-theme .el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.custom-theme .el-list-enter,.custom-theme .el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.custom-theme .el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-date-editor{position:relative;display:inline-block;text-align:left}.custom-theme .el-date-editor.el-input,.custom-theme .el-date-editor.el-input__inner{width:220px}.custom-theme .el-date-editor--daterange.el-input,.custom-theme .el-date-editor--daterange.el-input__inner,.custom-theme .el-date-editor--timerange.el-input,.custom-theme .el-date-editor--timerange.el-input__inner{width:350px}.custom-theme .el-date-editor--datetimerange.el-input,.custom-theme .el-date-editor--datetimerange.el-input__inner{width:400px}.custom-theme .el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#b4bccc;float:left;line-height:32px}.custom-theme .el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;display:inline-block;height:100%;margin:0;padding:0;width:39%;text-align:center;font-size:14px;color:#5a5e66}.custom-theme .el-date-editor .el-range-input::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input::placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-separator{display:inline-block;height:100%;padding:0 5px;margin:0;text-align:center;line-height:32px;font-size:14px;width:5%;color:#2d2f33}.custom-theme .el-date-editor .el-range__close-icon{font-size:14px;color:#b4bccc;width:25px;display:inline-block;float:right;line-height:32px}.custom-theme .el-range-editor.el-input__inner{padding:3px 10px}.custom-theme .el-range-editor.is-active{border-color:#262729}.custom-theme .el-range-editor.is-active:hover{border-color:#262729}.custom-theme .el-range-editor--medium.el-input__inner{height:36px}.custom-theme .el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.custom-theme .el-range-editor--medium .el-range-input{font-size:14px}.custom-theme .el-range-editor--medium .el-range__close-icon,.custom-theme .el-range-editor--medium .el-range__icon{line-height:28px}.custom-theme .el-range-editor--small.el-input__inner{height:32px}.custom-theme .el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.custom-theme .el-range-editor--small .el-range-input{font-size:13px}.custom-theme .el-range-editor--small .el-range__close-icon,.custom-theme .el-range-editor--small .el-range__icon{line-height:24px}.custom-theme .el-range-editor--mini.el-input__inner{height:28px}.custom-theme .el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.custom-theme .el-range-editor--mini .el-range-input{font-size:12px}.custom-theme .el-range-editor--mini .el-range__close-icon,.custom-theme .el-range-editor--mini .el-range__icon{line-height:20px}.custom-theme .el-range-editor.is-disabled{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-range-editor.is-disabled:focus,.custom-theme .el-range-editor.is-disabled:hover{border-color:#dfe4ed}.custom-theme .el-range-editor.is-disabled input{background-color:#f5f7fa;color:#b4bccc;cursor:not-allowed}.custom-theme .el-range-editor.is-disabled input::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input::placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled .el-range-separator{color:#b4bccc}.custom-theme .el-picker-panel{color:#5a5e66;border:1px solid #dfe4ed;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);background:#fff;border-radius:4px;line-height:30px;margin:5px 0}.custom-theme .el-picker-panel__body-wrapper::after,.custom-theme .el-picker-panel__body::after{content:"";display:table;clear:both}.custom-theme .el-picker-panel__content{position:relative;margin:15px}.custom-theme .el-picker-panel__footer{border-top:1px solid #e4e4e4;padding:4px;text-align:right;background-color:#fff;position:relative;font-size:0}.custom-theme .el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:#5a5e66;padding-left:12px;text-align:left;outline:0;cursor:pointer}.custom-theme .el-picker-panel__shortcut:hover{color:#262729}.custom-theme .el-picker-panel__shortcut.active{background-color:#e6f1fe;color:#262729}.custom-theme .el-picker-panel__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.custom-theme .el-picker-panel__btn[disabled]{color:#ccc;cursor:not-allowed}.custom-theme .el-picker-panel__icon-btn{font-size:12px;color:#2d2f33;border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.custom-theme .el-picker-panel__icon-btn:hover{color:#262729}.custom-theme .el-picker-panel__icon-btn.is-disabled{color:#bbb}.custom-theme .el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.custom-theme .el-picker-panel__link-btn{vertical-align:middle}.custom-theme .el-picker-panel .popper__arrow{-webkit-transform:translateX(-400%);transform:translateX(-400%)}.custom-theme .el-picker-panel [slot=sidebar],.custom-theme .el-picker-panel__sidebar{position:absolute;top:0;bottom:0;width:110px;border-right:1px solid #e4e4e4;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;background-color:#fff;overflow:auto}.custom-theme .el-picker-panel [slot=sidebar]+.el-picker-panel__body,.custom-theme .el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.custom-theme .el-date-picker{width:322px}.custom-theme .el-date-picker.has-sidebar.has-time{width:434px}.custom-theme .el-date-picker.has-sidebar{width:438px}.custom-theme .el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.custom-theme .el-date-picker .el-picker-panel__content{width:292px}.custom-theme .el-date-picker table{table-layout:fixed;width:100%}.custom-theme .el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.custom-theme .el-date-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-date-picker__header{margin:12px;text-align:center}.custom-theme .el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:solid 1px #e6ebf5}.custom-theme .el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.custom-theme .el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:#5a5e66}.custom-theme .el-date-picker__header-label:hover{color:#262729}.custom-theme .el-date-picker__header-label.active{color:#262729}.custom-theme .el-date-picker__prev-btn{float:left}.custom-theme .el-date-picker__next-btn{float:right}.custom-theme .el-date-picker__time-wrap{padding:10px;text-align:center}.custom-theme .el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.custom-theme .el-date-range-picker{width:646px}.custom-theme .el-date-range-picker.has-sidebar{width:756px}.custom-theme .el-date-range-picker table{table-layout:fixed;width:100%}.custom-theme .el-date-range-picker .el-picker-panel__body{min-width:513px}.custom-theme .el-date-range-picker .el-picker-panel__content{margin:0}.custom-theme .el-date-range-picker__header{position:relative;text-align:center;height:28px}.custom-theme .el-date-range-picker__header [class*=arrow-left]{float:left}.custom-theme .el-date-range-picker__header [class*=arrow-right]{float:right}.custom-theme .el-date-range-picker__header div{font-size:16px;font-weight:500;margin-right:50px}.custom-theme .el-date-range-picker__content{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:16px}.custom-theme .el-date-range-picker__content.is-left{border-right:1px solid #e4e4e4}.custom-theme .el-date-range-picker__content.is-right .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.custom-theme .el-date-range-picker__editors-wrap{-webkit-box-sizing:border-box;box-sizing:border-box;display:table-cell}.custom-theme .el-date-range-picker__editors-wrap.is-right{text-align:right}.custom-theme .el-date-range-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-date-range-picker__time-header>.el-icon-arrow-right{font-size:20px;vertical-align:middle;display:table-cell;color:#2d2f33}.custom-theme .el-date-range-picker__time-picker-wrap{position:relative;display:table-cell;padding:0 5px}.custom-theme .el-date-range-picker__time-picker-wrap .el-picker-panel{position:absolute;top:13px;right:0;z-index:1;background:#fff}.custom-theme .el-time-range-picker{width:354px;overflow:visible}.custom-theme .el-time-range-picker__content{position:relative;text-align:center;padding:10px}.custom-theme .el-time-range-picker__cell{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:4px 7px 7px;width:50%;display:inline-block}.custom-theme .el-time-range-picker__header{margin-bottom:5px;text-align:center;font-size:14px}.custom-theme .el-time-range-picker__body{border-radius:2px;border:1px solid #dfe4ed}.custom-theme .el-time-panel{margin:5px 0;border:solid 1px #dfe4ed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:2px;position:absolute;width:180px;left:0;z-index:1000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-time-panel__content{font-size:0;position:relative;overflow:hidden}.custom-theme .el-time-panel__content::after,.custom-theme .el-time-panel__content::before{content:"";top:50%;position:absolute;margin-top:-15px;height:32px;z-index:-1;left:0;right:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;text-align:left;border-top:1px solid #dfe4ed;border-bottom:1px solid #dfe4ed}.custom-theme .el-time-panel__content::after{left:50%;margin-left:12%;margin-right:12%}.custom-theme .el-time-panel__content::before{padding-left:50%;margin-right:12%;margin-left:12%}.custom-theme .el-time-panel__content.has-seconds::after{left:calc(100% / 3 * 2)}.custom-theme .el-time-panel__content.has-seconds::before{padding-left:calc(100% / 3)}.custom-theme .el-time-panel__footer{border-top:1px solid #e4e4e4;padding:4px;height:36px;line-height:25px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-time-panel__btn{border:none;line-height:28px;padding:0 5px;margin:0 5px;cursor:pointer;background-color:transparent;outline:0;font-size:12px;color:#2d2f33}.custom-theme .el-time-panel__btn.confirm{font-weight:800;color:#262729}.custom-theme .el-time-panel .popper__arrow{-webkit-transform:translateX(-400%);transform:translateX(-400%)}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-scrollbar{overflow:hidden;position:relative}.custom-theme .el-scrollbar:active>.el-scrollbar__bar,.custom-theme .el-scrollbar:focus>.el-scrollbar__bar,.custom-theme .el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.custom-theme .el-scrollbar__wrap{overflow:scroll;height:100%}.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.custom-theme .el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(135,141,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.custom-theme .el-scrollbar__thumb:hover{background-color:rgba(135,141,153,.5)}.custom-theme .el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.custom-theme .el-scrollbar__bar.is-vertical{width:6px;top:2px}.custom-theme .el-scrollbar__bar.is-vertical>div{width:100%}.custom-theme .el-scrollbar__bar.is-horizontal{height:6px;left:2px}.custom-theme .el-scrollbar__bar.is-horizontal>div{height:100%}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:" ";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .fade-in-linear-enter-active,.custom-theme .fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .fade-in-linear-enter,.custom-theme .fade-in-linear-leave,.custom-theme .fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-linear-enter-active,.custom-theme .el-fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .el-fade-in-linear-enter,.custom-theme .el-fade-in-linear-leave,.custom-theme .el-fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-enter-active,.custom-theme .el-fade-in-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-fade-in-enter,.custom-theme .el-fade-in-leave-active{opacity:0}.custom-theme .el-zoom-in-center-enter-active,.custom-theme .el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-zoom-in-center-enter,.custom-theme .el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.custom-theme .el-zoom-in-top-enter-active,.custom-theme .el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center top;transform-origin:center top}.custom-theme .el-zoom-in-top-enter,.custom-theme .el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-bottom-enter-active,.custom-theme .el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center bottom;transform-origin:center bottom}.custom-theme .el-zoom-in-bottom-enter,.custom-theme .el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-left-enter-active,.custom-theme .el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:top left;transform-origin:top left}.custom-theme .el-zoom-in-left-enter,.custom-theme .el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.custom-theme .collapse-transition{-webkit-transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out;transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out}.custom-theme .horizontal-collapse-transition{-webkit-transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out;transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out}.custom-theme .el-list-enter-active,.custom-theme .el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.custom-theme .el-list-enter,.custom-theme .el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.custom-theme .el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-date-editor{position:relative;display:inline-block;text-align:left}.custom-theme .el-date-editor.el-input,.custom-theme .el-date-editor.el-input__inner{width:220px}.custom-theme .el-date-editor--daterange.el-input,.custom-theme .el-date-editor--daterange.el-input__inner,.custom-theme .el-date-editor--timerange.el-input,.custom-theme .el-date-editor--timerange.el-input__inner{width:350px}.custom-theme .el-date-editor--datetimerange.el-input,.custom-theme .el-date-editor--datetimerange.el-input__inner{width:400px}.custom-theme .el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#b4bccc;float:left;line-height:32px}.custom-theme .el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;display:inline-block;height:100%;margin:0;padding:0;width:39%;text-align:center;font-size:14px;color:#5a5e66}.custom-theme .el-date-editor .el-range-input::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input::placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-separator{display:inline-block;height:100%;padding:0 5px;margin:0;text-align:center;line-height:32px;font-size:14px;width:5%;color:#2d2f33}.custom-theme .el-date-editor .el-range__close-icon{font-size:14px;color:#b4bccc;width:25px;display:inline-block;float:right;line-height:32px}.custom-theme .el-range-editor.el-input__inner{padding:3px 10px}.custom-theme .el-range-editor.is-active{border-color:#262729}.custom-theme .el-range-editor.is-active:hover{border-color:#262729}.custom-theme .el-range-editor--medium.el-input__inner{height:36px}.custom-theme .el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.custom-theme .el-range-editor--medium .el-range-input{font-size:14px}.custom-theme .el-range-editor--medium .el-range__close-icon,.custom-theme .el-range-editor--medium .el-range__icon{line-height:28px}.custom-theme .el-range-editor--small.el-input__inner{height:32px}.custom-theme .el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.custom-theme .el-range-editor--small .el-range-input{font-size:13px}.custom-theme .el-range-editor--small .el-range__close-icon,.custom-theme .el-range-editor--small .el-range__icon{line-height:24px}.custom-theme .el-range-editor--mini.el-input__inner{height:28px}.custom-theme .el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.custom-theme .el-range-editor--mini .el-range-input{font-size:12px}.custom-theme .el-range-editor--mini .el-range__close-icon,.custom-theme .el-range-editor--mini .el-range__icon{line-height:20px}.custom-theme .el-range-editor.is-disabled{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-range-editor.is-disabled:focus,.custom-theme .el-range-editor.is-disabled:hover{border-color:#dfe4ed}.custom-theme .el-range-editor.is-disabled input{background-color:#f5f7fa;color:#b4bccc;cursor:not-allowed}.custom-theme .el-range-editor.is-disabled input::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input::placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled .el-range-separator{color:#b4bccc}.custom-theme .el-picker-panel{color:#5a5e66;border:1px solid #dfe4ed;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);background:#fff;border-radius:4px;line-height:30px;margin:5px 0}.custom-theme .el-picker-panel__body-wrapper::after,.custom-theme .el-picker-panel__body::after{content:"";display:table;clear:both}.custom-theme .el-picker-panel__content{position:relative;margin:15px}.custom-theme .el-picker-panel__footer{border-top:1px solid #e4e4e4;padding:4px;text-align:right;background-color:#fff;position:relative;font-size:0}.custom-theme .el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:#5a5e66;padding-left:12px;text-align:left;outline:0;cursor:pointer}.custom-theme .el-picker-panel__shortcut:hover{color:#262729}.custom-theme .el-picker-panel__shortcut.active{background-color:#e6f1fe;color:#262729}.custom-theme .el-picker-panel__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.custom-theme .el-picker-panel__btn[disabled]{color:#ccc;cursor:not-allowed}.custom-theme .el-picker-panel__icon-btn{font-size:12px;color:#2d2f33;border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.custom-theme .el-picker-panel__icon-btn:hover{color:#262729}.custom-theme .el-picker-panel__icon-btn.is-disabled{color:#bbb}.custom-theme .el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.custom-theme .el-picker-panel__link-btn{vertical-align:middle}.custom-theme .el-picker-panel .popper__arrow{-webkit-transform:translateX(-400%);transform:translateX(-400%)}.custom-theme .el-picker-panel [slot=sidebar],.custom-theme .el-picker-panel__sidebar{position:absolute;top:0;bottom:0;width:110px;border-right:1px solid #e4e4e4;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;background-color:#fff;overflow:auto}.custom-theme .el-picker-panel [slot=sidebar]+.el-picker-panel__body,.custom-theme .el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.custom-theme .el-date-picker{width:322px}.custom-theme .el-date-picker.has-sidebar.has-time{width:434px}.custom-theme .el-date-picker.has-sidebar{width:438px}.custom-theme .el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.custom-theme .el-date-picker .el-picker-panel__content{width:292px}.custom-theme .el-date-picker table{table-layout:fixed;width:100%}.custom-theme .el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.custom-theme .el-date-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-date-picker__header{margin:12px;text-align:center}.custom-theme .el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:solid 1px #e6ebf5}.custom-theme .el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.custom-theme .el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:#5a5e66}.custom-theme .el-date-picker__header-label:hover{color:#262729}.custom-theme .el-date-picker__header-label.active{color:#262729}.custom-theme .el-date-picker__prev-btn{float:left}.custom-theme .el-date-picker__next-btn{float:right}.custom-theme .el-date-picker__time-wrap{padding:10px;text-align:center}.custom-theme .el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.custom-theme .el-scrollbar{overflow:hidden;position:relative}.custom-theme .el-scrollbar:active>.el-scrollbar__bar,.custom-theme .el-scrollbar:focus>.el-scrollbar__bar,.custom-theme .el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.custom-theme .el-scrollbar__wrap{overflow:scroll;height:100%}.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.custom-theme .el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(135,141,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.custom-theme .el-scrollbar__thumb:hover{background-color:rgba(135,141,153,.5)}.custom-theme .el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.custom-theme .el-scrollbar__bar.is-vertical{width:6px;top:2px}.custom-theme .el-scrollbar__bar.is-vertical>div{width:100%}.custom-theme .el-scrollbar__bar.is-horizontal{height:6px;left:2px}.custom-theme .el-scrollbar__bar.is-horizontal>div{height:100%}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:" ";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .time-select{margin:5px 0;min-width:0}.custom-theme .time-select .el-picker-panel__content{max-height:200px;margin:0}.custom-theme .time-select-item{padding:8px 10px;font-size:14px;line-height:20px}.custom-theme .time-select-item.selected:not(.disabled){color:#262729;font-weight:700}.custom-theme .time-select-item.disabled{color:#dfe4ed;cursor:not-allowed}.custom-theme .time-select-item:hover{background-color:#f5f7fa;font-weight:700;cursor:pointer}.custom-theme .fade-in-linear-enter-active,.custom-theme .fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .fade-in-linear-enter,.custom-theme .fade-in-linear-leave,.custom-theme .fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-linear-enter-active,.custom-theme .el-fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .el-fade-in-linear-enter,.custom-theme .el-fade-in-linear-leave,.custom-theme .el-fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-enter-active,.custom-theme .el-fade-in-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-fade-in-enter,.custom-theme .el-fade-in-leave-active{opacity:0}.custom-theme .el-zoom-in-center-enter-active,.custom-theme .el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-zoom-in-center-enter,.custom-theme .el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.custom-theme .el-zoom-in-top-enter-active,.custom-theme .el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center top;transform-origin:center top}.custom-theme .el-zoom-in-top-enter,.custom-theme .el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-bottom-enter-active,.custom-theme .el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center bottom;transform-origin:center bottom}.custom-theme .el-zoom-in-bottom-enter,.custom-theme .el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-left-enter-active,.custom-theme .el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:top left;transform-origin:top left}.custom-theme .el-zoom-in-left-enter,.custom-theme .el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.custom-theme .collapse-transition{-webkit-transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out;transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out}.custom-theme .horizontal-collapse-transition{-webkit-transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out;transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out}.custom-theme .el-list-enter-active,.custom-theme .el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.custom-theme .el-list-enter,.custom-theme .el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.custom-theme .el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-date-editor{position:relative;display:inline-block;text-align:left}.custom-theme .el-date-editor.el-input,.custom-theme .el-date-editor.el-input__inner{width:220px}.custom-theme .el-date-editor--daterange.el-input,.custom-theme .el-date-editor--daterange.el-input__inner,.custom-theme .el-date-editor--timerange.el-input,.custom-theme .el-date-editor--timerange.el-input__inner{width:350px}.custom-theme .el-date-editor--datetimerange.el-input,.custom-theme .el-date-editor--datetimerange.el-input__inner{width:400px}.custom-theme .el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#b4bccc;float:left;line-height:32px}.custom-theme .el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;display:inline-block;height:100%;margin:0;padding:0;width:39%;text-align:center;font-size:14px;color:#5a5e66}.custom-theme .el-date-editor .el-range-input::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input::placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-separator{display:inline-block;height:100%;padding:0 5px;margin:0;text-align:center;line-height:32px;font-size:14px;width:5%;color:#2d2f33}.custom-theme .el-date-editor .el-range__close-icon{font-size:14px;color:#b4bccc;width:25px;display:inline-block;float:right;line-height:32px}.custom-theme .el-range-editor.el-input__inner{padding:3px 10px}.custom-theme .el-range-editor.is-active{border-color:#262729}.custom-theme .el-range-editor.is-active:hover{border-color:#262729}.custom-theme .el-range-editor--medium.el-input__inner{height:36px}.custom-theme .el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.custom-theme .el-range-editor--medium .el-range-input{font-size:14px}.custom-theme .el-range-editor--medium .el-range__close-icon,.custom-theme .el-range-editor--medium .el-range__icon{line-height:28px}.custom-theme .el-range-editor--small.el-input__inner{height:32px}.custom-theme .el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.custom-theme .el-range-editor--small .el-range-input{font-size:13px}.custom-theme .el-range-editor--small .el-range__close-icon,.custom-theme .el-range-editor--small .el-range__icon{line-height:24px}.custom-theme .el-range-editor--mini.el-input__inner{height:28px}.custom-theme .el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.custom-theme .el-range-editor--mini .el-range-input{font-size:12px}.custom-theme .el-range-editor--mini .el-range__close-icon,.custom-theme .el-range-editor--mini .el-range__icon{line-height:20px}.custom-theme .el-range-editor.is-disabled{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-range-editor.is-disabled:focus,.custom-theme .el-range-editor.is-disabled:hover{border-color:#dfe4ed}.custom-theme .el-range-editor.is-disabled input{background-color:#f5f7fa;color:#b4bccc;cursor:not-allowed}.custom-theme .el-range-editor.is-disabled input::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input::placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled .el-range-separator{color:#b4bccc}.custom-theme .el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.custom-theme .el-time-spinner.has-seconds .el-time-spinner__wrapper:nth-child(2){margin-left:1%}.custom-theme .el-time-spinner__wrapper{max-height:190px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.custom-theme .el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.custom-theme .el-time-spinner__wrapper.is-arrow{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden}.custom-theme .el-time-spinner__wrapper.is-arrow .el-time-spinner__list{-webkit-transform:translateY(-32px);transform:translateY(-32px)}.custom-theme .el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active){background:#fff;cursor:default}.custom-theme .el-time-spinner__arrow{font-size:12px;color:#878d99;position:absolute;left:0;width:100%;z-index:1;text-align:center;height:30px;line-height:30px;cursor:pointer}.custom-theme .el-time-spinner__arrow:hover{color:#262729}.custom-theme .el-time-spinner__arrow.el-icon-arrow-up{top:10px}.custom-theme .el-time-spinner__arrow.el-icon-arrow-down{bottom:10px}.custom-theme .el-time-spinner__input.el-input{width:70%}.custom-theme .el-time-spinner__input.el-input .el-input__inner{padding:0;text-align:center}.custom-theme .el-time-spinner__list{padding:0;margin:0;list-style:none;text-align:center}.custom-theme .el-time-spinner__list::after,.custom-theme .el-time-spinner__list::before{content:'';display:block;width:100%;height:80px}.custom-theme .el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:#5a5e66}.custom-theme .el-time-spinner__item:hover:not(.disabled):not(.active){background:#f5f7fa;cursor:pointer}.custom-theme .el-time-spinner__item.active:not(.disabled){color:#2d2f33;font-weight:700}.custom-theme .el-time-spinner__item.disabled{color:#b4bccc;cursor:not-allowed}.custom-theme .el-time-panel{margin:5px 0;border:solid 1px #dfe4ed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:2px;position:absolute;width:180px;left:0;z-index:1000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-time-panel__content{font-size:0;position:relative;overflow:hidden}.custom-theme .el-time-panel__content::after,.custom-theme .el-time-panel__content::before{content:"";top:50%;position:absolute;margin-top:-15px;height:32px;z-index:-1;left:0;right:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;text-align:left;border-top:1px solid #dfe4ed;border-bottom:1px solid #dfe4ed}.custom-theme .el-time-panel__content::after{left:50%;margin-left:12%;margin-right:12%}.custom-theme .el-time-panel__content::before{padding-left:50%;margin-right:12%;margin-left:12%}.custom-theme .el-time-panel__content.has-seconds::after{left:calc(100% / 3 * 2)}.custom-theme .el-time-panel__content.has-seconds::before{padding-left:calc(100% / 3)}.custom-theme .el-time-panel__footer{border-top:1px solid #e4e4e4;padding:4px;height:36px;line-height:25px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-time-panel__btn{border:none;line-height:28px;padding:0 5px;margin:0 5px;cursor:pointer;background-color:transparent;outline:0;font-size:12px;color:#2d2f33}.custom-theme .el-time-panel__btn.confirm{font-weight:800;color:#262729}.custom-theme .el-time-panel .popper__arrow{-webkit-transform:translateX(-400%);transform:translateX(-400%)}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-scrollbar{overflow:hidden;position:relative}.custom-theme .el-scrollbar:active>.el-scrollbar__bar,.custom-theme .el-scrollbar:focus>.el-scrollbar__bar,.custom-theme .el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.custom-theme .el-scrollbar__wrap{overflow:scroll;height:100%}.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.custom-theme .el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(135,141,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.custom-theme .el-scrollbar__thumb:hover{background-color:rgba(135,141,153,.5)}.custom-theme .el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.custom-theme .el-scrollbar__bar.is-vertical{width:6px;top:2px}.custom-theme .el-scrollbar__bar.is-vertical>div{width:100%}.custom-theme .el-scrollbar__bar.is-horizontal{height:6px;left:2px}.custom-theme .el-scrollbar__bar.is-horizontal>div{height:100%}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:" ";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:" ";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .el-popover{position:absolute;background:#fff;min-width:150px;border-radius:4px;border:1px solid #e6ebf5;padding:12px;z-index:2000;color:#5a5e66;line-height:1.4;text-align:justify;word-break:break-all;font-size:14px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.custom-theme .el-popover--plain{padding:18px 20px}.custom-theme .el-popover__title{color:#2d2f33;font-size:16px;line-height:1;margin-bottom:12px}.custom-theme .el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:12px;line-height:1.2}.custom-theme .el-tooltip__popper .popper__arrow,.custom-theme .el-tooltip__popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-tooltip__popper .popper__arrow{border-width:6px}.custom-theme .el-tooltip__popper .popper__arrow::after{content:" ";border-width:5px}.custom-theme .el-tooltip__popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-tooltip__popper[x-placement^=top] .popper__arrow{bottom:-6px;border-top-color:#2d2f33;border-bottom-width:0}.custom-theme .el-tooltip__popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-5px;border-top-color:#2d2f33;border-bottom-width:0}.custom-theme .el-tooltip__popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-tooltip__popper[x-placement^=bottom] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#2d2f33}.custom-theme .el-tooltip__popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#2d2f33}.custom-theme .el-tooltip__popper[x-placement^=right]{margin-left:12px}.custom-theme .el-tooltip__popper[x-placement^=right] .popper__arrow{left:-6px;border-right-color:#2d2f33;border-left-width:0}.custom-theme .el-tooltip__popper[x-placement^=right] .popper__arrow::after{bottom:-5px;left:1px;border-right-color:#2d2f33;border-left-width:0}.custom-theme .el-tooltip__popper[x-placement^=left]{margin-right:12px}.custom-theme .el-tooltip__popper[x-placement^=left] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#2d2f33}.custom-theme .el-tooltip__popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#2d2f33}.custom-theme .el-tooltip__popper.is-dark{background:#2d2f33;color:#fff}.custom-theme .el-tooltip__popper.is-light{background:#fff;border:1px solid #2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=top] .popper__arrow{border-top-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=top] .popper__arrow::after{border-top-color:#fff}.custom-theme .el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow{border-bottom-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow::after{border-bottom-color:#fff}.custom-theme .el-tooltip__popper.is-light[x-placement^=left] .popper__arrow{border-left-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=left] .popper__arrow::after{border-left-color:#fff}.custom-theme .el-tooltip__popper.is-light[x-placement^=right] .popper__arrow{border-right-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=right] .popper__arrow::after{border-right-color:#fff}.custom-theme .v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.custom-theme .v-modal-leave{-webkit-animation:v-modal-out .2s ease forwards;animation:v-modal-out .2s ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{100%{opacity:0}}.custom-theme .v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.custom-theme .el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-color:#d8dce5;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button+.el-button{margin-left:10px}.custom-theme .el-button.is-round{padding:12px 20px}.custom-theme .el-button:focus,.custom-theme .el-button:hover{color:#262729;border-color:#bebebf;background-color:#e9e9ea}.custom-theme .el-button:active{color:#222325;border-color:#222325;outline:0}.custom-theme .el-button::-moz-focus-inner{border:0}.custom-theme .el-button [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-button.is-plain:focus,.custom-theme .el-button.is-plain:hover{background:#fff;border-color:#262729;color:#262729}.custom-theme .el-button.is-plain:active{background:#fff;border-color:#222325;color:#222325;outline:0}.custom-theme .el-button.is-active{color:#222325;border-color:#222325}.custom-theme .el-button.is-disabled,.custom-theme .el-button.is-disabled:focus,.custom-theme .el-button.is-disabled:hover{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5}.custom-theme .el-button.is-disabled.el-button--text{background-color:transparent}.custom-theme .el-button.is-disabled.is-plain,.custom-theme .el-button.is-disabled.is-plain:focus,.custom-theme .el-button.is-disabled.is-plain:hover{background-color:#fff;border-color:#e6ebf5;color:#b4bccc}.custom-theme .el-button.is-loading{position:relative;pointer-events:none}.custom-theme .el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.custom-theme .el-button.is-round{border-radius:20px;padding:12px 23px}.custom-theme .el-button--primary{color:#fff;background-color:#262729;border-color:#262729}.custom-theme .el-button--primary:focus,.custom-theme .el-button--primary:hover{background:#515254;border-color:#515254;color:#fff}.custom-theme .el-button--primary:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-active{background:#222325;border-color:#222325;color:#fff}.custom-theme .el-button--primary.is-disabled,.custom-theme .el-button--primary.is-disabled:active,.custom-theme .el-button--primary.is-disabled:focus,.custom-theme .el-button--primary.is-disabled:hover{color:#fff;background-color:#939394;border-color:#939394}.custom-theme .el-button--primary.is-plain{color:#262729;background:#e9e9ea;border-color:#a8a9a9}.custom-theme .el-button--primary.is-plain:focus,.custom-theme .el-button--primary.is-plain:hover{background:#262729;border-color:#262729;color:#fff}.custom-theme .el-button--primary.is-plain:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-plain.is-disabled,.custom-theme .el-button--primary.is-plain.is-disabled:active,.custom-theme .el-button--primary.is-plain.is-disabled:focus,.custom-theme .el-button--primary.is-plain.is-disabled:hover{color:#7d7d7f;background-color:#e9e9ea;border-color:#d4d4d4}.custom-theme .el-button--success{color:#fff;background-color:#409167;border-color:#409167}.custom-theme .el-button--success:focus,.custom-theme .el-button--success:hover{background:#66a785;border-color:#66a785;color:#fff}.custom-theme .el-button--success:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-active{background:#3a835d;border-color:#3a835d;color:#fff}.custom-theme .el-button--success.is-disabled,.custom-theme .el-button--success.is-disabled:active,.custom-theme .el-button--success.is-disabled:focus,.custom-theme .el-button--success.is-disabled:hover{color:#fff;background-color:#a0c8b3;border-color:#a0c8b3}.custom-theme .el-button--success.is-plain{color:#409167;background:#ecf4f0;border-color:#b3d3c2}.custom-theme .el-button--success.is-plain:focus,.custom-theme .el-button--success.is-plain:hover{background:#409167;border-color:#409167;color:#fff}.custom-theme .el-button--success.is-plain:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-plain.is-disabled,.custom-theme .el-button--success.is-plain.is-disabled:active,.custom-theme .el-button--success.is-plain.is-disabled:focus,.custom-theme .el-button--success.is-plain.is-disabled:hover{color:#8cbda4;background-color:#ecf4f0;border-color:#d9e9e1}.custom-theme .el-button--warning{color:#fff;background-color:#9da408;border-color:#9da408}.custom-theme .el-button--warning:focus,.custom-theme .el-button--warning:hover{background:#b1b639;border-color:#b1b639;color:#fff}.custom-theme .el-button--warning:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-active{background:#8d9407;border-color:#8d9407;color:#fff}.custom-theme .el-button--warning.is-disabled,.custom-theme .el-button--warning.is-disabled:active,.custom-theme .el-button--warning.is-disabled:focus,.custom-theme .el-button--warning.is-disabled:hover{color:#fff;background-color:#ced284;border-color:#ced284}.custom-theme .el-button--warning.is-plain{color:#9da408;background:#f5f6e6;border-color:#d8db9c}.custom-theme .el-button--warning.is-plain:focus,.custom-theme .el-button--warning.is-plain:hover{background:#9da408;border-color:#9da408;color:#fff}.custom-theme .el-button--warning.is-plain:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-plain.is-disabled,.custom-theme .el-button--warning.is-plain.is-disabled:active,.custom-theme .el-button--warning.is-plain.is-disabled:focus,.custom-theme .el-button--warning.is-plain.is-disabled:hover{color:#c4c86b;background-color:#f5f6e6;border-color:#ebedce}.custom-theme .el-button--danger{color:#fff;background-color:#b3450e;border-color:#b3450e}.custom-theme .el-button--danger:focus,.custom-theme .el-button--danger:hover{background:#c26a3e;border-color:#c26a3e;color:#fff}.custom-theme .el-button--danger:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-active{background:#a13e0d;border-color:#a13e0d;color:#fff}.custom-theme .el-button--danger.is-disabled,.custom-theme .el-button--danger.is-disabled:active,.custom-theme .el-button--danger.is-disabled:focus,.custom-theme .el-button--danger.is-disabled:hover{color:#fff;background-color:#d9a287;border-color:#d9a287}.custom-theme .el-button--danger.is-plain{color:#b3450e;background:#f7ece7;border-color:#e1b59f}.custom-theme .el-button--danger.is-plain:focus,.custom-theme .el-button--danger.is-plain:hover{background:#b3450e;border-color:#b3450e;color:#fff}.custom-theme .el-button--danger.is-plain:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-plain.is-disabled,.custom-theme .el-button--danger.is-plain.is-disabled:active,.custom-theme .el-button--danger.is-plain.is-disabled:focus,.custom-theme .el-button--danger.is-plain.is-disabled:hover{color:#d18f6e;background-color:#f7ece7;border-color:#f0dacf}.custom-theme .el-button--info{color:#fff;background-color:#0a76a4;border-color:#0a76a4}.custom-theme .el-button--info:focus,.custom-theme .el-button--info:hover{background:#3b91b6;border-color:#3b91b6;color:#fff}.custom-theme .el-button--info:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-active{background:#096a94;border-color:#096a94;color:#fff}.custom-theme .el-button--info.is-disabled,.custom-theme .el-button--info.is-disabled:active,.custom-theme .el-button--info.is-disabled:focus,.custom-theme .el-button--info.is-disabled:hover{color:#fff;background-color:#85bbd2;border-color:#85bbd2}.custom-theme .el-button--info.is-plain{color:#0a76a4;background:#e7f1f6;border-color:#9dc8db}.custom-theme .el-button--info.is-plain:focus,.custom-theme .el-button--info.is-plain:hover{background:#0a76a4;border-color:#0a76a4;color:#fff}.custom-theme .el-button--info.is-plain:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-plain.is-disabled,.custom-theme .el-button--info.is-plain.is-disabled:active,.custom-theme .el-button--info.is-plain.is-disabled:focus,.custom-theme .el-button--info.is-plain.is-disabled:hover{color:#6cadc8;background-color:#e7f1f6;border-color:#cee4ed}.custom-theme .el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button--medium.is-round{padding:10px 20px}.custom-theme .el-button--small{padding:9px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--small.is-round{padding:9px 15px}.custom-theme .el-button--mini{padding:7px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--mini.is-round{padding:7px 15px}.custom-theme .el-button--text{border:none;color:#262729;background:0 0;padding-left:0;padding-right:0}.custom-theme .el-button--text:focus,.custom-theme .el-button--text:hover{color:#515254;border-color:transparent;background-color:transparent}.custom-theme .el-button--text:active{color:#222325;border-color:transparent;background-color:transparent}.custom-theme .el-button-group{display:inline-block;vertical-align:middle}.custom-theme .el-button-group::after,.custom-theme .el-button-group::before{display:table;content:""}.custom-theme .el-button-group::after{clear:both}.custom-theme .el-button-group .el-button{float:left;position:relative}.custom-theme .el-button-group .el-button+.el-button{margin-left:0}.custom-theme .el-button-group .el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-button-group .el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-button-group .el-button:not(:first-child):not(:last-child){border-radius:0}.custom-theme .el-button-group .el-button:not(:last-child){margin-right:-1px}.custom-theme .el-button-group .el-button:active,.custom-theme .el-button-group .el-button:focus,.custom-theme .el-button-group .el-button:hover{z-index:1}.custom-theme .el-button-group .el-button.is-active{z-index:1}.custom-theme .el-button-group .el-button--primary:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-message-box{display:inline-block;width:420px;padding-bottom:10px;vertical-align:middle;background-color:#fff;border-radius:4px;border:1px solid #e6ebf5;font-size:18px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);text-align:left;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.custom-theme .el-message-box__wrapper{position:fixed;top:0;bottom:0;left:0;right:0;text-align:center}.custom-theme .el-message-box__wrapper::after{content:"";display:inline-block;height:100%;width:0;vertical-align:middle}.custom-theme .el-message-box__header{position:relative;padding:15px;padding-bottom:10px}.custom-theme .el-message-box__title{padding-left:0;margin-bottom:0;font-size:18px;line-height:1;color:#2d2f33}.custom-theme .el-message-box__headerbtn{position:absolute;top:15px;right:15px;padding:0;border:none;outline:0;background:0 0;font-size:16px;cursor:pointer}.custom-theme .el-message-box__headerbtn .el-message-box__close{color:#0a76a4}.custom-theme .el-message-box__headerbtn:focus .el-message-box__close,.custom-theme .el-message-box__headerbtn:hover .el-message-box__close{color:#262729}.custom-theme .el-message-box__content{position:relative;padding:10px 15px;color:#5a5e66;font-size:14px}.custom-theme .el-message-box__input{padding-top:15px}.custom-theme .el-message-box__input input.invalid{border-color:#b3450e}.custom-theme .el-message-box__input input.invalid:focus{border-color:#b3450e}.custom-theme .el-message-box__status{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);font-size:24px!important}.custom-theme .el-message-box__status::before{padding-left:1px}.custom-theme .el-message-box__status+.el-message-box__message{padding-left:36px;padding-right:12px}.custom-theme .el-message-box__status.el-icon-success{color:#409167}.custom-theme .el-message-box__status.el-icon-info{color:#0a76a4}.custom-theme .el-message-box__status.el-icon-warning{color:#9da408}.custom-theme .el-message-box__status.el-icon-error{color:#b3450e}.custom-theme .el-message-box__message{margin:0}.custom-theme .el-message-box__message p{margin:0;line-height:24px}.custom-theme .el-message-box__errormsg{color:#b3450e;font-size:12px;min-height:18px;margin-top:2px}.custom-theme .el-message-box__btns{padding:5px 15px 0;text-align:right}.custom-theme .el-message-box__btns button:nth-child(2){margin-left:10px}.custom-theme .el-message-box__btns-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.custom-theme .el-message-box--center{padding-bottom:30px}.custom-theme .el-message-box--center .el-message-box__header{padding-top:30px}.custom-theme .el-message-box--center .el-message-box__title{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.custom-theme .el-message-box--center .el-message-box__status{position:relative;top:auto;padding-right:5px;text-align:center;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.custom-theme .el-message-box--center .el-message-box__message{margin-left:0}.custom-theme .el-message-box--center .el-message-box__btns,.custom-theme .el-message-box--center .el-message-box__content{text-align:center}.custom-theme .el-message-box--center .el-message-box__content{padding-left:27px;padding-right:27px}.custom-theme .msgbox-fade-enter-active{-webkit-animation:msgbox-fade-in .3s;animation:msgbox-fade-in .3s}.custom-theme .msgbox-fade-leave-active{-webkit-animation:msgbox-fade-out .3s;animation:msgbox-fade-out .3s}@-webkit-keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.custom-theme .el-breadcrumb{font-size:14px;line-height:1}.custom-theme .el-breadcrumb::after,.custom-theme .el-breadcrumb::before{display:table;content:""}.custom-theme .el-breadcrumb::after{clear:both}.custom-theme .el-breadcrumb__separator{margin:0 9px;font-weight:700;color:#b4bccc}.custom-theme .el-breadcrumb__separator[class*=icon]{margin:0 6px;font-weight:400}.custom-theme .el-breadcrumb__item{float:left}.custom-theme .el-breadcrumb__inner,.custom-theme .el-breadcrumb__inner a{font-weight:700;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1);color:#2d2f33}.custom-theme .el-breadcrumb__inner a:hover,.custom-theme .el-breadcrumb__inner:hover{color:#262729;cursor:pointer}.custom-theme .el-breadcrumb__item:last-child .el-breadcrumb__inner,.custom-theme .el-breadcrumb__item:last-child .el-breadcrumb__inner a,.custom-theme .el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.custom-theme .el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{font-weight:400;color:#5a5e66;cursor:text}.custom-theme .el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none}.custom-theme .el-form--label-left .el-form-item__label{text-align:left}.custom-theme .el-form--label-top .el-form-item__label{float:none;display:inline-block;text-align:left;padding:0 0 10px 0}.custom-theme .el-form--inline .el-form-item{display:inline-block;margin-right:10px;vertical-align:top}.custom-theme .el-form--inline .el-form-item__label{float:none;display:inline-block}.custom-theme .el-form--inline .el-form-item__content{display:inline-block;vertical-align:top}.custom-theme .el-form--inline.el-form--label-top .el-form-item__content{display:block}.custom-theme .el-form-item{margin-bottom:22px}.custom-theme .el-form-item::after,.custom-theme .el-form-item::before{display:table;content:""}.custom-theme .el-form-item::after{clear:both}.custom-theme .el-form-item .el-form-item{margin-bottom:0}.custom-theme .el-form-item .el-input__validateIcon{display:none}.custom-theme .el-form-item--medium .el-form-item__label{line-height:36px}.custom-theme .el-form-item--medium .el-form-item__content{line-height:36px}.custom-theme .el-form-item--small .el-form-item__label{line-height:32px}.custom-theme .el-form-item--small .el-form-item__content{line-height:32px}.custom-theme .el-form-item--small.el-form-item{margin-bottom:18px}.custom-theme .el-form-item--small .el-form-item__error{padding-top:2px}.custom-theme .el-form-item--mini .el-form-item__label{line-height:28px}.custom-theme .el-form-item--mini .el-form-item__content{line-height:28px}.custom-theme .el-form-item--mini.el-form-item{margin-bottom:18px}.custom-theme .el-form-item--mini .el-form-item__error{padding-top:1px}.custom-theme .el-form-item__label{text-align:right;vertical-align:middle;float:left;font-size:14px;color:#5a5e66;line-height:40px;padding:0 12px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-form-item__content{line-height:40px;position:relative;font-size:14px}.custom-theme .el-form-item__content::after,.custom-theme .el-form-item__content::before{display:table;content:""}.custom-theme .el-form-item__content::after{clear:both}.custom-theme .el-form-item__error{color:#b3450e;font-size:12px;line-height:1;padding-top:4px;position:absolute;top:100%;left:0}.custom-theme .el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.custom-theme .el-form-item.is-required .el-form-item__label:before{content:'*';color:#b3450e;margin-right:4px}.custom-theme .el-form-item.is-error .el-input__inner,.custom-theme .el-form-item.is-error .el-input__inner:focus,.custom-theme .el-form-item.is-error .el-textarea__inner,.custom-theme .el-form-item.is-error .el-textarea__inner:focus{border-color:#b3450e}.custom-theme .el-form-item.is-error .el-input-group__append .el-input__inner,.custom-theme .el-form-item.is-error .el-input-group__prepend .el-input__inner{border-color:transparent}.custom-theme .el-form-item.is-error .el-input__validateIcon{color:#b3450e}.custom-theme .el-form-item.is-success .el-input__inner,.custom-theme .el-form-item.is-success .el-input__inner:focus,.custom-theme .el-form-item.is-success .el-textarea__inner,.custom-theme .el-form-item.is-success .el-textarea__inner:focus{border-color:#409167}.custom-theme .el-form-item.is-success .el-input-group__append .el-input__inner,.custom-theme .el-form-item.is-success .el-input-group__prepend .el-input__inner{border-color:transparent}.custom-theme .el-form-item.is-success .el-input__validateIcon{color:#409167}.custom-theme .el-form-item--feedback .el-input__validateIcon{display:inline-block}.custom-theme .el-tabs__header{padding:0;position:relative;margin:0 0 15px}.custom-theme .el-tabs__active-bar{position:absolute;bottom:0;left:0;height:2px;background-color:#262729;z-index:1;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);list-style:none}.custom-theme .el-tabs__new-tab{float:right;border:1px solid #d3dce6;height:18px;width:18px;line-height:18px;margin:12px 0 9px 10px;border-radius:3px;text-align:center;font-size:12px;color:#d3dce6;cursor:pointer;-webkit-transition:all .15s;transition:all .15s}.custom-theme .el-tabs__new-tab .el-icon-plus{-webkit-transform:scale(.8,.8);transform:scale(.8,.8)}.custom-theme .el-tabs__new-tab:hover{color:#262729}.custom-theme .el-tabs__nav-wrap{overflow:hidden;margin-bottom:-1px;position:relative}.custom-theme .el-tabs__nav-wrap::after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#dfe4ed;z-index:1}.custom-theme .el-tabs__nav-wrap.is-scrollable{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-tabs__nav-scroll{overflow:hidden}.custom-theme .el-tabs__nav-next,.custom-theme .el-tabs__nav-prev{position:absolute;cursor:pointer;line-height:44px;font-size:12px;color:#878d99}.custom-theme .el-tabs__nav-next{right:0}.custom-theme .el-tabs__nav-prev{left:0}.custom-theme .el-tabs__nav{white-space:nowrap;position:relative;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;float:left;z-index:2}.custom-theme .el-tabs__item{padding:0 20px;height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:40px;display:inline-block;list-style:none;font-size:14px;font-weight:500;color:#2d2f33;position:relative}.custom-theme .el-tabs__item:focus,.custom-theme .el-tabs__item:focus:active{outline:0}.custom-theme .el-tabs__item .el-icon-close{border-radius:50%;text-align:center;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);margin-left:5px}.custom-theme .el-tabs__item .el-icon-close:before{-webkit-transform:scale(.9);transform:scale(.9);display:inline-block}.custom-theme .el-tabs__item .el-icon-close:hover{background-color:#b4bccc;color:#fff}.custom-theme .el-tabs__item.is-active{color:#262729}.custom-theme .el-tabs__item:hover{color:#262729;cursor:pointer}.custom-theme .el-tabs__item.is-disabled{color:#b4bccc;cursor:default}.custom-theme .el-tabs__content{overflow:hidden;position:relative}.custom-theme .el-tabs--card>.el-tabs__header{border-bottom:1px solid #dfe4ed}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__nav-wrap::after{content:none}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid #dfe4ed;border-bottom:none;border-radius:4px 4px 0 0}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item .el-icon-close{position:relative;font-size:12px;width:0;height:14px;vertical-align:middle;line-height:15px;overflow:hidden;top:-1px;right:-2px;-webkit-transform-origin:100% 50%;transform-origin:100% 50%}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid #dfe4ed;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .el-icon-close{width:14px}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:#fff}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .el-icon-close{width:14px}.custom-theme .el-tabs--border-card{background:#fff;border:1px solid #d8dce5;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04);box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04)}.custom-theme .el-tabs--border-card>.el-tabs__content{padding:15px}.custom-theme .el-tabs--border-card>.el-tabs__header{background-color:#f5f7fa;border-bottom:1px solid #dfe4ed;margin:0}.custom-theme .el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap::after{content:none}.custom-theme .el-tabs--border-card>.el-tabs__header .el-tabs__item{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);border:1px solid transparent;margin:-1px -1px 0;color:#878d99}.custom-theme .el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:#262729;background-color:#fff;border-right-color:#d8dce5;border-left-color:#d8dce5}.custom-theme .el-tabs--border-card>.el-tabs__header .el-tabs__item:hover{color:#262729}.custom-theme .el-tabs--bottom:not(.el-tabs--border-card):not(.el-tabs--card) .el-tabs__item:nth-child(2),.custom-theme .el-tabs--top:not(.el-tabs--border-card):not(.el-tabs--card) .el-tabs__item:nth-child(2){padding-left:0}.custom-theme .el-tabs--bottom .el-tabs__header{margin-bottom:0;margin-top:10px}.custom-theme .el-tabs--bottom.el-tabs--border-card .el-tabs__header{border-bottom:0;border-top:1px solid #d8dce5}.custom-theme .el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap{margin-top:-1px;margin-bottom:0}.custom-theme .el-tabs--bottom.el-tabs--border-card .el-tabs__item{border:1px solid transparent;margin:0 -1px -1px -1px}.custom-theme .el-tabs--left,.custom-theme .el-tabs--right{overflow:hidden}.custom-theme .el-tabs--left .el-tabs__header,.custom-theme .el-tabs--left .el-tabs__nav-scroll,.custom-theme .el-tabs--left .el-tabs__nav-wrap,.custom-theme .el-tabs--right .el-tabs__header,.custom-theme .el-tabs--right .el-tabs__nav-scroll,.custom-theme .el-tabs--right .el-tabs__nav-wrap{height:100%}.custom-theme .el-tabs--left .el-tabs__active-bar,.custom-theme .el-tabs--right .el-tabs__active-bar{top:0;bottom:auto;width:2px;height:auto}.custom-theme .el-tabs--left .el-tabs__nav-wrap,.custom-theme .el-tabs--right .el-tabs__nav-wrap{margin-bottom:0}.custom-theme .el-tabs--left .el-tabs__nav-wrap.is-scrollable,.custom-theme .el-tabs--right .el-tabs__nav-wrap.is-scrollable{padding:30px 0}.custom-theme .el-tabs--left .el-tabs__nav-wrap::after,.custom-theme .el-tabs--right .el-tabs__nav-wrap::after{height:100%;width:2px;bottom:auto;top:0}.custom-theme .el-tabs--left .el-tabs__nav,.custom-theme .el-tabs--right .el-tabs__nav{float:none}.custom-theme .el-tabs--left .el-tabs__item,.custom-theme .el-tabs--right .el-tabs__item{display:block}.custom-theme .el-tabs--left .el-tabs__nav-next,.custom-theme .el-tabs--left .el-tabs__nav-prev,.custom-theme .el-tabs--right .el-tabs__nav-next,.custom-theme .el-tabs--right .el-tabs__nav-prev{height:30px;line-height:30px;width:100%;text-align:center;cursor:pointer}.custom-theme .el-tabs--left .el-tabs__nav-next i,.custom-theme .el-tabs--left .el-tabs__nav-prev i,.custom-theme .el-tabs--right .el-tabs__nav-next i,.custom-theme .el-tabs--right .el-tabs__nav-prev i{-webkit-transform:rotateZ(90deg);transform:rotateZ(90deg)}.custom-theme .el-tabs--left .el-tabs__nav-prev,.custom-theme .el-tabs--right .el-tabs__nav-prev{left:auto;top:0}.custom-theme .el-tabs--left .el-tabs__nav-next,.custom-theme .el-tabs--right .el-tabs__nav-next{right:auto;bottom:0}.custom-theme .el-tabs--left .el-tabs__header{float:left;margin-bottom:0;margin-right:10px}.custom-theme .el-tabs--left .el-tabs__nav-wrap{margin-right:-1px}.custom-theme .el-tabs--left .el-tabs__nav-wrap::after{left:auto;right:0}.custom-theme .el-tabs--left .el-tabs__active-bar{right:0;left:auto}.custom-theme .el-tabs--left .el-tabs__item{text-align:right}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__active-bar{display:none}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__item{border-left:none;border-right:1px solid #dfe4ed;border-bottom:none;border-top:1px solid #dfe4ed}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__item:first-child{border-right:1px solid #dfe4ed;border-top:none}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__item.is-active{border:1px solid #dfe4ed;border-right-color:#fff;border-left:none;border-bottom:none}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__item.is-active:first-child{border-top:none}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__item.is-active:last-child{border-bottom:none}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__nav{border-radius:4px 0 0 4px;border-bottom:1px solid #dfe4ed;border-right:none}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.custom-theme .el-tabs--left.el-tabs--border-card .el-tabs__header{border-right:1px solid #dfe4ed}.custom-theme .el-tabs--left.el-tabs--border-card .el-tabs__item{border:1px solid transparent;margin:-1px 0 -1px -1px}.custom-theme .el-tabs--left.el-tabs--border-card .el-tabs__item.is-active{border-color:transparent;border-top-color:#d1dbe5;border-bottom-color:#d1dbe5}.custom-theme .el-tabs--right .el-tabs__header{float:right;margin-bottom:0;margin-left:10px}.custom-theme .el-tabs--right .el-tabs__nav-wrap{margin-left:-1px}.custom-theme .el-tabs--right .el-tabs__nav-wrap::after{left:0;right:auto}.custom-theme .el-tabs--right .el-tabs__active-bar{left:0}.custom-theme .el-tabs--right.el-tabs--card .el-tabs__active-bar{display:none}.custom-theme .el-tabs--right.el-tabs--card .el-tabs__item{border-bottom:none;border-top:1px solid #dfe4ed}.custom-theme .el-tabs--right.el-tabs--card .el-tabs__item:first-child{border-left:1px solid #dfe4ed;border-top:none}.custom-theme .el-tabs--right.el-tabs--card .el-tabs__item.is-active{border:1px solid #dfe4ed;border-left-color:#fff;border-right:none;border-bottom:none}.custom-theme .el-tabs--right.el-tabs--card .el-tabs__item.is-active:first-child{border-top:none}.custom-theme .el-tabs--right.el-tabs--card .el-tabs__item.is-active:last-child{border-bottom:none}.custom-theme .el-tabs--right.el-tabs--card .el-tabs__nav{border-radius:0 4px 4px 0;border-bottom:1px solid #dfe4ed;border-left:none}.custom-theme .el-tabs--right.el-tabs--border-card .el-tabs__header{border-left:1px solid #dfe4ed}.custom-theme .el-tabs--right.el-tabs--border-card .el-tabs__item{border:1px solid transparent;margin:-1px -1px -1px 0}.custom-theme .el-tabs--right.el-tabs--border-card .el-tabs__item.is-active{border-color:transparent;border-top-color:#d1dbe5;border-bottom-color:#d1dbe5}.custom-theme .slideInLeft-transition,.custom-theme .slideInRight-transition{display:inline-block}.custom-theme .slideInRight-enter{-webkit-animation:slideInRight-enter .3s;animation:slideInRight-enter .3s}.custom-theme .slideInRight-leave{position:absolute;left:0;right:0;-webkit-animation:slideInRight-leave .3s;animation:slideInRight-leave .3s}.custom-theme .slideInLeft-enter{-webkit-animation:slideInLeft-enter .3s;animation:slideInLeft-enter .3s}.custom-theme .slideInLeft-leave{position:absolute;left:0;right:0;-webkit-animation:slideInLeft-leave .3s;animation:slideInLeft-leave .3s}@-webkit-keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@-webkit-keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}.custom-theme .el-tag{background-color:rgba(38,39,41,.1);display:inline-block;padding:0 10px;height:32px;line-height:30px;font-size:12px;color:#262729;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid rgba(38,39,41,.2);white-space:nowrap}.custom-theme .el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:18px;width:18px;line-height:18px;vertical-align:middle;top:-1px;right:-5px;color:#262729}.custom-theme .el-tag .el-icon-close::before{display:block}.custom-theme .el-tag .el-icon-close:hover{background-color:#262729;color:#fff}.custom-theme .el-tag--info{background-color:rgba(10,118,164,.1);border-color:rgba(10,118,164,.2);color:#0a76a4}.custom-theme .el-tag--info.is-hit{border-color:#0a76a4}.custom-theme .el-tag--info .el-tag__close{color:#0a76a4}.custom-theme .el-tag--info .el-tag__close:hover{background-color:#0a76a4;color:#fff}.custom-theme .el-tag--success{background-color:rgba(64,145,103,.1);border-color:rgba(64,145,103,.2);color:#409167}.custom-theme .el-tag--success.is-hit{border-color:#409167}.custom-theme .el-tag--success .el-tag__close{color:#409167}.custom-theme .el-tag--success .el-tag__close:hover{background-color:#409167;color:#fff}.custom-theme .el-tag--warning{background-color:rgba(157,164,8,.1);border-color:rgba(157,164,8,.2);color:#9da408}.custom-theme .el-tag--warning.is-hit{border-color:#9da408}.custom-theme .el-tag--warning .el-tag__close{color:#9da408}.custom-theme .el-tag--warning .el-tag__close:hover{background-color:#9da408;color:#fff}.custom-theme .el-tag--danger{background-color:rgba(179,69,14,.1);border-color:rgba(179,69,14,.2);color:#b3450e}.custom-theme .el-tag--danger.is-hit{border-color:#b3450e}.custom-theme .el-tag--danger .el-tag__close{color:#b3450e}.custom-theme .el-tag--danger .el-tag__close:hover{background-color:#b3450e;color:#fff}.custom-theme .el-tag--medium{height:28px;line-height:26px}.custom-theme .el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--small{height:24px;padding:0 8px;line-height:22px}.custom-theme .el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--mini{height:20px;padding:0 5px;line-height:19px}.custom-theme .el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.custom-theme .el-tree{cursor:default;background:#fff;color:#5a5e66}.custom-theme .el-tree__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.custom-theme .el-tree__empty-text{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:#623615}.custom-theme .el-tree-node{white-space:nowrap}.custom-theme .el-tree-node__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:26px;cursor:pointer}.custom-theme .el-tree-node__content>.el-tree-node__expand-icon{padding:6px}.custom-theme .el-tree-node__content>.el-checkbox{margin-right:8px}.custom-theme .el-tree-node__content:hover{background-color:#f5f7fa}.custom-theme .el-tree-node__expand-icon{cursor:pointer;color:#b4bccc;font-size:12px;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}.custom-theme .el-tree-node__expand-icon.expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.custom-theme .el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default}.custom-theme .el-tree-node__label{font-size:14px}.custom-theme .el-tree-node__loading-icon{margin-right:8px;font-size:14px;color:#b4bccc}.custom-theme .el-tree-node>.el-tree-node__children{overflow:hidden;background-color:transparent}.custom-theme .el-tree-node.is-expanded>.el-tree-node__children{display:block}.custom-theme .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:#eee}.custom-theme .el-alert{width:100%;padding:8px 16px;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;position:relative;background-color:#fff;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}.custom-theme .el-alert.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.custom-theme .el-alert--success{background-color:#ecf4f0;color:#409167}.custom-theme .el-alert--success .el-alert__description{color:#409167}.custom-theme .el-alert--info{background-color:#e7f1f6;color:#0a76a4}.custom-theme .el-alert--info .el-alert__description{color:#0a76a4}.custom-theme .el-alert--warning{background-color:#f5f6e6;color:#9da408}.custom-theme .el-alert--warning .el-alert__description{color:#9da408}.custom-theme .el-alert--error{background-color:#f7ece7;color:#b3450e}.custom-theme .el-alert--error .el-alert__description{color:#b3450e}.custom-theme .el-alert__content{display:table-cell;padding:0 8px}.custom-theme .el-alert__icon{font-size:16px;width:16px}.custom-theme .el-alert__icon.is-big{font-size:28px;width:28px}.custom-theme .el-alert__title{font-size:13px;line-height:18px}.custom-theme .el-alert__title.is-bold{font-weight:700}.custom-theme .el-alert .el-alert__description{font-size:12px;margin:5px 0 0 0}.custom-theme .el-alert__closebtn{font-size:12px;color:#b4bccc;opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.custom-theme .el-alert__closebtn.is-customed{font-style:normal;font-size:13px;top:9px}.custom-theme .el-alert-fade-enter,.custom-theme .el-alert-fade-leave-active{opacity:0}.custom-theme .el-notification{display:-webkit-box;display:-ms-flexbox;display:flex;width:330px;padding:14px 26px 14px 13px;border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #e6ebf5;position:fixed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;overflow:hidden}.custom-theme .el-notification.right{right:16px}.custom-theme .el-notification.left{left:16px}.custom-theme .el-notification__group{margin-left:13px}.custom-theme .el-notification__title{font-weight:700;font-size:16px;color:#2d2f33;margin:0}.custom-theme .el-notification__content{font-size:14px;line-height:21px;margin:6px 0 0 0;color:#5a5e66;text-align:justify}.custom-theme .el-notification__content p{margin:0}.custom-theme .el-notification__icon{height:24px;width:24px;font-size:24px;-webkit-transform:translateY(4px);transform:translateY(4px)}.custom-theme .el-notification__closeBtn{position:absolute;top:15px;right:15px;cursor:pointer;color:#878d99;font-size:16px}.custom-theme .el-notification__closeBtn:hover{color:#5a5e66}.custom-theme .el-notification .el-icon-success{color:#409167}.custom-theme .el-notification .el-icon-error{color:#b3450e}.custom-theme .el-notification .el-icon-info{color:#0a76a4}.custom-theme .el-notification .el-icon-warning{color:#9da408}.custom-theme .el-notification-fade-enter.right{right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.custom-theme .el-notification-fade-enter.left{left:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.custom-theme .el-notification-fade-leave-active{opacity:0}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-input-number{position:relative;display:inline-block;width:180px;line-height:38px}.custom-theme .el-input-number .el-input{display:block}.custom-theme .el-input-number .el-input__inner{-webkit-appearance:none;padding-left:50px;padding-right:50px;text-align:center}.custom-theme .el-input-number__decrease,.custom-theme .el-input-number__increase{position:absolute;z-index:1;top:1px;width:40px;height:auto;text-align:center;background:#f5f7fa;color:#5a5e66;cursor:pointer;font-size:13px}.custom-theme .el-input-number__decrease:hover,.custom-theme .el-input-number__increase:hover{color:#262729}.custom-theme .el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled),.custom-theme .el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled){border-color:#262729}.custom-theme .el-input-number__decrease.is-disabled,.custom-theme .el-input-number__increase.is-disabled{color:#b4bccc;cursor:not-allowed}.custom-theme .el-input-number__increase{right:1px;border-radius:0 4px 4px 0;border-left:1px solid #d8dce5}.custom-theme .el-input-number__decrease{left:1px;border-radius:4px 0 0 4px;border-right:1px solid #d8dce5}.custom-theme .el-input-number.is-disabled .el-input-number__decrease,.custom-theme .el-input-number.is-disabled .el-input-number__increase{border-color:#dfe4ed;color:#dfe4ed}.custom-theme .el-input-number.is-disabled .el-input-number__decrease:hover,.custom-theme .el-input-number.is-disabled .el-input-number__increase:hover{color:#dfe4ed;cursor:not-allowed}.custom-theme .el-input-number--medium{width:200px;line-height:34px}.custom-theme .el-input-number--medium .el-input-number__decrease,.custom-theme .el-input-number--medium .el-input-number__increase{width:36px;font-size:14px}.custom-theme .el-input-number--medium .el-input__inner{padding-left:43px;padding-right:43px}.custom-theme .el-input-number--small{width:130px;line-height:30px}.custom-theme .el-input-number--small .el-input-number__decrease,.custom-theme .el-input-number--small .el-input-number__increase{width:32px;font-size:13px}.custom-theme .el-input-number--small .el-input-number__decrease [class*=el-icon],.custom-theme .el-input-number--small .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.9);transform:scale(.9)}.custom-theme .el-input-number--small .el-input__inner{padding-left:39px;padding-right:39px}.custom-theme .el-input-number--mini{width:130px;line-height:26px}.custom-theme .el-input-number--mini .el-input-number__decrease,.custom-theme .el-input-number--mini .el-input-number__increase{width:28px;font-size:12px}.custom-theme .el-input-number--mini .el-input-number__decrease [class*=el-icon],.custom-theme .el-input-number--mini .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-input-number--mini .el-input__inner{padding-left:35px;padding-right:35px}.custom-theme .el-input-number.is-without-controls .el-input__inner{padding-left:15px;padding-right:15px}.custom-theme .el-input-number.is-controls-right .el-input__inner{padding-left:15px;padding-right:50px}.custom-theme .el-input-number.is-controls-right .el-input-number__decrease,.custom-theme .el-input-number.is-controls-right .el-input-number__increase{height:auto;line-height:19px}.custom-theme .el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.custom-theme .el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-input-number.is-controls-right .el-input-number__increase{border-radius:0 4px 0 0;border-bottom:1px solid #d8dce5}.custom-theme .el-input-number.is-controls-right .el-input-number__decrease{right:1px;bottom:1px;top:auto;left:auto;border-right:none;border-left:1px solid #d8dce5;border-radius:0 0 4px 0}.custom-theme .el-input-number.is-controls-right[class*=medium] [class*=decrease],.custom-theme .el-input-number.is-controls-right[class*=medium] [class*=increase]{line-height:17px}.custom-theme .el-input-number.is-controls-right[class*=small] [class*=decrease],.custom-theme .el-input-number.is-controls-right[class*=small] [class*=increase]{line-height:15px}.custom-theme .el-input-number.is-controls-right[class*=mini] [class*=decrease],.custom-theme .el-input-number.is-controls-right[class*=mini] [class*=increase]{line-height:13px}.custom-theme .el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:12px;line-height:1.2}.custom-theme .el-tooltip__popper .popper__arrow,.custom-theme .el-tooltip__popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-tooltip__popper .popper__arrow{border-width:6px}.custom-theme .el-tooltip__popper .popper__arrow::after{content:" ";border-width:5px}.custom-theme .el-tooltip__popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-tooltip__popper[x-placement^=top] .popper__arrow{bottom:-6px;border-top-color:#2d2f33;border-bottom-width:0}.custom-theme .el-tooltip__popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-5px;border-top-color:#2d2f33;border-bottom-width:0}.custom-theme .el-tooltip__popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-tooltip__popper[x-placement^=bottom] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#2d2f33}.custom-theme .el-tooltip__popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#2d2f33}.custom-theme .el-tooltip__popper[x-placement^=right]{margin-left:12px}.custom-theme .el-tooltip__popper[x-placement^=right] .popper__arrow{left:-6px;border-right-color:#2d2f33;border-left-width:0}.custom-theme .el-tooltip__popper[x-placement^=right] .popper__arrow::after{bottom:-5px;left:1px;border-right-color:#2d2f33;border-left-width:0}.custom-theme .el-tooltip__popper[x-placement^=left]{margin-right:12px}.custom-theme .el-tooltip__popper[x-placement^=left] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#2d2f33}.custom-theme .el-tooltip__popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#2d2f33}.custom-theme .el-tooltip__popper.is-dark{background:#2d2f33;color:#fff}.custom-theme .el-tooltip__popper.is-light{background:#fff;border:1px solid #2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=top] .popper__arrow{border-top-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=top] .popper__arrow::after{border-top-color:#fff}.custom-theme .el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow{border-bottom-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow::after{border-bottom-color:#fff}.custom-theme .el-tooltip__popper.is-light[x-placement^=left] .popper__arrow{border-left-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=left] .popper__arrow::after{border-left-color:#fff}.custom-theme .el-tooltip__popper.is-light[x-placement^=right] .popper__arrow{border-right-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=right] .popper__arrow::after{border-right-color:#fff}.custom-theme .el-slider::after,.custom-theme .el-slider::before{display:table;content:""}.custom-theme .el-slider::after{clear:both}.custom-theme .el-slider__runway{width:100%;height:6px;margin:16px 0;background-color:#dfe4ed;border-radius:3px;position:relative;cursor:pointer;vertical-align:middle}.custom-theme .el-slider__runway.show-input{margin-right:160px;width:auto}.custom-theme .el-slider__runway.disabled{cursor:default}.custom-theme .el-slider__runway.disabled .el-slider__bar{background-color:#b4bccc}.custom-theme .el-slider__runway.disabled .el-slider__button{border-color:#b4bccc}.custom-theme .el-slider__runway.disabled .el-slider__button-wrapper.hover,.custom-theme .el-slider__runway.disabled .el-slider__button-wrapper:hover{cursor:not-allowed}.custom-theme .el-slider__runway.disabled .el-slider__button-wrapper.dragging{cursor:not-allowed}.custom-theme .el-slider__runway.disabled .el-slider__button.dragging,.custom-theme .el-slider__runway.disabled .el-slider__button.hover,.custom-theme .el-slider__runway.disabled .el-slider__button:hover{-webkit-transform:scale(1);transform:scale(1)}.custom-theme .el-slider__runway.disabled .el-slider__button.hover,.custom-theme .el-slider__runway.disabled .el-slider__button:hover{cursor:not-allowed}.custom-theme .el-slider__runway.disabled .el-slider__button.dragging{cursor:not-allowed}.custom-theme .el-slider__input{float:right;margin-top:3px}.custom-theme .el-slider__bar{height:6px;background-color:#262729;border-top-left-radius:3px;border-bottom-left-radius:3px;position:absolute}.custom-theme .el-slider__button-wrapper{height:36px;width:36px;position:absolute;z-index:1001;top:-15px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:transparent;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-slider__button-wrapper::after{display:inline-block;content:"";height:100%;vertical-align:middle}.custom-theme .el-slider__button-wrapper .el-tooltip{vertical-align:middle;display:inline-block}.custom-theme .el-slider__button-wrapper.hover,.custom-theme .el-slider__button-wrapper:hover{cursor:-webkit-grab;cursor:grab}.custom-theme .el-slider__button-wrapper.dragging{cursor:-webkit-grabbing;cursor:grabbing}.custom-theme .el-slider__button{width:16px;height:16px;border:solid 2px #262729;background-color:#fff;border-radius:50%;-webkit-transition:.2s;transition:.2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-slider__button.dragging,.custom-theme .el-slider__button.hover,.custom-theme .el-slider__button:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.custom-theme .el-slider__button.hover,.custom-theme .el-slider__button:hover{cursor:-webkit-grab;cursor:grab}.custom-theme .el-slider__button.dragging{cursor:-webkit-grabbing;cursor:grabbing}.custom-theme .el-slider__stop{position:absolute;height:6px;width:6px;border-radius:100%;background-color:#fff;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.custom-theme .el-slider.is-vertical{position:relative}.custom-theme .el-slider.is-vertical .el-slider__runway{width:4px;height:100%;margin:0 16px}.custom-theme .el-slider.is-vertical .el-slider__bar{width:4px;height:auto;border-radius:0 0 3px 3px}.custom-theme .el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:-15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.custom-theme .el-slider.is-vertical .el-slider__stop{-webkit-transform:translateY(50%);transform:translateY(50%)}.custom-theme .el-slider.is-vertical.el-slider--with-input{padding-bottom:58px}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input{overflow:visible;float:none;position:absolute;bottom:22px;width:36px;margin-top:15px}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input__inner{text-align:center;padding-left:5px;padding-right:5px}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease,.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{top:32px;margin-top:-1px;border:1px solid #d8dce5;line-height:20px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease{width:18px;right:18px;border-bottom-left-radius:4px}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{width:19px;border-bottom-right-radius:4px}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase~.el-input .el-input__inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__decrease,.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__increase{border-color:#b4bccc}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__decrease,.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__increase{border-color:#262729}.custom-theme .el-loading-parent--relative{position:relative!important}.custom-theme .el-loading-parent--hidden{overflow:hidden!important}.custom-theme .el-loading-mask{position:absolute;z-index:10000;background-color:rgba(255,255,255,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.custom-theme .el-loading-mask.is-fullscreen{position:fixed}.custom-theme .el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.custom-theme .el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.custom-theme .el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.custom-theme .el-loading-spinner .el-loading-text{color:#262729;margin:3px 0;font-size:14px}.custom-theme .el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.custom-theme .el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:#262729;stroke-linecap:round}.custom-theme .el-loading-spinner i{color:#262729}.custom-theme .el-loading-fade-enter,.custom-theme .el-loading-fade-leave-active{opacity:0}@-webkit-keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.custom-theme .el-row{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-row::after,.custom-theme .el-row::before{display:table;content:""}.custom-theme .el-row::after{clear:both}.custom-theme .el-row--flex{display:-webkit-box;display:-ms-flexbox;display:flex}.custom-theme .el-row--flex:after,.custom-theme .el-row--flex:before{display:none}.custom-theme .el-row--flex.is-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.custom-theme .el-row--flex.is-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.custom-theme .el-row--flex.is-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.custom-theme .el-row--flex.is-justify-space-around{-ms-flex-pack:distribute;justify-content:space-around}.custom-theme .el-row--flex.is-align-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.custom-theme .el-row--flex.is-align-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.custom-theme [class*=el-col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-col-0{display:none}.custom-theme .el-col-1{width:4.16667%}.custom-theme .el-col-offset-1{margin-left:4.16667%}.custom-theme .el-col-pull-1{position:relative;right:4.16667%}.custom-theme .el-col-push-1{position:relative;left:4.16667%}.custom-theme .el-col-2{width:8.33333%}.custom-theme .el-col-offset-2{margin-left:8.33333%}.custom-theme .el-col-pull-2{position:relative;right:8.33333%}.custom-theme .el-col-push-2{position:relative;left:8.33333%}.custom-theme .el-col-3{width:12.5%}.custom-theme .el-col-offset-3{margin-left:12.5%}.custom-theme .el-col-pull-3{position:relative;right:12.5%}.custom-theme .el-col-push-3{position:relative;left:12.5%}.custom-theme .el-col-4{width:16.66667%}.custom-theme .el-col-offset-4{margin-left:16.66667%}.custom-theme .el-col-pull-4{position:relative;right:16.66667%}.custom-theme .el-col-push-4{position:relative;left:16.66667%}.custom-theme .el-col-5{width:20.83333%}.custom-theme .el-col-offset-5{margin-left:20.83333%}.custom-theme .el-col-pull-5{position:relative;right:20.83333%}.custom-theme .el-col-push-5{position:relative;left:20.83333%}.custom-theme .el-col-6{width:25%}.custom-theme .el-col-offset-6{margin-left:25%}.custom-theme .el-col-pull-6{position:relative;right:25%}.custom-theme .el-col-push-6{position:relative;left:25%}.custom-theme .el-col-7{width:29.16667%}.custom-theme .el-col-offset-7{margin-left:29.16667%}.custom-theme .el-col-pull-7{position:relative;right:29.16667%}.custom-theme .el-col-push-7{position:relative;left:29.16667%}.custom-theme .el-col-8{width:33.33333%}.custom-theme .el-col-offset-8{margin-left:33.33333%}.custom-theme .el-col-pull-8{position:relative;right:33.33333%}.custom-theme .el-col-push-8{position:relative;left:33.33333%}.custom-theme .el-col-9{width:37.5%}.custom-theme .el-col-offset-9{margin-left:37.5%}.custom-theme .el-col-pull-9{position:relative;right:37.5%}.custom-theme .el-col-push-9{position:relative;left:37.5%}.custom-theme .el-col-10{width:41.66667%}.custom-theme .el-col-offset-10{margin-left:41.66667%}.custom-theme .el-col-pull-10{position:relative;right:41.66667%}.custom-theme .el-col-push-10{position:relative;left:41.66667%}.custom-theme .el-col-11{width:45.83333%}.custom-theme .el-col-offset-11{margin-left:45.83333%}.custom-theme .el-col-pull-11{position:relative;right:45.83333%}.custom-theme .el-col-push-11{position:relative;left:45.83333%}.custom-theme .el-col-12{width:50%}.custom-theme .el-col-offset-12{margin-left:50%}.custom-theme .el-col-pull-12{position:relative;right:50%}.custom-theme .el-col-push-12{position:relative;left:50%}.custom-theme .el-col-13{width:54.16667%}.custom-theme .el-col-offset-13{margin-left:54.16667%}.custom-theme .el-col-pull-13{position:relative;right:54.16667%}.custom-theme .el-col-push-13{position:relative;left:54.16667%}.custom-theme .el-col-14{width:58.33333%}.custom-theme .el-col-offset-14{margin-left:58.33333%}.custom-theme .el-col-pull-14{position:relative;right:58.33333%}.custom-theme .el-col-push-14{position:relative;left:58.33333%}.custom-theme .el-col-15{width:62.5%}.custom-theme .el-col-offset-15{margin-left:62.5%}.custom-theme .el-col-pull-15{position:relative;right:62.5%}.custom-theme .el-col-push-15{position:relative;left:62.5%}.custom-theme .el-col-16{width:66.66667%}.custom-theme .el-col-offset-16{margin-left:66.66667%}.custom-theme .el-col-pull-16{position:relative;right:66.66667%}.custom-theme .el-col-push-16{position:relative;left:66.66667%}.custom-theme .el-col-17{width:70.83333%}.custom-theme .el-col-offset-17{margin-left:70.83333%}.custom-theme .el-col-pull-17{position:relative;right:70.83333%}.custom-theme .el-col-push-17{position:relative;left:70.83333%}.custom-theme .el-col-18{width:75%}.custom-theme .el-col-offset-18{margin-left:75%}.custom-theme .el-col-pull-18{position:relative;right:75%}.custom-theme .el-col-push-18{position:relative;left:75%}.custom-theme .el-col-19{width:79.16667%}.custom-theme .el-col-offset-19{margin-left:79.16667%}.custom-theme .el-col-pull-19{position:relative;right:79.16667%}.custom-theme .el-col-push-19{position:relative;left:79.16667%}.custom-theme .el-col-20{width:83.33333%}.custom-theme .el-col-offset-20{margin-left:83.33333%}.custom-theme .el-col-pull-20{position:relative;right:83.33333%}.custom-theme .el-col-push-20{position:relative;left:83.33333%}.custom-theme .el-col-21{width:87.5%}.custom-theme .el-col-offset-21{margin-left:87.5%}.custom-theme .el-col-pull-21{position:relative;right:87.5%}.custom-theme .el-col-push-21{position:relative;left:87.5%}.custom-theme .el-col-22{width:91.66667%}.custom-theme .el-col-offset-22{margin-left:91.66667%}.custom-theme .el-col-pull-22{position:relative;right:91.66667%}.custom-theme .el-col-push-22{position:relative;left:91.66667%}.custom-theme .el-col-23{width:95.83333%}.custom-theme .el-col-offset-23{margin-left:95.83333%}.custom-theme .el-col-pull-23{position:relative;right:95.83333%}.custom-theme .el-col-push-23{position:relative;left:95.83333%}.custom-theme .el-col-24{width:100%}.custom-theme .el-col-offset-24{margin-left:100%}.custom-theme .el-col-pull-24{position:relative;right:100%}.custom-theme .el-col-push-24{position:relative;left:100%}@media only screen and (max-width:768px){.custom-theme .el-col-xs-0{display:none}.custom-theme .el-col-xs-1{width:4.16667%}.custom-theme .el-col-xs-offset-1{margin-left:4.16667%}.custom-theme .el-col-xs-pull-1{position:relative;right:4.16667%}.custom-theme .el-col-xs-push-1{position:relative;left:4.16667%}.custom-theme .el-col-xs-2{width:8.33333%}.custom-theme .el-col-xs-offset-2{margin-left:8.33333%}.custom-theme .el-col-xs-pull-2{position:relative;right:8.33333%}.custom-theme .el-col-xs-push-2{position:relative;left:8.33333%}.custom-theme .el-col-xs-3{width:12.5%}.custom-theme .el-col-xs-offset-3{margin-left:12.5%}.custom-theme .el-col-xs-pull-3{position:relative;right:12.5%}.custom-theme .el-col-xs-push-3{position:relative;left:12.5%}.custom-theme .el-col-xs-4{width:16.66667%}.custom-theme .el-col-xs-offset-4{margin-left:16.66667%}.custom-theme .el-col-xs-pull-4{position:relative;right:16.66667%}.custom-theme .el-col-xs-push-4{position:relative;left:16.66667%}.custom-theme .el-col-xs-5{width:20.83333%}.custom-theme .el-col-xs-offset-5{margin-left:20.83333%}.custom-theme .el-col-xs-pull-5{position:relative;right:20.83333%}.custom-theme .el-col-xs-push-5{position:relative;left:20.83333%}.custom-theme .el-col-xs-6{width:25%}.custom-theme .el-col-xs-offset-6{margin-left:25%}.custom-theme .el-col-xs-pull-6{position:relative;right:25%}.custom-theme .el-col-xs-push-6{position:relative;left:25%}.custom-theme .el-col-xs-7{width:29.16667%}.custom-theme .el-col-xs-offset-7{margin-left:29.16667%}.custom-theme .el-col-xs-pull-7{position:relative;right:29.16667%}.custom-theme .el-col-xs-push-7{position:relative;left:29.16667%}.custom-theme .el-col-xs-8{width:33.33333%}.custom-theme .el-col-xs-offset-8{margin-left:33.33333%}.custom-theme .el-col-xs-pull-8{position:relative;right:33.33333%}.custom-theme .el-col-xs-push-8{position:relative;left:33.33333%}.custom-theme .el-col-xs-9{width:37.5%}.custom-theme .el-col-xs-offset-9{margin-left:37.5%}.custom-theme .el-col-xs-pull-9{position:relative;right:37.5%}.custom-theme .el-col-xs-push-9{position:relative;left:37.5%}.custom-theme .el-col-xs-10{width:41.66667%}.custom-theme .el-col-xs-offset-10{margin-left:41.66667%}.custom-theme .el-col-xs-pull-10{position:relative;right:41.66667%}.custom-theme .el-col-xs-push-10{position:relative;left:41.66667%}.custom-theme .el-col-xs-11{width:45.83333%}.custom-theme .el-col-xs-offset-11{margin-left:45.83333%}.custom-theme .el-col-xs-pull-11{position:relative;right:45.83333%}.custom-theme .el-col-xs-push-11{position:relative;left:45.83333%}.custom-theme .el-col-xs-12{width:50%}.custom-theme .el-col-xs-offset-12{margin-left:50%}.custom-theme .el-col-xs-pull-12{position:relative;right:50%}.custom-theme .el-col-xs-push-12{position:relative;left:50%}.custom-theme .el-col-xs-13{width:54.16667%}.custom-theme .el-col-xs-offset-13{margin-left:54.16667%}.custom-theme .el-col-xs-pull-13{position:relative;right:54.16667%}.custom-theme .el-col-xs-push-13{position:relative;left:54.16667%}.custom-theme .el-col-xs-14{width:58.33333%}.custom-theme .el-col-xs-offset-14{margin-left:58.33333%}.custom-theme .el-col-xs-pull-14{position:relative;right:58.33333%}.custom-theme .el-col-xs-push-14{position:relative;left:58.33333%}.custom-theme .el-col-xs-15{width:62.5%}.custom-theme .el-col-xs-offset-15{margin-left:62.5%}.custom-theme .el-col-xs-pull-15{position:relative;right:62.5%}.custom-theme .el-col-xs-push-15{position:relative;left:62.5%}.custom-theme .el-col-xs-16{width:66.66667%}.custom-theme .el-col-xs-offset-16{margin-left:66.66667%}.custom-theme .el-col-xs-pull-16{position:relative;right:66.66667%}.custom-theme .el-col-xs-push-16{position:relative;left:66.66667%}.custom-theme .el-col-xs-17{width:70.83333%}.custom-theme .el-col-xs-offset-17{margin-left:70.83333%}.custom-theme .el-col-xs-pull-17{position:relative;right:70.83333%}.custom-theme .el-col-xs-push-17{position:relative;left:70.83333%}.custom-theme .el-col-xs-18{width:75%}.custom-theme .el-col-xs-offset-18{margin-left:75%}.custom-theme .el-col-xs-pull-18{position:relative;right:75%}.custom-theme .el-col-xs-push-18{position:relative;left:75%}.custom-theme .el-col-xs-19{width:79.16667%}.custom-theme .el-col-xs-offset-19{margin-left:79.16667%}.custom-theme .el-col-xs-pull-19{position:relative;right:79.16667%}.custom-theme .el-col-xs-push-19{position:relative;left:79.16667%}.custom-theme .el-col-xs-20{width:83.33333%}.custom-theme .el-col-xs-offset-20{margin-left:83.33333%}.custom-theme .el-col-xs-pull-20{position:relative;right:83.33333%}.custom-theme .el-col-xs-push-20{position:relative;left:83.33333%}.custom-theme .el-col-xs-21{width:87.5%}.custom-theme .el-col-xs-offset-21{margin-left:87.5%}.custom-theme .el-col-xs-pull-21{position:relative;right:87.5%}.custom-theme .el-col-xs-push-21{position:relative;left:87.5%}.custom-theme .el-col-xs-22{width:91.66667%}.custom-theme .el-col-xs-offset-22{margin-left:91.66667%}.custom-theme .el-col-xs-pull-22{position:relative;right:91.66667%}.custom-theme .el-col-xs-push-22{position:relative;left:91.66667%}.custom-theme .el-col-xs-23{width:95.83333%}.custom-theme .el-col-xs-offset-23{margin-left:95.83333%}.custom-theme .el-col-xs-pull-23{position:relative;right:95.83333%}.custom-theme .el-col-xs-push-23{position:relative;left:95.83333%}.custom-theme .el-col-xs-24{width:100%}.custom-theme .el-col-xs-offset-24{margin-left:100%}.custom-theme .el-col-xs-pull-24{position:relative;right:100%}.custom-theme .el-col-xs-push-24{position:relative;left:100%}}@media only screen and (min-width:768px){.custom-theme .el-col-sm-0{display:none}.custom-theme .el-col-sm-1{width:4.16667%}.custom-theme .el-col-sm-offset-1{margin-left:4.16667%}.custom-theme .el-col-sm-pull-1{position:relative;right:4.16667%}.custom-theme .el-col-sm-push-1{position:relative;left:4.16667%}.custom-theme .el-col-sm-2{width:8.33333%}.custom-theme .el-col-sm-offset-2{margin-left:8.33333%}.custom-theme .el-col-sm-pull-2{position:relative;right:8.33333%}.custom-theme .el-col-sm-push-2{position:relative;left:8.33333%}.custom-theme .el-col-sm-3{width:12.5%}.custom-theme .el-col-sm-offset-3{margin-left:12.5%}.custom-theme .el-col-sm-pull-3{position:relative;right:12.5%}.custom-theme .el-col-sm-push-3{position:relative;left:12.5%}.custom-theme .el-col-sm-4{width:16.66667%}.custom-theme .el-col-sm-offset-4{margin-left:16.66667%}.custom-theme .el-col-sm-pull-4{position:relative;right:16.66667%}.custom-theme .el-col-sm-push-4{position:relative;left:16.66667%}.custom-theme .el-col-sm-5{width:20.83333%}.custom-theme .el-col-sm-offset-5{margin-left:20.83333%}.custom-theme .el-col-sm-pull-5{position:relative;right:20.83333%}.custom-theme .el-col-sm-push-5{position:relative;left:20.83333%}.custom-theme .el-col-sm-6{width:25%}.custom-theme .el-col-sm-offset-6{margin-left:25%}.custom-theme .el-col-sm-pull-6{position:relative;right:25%}.custom-theme .el-col-sm-push-6{position:relative;left:25%}.custom-theme .el-col-sm-7{width:29.16667%}.custom-theme .el-col-sm-offset-7{margin-left:29.16667%}.custom-theme .el-col-sm-pull-7{position:relative;right:29.16667%}.custom-theme .el-col-sm-push-7{position:relative;left:29.16667%}.custom-theme .el-col-sm-8{width:33.33333%}.custom-theme .el-col-sm-offset-8{margin-left:33.33333%}.custom-theme .el-col-sm-pull-8{position:relative;right:33.33333%}.custom-theme .el-col-sm-push-8{position:relative;left:33.33333%}.custom-theme .el-col-sm-9{width:37.5%}.custom-theme .el-col-sm-offset-9{margin-left:37.5%}.custom-theme .el-col-sm-pull-9{position:relative;right:37.5%}.custom-theme .el-col-sm-push-9{position:relative;left:37.5%}.custom-theme .el-col-sm-10{width:41.66667%}.custom-theme .el-col-sm-offset-10{margin-left:41.66667%}.custom-theme .el-col-sm-pull-10{position:relative;right:41.66667%}.custom-theme .el-col-sm-push-10{position:relative;left:41.66667%}.custom-theme .el-col-sm-11{width:45.83333%}.custom-theme .el-col-sm-offset-11{margin-left:45.83333%}.custom-theme .el-col-sm-pull-11{position:relative;right:45.83333%}.custom-theme .el-col-sm-push-11{position:relative;left:45.83333%}.custom-theme .el-col-sm-12{width:50%}.custom-theme .el-col-sm-offset-12{margin-left:50%}.custom-theme .el-col-sm-pull-12{position:relative;right:50%}.custom-theme .el-col-sm-push-12{position:relative;left:50%}.custom-theme .el-col-sm-13{width:54.16667%}.custom-theme .el-col-sm-offset-13{margin-left:54.16667%}.custom-theme .el-col-sm-pull-13{position:relative;right:54.16667%}.custom-theme .el-col-sm-push-13{position:relative;left:54.16667%}.custom-theme .el-col-sm-14{width:58.33333%}.custom-theme .el-col-sm-offset-14{margin-left:58.33333%}.custom-theme .el-col-sm-pull-14{position:relative;right:58.33333%}.custom-theme .el-col-sm-push-14{position:relative;left:58.33333%}.custom-theme .el-col-sm-15{width:62.5%}.custom-theme .el-col-sm-offset-15{margin-left:62.5%}.custom-theme .el-col-sm-pull-15{position:relative;right:62.5%}.custom-theme .el-col-sm-push-15{position:relative;left:62.5%}.custom-theme .el-col-sm-16{width:66.66667%}.custom-theme .el-col-sm-offset-16{margin-left:66.66667%}.custom-theme .el-col-sm-pull-16{position:relative;right:66.66667%}.custom-theme .el-col-sm-push-16{position:relative;left:66.66667%}.custom-theme .el-col-sm-17{width:70.83333%}.custom-theme .el-col-sm-offset-17{margin-left:70.83333%}.custom-theme .el-col-sm-pull-17{position:relative;right:70.83333%}.custom-theme .el-col-sm-push-17{position:relative;left:70.83333%}.custom-theme .el-col-sm-18{width:75%}.custom-theme .el-col-sm-offset-18{margin-left:75%}.custom-theme .el-col-sm-pull-18{position:relative;right:75%}.custom-theme .el-col-sm-push-18{position:relative;left:75%}.custom-theme .el-col-sm-19{width:79.16667%}.custom-theme .el-col-sm-offset-19{margin-left:79.16667%}.custom-theme .el-col-sm-pull-19{position:relative;right:79.16667%}.custom-theme .el-col-sm-push-19{position:relative;left:79.16667%}.custom-theme .el-col-sm-20{width:83.33333%}.custom-theme .el-col-sm-offset-20{margin-left:83.33333%}.custom-theme .el-col-sm-pull-20{position:relative;right:83.33333%}.custom-theme .el-col-sm-push-20{position:relative;left:83.33333%}.custom-theme .el-col-sm-21{width:87.5%}.custom-theme .el-col-sm-offset-21{margin-left:87.5%}.custom-theme .el-col-sm-pull-21{position:relative;right:87.5%}.custom-theme .el-col-sm-push-21{position:relative;left:87.5%}.custom-theme .el-col-sm-22{width:91.66667%}.custom-theme .el-col-sm-offset-22{margin-left:91.66667%}.custom-theme .el-col-sm-pull-22{position:relative;right:91.66667%}.custom-theme .el-col-sm-push-22{position:relative;left:91.66667%}.custom-theme .el-col-sm-23{width:95.83333%}.custom-theme .el-col-sm-offset-23{margin-left:95.83333%}.custom-theme .el-col-sm-pull-23{position:relative;right:95.83333%}.custom-theme .el-col-sm-push-23{position:relative;left:95.83333%}.custom-theme .el-col-sm-24{width:100%}.custom-theme .el-col-sm-offset-24{margin-left:100%}.custom-theme .el-col-sm-pull-24{position:relative;right:100%}.custom-theme .el-col-sm-push-24{position:relative;left:100%}}@media only screen and (min-width:992px){.custom-theme .el-col-md-0{display:none}.custom-theme .el-col-md-1{width:4.16667%}.custom-theme .el-col-md-offset-1{margin-left:4.16667%}.custom-theme .el-col-md-pull-1{position:relative;right:4.16667%}.custom-theme .el-col-md-push-1{position:relative;left:4.16667%}.custom-theme .el-col-md-2{width:8.33333%}.custom-theme .el-col-md-offset-2{margin-left:8.33333%}.custom-theme .el-col-md-pull-2{position:relative;right:8.33333%}.custom-theme .el-col-md-push-2{position:relative;left:8.33333%}.custom-theme .el-col-md-3{width:12.5%}.custom-theme .el-col-md-offset-3{margin-left:12.5%}.custom-theme .el-col-md-pull-3{position:relative;right:12.5%}.custom-theme .el-col-md-push-3{position:relative;left:12.5%}.custom-theme .el-col-md-4{width:16.66667%}.custom-theme .el-col-md-offset-4{margin-left:16.66667%}.custom-theme .el-col-md-pull-4{position:relative;right:16.66667%}.custom-theme .el-col-md-push-4{position:relative;left:16.66667%}.custom-theme .el-col-md-5{width:20.83333%}.custom-theme .el-col-md-offset-5{margin-left:20.83333%}.custom-theme .el-col-md-pull-5{position:relative;right:20.83333%}.custom-theme .el-col-md-push-5{position:relative;left:20.83333%}.custom-theme .el-col-md-6{width:25%}.custom-theme .el-col-md-offset-6{margin-left:25%}.custom-theme .el-col-md-pull-6{position:relative;right:25%}.custom-theme .el-col-md-push-6{position:relative;left:25%}.custom-theme .el-col-md-7{width:29.16667%}.custom-theme .el-col-md-offset-7{margin-left:29.16667%}.custom-theme .el-col-md-pull-7{position:relative;right:29.16667%}.custom-theme .el-col-md-push-7{position:relative;left:29.16667%}.custom-theme .el-col-md-8{width:33.33333%}.custom-theme .el-col-md-offset-8{margin-left:33.33333%}.custom-theme .el-col-md-pull-8{position:relative;right:33.33333%}.custom-theme .el-col-md-push-8{position:relative;left:33.33333%}.custom-theme .el-col-md-9{width:37.5%}.custom-theme .el-col-md-offset-9{margin-left:37.5%}.custom-theme .el-col-md-pull-9{position:relative;right:37.5%}.custom-theme .el-col-md-push-9{position:relative;left:37.5%}.custom-theme .el-col-md-10{width:41.66667%}.custom-theme .el-col-md-offset-10{margin-left:41.66667%}.custom-theme .el-col-md-pull-10{position:relative;right:41.66667%}.custom-theme .el-col-md-push-10{position:relative;left:41.66667%}.custom-theme .el-col-md-11{width:45.83333%}.custom-theme .el-col-md-offset-11{margin-left:45.83333%}.custom-theme .el-col-md-pull-11{position:relative;right:45.83333%}.custom-theme .el-col-md-push-11{position:relative;left:45.83333%}.custom-theme .el-col-md-12{width:50%}.custom-theme .el-col-md-offset-12{margin-left:50%}.custom-theme .el-col-md-pull-12{position:relative;right:50%}.custom-theme .el-col-md-push-12{position:relative;left:50%}.custom-theme .el-col-md-13{width:54.16667%}.custom-theme .el-col-md-offset-13{margin-left:54.16667%}.custom-theme .el-col-md-pull-13{position:relative;right:54.16667%}.custom-theme .el-col-md-push-13{position:relative;left:54.16667%}.custom-theme .el-col-md-14{width:58.33333%}.custom-theme .el-col-md-offset-14{margin-left:58.33333%}.custom-theme .el-col-md-pull-14{position:relative;right:58.33333%}.custom-theme .el-col-md-push-14{position:relative;left:58.33333%}.custom-theme .el-col-md-15{width:62.5%}.custom-theme .el-col-md-offset-15{margin-left:62.5%}.custom-theme .el-col-md-pull-15{position:relative;right:62.5%}.custom-theme .el-col-md-push-15{position:relative;left:62.5%}.custom-theme .el-col-md-16{width:66.66667%}.custom-theme .el-col-md-offset-16{margin-left:66.66667%}.custom-theme .el-col-md-pull-16{position:relative;right:66.66667%}.custom-theme .el-col-md-push-16{position:relative;left:66.66667%}.custom-theme .el-col-md-17{width:70.83333%}.custom-theme .el-col-md-offset-17{margin-left:70.83333%}.custom-theme .el-col-md-pull-17{position:relative;right:70.83333%}.custom-theme .el-col-md-push-17{position:relative;left:70.83333%}.custom-theme .el-col-md-18{width:75%}.custom-theme .el-col-md-offset-18{margin-left:75%}.custom-theme .el-col-md-pull-18{position:relative;right:75%}.custom-theme .el-col-md-push-18{position:relative;left:75%}.custom-theme .el-col-md-19{width:79.16667%}.custom-theme .el-col-md-offset-19{margin-left:79.16667%}.custom-theme .el-col-md-pull-19{position:relative;right:79.16667%}.custom-theme .el-col-md-push-19{position:relative;left:79.16667%}.custom-theme .el-col-md-20{width:83.33333%}.custom-theme .el-col-md-offset-20{margin-left:83.33333%}.custom-theme .el-col-md-pull-20{position:relative;right:83.33333%}.custom-theme .el-col-md-push-20{position:relative;left:83.33333%}.custom-theme .el-col-md-21{width:87.5%}.custom-theme .el-col-md-offset-21{margin-left:87.5%}.custom-theme .el-col-md-pull-21{position:relative;right:87.5%}.custom-theme .el-col-md-push-21{position:relative;left:87.5%}.custom-theme .el-col-md-22{width:91.66667%}.custom-theme .el-col-md-offset-22{margin-left:91.66667%}.custom-theme .el-col-md-pull-22{position:relative;right:91.66667%}.custom-theme .el-col-md-push-22{position:relative;left:91.66667%}.custom-theme .el-col-md-23{width:95.83333%}.custom-theme .el-col-md-offset-23{margin-left:95.83333%}.custom-theme .el-col-md-pull-23{position:relative;right:95.83333%}.custom-theme .el-col-md-push-23{position:relative;left:95.83333%}.custom-theme .el-col-md-24{width:100%}.custom-theme .el-col-md-offset-24{margin-left:100%}.custom-theme .el-col-md-pull-24{position:relative;right:100%}.custom-theme .el-col-md-push-24{position:relative;left:100%}}@media only screen and (min-width:1200px){.custom-theme .el-col-lg-0{display:none}.custom-theme .el-col-lg-1{width:4.16667%}.custom-theme .el-col-lg-offset-1{margin-left:4.16667%}.custom-theme .el-col-lg-pull-1{position:relative;right:4.16667%}.custom-theme .el-col-lg-push-1{position:relative;left:4.16667%}.custom-theme .el-col-lg-2{width:8.33333%}.custom-theme .el-col-lg-offset-2{margin-left:8.33333%}.custom-theme .el-col-lg-pull-2{position:relative;right:8.33333%}.custom-theme .el-col-lg-push-2{position:relative;left:8.33333%}.custom-theme .el-col-lg-3{width:12.5%}.custom-theme .el-col-lg-offset-3{margin-left:12.5%}.custom-theme .el-col-lg-pull-3{position:relative;right:12.5%}.custom-theme .el-col-lg-push-3{position:relative;left:12.5%}.custom-theme .el-col-lg-4{width:16.66667%}.custom-theme .el-col-lg-offset-4{margin-left:16.66667%}.custom-theme .el-col-lg-pull-4{position:relative;right:16.66667%}.custom-theme .el-col-lg-push-4{position:relative;left:16.66667%}.custom-theme .el-col-lg-5{width:20.83333%}.custom-theme .el-col-lg-offset-5{margin-left:20.83333%}.custom-theme .el-col-lg-pull-5{position:relative;right:20.83333%}.custom-theme .el-col-lg-push-5{position:relative;left:20.83333%}.custom-theme .el-col-lg-6{width:25%}.custom-theme .el-col-lg-offset-6{margin-left:25%}.custom-theme .el-col-lg-pull-6{position:relative;right:25%}.custom-theme .el-col-lg-push-6{position:relative;left:25%}.custom-theme .el-col-lg-7{width:29.16667%}.custom-theme .el-col-lg-offset-7{margin-left:29.16667%}.custom-theme .el-col-lg-pull-7{position:relative;right:29.16667%}.custom-theme .el-col-lg-push-7{position:relative;left:29.16667%}.custom-theme .el-col-lg-8{width:33.33333%}.custom-theme .el-col-lg-offset-8{margin-left:33.33333%}.custom-theme .el-col-lg-pull-8{position:relative;right:33.33333%}.custom-theme .el-col-lg-push-8{position:relative;left:33.33333%}.custom-theme .el-col-lg-9{width:37.5%}.custom-theme .el-col-lg-offset-9{margin-left:37.5%}.custom-theme .el-col-lg-pull-9{position:relative;right:37.5%}.custom-theme .el-col-lg-push-9{position:relative;left:37.5%}.custom-theme .el-col-lg-10{width:41.66667%}.custom-theme .el-col-lg-offset-10{margin-left:41.66667%}.custom-theme .el-col-lg-pull-10{position:relative;right:41.66667%}.custom-theme .el-col-lg-push-10{position:relative;left:41.66667%}.custom-theme .el-col-lg-11{width:45.83333%}.custom-theme .el-col-lg-offset-11{margin-left:45.83333%}.custom-theme .el-col-lg-pull-11{position:relative;right:45.83333%}.custom-theme .el-col-lg-push-11{position:relative;left:45.83333%}.custom-theme .el-col-lg-12{width:50%}.custom-theme .el-col-lg-offset-12{margin-left:50%}.custom-theme .el-col-lg-pull-12{position:relative;right:50%}.custom-theme .el-col-lg-push-12{position:relative;left:50%}.custom-theme .el-col-lg-13{width:54.16667%}.custom-theme .el-col-lg-offset-13{margin-left:54.16667%}.custom-theme .el-col-lg-pull-13{position:relative;right:54.16667%}.custom-theme .el-col-lg-push-13{position:relative;left:54.16667%}.custom-theme .el-col-lg-14{width:58.33333%}.custom-theme .el-col-lg-offset-14{margin-left:58.33333%}.custom-theme .el-col-lg-pull-14{position:relative;right:58.33333%}.custom-theme .el-col-lg-push-14{position:relative;left:58.33333%}.custom-theme .el-col-lg-15{width:62.5%}.custom-theme .el-col-lg-offset-15{margin-left:62.5%}.custom-theme .el-col-lg-pull-15{position:relative;right:62.5%}.custom-theme .el-col-lg-push-15{position:relative;left:62.5%}.custom-theme .el-col-lg-16{width:66.66667%}.custom-theme .el-col-lg-offset-16{margin-left:66.66667%}.custom-theme .el-col-lg-pull-16{position:relative;right:66.66667%}.custom-theme .el-col-lg-push-16{position:relative;left:66.66667%}.custom-theme .el-col-lg-17{width:70.83333%}.custom-theme .el-col-lg-offset-17{margin-left:70.83333%}.custom-theme .el-col-lg-pull-17{position:relative;right:70.83333%}.custom-theme .el-col-lg-push-17{position:relative;left:70.83333%}.custom-theme .el-col-lg-18{width:75%}.custom-theme .el-col-lg-offset-18{margin-left:75%}.custom-theme .el-col-lg-pull-18{position:relative;right:75%}.custom-theme .el-col-lg-push-18{position:relative;left:75%}.custom-theme .el-col-lg-19{width:79.16667%}.custom-theme .el-col-lg-offset-19{margin-left:79.16667%}.custom-theme .el-col-lg-pull-19{position:relative;right:79.16667%}.custom-theme .el-col-lg-push-19{position:relative;left:79.16667%}.custom-theme .el-col-lg-20{width:83.33333%}.custom-theme .el-col-lg-offset-20{margin-left:83.33333%}.custom-theme .el-col-lg-pull-20{position:relative;right:83.33333%}.custom-theme .el-col-lg-push-20{position:relative;left:83.33333%}.custom-theme .el-col-lg-21{width:87.5%}.custom-theme .el-col-lg-offset-21{margin-left:87.5%}.custom-theme .el-col-lg-pull-21{position:relative;right:87.5%}.custom-theme .el-col-lg-push-21{position:relative;left:87.5%}.custom-theme .el-col-lg-22{width:91.66667%}.custom-theme .el-col-lg-offset-22{margin-left:91.66667%}.custom-theme .el-col-lg-pull-22{position:relative;right:91.66667%}.custom-theme .el-col-lg-push-22{position:relative;left:91.66667%}.custom-theme .el-col-lg-23{width:95.83333%}.custom-theme .el-col-lg-offset-23{margin-left:95.83333%}.custom-theme .el-col-lg-pull-23{position:relative;right:95.83333%}.custom-theme .el-col-lg-push-23{position:relative;left:95.83333%}.custom-theme .el-col-lg-24{width:100%}.custom-theme .el-col-lg-offset-24{margin-left:100%}.custom-theme .el-col-lg-pull-24{position:relative;right:100%}.custom-theme .el-col-lg-push-24{position:relative;left:100%}}@media only screen and (min-width:1920px){.custom-theme .el-col-xl-0{display:none}.custom-theme .el-col-xl-1{width:4.16667%}.custom-theme .el-col-xl-offset-1{margin-left:4.16667%}.custom-theme .el-col-xl-pull-1{position:relative;right:4.16667%}.custom-theme .el-col-xl-push-1{position:relative;left:4.16667%}.custom-theme .el-col-xl-2{width:8.33333%}.custom-theme .el-col-xl-offset-2{margin-left:8.33333%}.custom-theme .el-col-xl-pull-2{position:relative;right:8.33333%}.custom-theme .el-col-xl-push-2{position:relative;left:8.33333%}.custom-theme .el-col-xl-3{width:12.5%}.custom-theme .el-col-xl-offset-3{margin-left:12.5%}.custom-theme .el-col-xl-pull-3{position:relative;right:12.5%}.custom-theme .el-col-xl-push-3{position:relative;left:12.5%}.custom-theme .el-col-xl-4{width:16.66667%}.custom-theme .el-col-xl-offset-4{margin-left:16.66667%}.custom-theme .el-col-xl-pull-4{position:relative;right:16.66667%}.custom-theme .el-col-xl-push-4{position:relative;left:16.66667%}.custom-theme .el-col-xl-5{width:20.83333%}.custom-theme .el-col-xl-offset-5{margin-left:20.83333%}.custom-theme .el-col-xl-pull-5{position:relative;right:20.83333%}.custom-theme .el-col-xl-push-5{position:relative;left:20.83333%}.custom-theme .el-col-xl-6{width:25%}.custom-theme .el-col-xl-offset-6{margin-left:25%}.custom-theme .el-col-xl-pull-6{position:relative;right:25%}.custom-theme .el-col-xl-push-6{position:relative;left:25%}.custom-theme .el-col-xl-7{width:29.16667%}.custom-theme .el-col-xl-offset-7{margin-left:29.16667%}.custom-theme .el-col-xl-pull-7{position:relative;right:29.16667%}.custom-theme .el-col-xl-push-7{position:relative;left:29.16667%}.custom-theme .el-col-xl-8{width:33.33333%}.custom-theme .el-col-xl-offset-8{margin-left:33.33333%}.custom-theme .el-col-xl-pull-8{position:relative;right:33.33333%}.custom-theme .el-col-xl-push-8{position:relative;left:33.33333%}.custom-theme .el-col-xl-9{width:37.5%}.custom-theme .el-col-xl-offset-9{margin-left:37.5%}.custom-theme .el-col-xl-pull-9{position:relative;right:37.5%}.custom-theme .el-col-xl-push-9{position:relative;left:37.5%}.custom-theme .el-col-xl-10{width:41.66667%}.custom-theme .el-col-xl-offset-10{margin-left:41.66667%}.custom-theme .el-col-xl-pull-10{position:relative;right:41.66667%}.custom-theme .el-col-xl-push-10{position:relative;left:41.66667%}.custom-theme .el-col-xl-11{width:45.83333%}.custom-theme .el-col-xl-offset-11{margin-left:45.83333%}.custom-theme .el-col-xl-pull-11{position:relative;right:45.83333%}.custom-theme .el-col-xl-push-11{position:relative;left:45.83333%}.custom-theme .el-col-xl-12{width:50%}.custom-theme .el-col-xl-offset-12{margin-left:50%}.custom-theme .el-col-xl-pull-12{position:relative;right:50%}.custom-theme .el-col-xl-push-12{position:relative;left:50%}.custom-theme .el-col-xl-13{width:54.16667%}.custom-theme .el-col-xl-offset-13{margin-left:54.16667%}.custom-theme .el-col-xl-pull-13{position:relative;right:54.16667%}.custom-theme .el-col-xl-push-13{position:relative;left:54.16667%}.custom-theme .el-col-xl-14{width:58.33333%}.custom-theme .el-col-xl-offset-14{margin-left:58.33333%}.custom-theme .el-col-xl-pull-14{position:relative;right:58.33333%}.custom-theme .el-col-xl-push-14{position:relative;left:58.33333%}.custom-theme .el-col-xl-15{width:62.5%}.custom-theme .el-col-xl-offset-15{margin-left:62.5%}.custom-theme .el-col-xl-pull-15{position:relative;right:62.5%}.custom-theme .el-col-xl-push-15{position:relative;left:62.5%}.custom-theme .el-col-xl-16{width:66.66667%}.custom-theme .el-col-xl-offset-16{margin-left:66.66667%}.custom-theme .el-col-xl-pull-16{position:relative;right:66.66667%}.custom-theme .el-col-xl-push-16{position:relative;left:66.66667%}.custom-theme .el-col-xl-17{width:70.83333%}.custom-theme .el-col-xl-offset-17{margin-left:70.83333%}.custom-theme .el-col-xl-pull-17{position:relative;right:70.83333%}.custom-theme .el-col-xl-push-17{position:relative;left:70.83333%}.custom-theme .el-col-xl-18{width:75%}.custom-theme .el-col-xl-offset-18{margin-left:75%}.custom-theme .el-col-xl-pull-18{position:relative;right:75%}.custom-theme .el-col-xl-push-18{position:relative;left:75%}.custom-theme .el-col-xl-19{width:79.16667%}.custom-theme .el-col-xl-offset-19{margin-left:79.16667%}.custom-theme .el-col-xl-pull-19{position:relative;right:79.16667%}.custom-theme .el-col-xl-push-19{position:relative;left:79.16667%}.custom-theme .el-col-xl-20{width:83.33333%}.custom-theme .el-col-xl-offset-20{margin-left:83.33333%}.custom-theme .el-col-xl-pull-20{position:relative;right:83.33333%}.custom-theme .el-col-xl-push-20{position:relative;left:83.33333%}.custom-theme .el-col-xl-21{width:87.5%}.custom-theme .el-col-xl-offset-21{margin-left:87.5%}.custom-theme .el-col-xl-pull-21{position:relative;right:87.5%}.custom-theme .el-col-xl-push-21{position:relative;left:87.5%}.custom-theme .el-col-xl-22{width:91.66667%}.custom-theme .el-col-xl-offset-22{margin-left:91.66667%}.custom-theme .el-col-xl-pull-22{position:relative;right:91.66667%}.custom-theme .el-col-xl-push-22{position:relative;left:91.66667%}.custom-theme .el-col-xl-23{width:95.83333%}.custom-theme .el-col-xl-offset-23{margin-left:95.83333%}.custom-theme .el-col-xl-pull-23{position:relative;right:95.83333%}.custom-theme .el-col-xl-push-23{position:relative;left:95.83333%}.custom-theme .el-col-xl-24{width:100%}.custom-theme .el-col-xl-offset-24{margin-left:100%}.custom-theme .el-col-xl-pull-24{position:relative;right:100%}.custom-theme .el-col-xl-push-24{position:relative;left:100%}}.custom-theme .el-progress{position:relative;line-height:1}.custom-theme .el-progress__text{font-size:14px;color:#5a5e66;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.custom-theme .el-progress__text i{vertical-align:middle;display:block}.custom-theme .el-progress--circle{display:inline-block}.custom-theme .el-progress--circle .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.custom-theme .el-progress--circle .el-progress__text i{vertical-align:middle;display:inline-block}.custom-theme .el-progress--without-text .el-progress__text{display:none}.custom-theme .el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.custom-theme .el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.custom-theme .el-progress.is-success .el-progress-bar__inner{background-color:#409167}.custom-theme .el-progress.is-success .el-progress__text{color:#409167}.custom-theme .el-progress.is-exception .el-progress-bar__inner{background-color:#b3450e}.custom-theme .el-progress.is-exception .el-progress__text{color:#b3450e}.custom-theme .el-progress-bar{padding-right:50px;display:inline-block;vertical-align:middle;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-progress-bar__outer{height:6px;border-radius:100px;background-color:#e6ebf5;overflow:hidden;position:relative;vertical-align:middle}.custom-theme .el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#262729;text-align:right;border-radius:100px;line-height:1;white-space:nowrap}.custom-theme .el-progress-bar__inner::after{display:inline-block;content:"";height:100%;vertical-align:middle}.custom-theme .el-progress-bar__innerText{display:inline-block;vertical-align:middle;color:#fff;font-size:12px;margin:0 5px}@-webkit-keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}@keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.custom-theme .el-upload{display:inline-block;text-align:center;cursor:pointer}.custom-theme .el-upload__input{display:none}.custom-theme .el-upload__tip{font-size:12px;color:#5a5e66;margin-top:7px}.custom-theme .el-upload iframe{position:absolute;z-index:-1;top:0;left:0;opacity:0}.custom-theme .el-upload--picture-card{background-color:#fbfdff;border:1px dashed #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;cursor:pointer;line-height:146px;vertical-align:top}.custom-theme .el-upload--picture-card i{font-size:28px;color:#8c939d}.custom-theme .el-upload--picture-card:hover{border-color:#262729;color:#262729}.custom-theme .el-upload-dragger{background-color:#fff;border:1px dashed #d9d9d9;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:360px;height:180px;text-align:center;cursor:pointer;position:relative;overflow:hidden}.custom-theme .el-upload-dragger .el-icon-upload{font-size:67px;color:#b4bccc;margin:40px 0 16px;line-height:50px}.custom-theme .el-upload-dragger+.el-upload__tip{text-align:center}.custom-theme .el-upload-dragger~.el-upload__files{border-top:1px solid #d8dce5;margin-top:7px;padding-top:5px}.custom-theme .el-upload-dragger .el-upload__text{color:#5a5e66;font-size:14px;text-align:center}.custom-theme .el-upload-dragger .el-upload__text em{color:#262729;font-style:normal}.custom-theme .el-upload-dragger:hover{border-color:#262729}.custom-theme .el-upload-dragger.is-dragover{background-color:rgba(32,159,255,.06);border:2px dashed #262729}.custom-theme .el-upload-list{margin:0;padding:0;list-style:none}.custom-theme .el-upload-list__item{-webkit-transition:all .5s cubic-bezier(.55,0,.1,1);transition:all .5s cubic-bezier(.55,0,.1,1);font-size:14px;color:#5a5e66;line-height:1.8;margin-top:5px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;width:100%}.custom-theme .el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.custom-theme .el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.custom-theme .el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.custom-theme .el-upload-list__item:first-child{margin-top:10px}.custom-theme .el-upload-list__item .el-icon-upload-success{color:#409167}.custom-theme .el-upload-list__item .el-icon-close{display:none;position:absolute;top:5px;right:5px;cursor:pointer;opacity:.75;color:#5a5e66}.custom-theme .el-upload-list__item .el-icon-close:hover{opacity:1}.custom-theme .el-upload-list__item .el-icon-close-tip{display:none;position:absolute;top:5px;right:0;cursor:pointer;opacity:1;color:#262729;-webkit-transform:translate(15%,0);transform:translate(15%,0)}.custom-theme .el-upload-list__item:hover{background-color:#f5f7fa}.custom-theme .el-upload-list__item:hover .el-icon-close{display:inline-block}.custom-theme .el-upload-list__item:hover .el-progress__text{display:none}.custom-theme .el-upload-list__item.is-success .el-upload-list__item-status-label{display:block}.custom-theme .el-upload-list__item.is-success .el-upload-list__item-name:focus,.custom-theme .el-upload-list__item.is-success .el-upload-list__item-name:hover{color:#262729;cursor:pointer}.custom-theme .el-upload-list__item.is-success:focus .el-icon-close-tip{display:inline-block}.custom-theme .el-upload-list__item.is-success:active,.custom-theme .el-upload-list__item.is-success:focus:not(.focusing){outline-width:0}.custom-theme .el-upload-list__item.is-success:active .el-icon-close-tip,.custom-theme .el-upload-list__item.is-success:focus:not(.focusing) .el-icon-close-tip{display:none}.custom-theme .el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.custom-theme .el-upload-list__item.is-success:hover .el-upload-list__item-status-label{display:none}.custom-theme .el-upload-list.is-disabled .el-upload-list__item:hover .el-upload-list__item-status-label{display:block}.custom-theme .el-upload-list__item-name{color:#5a5e66;display:block;margin-right:40px;overflow:hidden;padding-left:4px;text-overflow:ellipsis;-webkit-transition:color .3s;transition:color .3s;white-space:nowrap}.custom-theme .el-upload-list__item-name [class^=el-icon]{height:100%;margin-right:7px;color:#878d99;line-height:inherit}.custom-theme .el-upload-list__item-status-label{position:absolute;right:5px;top:0;line-height:inherit;display:none}.custom-theme .el-upload-list__item-delete{position:absolute;right:10px;top:0;font-size:12px;color:#5a5e66;display:none}.custom-theme .el-upload-list__item-delete:hover{color:#262729}.custom-theme .el-upload-list--picture-card{margin:0;display:inline;vertical-align:top}.custom-theme .el-upload-list--picture-card .el-upload-list__item{overflow:hidden;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;margin:0 8px 8px 0;display:inline-block}.custom-theme .el-upload-list--picture-card .el-upload-list__item .el-icon-check,.custom-theme .el-upload-list--picture-card .el-upload-list__item .el-icon-circle-check{color:#fff}.custom-theme .el-upload-list--picture-card .el-upload-list__item .el-icon-close{display:none}.custom-theme .el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{display:none}.custom-theme .el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.custom-theme .el-upload-list--picture-card .el-upload-list__item-name{display:none}.custom-theme .el-upload-list--picture-card .el-upload-list__item-thumbnail{width:100%;height:100%}.custom-theme .el-upload-list--picture-card .el-upload-list__item-status-label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.custom-theme .el-upload-list--picture-card .el-upload-list__item-status-label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions{position:absolute;width:100%;height:100%;left:0;top:0;cursor:default;text-align:center;color:#fff;opacity:0;font-size:20px;background-color:rgba(0,0,0,.5);-webkit-transition:opacity .3s;transition:opacity .3s}.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions::after{display:inline-block;content:"";height:100%;vertical-align:middle}.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions span{display:none;cursor:pointer}.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:15px}.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{position:static;font-size:inherit;color:inherit}.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-block}.custom-theme .el-upload-list--picture-card .el-progress{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);bottom:auto;width:126px}.custom-theme .el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.custom-theme .el-upload-list--picture .el-upload-list__item{overflow:hidden;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:10px;padding:10px 10px 10px 90px;height:92px}.custom-theme .el-upload-list--picture .el-upload-list__item .el-icon-check,.custom-theme .el-upload-list--picture .el-upload-list__item .el-icon-circle-check{color:#fff}.custom-theme .el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{background:0 0;-webkit-box-shadow:none;box-shadow:none;top:-2px;right:-12px}.custom-theme .el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.custom-theme .el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name{line-height:70px;margin-top:0}.custom-theme .el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.custom-theme .el-upload-list--picture .el-upload-list__item-thumbnail{vertical-align:middle;display:inline-block;width:70px;height:70px;float:left;position:relative;z-index:1;margin-left:-80px}.custom-theme .el-upload-list--picture .el-upload-list__item-name{display:block;margin-top:20px}.custom-theme .el-upload-list--picture .el-upload-list__item-name i{font-size:70px;line-height:1;position:absolute;left:9px;top:10px}.custom-theme .el-upload-list--picture .el-upload-list__item-status-label{position:absolute;right:-17px;top:-7px;width:46px;height:26px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.custom-theme .el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.custom-theme .el-upload-list--picture .el-progress{position:relative;top:-7px}.custom-theme .el-upload-cover{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;z-index:10;cursor:default}.custom-theme .el-upload-cover::after{display:inline-block;content:"";height:100%;vertical-align:middle}.custom-theme .el-upload-cover img{display:block;width:100%;height:100%}.custom-theme .el-upload-cover__label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.custom-theme .el-upload-cover__label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);color:#fff}.custom-theme .el-upload-cover__progress{display:inline-block;vertical-align:middle;position:static;width:243px}.custom-theme .el-upload-cover__progress+.el-upload__inner{opacity:0}.custom-theme .el-upload-cover__content{position:absolute;top:0;left:0;width:100%;height:100%}.custom-theme .el-upload-cover__interact{position:absolute;bottom:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.72);text-align:center}.custom-theme .el-upload-cover__interact .btn{display:inline-block;color:#fff;font-size:14px;cursor:pointer;vertical-align:middle;-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;margin-top:60px}.custom-theme .el-upload-cover__interact .btn i{margin-top:0}.custom-theme .el-upload-cover__interact .btn span{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.custom-theme .el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.custom-theme .el-upload-cover__interact .btn:hover{-webkit-transform:translateY(-13px);transform:translateY(-13px)}.custom-theme .el-upload-cover__interact .btn:hover span{opacity:1}.custom-theme .el-upload-cover__interact .btn i{color:#fff;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.custom-theme .el-upload-cover__title{position:absolute;bottom:0;left:0;background-color:#fff;height:36px;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400;text-align:left;padding:0 10px;margin:0;line-height:36px;font-size:14px;color:#2d2f33}.custom-theme .el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}.custom-theme .el-progress{position:relative;line-height:1}.custom-theme .el-progress__text{font-size:14px;color:#5a5e66;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.custom-theme .el-progress__text i{vertical-align:middle;display:block}.custom-theme .el-progress--circle{display:inline-block}.custom-theme .el-progress--circle .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.custom-theme .el-progress--circle .el-progress__text i{vertical-align:middle;display:inline-block}.custom-theme .el-progress--without-text .el-progress__text{display:none}.custom-theme .el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.custom-theme .el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.custom-theme .el-progress.is-success .el-progress-bar__inner{background-color:#409167}.custom-theme .el-progress.is-success .el-progress__text{color:#409167}.custom-theme .el-progress.is-exception .el-progress-bar__inner{background-color:#b3450e}.custom-theme .el-progress.is-exception .el-progress__text{color:#b3450e}.custom-theme .el-progress-bar{padding-right:50px;display:inline-block;vertical-align:middle;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-progress-bar__outer{height:6px;border-radius:100px;background-color:#e6ebf5;overflow:hidden;position:relative;vertical-align:middle}.custom-theme .el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#262729;text-align:right;border-radius:100px;line-height:1;white-space:nowrap}.custom-theme .el-progress-bar__inner::after{display:inline-block;content:"";height:100%;vertical-align:middle}.custom-theme .el-progress-bar__innerText{display:inline-block;vertical-align:middle;color:#fff;font-size:12px;margin:0 5px}@keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.custom-theme .el-time-spinner{width:100%;white-space:nowrap}.custom-theme .el-spinner{display:inline-block;vertical-align:middle}.custom-theme .el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.custom-theme .el-spinner-inner .path{stroke:#ececec;stroke-linecap:round;-webkit-animation:dash 1.5s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite}@-webkit-keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}.custom-theme .el-message{min-width:380px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;border-width:1px;border-style:solid;border-color:#e6ebf5;position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:#edf2fc;-webkit-transition:opacity .3s,-webkit-transform .4s;transition:opacity .3s,-webkit-transform .4s;transition:opacity .3s,transform .4s;transition:opacity .3s,transform .4s,-webkit-transform .4s;overflow:hidden;padding:15px 15px 15px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.custom-theme .el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.custom-theme .el-message p{margin:0}.custom-theme .el-message--info .el-message__content{color:#0a76a4}.custom-theme .el-message--success{background-color:#ecf4f0;border-color:#d9e9e1}.custom-theme .el-message--success .el-message__content{color:#409167}.custom-theme .el-message--warning{background-color:#f5f6e6;border-color:#ebedce}.custom-theme .el-message--warning .el-message__content{color:#9da408}.custom-theme .el-message--error{background-color:#f7ece7;border-color:#f0dacf}.custom-theme .el-message--error .el-message__content{color:#b3450e}.custom-theme .el-message__icon{margin-right:10px}.custom-theme .el-message__content{padding:0;font-size:14px;line-height:1}.custom-theme .el-message__content:focus{outline-width:0}.custom-theme .el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:#b4bccc;font-size:16px}.custom-theme .el-message__closeBtn:focus{outline-width:0}.custom-theme .el-message__closeBtn:hover{color:#878d99}.custom-theme .el-message .el-icon-success{color:#409167}.custom-theme .el-message .el-icon-error{color:#b3450e}.custom-theme .el-message .el-icon-info{color:#0a76a4}.custom-theme .el-message .el-icon-warning{color:#9da408}.custom-theme .el-message-fade-enter,.custom-theme .el-message-fade-leave-active{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}.custom-theme .el-badge{position:relative;vertical-align:middle;display:inline-block}.custom-theme .el-badge__content{background-color:#b3450e;border-radius:10px;color:#fff;display:inline-block;font-size:12px;height:18px;line-height:18px;padding:0 6px;text-align:center;white-space:nowrap;border:1px solid #fff}.custom-theme .el-badge__content.is-fixed{position:absolute;top:0;right:10px;-webkit-transform:translateY(-50%) translateX(100%);transform:translateY(-50%) translateX(100%)}.custom-theme .el-badge__content.is-fixed.is-dot{right:5px}.custom-theme .el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.custom-theme .el-card{border-radius:4px;border:1px solid #e6ebf5;background-color:#fff;overflow:hidden;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);color:#2d2f33}.custom-theme .el-card__header{padding:18px 20px;border-bottom:1px solid #e6ebf5;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-card__body{padding:20px}.custom-theme .el-rate{height:20px;line-height:1}.custom-theme .el-rate:active,.custom-theme .el-rate:focus{outline-width:0}.custom-theme .el-rate__item{display:inline-block;position:relative;font-size:0;vertical-align:middle}.custom-theme .el-rate__icon{position:relative;display:inline-block;font-size:18px;margin-right:6px;color:#b4bccc;-webkit-transition:.3s;transition:.3s}.custom-theme .el-rate__icon.hover{-webkit-transform:scale(1.15);transform:scale(1.15)}.custom-theme .el-rate__icon .path2{position:absolute;left:0;top:0}.custom-theme .el-rate__decimal{position:absolute;top:0;left:0;display:inline-block;overflow:hidden}.custom-theme .el-rate__text{font-size:14px;vertical-align:middle}.custom-theme .el-steps{display:-webkit-box;display:-ms-flexbox;display:flex}.custom-theme .el-steps--simple{padding:13px 8%;border-radius:4px;background:#f5f7fa}.custom-theme .el-steps--horizontal{white-space:nowrap}.custom-theme .el-steps--vertical{height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}.custom-theme .el-step{position:relative;-ms-flex-negative:1;flex-shrink:1}.custom-theme .el-step:last-of-type .el-step__line{display:none}.custom-theme .el-step:last-of-type.is-flex{-ms-flex-preferred-size:auto!important;flex-basis:auto!important;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.custom-theme .el-step:last-of-type .el-step__description,.custom-theme .el-step:last-of-type .el-step__main{padding-right:0}.custom-theme .el-step__head{position:relative;width:100%}.custom-theme .el-step__head.is-process{color:#2d2f33;border-color:#2d2f33}.custom-theme .el-step__head.is-wait{color:#b4bccc;border-color:#b4bccc}.custom-theme .el-step__head.is-success{color:#409167;border-color:#409167}.custom-theme .el-step__head.is-error{color:#b3450e;border-color:#b3450e}.custom-theme .el-step__head.is-finish{color:#262729;border-color:#262729}.custom-theme .el-step__icon{position:relative;z-index:1;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:24px;height:24px;font-size:14px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#fff;-webkit-transition:.15s ease-out;transition:.15s ease-out}.custom-theme .el-step__icon.is-text{border-radius:50%;border:2px solid;border-color:inherit}.custom-theme .el-step__icon.is-icon{width:40px}.custom-theme .el-step__icon-inner{display:inline-block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;font-weight:700;line-height:1;color:inherit}.custom-theme .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:25px;font-weight:400}.custom-theme .el-step__icon-inner.is-status{-webkit-transform:translateY(1px);transform:translateY(1px)}.custom-theme .el-step__line{position:absolute;border-color:inherit;background-color:#b4bccc}.custom-theme .el-step__line-inner{display:block;border-width:1px;border-style:solid;border-color:inherit;-webkit-transition:.15s ease-out;transition:.15s ease-out;-webkit-box-sizing:border-box;box-sizing:border-box;width:0;height:0}.custom-theme .el-step__main{white-space:normal;text-align:left}.custom-theme .el-step__title{font-size:16px;line-height:38px}.custom-theme .el-step__title.is-process{font-weight:700;color:#2d2f33}.custom-theme .el-step__title.is-wait{color:#b4bccc}.custom-theme .el-step__title.is-success{color:#409167}.custom-theme .el-step__title.is-error{color:#b3450e}.custom-theme .el-step__title.is-finish{color:#262729}.custom-theme .el-step__description{padding-right:10%;margin-top:-5px;font-size:12px;line-height:20px;font-weight:400}.custom-theme .el-step__description.is-process{color:#2d2f33}.custom-theme .el-step__description.is-wait{color:#b4bccc}.custom-theme .el-step__description.is-success{color:#409167}.custom-theme .el-step__description.is-error{color:#b3450e}.custom-theme .el-step__description.is-finish{color:#262729}.custom-theme .el-step.is-horizontal{display:inline-block}.custom-theme .el-step.is-horizontal .el-step__line{height:2px;top:11px;left:0;right:0}.custom-theme .el-step.is-vertical{display:-webkit-box;display:-ms-flexbox;display:flex}.custom-theme .el-step.is-vertical .el-step__head{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:24px}.custom-theme .el-step.is-vertical .el-step__main{padding-left:10px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.custom-theme .el-step.is-vertical .el-step__title{line-height:24px;padding-bottom:8px}.custom-theme .el-step.is-vertical .el-step__line{width:2px;top:0;bottom:0;left:11px}.custom-theme .el-step.is-vertical .el-step__icon.is-icon{width:24px}.custom-theme .el-step.is-center .el-step__head{text-align:center}.custom-theme .el-step.is-center .el-step__main{text-align:center}.custom-theme .el-step.is-center .el-step__description{padding-left:20%;padding-right:20%}.custom-theme .el-step.is-center .el-step__line{left:50%;right:-50%}.custom-theme .el-step.is-simple{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.custom-theme .el-step.is-simple .el-step__head{width:auto;font-size:0;padding-right:10px}.custom-theme .el-step.is-simple .el-step__icon{background:0 0;width:16px;height:16px;font-size:12px}.custom-theme .el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:18px}.custom-theme .el-step.is-simple .el-step__icon-inner.is-status{-webkit-transform:scale(.8) translateY(1px);transform:scale(.8) translateY(1px)}.custom-theme .el-step.is-simple .el-step__main{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.custom-theme .el-step.is-simple .el-step__title{font-size:16px;line-height:20px}.custom-theme .el-step.is-simple:not(:last-of-type) .el-step__title{max-width:50%;word-break:break-all}.custom-theme .el-step.is-simple .el-step__arrow{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.custom-theme .el-step.is-simple .el-step__arrow::after,.custom-theme .el-step.is-simple .el-step__arrow::before{content:'';display:inline-block;position:absolute;height:15px;width:1px;background:#b4bccc}.custom-theme .el-step.is-simple .el-step__arrow::before{-webkit-transform:rotate(-45deg) translateY(-4px);transform:rotate(-45deg) translateY(-4px);-webkit-transform-origin:0 0;transform-origin:0 0}.custom-theme .el-step.is-simple .el-step__arrow::after{-webkit-transform:rotate(45deg) translateY(4px);transform:rotate(45deg) translateY(4px);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}.custom-theme .el-step.is-simple:last-of-type .el-step__arrow{display:none}.custom-theme .el-carousel{overflow-x:hidden;position:relative}.custom-theme .el-carousel__container{position:relative;height:300px}.custom-theme .el-carousel__arrow{border:none;outline:0;padding:0;margin:0;height:36px;width:36px;cursor:pointer;-webkit-transition:.3s;transition:.3s;border-radius:50%;background-color:rgba(31,45,61,.11);color:#fff;position:absolute;top:50%;z-index:10;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center;font-size:12px}.custom-theme .el-carousel__arrow--left{left:16px}.custom-theme .el-carousel__arrow--right{right:16px}.custom-theme .el-carousel__arrow:hover{background-color:rgba(31,45,61,.23)}.custom-theme .el-carousel__arrow i{cursor:pointer}.custom-theme .el-carousel__indicators{position:absolute;list-style:none;bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);margin:0;padding:0;z-index:2}.custom-theme .el-carousel__indicators--outside{bottom:26px;text-align:center;position:static;-webkit-transform:none;transform:none}.custom-theme .el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.custom-theme .el-carousel__indicators--outside button{background-color:#b4bccc;opacity:.24}.custom-theme .el-carousel__indicators--labels{left:0;right:0;-webkit-transform:none;transform:none;text-align:center}.custom-theme .el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px}.custom-theme .el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.custom-theme .el-carousel__indicator{display:inline-block;background-color:transparent;padding:12px 4px;cursor:pointer}.custom-theme .el-carousel__indicator:hover button{opacity:.72}.custom-theme .el-carousel__indicator.is-active button{opacity:1}.custom-theme .el-carousel__button{display:block;opacity:.48;width:30px;height:2px;background-color:#fff;border:none;outline:0;padding:0;margin:0;cursor:pointer;-webkit-transition:.3s;transition:.3s}.custom-theme .carousel-arrow-left-enter,.custom-theme .carousel-arrow-left-leave-active{-webkit-transform:translateY(-50%) translateX(-10px);transform:translateY(-50%) translateX(-10px);opacity:0}.custom-theme .carousel-arrow-right-enter,.custom-theme .carousel-arrow-right-leave-active{-webkit-transform:translateY(-50%) translateX(10px);transform:translateY(-50%) translateX(10px);opacity:0}.custom-theme .el-scrollbar{overflow:hidden;position:relative}.custom-theme .el-scrollbar:active>.el-scrollbar__bar,.custom-theme .el-scrollbar:focus>.el-scrollbar__bar,.custom-theme .el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.custom-theme .el-scrollbar__wrap{overflow:scroll;height:100%}.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.custom-theme .el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(135,141,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.custom-theme .el-scrollbar__thumb:hover{background-color:rgba(135,141,153,.5)}.custom-theme .el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.custom-theme .el-scrollbar__bar.is-vertical{width:6px;top:2px}.custom-theme .el-scrollbar__bar.is-vertical>div{width:100%}.custom-theme .el-scrollbar__bar.is-horizontal{height:6px;left:2px}.custom-theme .el-scrollbar__bar.is-horizontal>div{height:100%}.custom-theme .el-carousel__item{position:absolute;top:0;left:0;width:100%;height:100%;display:inline-block;overflow:hidden;z-index:0}.custom-theme .el-carousel__item.is-active{z-index:2}.custom-theme .el-carousel__item.is-animating{-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.custom-theme .el-carousel__item--card{width:50%;-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.custom-theme .el-carousel__item--card.is-in-stage{cursor:pointer;z-index:1}.custom-theme .el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.custom-theme .el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.custom-theme .el-carousel__item--card.is-active{z-index:2}.custom-theme .el-carousel__mask{position:absolute;width:100%;height:100%;top:0;left:0;background-color:#fff;opacity:.24;-webkit-transition:.2s;transition:.2s}.custom-theme .el-collapse{border-top:1px solid #e6ebf5;border-bottom:1px solid #e6ebf5}.custom-theme .el-collapse-item__header{height:48px;line-height:48px;background-color:#fff;color:#2d2f33;cursor:pointer;border-bottom:1px solid #e6ebf5;font-size:13px;font-weight:500;-webkit-transition:border-bottom-color .3s;transition:border-bottom-color .3s}.custom-theme .el-collapse-item__header:active,.custom-theme .el-collapse-item__header:focus:not(.focusing){outline-width:0}.custom-theme .el-collapse-item__arrow{margin-right:8px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;float:right;line-height:48px;font-weight:300}.custom-theme .el-collapse-item__wrap{will-change:height;background-color:#fff;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #e6ebf5}.custom-theme .el-collapse-item__content{padding-bottom:25px;font-size:13px;color:#2d2f33;line-height:1.769230769230769}.custom-theme .el-collapse-item.is-active .el-collapse-item__header{border-bottom-color:transparent}.custom-theme .el-collapse-item.is-active .el-collapse-item__header .el-collapse-item__arrow{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.custom-theme .el-collapse-item:last-child{margin-bottom:-1px}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:" ";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .el-cascader{display:inline-block;position:relative;font-size:14px;line-height:40px}.custom-theme .el-cascader .el-input,.custom-theme .el-cascader .el-input__inner{cursor:pointer}.custom-theme .el-cascader .el-input__icon{-webkit-transition:none;transition:none}.custom-theme .el-cascader .el-icon-arrow-down{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:14px}.custom-theme .el-cascader .el-icon-arrow-down.is-reverse{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.custom-theme .el-cascader .el-icon-circle-close{z-index:2;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-cascader .el-icon-circle-close:hover{color:#878d99}.custom-theme .el-cascader__clearIcon{z-index:2;position:relative}.custom-theme .el-cascader__label{position:absolute;left:0;top:0;height:100%;padding:0 25px 0 15px;color:#5a5e66;width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;text-align:left;font-size:inherit}.custom-theme .el-cascader__label span{color:#000}.custom-theme .el-cascader--medium{font-size:14px;line-height:36px}.custom-theme .el-cascader--small{font-size:13px;line-height:32px}.custom-theme .el-cascader--mini{font-size:12px;line-height:28px}.custom-theme .el-cascader.is-disabled .el-cascader__label{z-index:2;color:#b4bccc}.custom-theme .el-cascader-menus{white-space:nowrap;background:#fff;position:absolute;margin:5px 0;z-index:2;border:solid 1px #dfe4ed;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.custom-theme .el-cascader-menus .popper__arrow{-webkit-transform:translateX(-400%);transform:translateX(-400%)}.custom-theme .el-cascader-menu{display:inline-block;vertical-align:top;height:204px;overflow:auto;border-right:solid 1px #dfe4ed;background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:6px 0;min-width:160px}.custom-theme .el-cascader-menu:last-child{border-right:0}.custom-theme .el-cascader-menu__item{font-size:14px;padding:8px 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#5a5e66;height:34px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.custom-theme .el-cascader-menu__item--extensible:after{font-family:element-icons;content:"\e604";font-size:14px;color:#bfcbd9;position:absolute;right:15px}.custom-theme .el-cascader-menu__item.is-disabled{color:#b4bccc;background-color:#fff;cursor:not-allowed}.custom-theme .el-cascader-menu__item.is-disabled:hover{background-color:#fff}.custom-theme .el-cascader-menu__item.is-active{color:#262729}.custom-theme .el-cascader-menu__item:hover{background-color:#f5f7fa}.custom-theme .el-cascader-menu__item.selected{color:#fff;background-color:#f5f7fa}.custom-theme .el-cascader-menu__item__keyword{font-weight:700}.custom-theme .el-cascader-menu--flexible{height:auto;max-height:180px;overflow:auto}.custom-theme .el-cascader-menu--flexible .el-cascader-menu__item{overflow:visible}.custom-theme .el-color-hue-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background-color:red;padding:0 2px}.custom-theme .el-color-hue-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);height:100%}.custom-theme .el-color-hue-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.custom-theme .el-color-hue-slider.is-vertical{width:12px;height:180px;padding:2px 0}.custom-theme .el-color-hue-slider.is-vertical .el-color-hue-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to bottom,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.custom-theme .el-color-hue-slider.is-vertical .el-color-hue-slider__thumb{left:0;top:0;width:100%;height:4px}.custom-theme .el-color-svpanel{position:relative;width:280px;height:180px}.custom-theme .el-color-svpanel__black,.custom-theme .el-color-svpanel__white{position:absolute;top:0;left:0;right:0;bottom:0}.custom-theme .el-color-svpanel__white{background:-webkit-gradient(linear,left top,right top,from(#fff),to(rgba(255,255,255,0)));background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.custom-theme .el-color-svpanel__black{background:-webkit-gradient(linear,left bottom,left top,from(#000),to(transparent));background:linear-gradient(to top,#000,transparent)}.custom-theme .el-color-svpanel__cursor{position:absolute}.custom-theme .el-color-svpanel__cursor>div{cursor:head;width:4px;height:4px;-webkit-box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;-webkit-transform:translate(-2px,-2px);transform:translate(-2px,-2px)}.custom-theme .el-color-alpha-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.custom-theme .el-color-alpha-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to right,rgba(255,255,255,0) 0,#fff 100%);height:100%}.custom-theme .el-color-alpha-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.custom-theme .el-color-alpha-slider.is-vertical{width:20px;height:180px}.custom-theme .el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fff 100%)}.custom-theme .el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb{left:0;top:0;width:100%;height:4px}.custom-theme .el-color-dropdown{width:300px}.custom-theme .el-color-dropdown__main-wrapper{margin-bottom:6px}.custom-theme .el-color-dropdown__main-wrapper::after{content:"";display:table;clear:both}.custom-theme .el-color-dropdown__btns{margin-top:6px;text-align:right}.custom-theme .el-color-dropdown__value{float:left;line-height:26px;font-size:12px;color:#000;width:160px}.custom-theme .el-color-dropdown__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.custom-theme .el-color-dropdown__btn[disabled]{color:#ccc;cursor:not-allowed}.custom-theme .el-color-dropdown__btn:hover{color:#262729;border-color:#262729}.custom-theme .el-color-dropdown__link-btn{cursor:pointer;color:#262729;text-decoration:none;padding:15px;font-size:12px}.custom-theme .el-color-dropdown__link-btn:hover{color:tint(#262729,20%)}.custom-theme .el-color-picker{display:inline-block;position:relative;line-height:normal;height:40px}.custom-theme .el-color-picker.is-disabled .el-color-picker__trigger{cursor:not-allowed}.custom-theme .el-color-picker--medium{height:36px}.custom-theme .el-color-picker--medium .el-color-picker__trigger{height:36px;width:36px}.custom-theme .el-color-picker--medium .el-color-picker__mask{height:34px;width:34px}.custom-theme .el-color-picker--small{height:32px}.custom-theme .el-color-picker--small .el-color-picker__trigger{height:32px;width:32px}.custom-theme .el-color-picker--small .el-color-picker__mask{height:30px;width:30px}.custom-theme .el-color-picker--small .el-color-picker__empty,.custom-theme .el-color-picker--small .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.custom-theme .el-color-picker--mini{height:28px}.custom-theme .el-color-picker--mini .el-color-picker__trigger{height:28px;width:28px}.custom-theme .el-color-picker--mini .el-color-picker__mask{height:26px;width:26px}.custom-theme .el-color-picker--mini .el-color-picker__empty,.custom-theme .el-color-picker--mini .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.custom-theme .el-color-picker__mask{height:38px;width:38px;border-radius:4px;position:absolute;top:1px;left:1px;z-index:1;cursor:not-allowed;background-color:rgba(255,255,255,.7)}.custom-theme .el-color-picker__trigger{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px;width:40px;padding:4px;border:1px solid #e6e6e6;border-radius:4px;font-size:0;position:relative;cursor:pointer}.custom-theme .el-color-picker__color{position:relative;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #999;border-radius:2px;width:100%;height:100%;text-align:center}.custom-theme .el-color-picker__color.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.custom-theme .el-color-picker__color-inner{position:absolute;left:0;top:0;right:0;bottom:0}.custom-theme .el-color-picker__empty{font-size:12px;color:#999;position:absolute;top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.custom-theme .el-color-picker__icon{display:inline-block;position:absolute;width:100%;top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);color:#fff;text-align:center;font-size:12px}.custom-theme .el-color-picker__panel{position:absolute;z-index:10;padding:6px;background-color:#fff;border:1px solid #e6ebf5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-color:#d8dce5;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button+.el-button{margin-left:10px}.custom-theme .el-button.is-round{padding:12px 20px}.custom-theme .el-button:focus,.custom-theme .el-button:hover{color:#262729;border-color:#bebebf;background-color:#e9e9ea}.custom-theme .el-button:active{color:#222325;border-color:#222325;outline:0}.custom-theme .el-button::-moz-focus-inner{border:0}.custom-theme .el-button [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-button.is-plain:focus,.custom-theme .el-button.is-plain:hover{background:#fff;border-color:#262729;color:#262729}.custom-theme .el-button.is-plain:active{background:#fff;border-color:#222325;color:#222325;outline:0}.custom-theme .el-button.is-active{color:#222325;border-color:#222325}.custom-theme .el-button.is-disabled,.custom-theme .el-button.is-disabled:focus,.custom-theme .el-button.is-disabled:hover{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5}.custom-theme .el-button.is-disabled.el-button--text{background-color:transparent}.custom-theme .el-button.is-disabled.is-plain,.custom-theme .el-button.is-disabled.is-plain:focus,.custom-theme .el-button.is-disabled.is-plain:hover{background-color:#fff;border-color:#e6ebf5;color:#b4bccc}.custom-theme .el-button.is-loading{position:relative;pointer-events:none}.custom-theme .el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.custom-theme .el-button.is-round{border-radius:20px;padding:12px 23px}.custom-theme .el-button--primary{color:#fff;background-color:#262729;border-color:#262729}.custom-theme .el-button--primary:focus,.custom-theme .el-button--primary:hover{background:#515254;border-color:#515254;color:#fff}.custom-theme .el-button--primary:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-active{background:#222325;border-color:#222325;color:#fff}.custom-theme .el-button--primary.is-disabled,.custom-theme .el-button--primary.is-disabled:active,.custom-theme .el-button--primary.is-disabled:focus,.custom-theme .el-button--primary.is-disabled:hover{color:#fff;background-color:#939394;border-color:#939394}.custom-theme .el-button--primary.is-plain{color:#262729;background:#e9e9ea;border-color:#a8a9a9}.custom-theme .el-button--primary.is-plain:focus,.custom-theme .el-button--primary.is-plain:hover{background:#262729;border-color:#262729;color:#fff}.custom-theme .el-button--primary.is-plain:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-plain.is-disabled,.custom-theme .el-button--primary.is-plain.is-disabled:active,.custom-theme .el-button--primary.is-plain.is-disabled:focus,.custom-theme .el-button--primary.is-plain.is-disabled:hover{color:#7d7d7f;background-color:#e9e9ea;border-color:#d4d4d4}.custom-theme .el-button--success{color:#fff;background-color:#409167;border-color:#409167}.custom-theme .el-button--success:focus,.custom-theme .el-button--success:hover{background:#66a785;border-color:#66a785;color:#fff}.custom-theme .el-button--success:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-active{background:#3a835d;border-color:#3a835d;color:#fff}.custom-theme .el-button--success.is-disabled,.custom-theme .el-button--success.is-disabled:active,.custom-theme .el-button--success.is-disabled:focus,.custom-theme .el-button--success.is-disabled:hover{color:#fff;background-color:#a0c8b3;border-color:#a0c8b3}.custom-theme .el-button--success.is-plain{color:#409167;background:#ecf4f0;border-color:#b3d3c2}.custom-theme .el-button--success.is-plain:focus,.custom-theme .el-button--success.is-plain:hover{background:#409167;border-color:#409167;color:#fff}.custom-theme .el-button--success.is-plain:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-plain.is-disabled,.custom-theme .el-button--success.is-plain.is-disabled:active,.custom-theme .el-button--success.is-plain.is-disabled:focus,.custom-theme .el-button--success.is-plain.is-disabled:hover{color:#8cbda4;background-color:#ecf4f0;border-color:#d9e9e1}.custom-theme .el-button--warning{color:#fff;background-color:#9da408;border-color:#9da408}.custom-theme .el-button--warning:focus,.custom-theme .el-button--warning:hover{background:#b1b639;border-color:#b1b639;color:#fff}.custom-theme .el-button--warning:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-active{background:#8d9407;border-color:#8d9407;color:#fff}.custom-theme .el-button--warning.is-disabled,.custom-theme .el-button--warning.is-disabled:active,.custom-theme .el-button--warning.is-disabled:focus,.custom-theme .el-button--warning.is-disabled:hover{color:#fff;background-color:#ced284;border-color:#ced284}.custom-theme .el-button--warning.is-plain{color:#9da408;background:#f5f6e6;border-color:#d8db9c}.custom-theme .el-button--warning.is-plain:focus,.custom-theme .el-button--warning.is-plain:hover{background:#9da408;border-color:#9da408;color:#fff}.custom-theme .el-button--warning.is-plain:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-plain.is-disabled,.custom-theme .el-button--warning.is-plain.is-disabled:active,.custom-theme .el-button--warning.is-plain.is-disabled:focus,.custom-theme .el-button--warning.is-plain.is-disabled:hover{color:#c4c86b;background-color:#f5f6e6;border-color:#ebedce}.custom-theme .el-button--danger{color:#fff;background-color:#b3450e;border-color:#b3450e}.custom-theme .el-button--danger:focus,.custom-theme .el-button--danger:hover{background:#c26a3e;border-color:#c26a3e;color:#fff}.custom-theme .el-button--danger:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-active{background:#a13e0d;border-color:#a13e0d;color:#fff}.custom-theme .el-button--danger.is-disabled,.custom-theme .el-button--danger.is-disabled:active,.custom-theme .el-button--danger.is-disabled:focus,.custom-theme .el-button--danger.is-disabled:hover{color:#fff;background-color:#d9a287;border-color:#d9a287}.custom-theme .el-button--danger.is-plain{color:#b3450e;background:#f7ece7;border-color:#e1b59f}.custom-theme .el-button--danger.is-plain:focus,.custom-theme .el-button--danger.is-plain:hover{background:#b3450e;border-color:#b3450e;color:#fff}.custom-theme .el-button--danger.is-plain:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-plain.is-disabled,.custom-theme .el-button--danger.is-plain.is-disabled:active,.custom-theme .el-button--danger.is-plain.is-disabled:focus,.custom-theme .el-button--danger.is-plain.is-disabled:hover{color:#d18f6e;background-color:#f7ece7;border-color:#f0dacf}.custom-theme .el-button--info{color:#fff;background-color:#0a76a4;border-color:#0a76a4}.custom-theme .el-button--info:focus,.custom-theme .el-button--info:hover{background:#3b91b6;border-color:#3b91b6;color:#fff}.custom-theme .el-button--info:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-active{background:#096a94;border-color:#096a94;color:#fff}.custom-theme .el-button--info.is-disabled,.custom-theme .el-button--info.is-disabled:active,.custom-theme .el-button--info.is-disabled:focus,.custom-theme .el-button--info.is-disabled:hover{color:#fff;background-color:#85bbd2;border-color:#85bbd2}.custom-theme .el-button--info.is-plain{color:#0a76a4;background:#e7f1f6;border-color:#9dc8db}.custom-theme .el-button--info.is-plain:focus,.custom-theme .el-button--info.is-plain:hover{background:#0a76a4;border-color:#0a76a4;color:#fff}.custom-theme .el-button--info.is-plain:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-plain.is-disabled,.custom-theme .el-button--info.is-plain.is-disabled:active,.custom-theme .el-button--info.is-plain.is-disabled:focus,.custom-theme .el-button--info.is-plain.is-disabled:hover{color:#6cadc8;background-color:#e7f1f6;border-color:#cee4ed}.custom-theme .el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button--medium.is-round{padding:10px 20px}.custom-theme .el-button--small{padding:9px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--small.is-round{padding:9px 15px}.custom-theme .el-button--mini{padding:7px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--mini.is-round{padding:7px 15px}.custom-theme .el-button--text{border:none;color:#262729;background:0 0;padding-left:0;padding-right:0}.custom-theme .el-button--text:focus,.custom-theme .el-button--text:hover{color:#515254;border-color:transparent;background-color:transparent}.custom-theme .el-button--text:active{color:#222325;border-color:transparent;background-color:transparent}.custom-theme .el-button-group{display:inline-block;vertical-align:middle}.custom-theme .el-button-group::after,.custom-theme .el-button-group::before{display:table;content:""}.custom-theme .el-button-group::after{clear:both}.custom-theme .el-button-group .el-button{float:left;position:relative}.custom-theme .el-button-group .el-button+.el-button{margin-left:0}.custom-theme .el-button-group .el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-button-group .el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-button-group .el-button:not(:first-child):not(:last-child){border-radius:0}.custom-theme .el-button-group .el-button:not(:last-child){margin-right:-1px}.custom-theme .el-button-group .el-button:active,.custom-theme .el-button-group .el-button:focus,.custom-theme .el-button-group .el-button:hover{z-index:1}.custom-theme .el-button-group .el-button.is-active{z-index:1}.custom-theme .el-button-group .el-button--primary:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-checkbox{color:#5a5e66;font-weight:500;font-size:14px;position:relative;cursor:pointer;display:inline-block;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #d8dce5}.custom-theme .el-checkbox.is-bordered.is-checked{border-color:#262729}.custom-theme .el-checkbox.is-bordered.is-disabled{border-color:#e6ebf5;cursor:not-allowed}.custom-theme .el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small{padding:3px 15px 7px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini{padding:1px 15px 5px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox__input{white-space:nowrap;cursor:pointer;outline:0;display:inline-block;line-height:1;position:relative;vertical-align:middle}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5;cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner::after{cursor:not-allowed;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before{background-color:#b4bccc;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled+span.el-checkbox__label{color:#b4bccc;cursor:not-allowed}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner::after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.custom-theme .el-checkbox__input.is-checked+.el-checkbox__label{color:#262729}.custom-theme .el-checkbox__input.is-focus .el-checkbox__inner{border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::before{content:'';position:absolute;display:block;background-color:#fff;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::after{display:none}.custom-theme .el-checkbox__inner{display:inline-block;position:relative;border:1px solid #d8dce5;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#fff;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.custom-theme .el-checkbox__inner:hover{border-color:#262729}.custom-theme .el-checkbox__inner::after{-webkit-box-sizing:content-box;box-sizing:content-box;content:"";border:1px solid #fff;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms,-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;-webkit-transform-origin:center;transform-origin:center}.custom-theme .el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;left:-999px}.custom-theme .el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.custom-theme .el-checkbox+.el-checkbox{margin-left:30px}.custom-theme .el-checkbox-button{position:relative;display:inline-block}.custom-theme .el-checkbox-button__inner{display:inline-block;line-height:1;font-weight:500;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-left:0;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;position:relative;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button__inner.is-round{padding:12px 20px}.custom-theme .el-checkbox-button__inner:hover{color:#262729}.custom-theme .el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.custom-theme .el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;left:-999px}.custom-theme .el-checkbox-button.is-checked .el-checkbox-button__inner{color:#fff;background-color:#262729;border-color:#262729;-webkit-box-shadow:-1px 0 0 0 #7d7d7f;box-shadow:-1px 0 0 0 #7d7d7f}.custom-theme .el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5;-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #d8dce5;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.custom-theme .el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#262729}.custom-theme .el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.custom-theme .el-checkbox-group{font-size:0}.custom-theme .el-transfer{font-size:14px}.custom-theme .el-transfer__buttons{display:inline-block;vertical-align:middle;padding:0 30px}.custom-theme .el-transfer__button{display:block;margin:0 auto;padding:10px;border-radius:50%;color:#fff;background-color:#262729;font-size:0}.custom-theme .el-transfer__button.is-with-texts{border-radius:4px}.custom-theme .el-transfer__button.is-disabled{border:1px solid #d8dce5;background-color:#f5f7fa;color:#b4bccc}.custom-theme .el-transfer__button.is-disabled:hover{border:1px solid #d8dce5;background-color:#f5f7fa;color:#b4bccc}.custom-theme .el-transfer__button:first-child{margin-bottom:10px}.custom-theme .el-transfer__button:nth-child(2){margin:0}.custom-theme .el-transfer__button i,.custom-theme .el-transfer__button span{font-size:14px}.custom-theme .el-transfer__button [class*=el-icon-]+span{margin-left:0}.custom-theme .el-transfer-panel{border:1px solid #e6ebf5;border-radius:4px;overflow:hidden;background:#fff;display:inline-block;vertical-align:middle;width:200px;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative}.custom-theme .el-transfer-panel__body{height:246px}.custom-theme .el-transfer-panel__body.is-with-footer{padding-bottom:40px}.custom-theme .el-transfer-panel__list{margin:0;padding:6px 0;list-style:none;height:246px;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-transfer-panel__list.is-filterable{height:194px;padding-top:0}.custom-theme .el-transfer-panel__item{height:30px;line-height:30px;padding-left:15px;display:block}.custom-theme .el-transfer-panel__item+.el-transfer-panel__item{margin-left:0}.custom-theme .el-transfer-panel__item.el-checkbox{color:#5a5e66}.custom-theme .el-transfer-panel__item:hover{color:#262729}.custom-theme .el-transfer-panel__item.el-checkbox .el-checkbox__label{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding-left:24px;line-height:30px}.custom-theme .el-transfer-panel__item .el-checkbox__input{position:absolute;top:8px}.custom-theme .el-transfer-panel__filter{text-align:center;margin:15px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:auto}.custom-theme .el-transfer-panel__filter .el-input__inner{height:32px;width:100%;font-size:12px;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:16px;padding-right:10px;padding-left:30px}.custom-theme .el-transfer-panel__filter .el-input__icon{margin-left:5px}.custom-theme .el-transfer-panel__filter .el-icon-circle-close{cursor:pointer}.custom-theme .el-transfer-panel .el-transfer-panel__header{height:40px;line-height:40px;background:#f5f7fa;margin:0;padding-left:15px;border-bottom:1px solid #e6ebf5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#000}.custom-theme .el-transfer-panel .el-transfer-panel__header .el-checkbox{display:block;line-height:40px}.custom-theme .el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{font-size:16px;color:#2d2f33;font-weight:400}.custom-theme .el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span{position:absolute;right:15px;color:#878d99;font-size:12px;font-weight:400}.custom-theme .el-transfer-panel .el-transfer-panel__footer{height:40px;background:#fff;margin:0;padding:0;border-top:1px solid #e6ebf5;position:absolute;bottom:0;left:0;width:100%;z-index:1}.custom-theme .el-transfer-panel .el-transfer-panel__footer::after{display:inline-block;content:"";height:100%;vertical-align:middle}.custom-theme .el-transfer-panel .el-transfer-panel__footer .el-checkbox{padding-left:20px;color:#5a5e66}.custom-theme .el-transfer-panel .el-transfer-panel__empty{margin:0;height:30px;line-height:30px;padding:6px 15px 0;color:#878d99}.custom-theme .el-transfer-panel .el-checkbox__label{padding-left:8px}.custom-theme .el-transfer-panel .el-checkbox__inner{height:14px;width:14px;border-radius:3px}.custom-theme .el-transfer-panel .el-checkbox__inner::after{height:6px;width:3px;left:4px}.custom-theme .el-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-container.is-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.custom-theme .el-header{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-aside{overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box;padding:20px}.custom-theme .el-footer{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box} diff --git a/threadpool/console/src/components/BackToTop/index.vue b/threadpool/console/src/components/BackToTop/index.vue deleted file mode 100755 index 36522f4a..00000000 --- a/threadpool/console/src/components/BackToTop/index.vue +++ /dev/null @@ -1,111 +0,0 @@ - - - - - diff --git a/threadpool/console/src/components/Breadcrumb/index.vue b/threadpool/console/src/components/Breadcrumb/index.vue deleted file mode 100755 index 0637e734..00000000 --- a/threadpool/console/src/components/Breadcrumb/index.vue +++ /dev/null @@ -1,82 +0,0 @@ - - - - - diff --git a/threadpool/console/src/components/Charts/Keyboard.vue b/threadpool/console/src/components/Charts/Keyboard.vue deleted file mode 100755 index 0b258f36..00000000 --- a/threadpool/console/src/components/Charts/Keyboard.vue +++ /dev/null @@ -1,155 +0,0 @@ - - - diff --git a/threadpool/console/src/components/Charts/LineMarker.vue b/threadpool/console/src/components/Charts/LineMarker.vue deleted file mode 100755 index 3dd74369..00000000 --- a/threadpool/console/src/components/Charts/LineMarker.vue +++ /dev/null @@ -1,227 +0,0 @@ - - - diff --git a/threadpool/console/src/components/Charts/MixChart.vue b/threadpool/console/src/components/Charts/MixChart.vue deleted file mode 100755 index c416542e..00000000 --- a/threadpool/console/src/components/Charts/MixChart.vue +++ /dev/null @@ -1,271 +0,0 @@ - - - diff --git a/threadpool/console/src/components/Charts/mixins/resize.js b/threadpool/console/src/components/Charts/mixins/resize.js deleted file mode 100755 index dccaf1a8..00000000 --- a/threadpool/console/src/components/Charts/mixins/resize.js +++ /dev/null @@ -1,34 +0,0 @@ -import { debounce } from '@/utils' - -export default { - data() { - return { - $_sidebarElm: null - } - }, - mounted() { - this.__resizeHandler = debounce(() => { - if (this.chart) { - this.chart.resize() - } - }, 100) - window.addEventListener('resize', this.__resizeHandler) - - this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] - this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) - }, - beforeDestroy() { - window.removeEventListener('resize', this.__resizeHandler) - - this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) - }, - methods: { - // use $_ for mixins properties - // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential - $_sidebarResizeHandler(e) { - if (e.propertyName === 'width') { - this.__resizeHandler() - } - } - } -} diff --git a/threadpool/console/src/components/ErrorLog/index.vue b/threadpool/console/src/components/ErrorLog/index.vue deleted file mode 100755 index 6119c037..00000000 --- a/threadpool/console/src/components/ErrorLog/index.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - - - diff --git a/threadpool/console/src/components/GithubCorner/index.vue b/threadpool/console/src/components/GithubCorner/index.vue deleted file mode 100755 index b45bb32c..00000000 --- a/threadpool/console/src/components/GithubCorner/index.vue +++ /dev/null @@ -1,54 +0,0 @@ - - - diff --git a/threadpool/console/src/components/Hamburger/index.vue b/threadpool/console/src/components/Hamburger/index.vue deleted file mode 100755 index 368b0021..00000000 --- a/threadpool/console/src/components/Hamburger/index.vue +++ /dev/null @@ -1,44 +0,0 @@ - - - - - diff --git a/threadpool/console/src/components/HeaderSearch/index.vue b/threadpool/console/src/components/HeaderSearch/index.vue deleted file mode 100755 index af047168..00000000 --- a/threadpool/console/src/components/HeaderSearch/index.vue +++ /dev/null @@ -1,180 +0,0 @@ - - - - - diff --git a/threadpool/console/src/components/ImageCropper/index.vue b/threadpool/console/src/components/ImageCropper/index.vue deleted file mode 100755 index c2688e99..00000000 --- a/threadpool/console/src/components/ImageCropper/index.vue +++ /dev/null @@ -1,1425 +0,0 @@ - - - - - - - diff --git a/threadpool/console/src/components/ImageCropper/utils/data2blob.js b/threadpool/console/src/components/ImageCropper/utils/data2blob.js deleted file mode 100755 index 9c47f8af..00000000 --- a/threadpool/console/src/components/ImageCropper/utils/data2blob.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * database64文件格式转换为2进制 - * - * @param {[String]} data dataURL 的格式为 “data:image/png;base64,****”,逗号之前都是一些说明性的文字,我们只需要逗号之后的就行了 - * @param {[String]} mime [description] - * @return {[blob]} [description] - */ -export default function(data, mime) { - data = data.split(',')[1] - data = window.atob(data) - var ia = new Uint8Array(data.length) - for (var i = 0; i < data.length; i++) { - ia[i] = data.charCodeAt(i) - } - // canvas.toDataURL 返回的默认格式就是 image/png - return new Blob([ia], { - type: mime - }) -} diff --git a/threadpool/console/src/components/ImageCropper/utils/effectRipple.js b/threadpool/console/src/components/ImageCropper/utils/effectRipple.js deleted file mode 100755 index 46a01640..00000000 --- a/threadpool/console/src/components/ImageCropper/utils/effectRipple.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * 点击波纹效果 - * - * @param {[event]} e [description] - * @param {[Object]} arg_opts [description] - * @return {[bollean]} [description] - */ -export default function(e, arg_opts) { - var opts = Object.assign({ - ele: e.target, // 波纹作用元素 - type: 'hit', // hit点击位置扩散center中心点扩展 - bgc: 'rgba(0, 0, 0, 0.15)' // 波纹颜色 - }, arg_opts) - var target = opts.ele - if (target) { - var rect = target.getBoundingClientRect() - var ripple = target.querySelector('.e-ripple') - if (!ripple) { - ripple = document.createElement('span') - ripple.className = 'e-ripple' - ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px' - target.appendChild(ripple) - } else { - ripple.className = 'e-ripple' - } - switch (opts.type) { - case 'center': - ripple.style.top = (rect.height / 2 - ripple.offsetHeight / 2) + 'px' - ripple.style.left = (rect.width / 2 - ripple.offsetWidth / 2) + 'px' - break - default: - ripple.style.top = (e.pageY - rect.top - ripple.offsetHeight / 2 - document.body.scrollTop) + 'px' - ripple.style.left = (e.pageX - rect.left - ripple.offsetWidth / 2 - document.body.scrollLeft) + 'px' - } - ripple.style.backgroundColor = opts.bgc - ripple.className = 'e-ripple z-active' - return false - } -} diff --git a/threadpool/console/src/components/ImageCropper/utils/language.js b/threadpool/console/src/components/ImageCropper/utils/language.js deleted file mode 100755 index 727872d9..00000000 --- a/threadpool/console/src/components/ImageCropper/utils/language.js +++ /dev/null @@ -1,232 +0,0 @@ -export default { - zh: { - hint: '点击,或拖动图片至此处', - loading: '正在上传……', - noSupported: '浏览器不支持该功能,请使用IE10以上或其他现在浏览器!', - success: '上传成功', - fail: '图片上传失败', - preview: '头像预览', - btn: { - off: '取消', - close: '关闭', - back: '上一步', - save: '保存' - }, - error: { - onlyImg: '仅限图片格式', - outOfSize: '单文件大小不能超过 ', - lowestPx: '图片最低像素为(宽*高):' - } - }, - 'zh-tw': { - hint: '點擊,或拖動圖片至此處', - loading: '正在上傳……', - noSupported: '瀏覽器不支持該功能,請使用IE10以上或其他現代瀏覽器!', - success: '上傳成功', - fail: '圖片上傳失敗', - preview: '頭像預覽', - btn: { - off: '取消', - close: '關閉', - back: '上一步', - save: '保存' - }, - error: { - onlyImg: '僅限圖片格式', - outOfSize: '單文件大小不能超過 ', - lowestPx: '圖片最低像素為(寬*高):' - } - }, - en: { - hint: 'Click or drag the file here to upload', - loading: 'Uploading…', - noSupported: 'Browser is not supported, please use IE10+ or other browsers', - success: 'Upload success', - fail: 'Upload failed', - preview: 'Preview', - btn: { - off: 'Cancel', - close: 'Close', - back: 'Back', - save: 'Save' - }, - error: { - onlyImg: 'Image only', - outOfSize: 'Image exceeds size limit: ', - lowestPx: 'Image\'s size is too low. Expected at least: ' - } - }, - ro: { - hint: 'Atinge sau trage fișierul aici', - loading: 'Se încarcă', - noSupported: 'Browser-ul tău nu suportă acest feature. Te rugăm încearcă cu alt browser.', - success: 'S-a încărcat cu succes', - fail: 'A apărut o problemă la încărcare', - preview: 'Previzualizează', - - btn: { - off: 'Anulează', - close: 'Închide', - back: 'Înapoi', - save: 'Salvează' - }, - - error: { - onlyImg: 'Doar imagini', - outOfSize: 'Imaginea depășește limita de: ', - loewstPx: 'Imaginea este prea mică; Minim: ' - } - }, - ru: { - hint: 'Нажмите, или перетащите файл в это окно', - loading: 'Загружаю……', - noSupported: 'Ваш браузер не поддерживается, пожалуйста, используйте IE10 + или другие браузеры', - success: 'Загрузка выполнена успешно', - fail: 'Ошибка загрузки', - preview: 'Предпросмотр', - btn: { - off: 'Отменить', - close: 'Закрыть', - back: 'Назад', - save: 'Сохранить' - }, - error: { - onlyImg: 'Только изображения', - outOfSize: 'Изображение превышает предельный размер: ', - lowestPx: 'Минимальный размер изображения: ' - } - }, - 'pt-br': { - hint: 'Clique ou arraste o arquivo aqui para carregar', - loading: 'Carregando…', - noSupported: 'Browser não suportado, use o IE10+ ou outro browser', - success: 'Sucesso ao carregar imagem', - fail: 'Falha ao carregar imagem', - preview: 'Pré-visualizar', - btn: { - off: 'Cancelar', - close: 'Fechar', - back: 'Voltar', - save: 'Salvar' - }, - error: { - onlyImg: 'Apenas imagens', - outOfSize: 'A imagem excede o limite de tamanho: ', - lowestPx: 'O tamanho da imagem é muito pequeno. Tamanho mínimo: ' - } - }, - fr: { - hint: 'Cliquez ou glissez le fichier ici.', - loading: 'Téléchargement…', - noSupported: 'Votre navigateur n\'est pas supporté. Utilisez IE10 + ou un autre navigateur s\'il vous plaît.', - success: 'Téléchargement réussit', - fail: 'Téléchargement echoué', - preview: 'Aperçu', - btn: { - off: 'Annuler', - close: 'Fermer', - back: 'Retour', - save: 'Enregistrer' - }, - error: { - onlyImg: 'Image uniquement', - outOfSize: 'L\'image sélectionnée dépasse la taille maximum: ', - lowestPx: 'L\'image sélectionnée est trop petite. Dimensions attendues: ' - } - }, - nl: { - hint: 'Klik hier of sleep een afbeelding in dit vlak', - loading: 'Uploaden…', - noSupported: 'Je browser wordt helaas niet ondersteund. Gebruik IE10+ of een andere browser.', - success: 'Upload succesvol', - fail: 'Upload mislukt', - preview: 'Voorbeeld', - btn: { - off: 'Annuleren', - close: 'Sluiten', - back: 'Terug', - save: 'Opslaan' - }, - error: { - onlyImg: 'Alleen afbeeldingen', - outOfSize: 'De afbeelding is groter dan: ', - lowestPx: 'De afbeelding is te klein! Minimale afmetingen: ' - } - }, - tr: { - hint: 'Tıkla veya yüklemek istediğini buraya sürükle', - loading: 'Yükleniyor…', - noSupported: 'Tarayıcı desteklenmiyor, lütfen IE10+ veya farklı tarayıcı kullanın', - success: 'Yükleme başarılı', - fail: 'Yüklemede hata oluştu', - preview: 'Önizle', - btn: { - off: 'İptal', - close: 'Kapat', - back: 'Geri', - save: 'Kaydet' - }, - error: { - onlyImg: 'Sadece resim', - outOfSize: 'Resim yükleme limitini aşıyor: ', - lowestPx: 'Resmin boyutu çok küçük. En az olması gereken: ' - } - }, - 'es-MX': { - hint: 'Selecciona o arrastra una imagen', - loading: 'Subiendo...', - noSupported: 'Tu navegador no es soportado, porfavor usa IE10+ u otros navegadores mas recientes', - success: 'Subido exitosamente', - fail: 'Sucedió un error', - preview: 'Vista previa', - btn: { - off: 'Cancelar', - close: 'Cerrar', - back: 'Atras', - save: 'Guardar' - }, - error: { - onlyImg: 'Unicamente imagenes', - outOfSize: 'La imagen excede el tamaño maximo:', - lowestPx: 'La imagen es demasiado pequeño. Se espera por lo menos:' - } - }, - de: { - hint: 'Klick hier oder zieh eine Datei hier rein zum Hochladen', - loading: 'Hochladen…', - noSupported: 'Browser wird nicht unterstützt, bitte verwende IE10+ oder andere Browser', - success: 'Upload erfolgreich', - fail: 'Upload fehlgeschlagen', - preview: 'Vorschau', - btn: { - off: 'Abbrechen', - close: 'Schließen', - back: 'Zurück', - save: 'Speichern' - }, - error: { - onlyImg: 'Nur Bilder', - outOfSize: 'Das Bild ist zu groß: ', - lowestPx: 'Das Bild ist zu klein. Mindestens: ' - } - }, - ja: { - hint: 'クリック・ドラッグしてファイルをアップロード', - loading: 'アップロード中...', - noSupported: 'このブラウザは対応されていません。IE10+かその他の主要ブラウザをお使いください。', - success: 'アップロード成功', - fail: 'アップロード失敗', - preview: 'プレビュー', - btn: { - off: 'キャンセル', - close: '閉じる', - back: '戻る', - save: '保存' - }, - error: { - onlyImg: '画像のみ', - outOfSize: '画像サイズが上限を超えています。上限: ', - lowestPx: '画像が小さすぎます。最小サイズ: ' - } - } -} diff --git a/threadpool/console/src/components/ImageCropper/utils/mimes.js b/threadpool/console/src/components/ImageCropper/utils/mimes.js deleted file mode 100755 index e20c085c..00000000 --- a/threadpool/console/src/components/ImageCropper/utils/mimes.js +++ /dev/null @@ -1,7 +0,0 @@ -export default { - 'jpg': 'image/jpeg', - 'png': 'image/png', - 'gif': 'image/gif', - 'svg': 'image/svg+xml', - 'psd': 'image/photoshop' -} diff --git a/threadpool/console/src/components/JsonEditor/index.vue b/threadpool/console/src/components/JsonEditor/index.vue deleted file mode 100755 index 07b282e4..00000000 --- a/threadpool/console/src/components/JsonEditor/index.vue +++ /dev/null @@ -1,72 +0,0 @@ -