diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..9be581cd8772e496042daa23e8ac5f2c74073196 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +Yunzai-Bot +Yunzai-Bot-* +old +.git +data \ No newline at end of file diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..41597805d26137229a89e08560ac3be3e5d250c4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,9 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +doc/assets/demo.png filter=lfs diff=lfs merge=lfs -text +doc/assets/help.png filter=lfs diff=lfs merge=lfs -text +script/yunzai-web-downloader/assets/files.png filter=lfs diff=lfs merge=lfs -text +src/Yunzai-Bot/resources/font/华文中宋.TTF filter=lfs diff=lfs merge=lfs -text +src/Yunzai-Bot/resources/font/HYWenHei-55W.ttf filter=lfs diff=lfs merge=lfs -text +src/yunzai-web-fe/docs/c2.png filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml new file mode 100644 index 0000000000000000000000000000000000000000..eb429e28aba1155f4fbfd9236fda716d4e24f0c8 --- /dev/null +++ b/.github/workflows/docker.yaml @@ -0,0 +1,64 @@ +name: docker + +on: + push: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + # https://github.com/actions/checkout + - name: Checkout + uses: actions/checkout@v3 + + # https://github.com/docker/setup-qemu-action + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + # https://github.com/docker/setup-buildx-action + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2 + + # https://github.com/docker/login-action + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + # https://github.com/docker/login-action + - name: Login to ACR + uses: docker/login-action@v2 + with: + registry: registry.cn-hangzhou.aliyuncs.com + username: ${{ secrets.ALI_REGISTRY_USERNAME }} + password: ${{ secrets.ALI_REGISTRY_PASSWORD }} + + # https://github.com/docker/metadata-action + - name: Docker meta + id: meta + uses: docker/metadata-action@v3 + with: + images: | + 117503445/yunzai-web + registry.cn-hangzhou.aliyuncs.com/117503445-mirror/yunzai-web + tags: | + type=schedule + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + type=sha + type=raw,value=latest + # https://github.com/docker/build-push-action + - name: Build and push + uses: docker/build-push-action@v3 + with: + context: . + platforms: linux/amd64, linux/arm64 + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..567052671a061c54614488b705054f583fcdb32f --- /dev/null +++ b/.gitignore @@ -0,0 +1,143 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +.devcontainer/_data + +node_modules +yunzai-client-ws + +.pnpm-store + +egg-demo +fastify-demo + +_data +old +config.json +data \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000000000000000000000000000000000000..d24a18fc4a8ffa632ef230e8ea567516c2a1d2a9 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "humao.rest-client" + ] +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..b7f0ec3a79e9f1865fa0d6defe5c190c07fe7657 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,33 @@ +FROM node:lts-slim AS fe-builder + +COPY src/yunzai-web-fe /workspace/yunzai-web-fe +WORKDIR /workspace/yunzai-web-fe +RUN npm install pnpm -g && pnpm install && pnpm run build + +FROM node:lts-slim AS runtime + +RUN apt-get update \ + && apt-get upgrade -y \ + && apt-get install -y curl wget gnupg git python3-pip fonts-wqy-microhei xfonts-utils chromium fontconfig libxss1 libgl1 \ + && apt-get autoremove \ + && apt-get clean + +RUN fc-cache -f -v +RUN npm install pnpm -g +RUN ln -s /usr/bin/python3 /usr/bin/python \ + && curl -fsSL https://install.python-poetry.org | python - \ + && ln -s /$HOME/.local/bin/poetry /usr/bin \ + && poetry config virtualenvs.in-project true +RUN rm -rf /var/cache/* \ + && rm -rf /tmp/* + +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium + +COPY src/Yunzai-Bot /workspace/Yunzai-Bot +COPY --from=fe-builder /workspace/yunzai-web-fe/dist /workspace/Yunzai-Bot/web-data + +WORKDIR /workspace/Yunzai-Bot +RUN pnpm install && pnpm add image-size fastify @fastify/static @fastify/cors @fastify/basic-auth uuid -w && mkdir ./data +EXPOSE 8080 +ENTRYPOINT [ "./docker-entrypoint.py" ] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..f288702d2fa16d3cdf0035b15a9fcbc552cd88e7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md index 0a9d9e2bdb6a1b97b9c3ca2486d405acd06c94f0..b04c7de80cbfae7ecb0ecd773bde2da8b4b21322 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,200 @@ ---- -title: HL -emoji: 🔥 -colorFrom: red -colorTo: green -sdk: docker -pinned: false ---- - -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference +# Yunzai-Bot-Web + +> 基于 Web 的 Yunzai-Bot 发行版,不依赖 QQ,极易部署! + +Yunzai-Bot 是查询原神游戏信息的 QQ 机器人,但是 QQ 登录比较麻烦(小号、扫码、要求和设备同局域网..)。对于单纯只想查询原神面板信息的用户来说,或许并不想处理 QQ 登录的问题。 + +**Yunzai-Bot-Web** 提供了一种更轻量的部署方案!通过解除 Yunzai-Bot 对 QQ 的依赖,**Yunzai-Bot-Web** 可以进行零手工配置的部署,一行 `docker compose up -d` 即可开始使用~ + +![demo](./doc/assets/demo.png) + +## 快速上手 + +安装最新版本的 [Docker](https://docs.docker.com/engine/install/) + +在合适的文件夹下新建 [docker-compose.yml](https://github.com/117503445/yunzai-bot-web/blob/master/docker-compose.yml) + +```yaml +version: '3' + +services: + yunzai-web: + image: registry.cn-hangzhou.aliyuncs.com/117503445-mirror/yunzai-web + container_name: yunzai-web + restart: unless-stopped + ports: + - 8080:8080 + depends_on: + redis: + condition: service_healthy + volumes: + - ./data/yunzai-web/yunzai-bot-data:/workspace/Yunzai-Bot/data # data of `Yunzai-Bot` + - ./data/yunzai-web/be-images:/workspace/Yunzai-Bot/web-data/images # images of backend + + - ./config/plugins:/workspace/Yunzai-Bot/user_plugins # plugins of `Yunzai-Bot` + # - ./config/config.json:/workspace/Yunzai-Bot/config.json # config of backend, unconment this line when config.json is provided + + - ./dev-data/vsc:/root/.vscode-server # vscode-server cache + redis: + image: registry.cn-hangzhou.aliyuncs.com/117503445-mirror/redis:alpine + restart: unless-stopped + volumes: + - ./data/redis/data:/data + - ./data/redis/logs:/logs + healthcheck: + test: [ "CMD", "redis-cli", "PING" ] + start_period: 10s + interval: 5s + timeout: 1s +``` + +在此文件夹下运行命令 + +```sh +docker compose up -d +``` + +访问 + +Enjoy :) + +## 使用技巧 + +### 插件管理 + +以 [miao-plugin](https://gitee.com/yoimiya-kokomi/miao-plugin) 插件为例 + +#### 插件安装 + +先将插件下载至 `./config/plugins/` 目录 + +```sh +git clone --depth=1 https://gitee.com/yoimiya-kokomi/miao-plugin.git ./config/plugins/miao-plugin +``` + +重启容器,应用插件更新 + +```sh +docker compose down && docker compose up -d +``` + +#### 插件升级 + +拉取更改 + +```sh +cd ./config/plugins/miao-plugin +git pull +``` + +重启容器,应用插件更新 + +```sh +docker compose down && docker compose up -d +``` + + +### 帮助 + +输入 `#帮助` 查看 Yunzai 的帮助 + +输入 `#喵喵帮助` 查看喵喵插件的帮助 + +![help](./doc/assets/help.png) + +### 绑定 uid + +![bind-uid](./doc/assets/bind-uid.png) + +### 绑定 ck + +ck 指的是 [米游社](https://www.miyoushe.com/ys) 的 cookie。Yunzai 在进行某些信息查询时需要用到 ck。 + +#### 油猴脚本[推荐] + +可以通过油猴脚本,便捷的将 ck 发送至 Yunzai-Web。 + +详情见 + +#### 手动 + +在电脑上,登录 [米游社](https://www.miyoushe.com/ys),打开浏览器的开发者工具,抓包,得到 cookie + +![get-ck](./doc/assets/get-ck.png) + +然后将 cookie 直接发送即可完成绑定 + +![bind-ck](./doc/assets/bind-ck.png) + +### 多用户 + +默认情况下 **Yunzai-Bot-Web** 只支持单个原神用户。可以通过本节的配置,开启安全的多原神用户功能。 + +准备配置文件 `./config/config.json` + +以下为配置文件示例。 + +```json +{ + "multiUser": false, + "users": { + "user1": { + "password": "pass1", + "qq": "10000000" + }, + "user2": { + "password": "pass2", + "qq": "10000001" + } + } +} +``` + +定义了 2 个用户,分别是 + +- 用户名 user1 密码 pass1 QQ号 10000000 +- 用户名 user2 密码 pass2 QQ号 10000001 + +QQ号字段不要求和真实 QQ 号一致,只要不同用户的 QQ 字段互相不同即可。其中 `10000000` 是 magic number, 表示 `user1` 是管理员。因为 `10000001` 不是 `10000000`, 所以 `user2` 是普通用户。 + +然后挂载配置文件即可 + +```yaml + volumes: + - ./config/config.json:/workspace/Yunzai-Bot/config.json +``` + +目前采用了 Basic Auth 方案,建议在网关上配置 HTTPS 以保障安全性。 + +### 米游社验证 + +当使用 `#体力` 等米游社功能,出现米游社验证错误时,代表当前账号被米游社风控系统盯上了。可以下载胡桃工具箱,登录自己账号后,点击 实时便笺 - 验证当前用户与角色,就能解决米游社账号的风控问题了。 + +可以参考 [胡桃工具箱文档](https://hut.ao/zh/advanced/exceptions.html#%E7%8A%B6%E6%80%81-1034-%E9%AA%8C%E8%AF%81%E5%A4%B1%E8%B4%A5) + +### 镜像更新 + +当 `Yunzai-Bot` 或 `yunzai-bot-web` 更新时,需要通过本节描述的方法进行镜像更新。其中 `Yunzai-Bot` 基本已经停更了;`yunzai-bot-web` 修 bug 或者增添新功能(比较少见) 时会更新。 + +```sh +docker compose pull +docker compose up -d +``` + +### 脚本开发 + +可以编写脚本,进行一些自动化操作。例如 [yunzai-web-downloader](./script/yunzai-web-downloader/) 下载指定角色的面板、圣遗物,就不需要手动在 Web 面板上一个个问过来了。 + +### 调试 + +当 `yunzai-web` 出现非预期的故障时,需要进行调试。具体方法参考 [调试方法](./doc/dev.md)。 + +## 致谢 + +[Yunzai-Bot](https://gitee.com/Le-niao/Yunzai-Bot.git) 提供机器人框架 + +[miao-plugin](https://github.com/yoimiya-kokomi/miao-plugin.git) 提供高质量的原神信息查询插件 + +[chatgpt-web](https://github.com/Chanzhaoyu/chatgpt-web) 提供前端的基础框架 + +[胡桃工具箱](https://hut.ao/zh/) 提供米游社验证解决方案 diff --git a/config.json.example b/config.json.example new file mode 100644 index 0000000000000000000000000000000000000000..9d45c2fe537b01784468701b4b1665ce02deb233 --- /dev/null +++ b/config.json.example @@ -0,0 +1,13 @@ +{ + "multiUser": true, + "users": { + "user1": { + "password": "pass1", + "qq": 805475874 + }, + "user2": { + "password": "pass2", + "qq": 805475875 + } + } +} \ No newline at end of file diff --git a/doc/assets/bind-ck.png b/doc/assets/bind-ck.png new file mode 100644 index 0000000000000000000000000000000000000000..09fe12445df2fb5d0559f9ee6361b0a887e7af07 Binary files /dev/null and b/doc/assets/bind-ck.png differ diff --git a/doc/assets/bind-uid.png b/doc/assets/bind-uid.png new file mode 100644 index 0000000000000000000000000000000000000000..fd225d6dcec14050e10631ddc3d1474df6156ab2 Binary files /dev/null and b/doc/assets/bind-uid.png differ diff --git a/doc/assets/demo.png b/doc/assets/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..3e9726985e18abb7ce00e673cf887eb8f366e1f8 --- /dev/null +++ b/doc/assets/demo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d34f5c21a71578060855d0a574caf64852fa4eb0b1c6f1eb4ca2f4ca858eec58 +size 2238462 diff --git a/doc/assets/get-ck.png b/doc/assets/get-ck.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca70b2ce884878757e3acc1cbd9680c6d29f1eb Binary files /dev/null and b/doc/assets/get-ck.png differ diff --git a/doc/assets/help.png b/doc/assets/help.png new file mode 100644 index 0000000000000000000000000000000000000000..c4898adc1f972e89e1cc7f06c777414fabacea9e --- /dev/null +++ b/doc/assets/help.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:699d20d1d26a8d99c75381a55e2d3cc250301de92150a333d604fdb1d48916bd +size 1806622 diff --git a/doc/dev.md b/doc/dev.md new file mode 100644 index 0000000000000000000000000000000000000000..2501319e44cf339c54adc00b3e6f3ba991d5be81 --- /dev/null +++ b/doc/dev.md @@ -0,0 +1,40 @@ +# 开发技巧 + +## 调试方法 + +先在 `docker-compose.yml` 中添加 + +```yaml +entrypoint: /bin/bash +stdin_open: true # docker run -i +tty: true # docker run -t +``` + +attach 到容器中,修改代码 + +启动服务 + +```sh +node ./lib/tools/server.js +``` + +## 本地构建 + +```sh +docker build -t 117503445/yunzai-bot . +docker push 117503445/yunzai-bot +docker tag 117503445/yunzai-bot registry.cn-hangzhou.aliyuncs.com/117503445-mirror/yunzai-web +docker push registry.cn-hangzhou.aliyuncs.com/117503445-mirror/yunzai-web +``` + +## 本地开发 + +在项目根目录执行 + +```sh +docker compose -f doc/docker/docker-compose.yml up --build +``` + +会在 `doc/docker` 目录下生成 `data` `config` `dev-data` 目录,其中 `dev-data` 用来储存镜像中的 VSCode Server 缓存等数据 + +可以通过 `http://localhost:8080` 访问项目 diff --git a/doc/docker/.gitignore b/doc/docker/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..7a4f7ecec42aa0e583f04c463d0d95cbb58fa192 --- /dev/null +++ b/doc/docker/.gitignore @@ -0,0 +1,3 @@ +config +data +dev-data \ No newline at end of file diff --git a/doc/docker/Dockerfile b/doc/docker/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..b7f0ec3a79e9f1865fa0d6defe5c190c07fe7657 --- /dev/null +++ b/doc/docker/Dockerfile @@ -0,0 +1,33 @@ +FROM node:lts-slim AS fe-builder + +COPY src/yunzai-web-fe /workspace/yunzai-web-fe +WORKDIR /workspace/yunzai-web-fe +RUN npm install pnpm -g && pnpm install && pnpm run build + +FROM node:lts-slim AS runtime + +RUN apt-get update \ + && apt-get upgrade -y \ + && apt-get install -y curl wget gnupg git python3-pip fonts-wqy-microhei xfonts-utils chromium fontconfig libxss1 libgl1 \ + && apt-get autoremove \ + && apt-get clean + +RUN fc-cache -f -v +RUN npm install pnpm -g +RUN ln -s /usr/bin/python3 /usr/bin/python \ + && curl -fsSL https://install.python-poetry.org | python - \ + && ln -s /$HOME/.local/bin/poetry /usr/bin \ + && poetry config virtualenvs.in-project true +RUN rm -rf /var/cache/* \ + && rm -rf /tmp/* + +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium + +COPY src/Yunzai-Bot /workspace/Yunzai-Bot +COPY --from=fe-builder /workspace/yunzai-web-fe/dist /workspace/Yunzai-Bot/web-data + +WORKDIR /workspace/Yunzai-Bot +RUN pnpm install && pnpm add image-size fastify @fastify/static @fastify/cors @fastify/basic-auth uuid -w && mkdir ./data +EXPOSE 8080 +ENTRYPOINT [ "./docker-entrypoint.py" ] \ No newline at end of file diff --git a/doc/docker/docker-compose.yml b/doc/docker/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..4d503095e5f2347c4d999647177903c78640ec2e --- /dev/null +++ b/doc/docker/docker-compose.yml @@ -0,0 +1,33 @@ +version: '3' + +services: + yunzai-web-dev: + build: + context: ../../ + dockerfile: doc/docker/Dockerfile + depends_on: + redis: + condition: service_healthy + ports: + - 8080:8080 + volumes: + - ./data/yunzai-web/yunzai-bot-data:/workspace/Yunzai-Bot/data # data of `Yunzai-Bot` + - ./data/yunzai-web/be-images:/workspace/Yunzai-Bot/web-data/images # images of backend + + # - ./config/config.json:/workspace/Yunzai-Bot/config.json # config of backend + - ./config/plugins:/workspace/Yunzai-Bot/user_plugins # plugins of `Yunzai-Bot` + + - ../../src/Yunzai-Bot/docker-entrypoint.py:/workspace/Yunzai-Bot/docker-entrypoint.py + + - ./dev-data/vsc:/root/.vscode-server # vscode-server cache + redis: + # docker pull registry.cn-hangzhou.aliyuncs.com/117503445-mirror/redis:alpine && docker image tag registry.cn-hangzhou.aliyuncs.com/117503445-mirror/redis:alpine redis:alpine + image: redis:alpine + volumes: + - ./data/redis/data:/data + - ./data/redis/logs:/logs + healthcheck: + test: [ "CMD", "redis-cli", "PING" ] + start_period: 10s + interval: 5s + timeout: 1s \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..00f0b85c37faeee32f39e8676c1e4e628e9eebe5 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +version: '3' + +services: + yunzai-web: + image: registry.cn-hangzhou.aliyuncs.com/117503445-mirror/yunzai-web + container_name: yunzai-web + restart: unless-stopped + ports: + - 8080:8080 + depends_on: + redis: + condition: service_healthy + volumes: + - ./data/yunzai-web/yunzai-bot-data:/workspace/Yunzai-Bot/data # data of `Yunzai-Bot` + - ./data/yunzai-web/be-images:/workspace/Yunzai-Bot/web-data/images # images of backend + + - ./config/plugins:/workspace/Yunzai-Bot/user_plugins # plugins of `Yunzai-Bot` + # - ./config/config.json:/workspace/Yunzai-Bot/config.json # config of backend, unconment this line when config.json is provided + + - ./dev-data/vsc:/root/.vscode-server # vscode-server cache + redis: + image: registry.cn-hangzhou.aliyuncs.com/117503445-mirror/redis:alpine + restart: unless-stopped + volumes: + - ./data/redis/data:/data + - ./data/redis/logs:/logs + healthcheck: + test: [ "CMD", "redis-cli", "PING" ] + start_period: 10s + interval: 5s + timeout: 1s \ No newline at end of file diff --git a/script/miyoushe-token-sender/README.md b/script/miyoushe-token-sender/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e998e01553a5dfe6240075d523f93b9ea4642caf --- /dev/null +++ b/script/miyoushe-token-sender/README.md @@ -0,0 +1,30 @@ +# miyoushe-token-sender + +将米游社 Cookie 发送至 Yunzai-Web + +## 安装 + +安装 Chrome 插件 [tampermonkey-beta](https://chrome.google.com/webstore/detail/tampermonkey-beta/gcalenpjmijncebpfijmoaglllgpjagf) + +> 使用 **tampermonkey-beta** 的原因: 米游社的 Cookie 中有些 HTTPOnly 的字段,需要通过油猴的 `GM_cookie` API 才能获取到。但是这个 API 目前只在测试版可用,稳定版还无法使用此 API。 + +安装脚本 + +## 修改配置 + +修改脚本中的相关配置 + +```js +// Yunzai-Web 的 host +const host = "https://example.yunzai-web.com" + +// Basic Auth 的用户名 / 密码, 为空则不使用 Basic Auth +const username = "user1" +const password = "pass1" +``` + +## 使用方法 + +访问 [米游社](https://www.miyoushe.com/ys/) + +点击页面右上方的按钮 diff --git a/script/miyoushe-token-sender/miyoushe-token-sender.js b/script/miyoushe-token-sender/miyoushe-token-sender.js new file mode 100644 index 0000000000000000000000000000000000000000..737bf99afd0aa985d5d428537391ab71e6845050 --- /dev/null +++ b/script/miyoushe-token-sender/miyoushe-token-sender.js @@ -0,0 +1,83 @@ +// ==UserScript== +// @name miyoushe token sender +// @namespace http://tampermonkey.net/ +// @version 0.1 +// @description send miyoushe cookies to yunzai-web +// @author 117503445 +// @match https://www.miyoushe.com/* +// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== +// @grant GM_xmlhttpRequest +// @grant GM_cookie +// @license GNU/GPL V3 +// ==/UserScript== + +(function () { + 'use strict'; + + const host = "https://example.yunzai-web.com" + + // Basic Auth 的用户名 / 密码, 为空则不使用 Basic Auth + const username = "user1" + const password = "pass1" + + var button = document.createElement("button"); + button.innerHTML = "Send Cookie To Yunzai-Web"; + button.className = "my-button"; + var style = document.createAttribute("style"); + button.setAttributeNode(style); + button.style.position = "fixed"; + button.style.top = "80px"; + button.style.right = "20px"; + + document.body.appendChild(button); + + function log(msg) { + console.log(`[miyoushe token] ${msg}`) + } + + function error_alert(msg) { + msg = `[miyoushe token] meeting error: ${msg}` + console.error(msg); + alert(msg); + } + + button.addEventListener("click", function () { + GM_cookie.list({}, function (cookies, error) { + if (!error) { + let cookieStr = ""; + + log(`get cookies: ${JSON.stringify(cookies)}`) + cookies.forEach(cookie => { + cookieStr += `${cookie.name}=${cookie.value}; `; + }); + log(`cookieMsg: ${cookieStr}`) + + var data = { + // prompt: document.cookie + prompt: cookieStr + }; + + let headers = { + 'Content-Type': 'application/json', + } + if (username) { + let authorization = btoa(`${username}:${password}`) + headers.Authorization = `Basic ${authorization}` + } + + GM_xmlhttpRequest({ + method: 'POST', + url: `${host}/api/chat-process`, + headers: headers, + data: JSON.stringify(data), + onload(xhr) { + log(xhr.responseText) + alert(`[miyoushe token] Yunzai-Web 返回: \n ${xhr.responseText}`) + } + }); + } else { + error_alert(error); + } + }); + }); +})(); \ No newline at end of file diff --git a/script/yunzai-web-downloader/.gitignore b/script/yunzai-web-downloader/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..5c02ff0a9afbd312fa75c1117cad993e8130ba8b --- /dev/null +++ b/script/yunzai-web-downloader/.gitignore @@ -0,0 +1,3 @@ +面板 +圣遗物 +config.json \ No newline at end of file diff --git a/script/yunzai-web-downloader/README.md b/script/yunzai-web-downloader/README.md new file mode 100644 index 0000000000000000000000000000000000000000..cba7343eb009cadf35d85c824312841deddb41fe --- /dev/null +++ b/script/yunzai-web-downloader/README.md @@ -0,0 +1,21 @@ +# Yunzai-web-downloader + +基于 `Yunzai-Bot-Web` 获取指定角色的圣遗物和面板 + +![files](./assets/files.png) + +## 使用方法 + +1. 安装依赖 + + ```sh + poetry install + ``` + +2. 将 `config.json.examle` 粘贴为 `config.json`,填写对应字段 + +3. 运行命令 + + ```sh + poetry run python main.py + ``` diff --git a/script/yunzai-web-downloader/assets/files.png b/script/yunzai-web-downloader/assets/files.png new file mode 100644 index 0000000000000000000000000000000000000000..cac978fb13fdcb978a15a3f959c136f952a4865c --- /dev/null +++ b/script/yunzai-web-downloader/assets/files.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:580af6096250f4a304e7c90226206a41f2623bd830c7d153f7f248ddb451a5b9 +size 3440074 diff --git a/script/yunzai-web-downloader/config.json.example b/script/yunzai-web-downloader/config.json.example new file mode 100644 index 0000000000000000000000000000000000000000..ca84a93c4b0b940b03a207feff17cc9283a14d84 --- /dev/null +++ b/script/yunzai-web-downloader/config.json.example @@ -0,0 +1,24 @@ +{ + "host": "https://HOST:20000", + "auth": { + "username": "USERNAME", + "password": "PASSWORD" + }, + "names": [ + "胡桃", + "夜兰", + "温迪", + "可莉", + "甘雨", + "枫原万叶", + "雷电将军", + "妮露", + "纳西妲", + "流浪者", + "班尼特", + "行秋", + "香菱", + "久岐忍", + "瑶瑶" + ] +} \ No newline at end of file diff --git a/script/yunzai-web-downloader/main.py b/script/yunzai-web-downloader/main.py new file mode 100644 index 0000000000000000000000000000000000000000..be13daa0769555cf43c5006e2f71b9505cdb04c5 --- /dev/null +++ b/script/yunzai-web-downloader/main.py @@ -0,0 +1,69 @@ +from htutil import file +import requests +import re +import logging +import time +from pathlib import Path +from requests.auth import HTTPBasicAuth + +cfg = file.read_json('config.json') + + +logging.basicConfig(format='%(asctime)s,%(msecs)03d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s', + datefmt='%Y-%m-%d:%H:%M:%S', + level=logging.INFO) + + +pattern = re.compile(r'\((.*?)\)') + +host = cfg['host'] + +session = requests.Session() +if cfg['auth']: + session.auth = HTTPBasicAuth( + cfg['auth']['username'], cfg['auth']['password']) +session.proxies = {'http': '', 'https': ''} + + +def get_image(name: str, _type: str) -> bool: + p = Path(_type) + if not p.exists(): + p.mkdir() + + prompt = f'#{name}{_type}' + path = p / f'{name}.jpg' + # path = f'{name}-{_type}.jpg' + + resp = session.post(f'{host}/api/chat-process', json={ + "prompt": prompt + }, ).text + + match = pattern.search(resp) + if not match: + logging.info(f"img not found, resp = {resp}") + return False + else: + img_url = f'{host}/{match.group(1)}' + resp = session.get(img_url) + with open(path, 'wb') as f: + f.write(resp.content) + return True + +resp = session.post(f'{host}/api/chat-process', json={ + "prompt": "#更新面板" +}).text + +logging.info(resp) + +fail_names = [] + +for name in cfg['names']: + for _type in ['面板', '圣遗物']: + logging.info(f'{name} {_type}') + r = get_image(name, _type) + if not r: + fail_names.append(name) + time.sleep(2) + +if fail_names: + logging.info(fail_names) diff --git a/script/yunzai-web-downloader/poetry.lock b/script/yunzai-web-downloader/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..332fb94a7c5260f89cb0e6ac3c48df294af5f642 --- /dev/null +++ b/script/yunzai-web-downloader/poetry.lock @@ -0,0 +1,206 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "autopep8" +version = "2.0.2" +description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "autopep8-2.0.2-py2.py3-none-any.whl", hash = "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1"}, + {file = "autopep8-2.0.2.tar.gz", hash = "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c"}, +] + +[package.dependencies] +pycodestyle = ">=2.10.0" +tomli = {version = "*", markers = "python_version < \"3.11\""} + +[[package]] +name = "certifi" +version = "2022.12.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, + {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "htutil" +version = "3.0.0" +description = "HaoTian's Python Util" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "htutil-3.0.0-py3-none-any.whl", hash = "sha256:b0e8f323515cadc9100884699a3464ddf0272fc0009403b1cd5e68b4b7c47825"}, + {file = "htutil-3.0.0.tar.gz", hash = "sha256:75bef2704bad8114c33a8b32db4a62226d573af2623ed7d8efa2364ac2dfaea2"}, +] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "pycodestyle" +version = "2.10.0" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, + {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, +] + +[[package]] +name = "requests" +version = "2.28.2" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7, <4" +files = [ + {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, + {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "urllib3" +version = "1.26.15" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, + {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "bb7ea60608f0522cbc4ea15cbb55eb928258b107abfb45f6dca4b099a9ce8871" diff --git a/script/yunzai-web-downloader/pyproject.toml b/script/yunzai-web-downloader/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..2f8a878f994f683e684730ee59501c1de6a1f6a8 --- /dev/null +++ b/script/yunzai-web-downloader/pyproject.toml @@ -0,0 +1,20 @@ +[tool.poetry] +name = "yunzai-web-downloader" +version = "0.1.0" +description = "" +authors = ["117503445 "] +readme = "README.md" +packages = [{include = "yunzai_web_downloader"}] + +[tool.poetry.dependencies] +python = "^3.10" +htutil = "^3.0.0" +requests = "^2.28.2" + + +[tool.poetry.group.dev.dependencies] +autopep8 = "^2.0.2" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/src/Yunzai-Bot/.eslintrc.cjs b/src/Yunzai-Bot/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..a9b525032da461f639576fefdc3551565af8f5d6 --- /dev/null +++ b/src/Yunzai-Bot/.eslintrc.cjs @@ -0,0 +1,22 @@ +module.exports = { + env: { + es2021: true, + node: true + }, + extends: ['standard'], + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module' + }, + globals: { + Bot: true, + redis: true, + logger: true, + plugin: true + }, + rules: { + eqeqeq: ['off'], + 'prefer-const': ['off'], + 'arrow-body-style': 'off' + } +} diff --git a/src/Yunzai-Bot/.github/workflows/Docker Build Test.yml b/src/Yunzai-Bot/.github/workflows/Docker Build Test.yml new file mode 100644 index 0000000000000000000000000000000000000000..e08cfa4c3cd50b66341dbfd2505103bc3e17f4d4 --- /dev/null +++ b/src/Yunzai-Bot/.github/workflows/Docker Build Test.yml @@ -0,0 +1,26 @@ +name: docker test + +on: + push: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Modify Build File + run: sed -i "s|# build|build|g" ./docker-compose.yaml + && sed -i "s|gitee|github|g" ./docker/Dockerfile + + - name: Build Docker Images + run: docker compose up -d --build + + - name: Use Default Config + run: docker cp docker/qq.yaml yunzai-bot:/app/Yunzai-Bot/config/config + + - name: Run Test Script + run: docker exec yunzai-bot npm --prefix=/app/Yunzai-Bot run test diff --git a/src/Yunzai-Bot/.gitignore b/src/Yunzai-Bot/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..a66b0f640c53d3e883f8cce87c414476f0a89c9e --- /dev/null +++ b/src/Yunzai-Bot/.gitignore @@ -0,0 +1,142 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test +.vscode/ + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# Yunzai data +dump.rdb +data/ +config/test/* +!config/test/default.yaml +logs/ + +# Docker file +redis +yunzai \ No newline at end of file diff --git a/src/Yunzai-Bot/LICENSE b/src/Yunzai-Bot/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..f288702d2fa16d3cdf0035b15a9fcbc552cd88e7 --- /dev/null +++ b/src/Yunzai-Bot/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/src/Yunzai-Bot/README.md b/src/Yunzai-Bot/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0f6c8425fa7450147c24df15fefe7456fcd8a6ce --- /dev/null +++ b/src/Yunzai-Bot/README.md @@ -0,0 +1,41 @@ +# Yunzai-Bot v3 +云崽v3.0,原神qq群机器人,通过米游社接口,查询原神游戏信息,快速生成图片返回 + +项目仅供学习交流使用,严禁用于任何商业用途和非法行为 + +[目前功能](https://github.com/Le-niao/Yunzai-Bot/tree/main/plugins/genshin) + +## 使用方法 +>环境准备: Windows or Linux,Node.js([版本至少v16以上](http://nodejs.cn/download/)),[Redis](https://redis.io/docs/getting-started/installation/) + +1.克隆项目 +``` +git clone --depth=1 -b main https://github.com/Le-niao/Yunzai-Bot.git +``` +``` +cd Yunzai-Bot #进入Yunzai目录 +``` +2.安装[pnpm](https://pnpm.io/zh/installation),已安装的可以跳过 +``` +npm install pnpm -g +``` +3.安装依赖 +``` +pnpm install -P +``` +4.运行(首次运行按提示输入登录) +``` +node app +``` + +## 致谢 +| Nickname | Contribution | +| :----------------------------------------------------------: | ----------------------------------- | +|[GardenHamster](https://github.com/GardenHamster/GenshinPray) | 模拟抽卡背景素材来源 | +|[西风驿站](https://bbs.mihoyo.com/ys/collection/839181) | 角色攻略图来源 | +|[米游社友人A](https://bbs.mihoyo.com/ys/collection/428421) | 角色突破素材图来源 | + +## 其他 +- 最后给个star或者[爱发电](https://afdian.net/@Le-niao),你的支持是维护本项目的动力~~ +- 图片素材来源于网络,仅供交流学习使用 +- 严禁用于任何商业用途和非法行为 diff --git a/src/Yunzai-Bot/app.js b/src/Yunzai-Bot/app.js new file mode 100644 index 0000000000000000000000000000000000000000..425d2b3008d2d4a770f836e6b6fbe4ce68f7d396 --- /dev/null +++ b/src/Yunzai-Bot/app.js @@ -0,0 +1,4 @@ +import Yunzai from './lib/bot.js' + +/** 全局变量 bot */ +global.Bot = await Yunzai.run() diff --git a/src/Yunzai-Bot/config/config/other.yaml b/src/Yunzai-Bot/config/config/other.yaml new file mode 100644 index 0000000000000000000000000000000000000000..bac68fa7a9b3d1cbf0e3ee7f9701ed1851330bb4 --- /dev/null +++ b/src/Yunzai-Bot/config/config/other.yaml @@ -0,0 +1,23 @@ +# 是否自动同意加好友 1-同意 0-不处理 +autoFriend: 1 +# 是否自动退群人数,当被好友拉进群时,群人数小于配置值自动退出, 默认50,0则不处理 +autoQuit: 50 +# 主人QQ号 +masterQQ: "10000000" + +# 禁用私聊功能 true:私聊只接受ck以及抽卡链接(Bot主人不受限制),false:私聊可以触发全部指令,默认false +disablePrivate: false +# 禁用私聊Bot提示内容 +disableMsg: "私聊功能已禁用,仅支持发送cookie,抽卡记录链接,记录日志文件" +# 私聊通行字符串 +disableAdopt: + - stoken +#白名单群,配置后只在该群生效 +whiteGroup: + +#黑名单群 +blackGroup: + - 213938015 +#黑名单qq +blackQQ: + - 528952540 \ No newline at end of file diff --git a/src/Yunzai-Bot/config/config/redis.yaml b/src/Yunzai-Bot/config/config/redis.yaml new file mode 100644 index 0000000000000000000000000000000000000000..0e35023ac90b2e61badda27242e2cc9d150bdfcb --- /dev/null +++ b/src/Yunzai-Bot/config/config/redis.yaml @@ -0,0 +1,9 @@ +# redis地址 +host: redis +# redis端口 +port: 6379 +# redis密码,没有密码可以为空 +password: +# redis数据库 +db: 0 + diff --git a/src/Yunzai-Bot/config/default_config/bot.yaml b/src/Yunzai-Bot/config/default_config/bot.yaml new file mode 100644 index 0000000000000000000000000000000000000000..bf2a9c21d615418a068e1fbda8406f0170c01685 --- /dev/null +++ b/src/Yunzai-Bot/config/default_config/bot.yaml @@ -0,0 +1,21 @@ +# 日志等级:trace,debug,info,warn,fatal,mark,error,off +# mark时只显示执行命令,不显示聊天记录 +log_level: info +# 群聊和频道中过滤自己的消息 +ignore_self: true +# 被风控时是否尝试用分片发送 +resend: false +# ffmpeg +ffmpeg_path: +ffprobe_path: + +# chromium其他路径 +chromium_path: + +# 米游社接口代理地址,国际服用 +proxyAddress: + +# 上线时给首个主人QQ推送帮助 +online_msg: true +# 上线推送通知的冷却时间 +online_msg_exp: 86400 \ No newline at end of file diff --git a/src/Yunzai-Bot/config/default_config/group.yaml b/src/Yunzai-Bot/config/default_config/group.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f68bd31311e66289241845c26c709aa120f928b8 --- /dev/null +++ b/src/Yunzai-Bot/config/default_config/group.yaml @@ -0,0 +1,26 @@ +# 默认设置 +default: + groupCD: 500 # 群聊中所有指令操作冷却时间,单位毫秒,0则无限制 + singleCD: 2000 # 群聊中个人操作冷却时间,单位毫秒 + + onlyReplyAt: 0 # 是否只仅关注主动@机器人的消息, 0-否 1-是 + botAlias: # 开启后则只回复@机器人的消息及特定前缀的消息,支持多个 + - 云崽 + - 云宝 + + imgAddLimit: 0 #添加表情是否限制 0-所有群员都可以添加 1-群管理员才能添加 2-主人才能添加 + imgMaxSize: 2 #添加表情图片大小限制,默认2m + addPrivate: 1 #是否允许私聊添加 1-允许 0-禁止 + + enable: #只启用功能,配置后只有该功能才响应 + + #禁用功能,功能名称,例如:十连、角色查询、体力查询、用户绑定、抽卡记录、添加表情、欢迎新人、退群通知 + #禁用功能,功能名称,例如:云崽帮助、角色素材、今日素材、养成计算、米游社公告 + disable: + - 禁用示例 + - 支持多个 + +# 群单独设置,自动覆盖默认值 +123456: + groupCD: 500 # 群聊中所有指令操作冷却时间,单位毫秒,0则无限制 + singleCD: 2000 # 群聊中个人操作冷却时间,单位毫秒 diff --git a/src/Yunzai-Bot/config/default_config/other.yaml b/src/Yunzai-Bot/config/default_config/other.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4a2183e274a091840c08713cb5db1aa4347eddb2 --- /dev/null +++ b/src/Yunzai-Bot/config/default_config/other.yaml @@ -0,0 +1,23 @@ +# 是否自动同意加好友 1-同意 0-不处理 +autoFriend: 1 +# 是否自动退群人数,当被好友拉进群时,群人数小于配置值自动退出, 默认50,0则不处理 +autoQuit: 50 +# 主人QQ号 +masterQQ: + +# 禁用私聊功能 true:私聊只接受ck以及抽卡链接(Bot主人不受限制),false:私聊可以触发全部指令,默认false +disablePrivate: false +# 禁用私聊Bot提示内容 +disableMsg: "私聊功能已禁用,仅支持发送cookie,抽卡记录链接,记录日志文件" +# 私聊通行字符串 +disableAdopt: + - stoken +#白名单群,配置后只在该群生效 +whiteGroup: + +#黑名单群 +blackGroup: + - 213938015 +#黑名单qq +blackQQ: + - 528952540 \ No newline at end of file diff --git a/src/Yunzai-Bot/config/default_config/qq.yaml b/src/Yunzai-Bot/config/default_config/qq.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b15e562b8892423bfb496a6b9c4ac795b874038a --- /dev/null +++ b/src/Yunzai-Bot/config/default_config/qq.yaml @@ -0,0 +1,6 @@ +# qq账号 +qq: +# 密码,为空则用扫码登录,扫码登录现在仅能在同一ip下进行 +pwd: +# 1:安卓手机、 2:aPad 、 3:安卓手表、 4:MacOS 、 5:iPad +platform: 5 \ No newline at end of file diff --git a/src/Yunzai-Bot/config/default_config/redis.yaml b/src/Yunzai-Bot/config/default_config/redis.yaml new file mode 100644 index 0000000000000000000000000000000000000000..0c268438a93f0d5acd694353e368aab4c22996a4 --- /dev/null +++ b/src/Yunzai-Bot/config/default_config/redis.yaml @@ -0,0 +1,9 @@ +# redis地址 +host: 127.0.0.1 +# redis端口 +port: 6379 +# redis密码,没有密码可以为空 +password: +# redis数据库 +db: 0 + diff --git a/src/Yunzai-Bot/config/pm2/pm2.json b/src/Yunzai-Bot/config/pm2/pm2.json new file mode 100644 index 0000000000000000000000000000000000000000..5308d97a5501508275d3ac81a2ec0bfc78f3dcb3 --- /dev/null +++ b/src/Yunzai-Bot/config/pm2/pm2.json @@ -0,0 +1,10 @@ +{ + "apps": [ + { + "name": "Yunzai-Bot", + "script": "./app.js", + "max_memory_restart": "512M", + "restart_delay": 60000 + } + ] +} \ No newline at end of file diff --git a/src/Yunzai-Bot/config/test/default.yaml b/src/Yunzai-Bot/config/test/default.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1477402e2630fb135e0267d3b2692b18d84a374b --- /dev/null +++ b/src/Yunzai-Bot/config/test/default.yaml @@ -0,0 +1,10 @@ +# 默认测试配置,其他配置自行复制 +post_type: message +message_type: group +sub_type: normal +group_id: 213938015 +group_name: '2333' +user_id: 805475874 +# 测试命令 +text: 十连 +card: 测试(104070461) diff --git a/src/Yunzai-Bot/docker-compose.yaml b/src/Yunzai-Bot/docker-compose.yaml new file mode 100644 index 0000000000000000000000000000000000000000..caea56665286706f5b7ad8fd6af0d0de90b62ccc --- /dev/null +++ b/src/Yunzai-Bot/docker-compose.yaml @@ -0,0 +1,51 @@ +version: "3" +services: + yunzai-bot: + container_name: yunzai-bot + # build: ./docker # 使用 Dockerfile 本地构建 + image: swr.cn-south-1.myhuaweicloud.com/sirly/yunzai-bot:v3 # 使用云端精简镜像 + # image: swr.cn-south-1.myhuaweicloud.com/sirly/yunzai-bot:v3plus # 使用扩展镜像,包含ffmpeg和python + # image: sirly/yunzai-bot:v3 # Docker Hub源 + # image: sirly/yunzai-bot:v3plus + # user: "1000:1000" # 指定容器内用户,格式"UID:GID"(请先修改文件夹权限) + restart: always + # ports: + # - "50831:50831" # 映射锅巴插件端口,格式"主机端口:容器内部端口" + volumes: + - ./yunzai/config/:/app/Yunzai-Bot/config/config/ # Bot基础配置文件 + - ./yunzai/genshin_config:/app/Yunzai-Bot/plugins/genshin/config # 公共Cookie,云崽功能配置文件 + - ./yunzai/logs:/app/Yunzai-Bot/logs # 日志文件 + - ./yunzai/data:/app/Yunzai-Bot/data # 数据文件 + # 以下目录是插件目录,安装完插件后需要手动添加映射(如有其他插件请自行添加) + # 映射格式:./yunzai/plugins/<插件目录名>:/app/Yunzai-Bot/plugins/<插件目录名> + # - ./yunzai/plugins/example:/app/Yunzai-Bot/plugins/example # 单js插件目录 + # - ./yunzai/plugins/miao-plugin:/app/Yunzai-Bot/plugins/miao-plugin # 喵喵插件 + # - ./yunzai/plugins/py-plugin:/app/Yunzai-Bot/plugins/py-plugin # 新py插件 + # - ./yunzai/plugins/xiaoyao-cvs-plugin:/app/Yunzai-Bot/plugins/xiaoyao-cvs-plugin # 图鉴插件 + #### [警告] 受云崽架构和docker特性限制,使用锅巴插件安装的插件无法持久化,销毁容器后新安装的插件会消失,请谨慎使用 #### + # - ./yunzai/plugins/Guoba-Plugin:/app/Yunzai-Bot/plugins/Guoba-Plugin # 锅巴插件 + environment: + - CUID=1000 # 宿主机运行 id -u 获取 + - CGID=1000 # 宿主机运行 id -g 获取 + depends_on: + redis: { condition: service_healthy } + deploy: + resources: + limits: + memory: 2G + + redis: + container_name: yunzai-redis + image: redis:alpine + restart: always + volumes: + # 前往 https://download.redis.io/redis-stable/redis.conf 下载配置文件,放入 ./redis/config 文件夹中 + # - ./redis/config:/etc/redis/ # Redis配置文件 + - ./redis/data:/data + - ./redis/logs:/logs + # command: /etc/redis/redis.conf # 取消注释以应用Redis配置文件 + healthcheck: + test: [ "CMD", "redis-cli", "PING" ] + start_period: 10s + interval: 5s + timeout: 1s diff --git a/src/Yunzai-Bot/docker-entrypoint.py b/src/Yunzai-Bot/docker-entrypoint.py new file mode 100644 index 0000000000000000000000000000000000000000..d9639efc85cb8ca75df44fa5d8ff639a00178608 --- /dev/null +++ b/src/Yunzai-Bot/docker-entrypoint.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +import subprocess +import os + +# soft link every plugin in ./user_plugins to ./plugins, like ./user_plugins/miao -> ./plugins/miao +def link_plugins(): + buildin_plugins = [ + "example", "genshin", "other", "system" + ] + + # when container restart, remove all plugins in ./plugins except buildin plugins + for plugin in os.listdir("./plugins"): + if plugin not in buildin_plugins: + subprocess.run(["rm", "-rf", "./plugins/" + plugin]) + + for plugin in os.listdir("./user_plugins"): + if plugin in buildin_plugins: + print(f"plugin {plugin} is buildin, please rename it", flush=True) + exit(1) + + subprocess.run(["ln", "-s", "../user_plugins/" + plugin, "./plugins/" + plugin]) + print("copy plugin %s to ./plugins" % plugin, flush=True) + + +def run_server(): + print("run server", flush=True) + subprocess.run(["node", "./lib/tools/server.js"]) + + +def main(): + link_plugins() + run_server() + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/src/Yunzai-Bot/docker/Dockerfile b/src/Yunzai-Bot/docker/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..b9f00c6ed5c5397e6ba9f34e9ae2b04ce091b18a --- /dev/null +++ b/src/Yunzai-Bot/docker/Dockerfile @@ -0,0 +1,59 @@ +FROM debian:stable AS resource + +RUN apt-get update \ + && apt-get upgrade -y \ + && apt-get install -y wget xz-utils dos2unix \ + && wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-$(dpkg --print-architecture)-static.tar.xz \ + && mkdir -p /res/ffmpeg \ + && tar -xvf ./ffmpeg-git-$(dpkg --print-architecture)-static.tar.xz -C /res/ffmpeg --strip-components 1 + +COPY docker-entrypoint.sh /res/entrypoint.sh + +RUN dos2unix /res/entrypoint.sh \ + && chmod +x /res/entrypoint.sh + + +FROM node:lts-slim AS runtime + +COPY --from=resource /res/ffmpeg/ffmpeg /usr/bin/ffmpeg + +COPY --from=resource /res/ffmpeg/ffprobe /usr/bin/ffprobe + +RUN apt-get update \ + && apt-get upgrade -y \ + && apt-get install -y curl wget gnupg git python3-pip fonts-wqy-microhei xfonts-utils chromium fontconfig libxss1 libgl1 \ + && apt-get autoremove \ + && apt-get clean + +RUN fc-cache -f -v + +RUN git config --global --add safe.directory '*' \ + && git config --global pull.rebase false \ + && git config --global user.email "Yunzai@yunzai.bot" \ + && git config --global user.name "Yunzai" + +RUN npm install pnpm -g + +RUN ln -s /usr/bin/python3 /usr/bin/python \ + && curl -fsSL https://install.python-poetry.org | python - \ + && ln -s /$HOME/.local/bin/poetry /usr/bin \ + && poetry config virtualenvs.in-project true + +RUN rm -rf /var/cache/* \ + && rm -rf /tmp/* + + +FROM runtime AS prod + +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium + +RUN git clone --depth=1 --branch main https://gitee.com/Le-niao/Yunzai-Bot.git /app/Yunzai-Bot\ + && cd /app/Yunzai-Bot \ + && sed -i 's/127.0.0.1/redis/g' ./config/default_config/redis.yaml \ + && pnpm install -P + +COPY --from=resource /res/entrypoint.sh /app/Yunzai-Bot/entrypoint.sh + +WORKDIR /app/Yunzai-Bot +ENTRYPOINT ["/app/Yunzai-Bot/entrypoint.sh"] diff --git a/src/Yunzai-Bot/docker/docker-entrypoint.sh b/src/Yunzai-Bot/docker/docker-entrypoint.sh new file mode 100644 index 0000000000000000000000000000000000000000..3675ce16421e8f530bdd6174d12fe0ab66fc1d33 --- /dev/null +++ b/src/Yunzai-Bot/docker/docker-entrypoint.sh @@ -0,0 +1,181 @@ +#!/usr/bin/env bash + +set +e + +GreenBG="\\033[42;37m" +YellowBG="\\033[43;37m" +BlueBG="\\033[44;37m" +Font="\\033[0m" + +Version="${BlueBG}[版本]${Font}" +Info="${GreenBG}[信息]${Font}" +Warn="${YellowBG}[提示]${Font}" + +WORK_DIR="/app/Yunzai-Bot" +MIAO_PLUGIN_PATH="/app/Yunzai-Bot/plugins/miao-plugin" +XIAOYAO_CVS_PATH="/app/Yunzai-Bot/plugins/xiaoyao-cvs-plugin" +PY_PLUGIN_PATH="/app/Yunzai-Bot/plugins/py-plugin" + +if [[ ! -d "$HOME/.ovo" ]]; then + mkdir ~/.ovo +fi + +echo -e "\n ================ \n ${Info} ${GreenBG} 拉取 Yunzai-Bot 更新 ${Font} \n ================ \n" + +cd $WORK_DIR + +if [[ -z $(git status -s) ]]; then + echo -e " ${Warn} ${YellowBG} 当前工作区有修改,尝试暂存后更新。${Font}" + git add . + git stash + git pull origin main --allow-unrelated-histories --rebase + git stash pop +else + git pull origin main --allow-unrelated-histories +fi + +if [[ ! -f "$HOME/.ovo/yunzai.ok" ]]; then + set -e + echo -e "\n ================ \n ${Info} ${GreenBG} 更新 Yunzai-Bot 运行依赖 ${Font} \n ================ \n" + pnpm install -P + touch ~/.ovo/yunzai.ok + set +e +fi + +echo -e "\n ================ \n ${Version} ${BlueBG} Yunzai-Bot 版本信息 ${Font} \n ================ \n" + +git log -1 --pretty=format:"%h - %an, %ar (%cd) : %s" + +if [ -d $MIAO_PLUGIN_PATH"/.git" ]; then + + echo -e "\n ================ \n ${Info} ${GreenBG} 拉取 喵喵插件 更新 ${Font} \n ================ \n" + + cd $MIAO_PLUGIN_PATH + + if [[ -n $(git status -s) ]]; then + echo -e " ${Warn} ${YellowBG} 当前工作区有修改,尝试暂存后更新。${Font}" + git add . + git stash + git pull origin master --allow-unrelated-histories --rebase + git stash pop + else + git pull origin master --allow-unrelated-histories + fi + + if [[ ! -f "$HOME/.ovo/miao.ok" ]]; then + set -e + echo -e "\n ================ \n ${Info} ${GreenBG} 更新 喵喵插件 运行依赖 ${Font} \n ================ \n" + pnpm add image-size -w + touch ~/.ovo/miao.ok + set +e + fi + + echo -e "\n ================ \n ${Version} ${BlueBG} 喵喵插件版本信息 ${Font} \n ================ \n" + git log -1 --pretty=format:"%h - %an, %ar (%cd) : %s" + +fi + +if [ -d $PY_PLUGIN_PATH"/.git" ]; then + + echo -e "\n ================ \n ${Info} ${GreenBG} 拉取 py-plugin 插件更新 ${Font} \n ================ \n" + + cd $PY_PLUGIN_PATH + + if [[ -n $(git status -s) ]]; then + echo -e " ${Warn} ${YellowBG} 当前工作区有修改,尝试暂存后更新。${Font}" + git add . + git stash + git pull origin main --allow-unrelated-histories --rebase + git stash pop + else + git pull origin main --allow-unrelated-histories + fi + + if [[ ! -f "$HOME/.ovo/py.ok" ]]; then + set -e + echo -e "\n ================ \n ${Info} ${GreenBG} 更新 py-plugin 运行依赖 ${Font} \n ================ \n" + pnpm install iconv-lite @grpc/grpc-js @grpc/proto-loader -w + poetry config virtualenvs.in-project true + poetry install + touch ~/.ovo/py.ok + set +e + fi + + echo -e "\n ================ \n ${Version} ${BlueBG} py-plugin 插件版本信息 ${Font} \n ================ \n" + + git log -1 --pretty=format:"%h - %an, %ar (%cd) : %s" + +fi + +if [ -d $XIAOYAO_CVS_PATH"/.git" ]; then + + echo -e "\n ================ \n ${Info} ${GreenBG} 拉取 xiaoyao-cvs 插件更新 ${Font} \n ================ \n" + + cd $XIAOYAO_CVS_PATH + + if [[ -n $(git status -s) ]]; then + echo -e " ${Warn} ${YellowBG} 当前工作区有修改,尝试暂存后更新。${Font}" + git add . + git stash + git pull origin master --allow-unrelated-histories --rebase + git stash pop + else + git pull origin master --allow-unrelated-histories + fi + + if [[ ! -f "$HOME/.ovo/xiaoyao.ok" ]]; then + set -e + echo -e "\n ================ \n ${Info} ${GreenBG} 更新 xiaoyao-cvs 插件运行依赖 ${Font} \n ================ \n" + pnpm add promise-retry superagent -w + touch ~/.ovo/xiaoyao.ok + set +e + fi + + echo -e "\n ================ \n ${Version} ${BlueBG} xiaoyao-cvs 插件版本信息 ${Font} \n ================ \n" + + git log -1 --pretty=format:"%h - %an, %ar (%cd) : %s" +fi + +if [ -d $GUOBA_PLUGIN_PATH"/.git" ]; then + + echo -e "\n ================ \n ${Info} ${GreenBG} 拉取 Guoba-Plugin 插件更新 ${Font} \n ================ \n" + + cd $GUOBA_PLUGIN_PATH + + if [[ -n $(git status -s) ]]; then + echo -e " ${Warn} ${YellowBG} 当前工作区有修改,尝试暂存后更新。${Font}" + git add . + git stash + git pull origin master --allow-unrelated-histories --rebase + git stash pop + else + git pull origin master --allow-unrelated-histories + fi + + if [[ ! -f "$HOME/.ovo/guoba.ok" ]]; then + set -e + echo -e "\n ================ \n ${Info} ${GreenBG} 更新 Guoba-Plugin 插件运行依赖 ${Font} \n ================ \n" + pnpm add multer body-parser jsonwebtoken -w + touch ~/.ovo/guoba.ok + set +e + fi + + echo -e "\n ================ \n ${Version} ${BlueBG} Guoba-Plugin 插件版本信息 ${Font} \n ================ \n" + + git log -1 --pretty=format:"%h - %an, %ar (%cd) : %s" +fi + +set -e + +cd $WORK_DIR + +echo -e "\n ================ \n ${Info} ${GreenBG} 初始化 Docker 环境 ${Font} \n ================ \n" + +if [ -f "./config/config/redis.yaml" ]; then + sed -i 's/127.0.0.1/redis/g' ./config/config/redis.yaml + echo -e "\n 修改Redis地址完成~ \n" +fi + +echo -e "\n ================ \n ${Info} ${GreenBG} 启动 Yunzai-Bot ${Font} \n ================ \n" + +node app diff --git a/src/Yunzai-Bot/docker/qq.yaml b/src/Yunzai-Bot/docker/qq.yaml new file mode 100644 index 0000000000000000000000000000000000000000..388b6f6dcd84f9552a760060cc5deca6d964851f --- /dev/null +++ b/src/Yunzai-Bot/docker/qq.yaml @@ -0,0 +1,6 @@ +# qq账号 +qq: 123456 +# 密码,为空则用扫码登录,扫码登录现在仅能在同一ip下进行 +pwd: +# 1:安卓手机、 2:aPad 、 3:安卓手表、 4:MacOS 、 5:iPad +platform: 5 \ No newline at end of file diff --git a/src/Yunzai-Bot/lib/bot.js b/src/Yunzai-Bot/lib/bot.js new file mode 100644 index 0000000000000000000000000000000000000000..cb55e68095db86299412c2f78c173505b9677b04 --- /dev/null +++ b/src/Yunzai-Bot/lib/bot.js @@ -0,0 +1,20 @@ +import './config/init.js' +import ListenerLoader from './listener/loader.js' +import { Client } from 'oicq' +import cfg from './config/config.js' + +export default class Yunzai extends Client { + // eslint-disable-next-line no-useless-constructor + constructor (uin, conf) { + super(uin, conf) + } + + /** 登录机器人 */ + static async run () { + const bot = new Yunzai(cfg.qq, cfg.bot) + /** 加载oicq事件监听 */ + await ListenerLoader.load(bot) + await bot.login(cfg.pwd) + return bot + } +} diff --git a/src/Yunzai-Bot/lib/common/common.js b/src/Yunzai-Bot/lib/common/common.js new file mode 100644 index 0000000000000000000000000000000000000000..42a0df954473cb44b7ab1cf5bea5d907697fed50 --- /dev/null +++ b/src/Yunzai-Bot/lib/common/common.js @@ -0,0 +1,108 @@ + +import { pipeline } from 'stream' +import { promisify } from 'util' +import fetch from 'node-fetch' +import fs from 'node:fs' +import path from 'node:path' + +/** + * 发送私聊消息,仅给好友发送 + * @param user_id qq号 + * @param msg 消息 + */ +async function relpyPrivate (userId, msg) { + userId = Number(userId) + + let friend = Bot.fl.get(userId) + if (friend) { + logger.mark(`发送好友消息[${friend.nickname}](${userId})`) + return await Bot.pickUser(userId).sendMsg(msg).catch((err) => { + logger.mark(err) + }) + } +} + +/** + * 休眠函数 + * @param ms 毫秒 + */ +function sleep (ms) { + return new Promise((resolve) => setTimeout(resolve, ms)) +} + +/** + * 下载保存文件 + * @param fileUrl 下载地址 + * @param savePath 保存路径 + */ +async function downFile (fileUrl, savePath,param = {}) { + try { + mkdirs(path.dirname(savePath)) + logger.debug(`[下载文件] ${fileUrl}`) + const response = await fetch(fileUrl,param) + const streamPipeline = promisify(pipeline) + await streamPipeline(response.body, fs.createWriteStream(savePath)) + return true + } catch (err) { + logger.error(`下载文件错误:${err}`) + return false + } +} + +function mkdirs (dirname) { + if (fs.existsSync(dirname)) { + return true + } else { + if (mkdirs(path.dirname(dirname))) { + fs.mkdirSync(dirname) + return true + } + } +} + +/** + * 制作转发消息 + * @param e oicq消息e + * @param msg 消息数组 + * @param dec 转发描述 + */ +async function makeForwardMsg (e, msg = [], dec = '') { + let nickname = Bot.nickname + if (e.isGroup) { + let info = await Bot.getGroupMemberInfo(e.group_id, Bot.uin) + nickname = info.card || info.nickname + } + let userInfo = { + user_id: Bot.uin, + nickname + } + + let forwardMsg = [] + msg.forEach(v => { + forwardMsg.push({ + ...userInfo, + message: v + }) + }) + + /** 制作转发内容 */ + if (e.isGroup) { + forwardMsg = await e.group.makeForwardMsg(forwardMsg) + } else if (e.friend) { + forwardMsg = await e.friend.makeForwardMsg(forwardMsg) + } else { + return false + } + + if (dec) { + /** 处理描述 */ + forwardMsg.data = forwardMsg.data + .replace(/\n/g, '') + .replace(/(.+?)<\/title>/g, '___') + .replace(/___+/, `<title color="#777777" size="26">${dec}`) + } + + return forwardMsg +} + +export default { sleep, relpyPrivate, downFile, makeForwardMsg } diff --git a/src/Yunzai-Bot/lib/config/check.js b/src/Yunzai-Bot/lib/config/check.js new file mode 100644 index 0000000000000000000000000000000000000000..49931d6d701bb9462394afea0cbfe9ff2e479311 --- /dev/null +++ b/src/Yunzai-Bot/lib/config/check.js @@ -0,0 +1,32 @@ +import fs from 'fs' +import { createRequire } from 'module' +const require = createRequire(import.meta.url) +const { exec } = require('child_process') + +export async function checkRun () { + if (process.argv[1].includes('pm2')) return + if (process.argv[1].includes('test')) return + + let cfg = pm2Cfg() + let status = await execSync(`pm2 show ${cfg.apps[0].name}`) + + if (status.stdout.includes('online')) { + logger.mark('检测到后台正在运行') + logger.mark('已停止后台进程,防止重复运行') + execSync(`pm2 stop ${cfg.apps[0].name}`) + } +} + +async function execSync (cmd) { + return new Promise((resolve, reject) => { + exec(cmd, (error, stdout, stderr) => { + resolve({ error, stdout, stderr }) + }) + }) +} + +function pm2Cfg () { + let cfg = fs.readFileSync('./config/pm2/pm2.json') + cfg = JSON.parse(cfg) + return cfg +} diff --git a/src/Yunzai-Bot/lib/config/config.js b/src/Yunzai-Bot/lib/config/config.js new file mode 100644 index 0000000000000000000000000000000000000000..65ad5196b9fbfeb19d1e67f4abb5827e9ce74fef --- /dev/null +++ b/src/Yunzai-Bot/lib/config/config.js @@ -0,0 +1,157 @@ +import YAML from 'yaml' +import fs from 'node:fs' +import chokidar from 'chokidar' + +/** 配置文件 */ +class Cfg { + constructor () { + this.config = {} + + /** 监听文件 */ + this.watcher = { config: {}, defSet: {} } + + this.initCfg() + } + + /** 初始化配置 */ + initCfg () { + let path = './config/config/' + let pathDef = './config/default_config/' + const files = fs.readdirSync(pathDef).filter(file => file.endsWith('.yaml')) + for (let file of files) { + if (!fs.existsSync(`${path}${file}`)) { + fs.copyFileSync(`${pathDef}${file}`, `${path}${file}`) + } + } + } + + /** 机器人qq号 */ + get qq () { + return Number(this.getConfig('qq').qq) + } + + /** 密码 */ + get pwd () { + return this.getConfig('qq').pwd + } + + /** oicq配置 */ + get bot () { + let bot = this.getConfig('bot') + let defbot = this.getdefSet('bot') + bot = { ...defbot, ...bot } + bot.platform = this.getConfig('qq').platform + /** 设置data目录,防止pm2运行时目录不对 */ + bot.data_dir = process.cwd() + '/data' + + if (!bot.ffmpeg_path) delete bot.ffmpeg_path + if (!bot.ffprobe_path) delete bot.ffprobe_path + + return bot + } + + get other () { + return this.getConfig('other') + } + + /** 主人qq */ + get masterQQ () { + let masterQQ = this.getConfig('other').masterQQ || [] + + if (Array.isArray(masterQQ)) { + masterQQ.forEach(qq => { qq = String(qq) }) + } else { + masterQQ = [String(masterQQ)] + } + return masterQQ + } + + /** package.json */ + get package () { + if (this._package) return this._package + + this._package = JSON.parse(fs.readFileSync('./package.json', 'utf8')) + return this._package + } + + /** 群配置 */ + getGroup (groupId = '') { + let config = this.getConfig('group') + let defCfg = this.getdefSet('group') + if (config[groupId]) { + return { ...defCfg.default, ...config.default, ...config[groupId] } + } + return { ...defCfg.default, ...config.default } + } + + /** other配置 */ + getOther () { + let def = this.getdefSet('other') + let config = this.getConfig('other') + return { ...def, ...config } + } + + /** + * @param app 功能 + * @param name 配置文件名称 + */ + getdefSet (name) { + return this.getYaml('default_config', name) + } + + /** 用户配置 */ + getConfig (name) { + return this.getYaml('config', name) + } + + /** + * 获取配置yaml + * @param type 默认跑配置-defSet,用户配置-config + * @param name 名称 + */ + getYaml (type, name) { + let file = `./config/${type}/${name}.yaml` + let key = `${type}.${name}` + if (this.config[key]) return this.config[key] + + this.config[key] = YAML.parse( + fs.readFileSync(file, 'utf8') + ) + + this.watch(file, name, type) + + return this.config[key] + } + + /** 监听配置文件 */ + watch (file, name, type = 'default_config') { + let key = `${type}.${name}` + + if (this.watcher[key]) return + + const watcher = chokidar.watch(file) + watcher.on('change', path => { + delete this.config[key] + if (typeof Bot == 'undefined') return + logger.mark(`[修改配置文件][${type}][${name}]`) + if (this[`change_${name}`]) { + this[`change_${name}`]() + } + }) + + this.watcher[key] = watcher + } + + change_qq () { + if (process.argv.includes('login') || !this.qq) return + logger.info('修改qq或密码,请手动重启') + } + + async change_bot () { + /** 修改日志等级 */ + let log = await import('./log.js') + log.default() + } +} + +export default new Cfg() diff --git a/src/Yunzai-Bot/lib/config/init.js b/src/Yunzai-Bot/lib/config/init.js new file mode 100644 index 0000000000000000000000000000000000000000..ddc713fad761cccd431116282ee58d5d25b1bf44 --- /dev/null +++ b/src/Yunzai-Bot/lib/config/init.js @@ -0,0 +1,51 @@ + +import createQQ from './qq.js' +import setLog from './log.js' +import redisInit from './redis.js' +import { checkRun } from './check.js' +import fs from 'fs' + +/** 设置标题 */ +process.title = 'Yunzai-Bot' +/** 设置时区 */ +process.env.TZ = 'Asia/Shanghai' + +/** 捕获未处理的Promise错误 */ +process.on('unhandledRejection', (error, promise) => { + let err = error + if (logger) { + logger.error(err) + } else { + console.log(err) + } +}) + +/** 退出事件 */ +process.on('exit', async (code) => { + if (typeof redis != 'undefined' && typeof test == 'undefined') { + await redis.save() + } +}) + +await checkInit() + +/** 初始化事件 */ +async function checkInit () { + /** 检查node_modules */ + if (!fs.existsSync('./node_modules') || !fs.existsSync('./node_modules/oicq')) { + console.log('请先npm install安装') + process.exit() + } + + /** 检查qq.yaml */ + // await createQQ() + + /** 日志设置 */ + setLog() + + logger.mark('Yunzai-Bot 启动中...') + + await redisInit() + + checkRun() +} diff --git a/src/Yunzai-Bot/lib/config/log.js b/src/Yunzai-Bot/lib/config/log.js new file mode 100644 index 0000000000000000000000000000000000000000..6cf77dd1f6534e6ddd9976be619d6b38e77a42a2 --- /dev/null +++ b/src/Yunzai-Bot/lib/config/log.js @@ -0,0 +1,98 @@ +import log4js from 'log4js' +import chalk from 'chalk' +import cfg from './config.js' +import fs from 'node:fs' + +/** +* 设置日志样式 +*/ +export default function setLog () { + let file = './logs' + if (!fs.existsSync(file)) { + fs.mkdirSync(file) + } + + /** 调整error日志等级 */ + // log4js.levels.levels[5].level = Number.MAX_VALUE + // log4js.levels.levels.sort((a, b) => a.level - b.level) + + log4js.configure({ + appenders: { + console: { + type: 'console', + layout: { + type: 'pattern', + pattern: '%[[YzBot][%d{hh:mm:ss.SSS}][%4.4p]%] %m' + } + }, + command: { + type: 'dateFile', // 可以是console,dateFile,file,Logstash等 + filename: 'logs/command', // 将会按照filename和pattern拼接文件名 + pattern: 'yyyy-MM-dd.log', + numBackups: 15, + alwaysIncludePattern: true, + layout: { + type: 'pattern', + pattern: '[%d{hh:mm:ss.SSS}][%4.4p] %m' + } + }, + error: { + type: 'file', + filename: 'logs/error.log', + alwaysIncludePattern: true, + layout: { + type: 'pattern', + pattern: '[%d{hh:mm:ss.SSS}][%4.4p] %m' + } + } + }, + categories: { + default: { appenders: ['console'], level: cfg.bot.log_level }, + command: { appenders: ['console', 'command'], level: 'warn' }, + error: { appenders: ['console', 'command', 'error'], level: 'error' } + } + }) + + const defaultLogger = log4js.getLogger('message') + const commandLogger = log4js.getLogger('command') + const errorLogger = log4js.getLogger('error') + + /* eslint-disable no-useless-call */ + /** 全局变量 logger */ + global.logger = { + trace () { + defaultLogger.trace.call(defaultLogger, ...arguments) + }, + debug () { + defaultLogger.debug.call(defaultLogger, ...arguments) + }, + info () { + defaultLogger.info.call(defaultLogger, ...arguments) + }, + // warn及以上的日志采用error策略 + warn () { + commandLogger.warn.call(defaultLogger, ...arguments) + }, + error () { + errorLogger.error.call(errorLogger, ...arguments) + }, + fatal () { + errorLogger.fatal.call(errorLogger, ...arguments) + }, + mark () { + errorLogger.mark.call(commandLogger, ...arguments) + } + } + + logColor() +} + +function logColor () { + logger.chalk = chalk + logger.red = chalk.red + logger.green = chalk.green + logger.yellow = chalk.yellow + logger.blue = chalk.blue + logger.magenta = chalk.magenta + logger.cyan = chalk.cyan +} diff --git a/src/Yunzai-Bot/lib/config/qq.js b/src/Yunzai-Bot/lib/config/qq.js new file mode 100644 index 0000000000000000000000000000000000000000..68ce902e8eff2dc88b5784a2b3041b1b9fbf34cf --- /dev/null +++ b/src/Yunzai-Bot/lib/config/qq.js @@ -0,0 +1,89 @@ +import fs from 'fs' +import inquirer from 'inquirer' +import cfg from './config.js' +import common from '../common/common.js' +import chalk from 'chalk' + +/** + * 创建qq配置文件 `config/bot/qq.yaml` + * Git Bash 运行npm命令会无法选择列表 + */ +export default async function createQQ () { + if (cfg.qq && !process.argv.includes('login')) { + return + } + console.log(`欢迎使用${chalk.green('Yunzai-Bot v' + cfg.package.version)}\n请按提示输入完成QQ配置`) + let propmtList = [ + { + type: 'Input', + message: '请输入机器人QQ号(请用小号):', + name: 'QQ', + validate (value) { + if (/^[1-9][0-9]{4,14}$/.test(value)) return true + return '请输入正确的QQ号' + } + }, + { + type: process.platform == 'win32' ? 'Input' : 'password', + message: '请输入登录密码(为空则扫码登录):', + name: 'pwd' + }, + { + type: 'list', + message: '请选择登录端口:', + name: 'platform', + default: '5', + choices: ['iPad', '安卓手机', '安卓手表', 'MacOS', 'aPad'], + filter: (val) => { + switch (val) { + case 'iPad':return 5 + case 'MacOS':return 4 + case '安卓手机':return 1 + case '安卓手表':return 3 + case 'aPad':return 2 + default:return 5 + } + } + } + // ,{ + // type: 'Input', + // message: '代理服务器地址,无需代理服务器请直接按下Enter:', + // name: 'proxyAddress', + // default: 'http://0.0.0.0:0' + // } + ] + + if (!process.argv.includes('login')) { + propmtList.push({ + type: 'Input', + message: '请输入主人QQ号:', + name: 'masterQQ' + }) + } + const ret = await inquirer.prompt(propmtList) + + let file = './config/config/' + let fileDef = './config/default_config/' + + let qq = fs.readFileSync(`${fileDef}qq.yaml`, 'utf8') + + qq = qq.replace(/qq:/g, 'qq: ' + ret.QQ) + qq = qq.replace(/pwd:/g, `pwd: '${ret.pwd}'`) + qq = qq.replace(/platform: [1-5]/g, 'platform: ' + Number(ret.platform)) + fs.writeFileSync(`${file}qq.yaml`, qq, 'utf8') + + let bot = fs.readFileSync(`${fileDef}bot.yaml`, 'utf8') + // bot = bot.replace(/proxyAddress:/g, `proxyAddress: ${ret.proxyAddress}`) + + if (ret.masterQQ) { + let other = fs.readFileSync(`${fileDef}other.yaml`, 'utf8') + other = other.replace(/masterQQ:/g, `masterQQ:\n - ${ret.masterQQ}`) + fs.writeFileSync(`${file}other.yaml`, other, 'utf8') + } + + fs.writeFileSync(`${file}bot.yaml`, bot, 'utf8') + + console.log(`\nQQ配置完成,正在登录\n后续修改账号可以运行命令: ${chalk.green('npm run login')}\n`) + + await common.sleep(2000) +} diff --git a/src/Yunzai-Bot/lib/config/redis.js b/src/Yunzai-Bot/lib/config/redis.js new file mode 100644 index 0000000000000000000000000000000000000000..ffba404d8203f3d23c4529c62f63d3d7761f3677 --- /dev/null +++ b/src/Yunzai-Bot/lib/config/redis.js @@ -0,0 +1,127 @@ +import YAML from 'yaml' +import fs from 'fs' +import common from '../common/common.js' +import { createClient } from 'redis' + +import { createRequire } from 'module' +const require = createRequire(import.meta.url) +const { exec } = require('child_process') + +/** + * 初始化全局redis客户端 + */ +export default async function redisInit () { + logger.mark('连接redis....') + const file = './config/config/redis.yaml' + const cfg = YAML.parse(fs.readFileSync(file, 'utf8')) + + let redisUrl = '' + if (cfg.password) { + redisUrl = `redis://:${cfg.password}@${cfg.host}:${cfg.port}` + } else { + redisUrl = `redis://${cfg.host}:${cfg.port}` + } + + // 初始化reids + let client = createClient({ url: redisUrl }) + + try { + await client.connect() + } catch (error) { + let err = error.toString() + + if (err != 'Error: connect ECONNREFUSED 127.0.0.1:6379') { + logger.error('redis链接失败!') + process.exit() + } + + /** windows */ + if (process.platform == 'win32') { + logger.error('请先开启Redis') + logger.error('window系统:双击redis-server.exe启动') + process.exit() + } else { + let cmd = 'redis-server --save 900 1 --save 300 10 --daemonize yes' + let arm = await aarch64() + /** 安卓端自动启动redis */ + if (arm) { + client = await startRedis(`${cmd}${arm}`, client, redisUrl) + } else { + logger.error('请先开启Redis') + logger.error(`redis启动命令:${cmd} ${arm}`) + process.exit() + } + } + } + + client.on('error', async (err) => { + let log = { error: (log) => console.log(log) } + if (typeof logger != 'undefined') log = logger + if (err == 'Error: connect ECONNREFUSED 127.0.0.1:6379') { + if (process.platform == 'win32') { + log.error('请先开启Redis') + log.error('window系统:双击redis-server.exe启动') + } else { + let cmd = 'redis-server --save 900 1 --save 300 10 --daemonize yes' + let arm = await aarch64() + log.error('请先开启Redis') + log.error(`redis启动命令:${cmd} ${arm}`) + } + } else { + log.error(`redis错误:${err}`) + } + process.exit() + }) + + client.select(cfg.db) + /** 全局变量 redis */ + global.redis = client + + logger.mark('连接redis成功') + + return client +} + +async function aarch64 () { + let tips = '' + /** 判断arch */ + let arch = await execSync('arch') + if (arch.stdout && arch.stdout.includes('aarch64')) { + /** 判断redis版本 */ + let v = await execSync('redis-server -v') + if (v.stdout) { + v = v.stdout.match(/v=(\d)./) + /** 忽略arm警告 */ + if (v && v[1] >= 6) tips = ' --ignore-warnings ARM64-COW-BUG' + } + } + tips = ' --ignore-warnings ARM64-COW-BUG' + return tips +} + +/** 尝试自动启动redis */ +async function startRedis (cmd, client, redisUrl) { + logger.mark('尝试启动redis') + await execSync(cmd) + await common.sleep(500) + try { + /** 重新链接 */ + client = createClient({ url: redisUrl }) + await client.connect() + } catch (error) { + let err = error.toString() + logger.mark(err) + logger.error('请先开启Redis') + logger.error(`redis启动命令:${cmd}`) + process.exit() + } + return client +} + +async function execSync (cmd) { + return new Promise((resolve, reject) => { + exec(cmd, (error, stdout, stderr) => { + resolve({ error, stdout, stderr }) + }) + }) +} diff --git a/src/Yunzai-Bot/lib/events/login.js b/src/Yunzai-Bot/lib/events/login.js new file mode 100644 index 0000000000000000000000000000000000000000..a6ef721a6e5989ffa599b274ecddf710fdec0752 --- /dev/null +++ b/src/Yunzai-Bot/lib/events/login.js @@ -0,0 +1,182 @@ +import EventListener from '../listener/listener.js' +import common from '../common/common.js' +import inquirer from 'inquirer' +import lodash from 'lodash' +import fetch from 'node-fetch' + +/** + * 监听上线事件 + */ +export default class loginEvent extends EventListener { + constructor () { + super({ + prefix: 'system.login.', + event: ['qrcode', 'slider', 'device', 'error'], + once: false + }) + } + + async execute (event) {} + + /** 扫码登录现在仅能在同一ip下进行 */ + async qrcode (event) { + logger.mark(`请使用登录当前QQ的手机${logger.green('扫码')}完成登录,如果显示二维码过期,可以按${logger.green('回车键(Enter)')}刷新,重新输入密码请执行命令:${logger.green('npm run login')}`) + // logger.info('等待扫码中...') + + /** 获取扫码结果 */ + let time = 0 + let interval = setInterval(async () => { + time++ + let res = await this.client.queryQrcodeResult() + if (res.retcode === 0) { + console.log('\n') + logger.info(logger.green('扫码成功,开始登录..')) + console.log('\n') + await common.sleep(1000) + this.client.qrcodeLogin() + clearInterval(interval) + } + if (time >= 150) { + clearInterval(interval) + logger.error('等待扫码超时,已停止运行') + process.exit() + } + }, 2000) + + /** 刷新二维码 */ + inquirer.prompt({ type: 'Input', message: '回车刷新二维码,等待扫码中...\n', name: 'enter' }).then(async () => { + clearInterval(interval) + console.log(' 重新刷新二维码...\n\n') + await common.sleep(1000) + this.client.fetchQrcode() + }) + } + + /** + * 收到滑动验证码提示后,必须使用手机拉动,PC浏览器已经无效 + * https://github.com/takayama-lily/oicq/wiki/01.使用密码登录-(滑动验证码教程) + */ + async slider (event) { + console.log(`\n\n------------------${logger.green('↓↓滑动验证链接↓↓')}----------------------\n`) + console.log(logger.green(event.url)) + console.log('\n--------------------------------------------------------') + console.log(`提示:打开上面链接获取ticket,可使用${logger.green('【滑动验证app】')}获取`) + console.log(`链接存在${logger.green('有效期')},请尽快操作,多次操作失败可能会被冻结`) + console.log('滑动验证app下载地址:https://wwp.lanzouy.com/i6w3J08um92h 密码:3kuu\n') + + const ret = await inquirer.prompt([ + { + type: 'list', + name: 'type', + message: '触发滑动验证,需要获取ticket通过验证,请选择获取方式:', + choices: ['1.手动获取ticket', '2.滑动验证app请求码获取'] + } + ]) + + await common.sleep(200) + let ticket + + if (ret.type == '2.滑动验证app请求码获取') { + ticket = await this.requestCode(event.url) + if (!ticket) console.log('\n请求错误,返回手动获取ticket方式\n') + } + + if (!ticket) { + let res = await inquirer.prompt({ + type: 'Input', + message: '请输入ticket:', + name: 'ticket', + validate (value) { + if (!value) return 'ticket不能为空' + if (value.toLowerCase() == 'ticket') return '请输入获取的ticket' + if (value == event.url) return '请勿输入滑动验证链接' + return true + } + }) + ticket = lodash.trim(res.ticket, '"') + } + global.inputTicket = true + this.client.submitSlider(ticket.trim()) + } + + async requestCode (url) { + let txhelper = { + url: url.replace('ssl.captcha.qq.com', 'txhelper.glitch.me') + } + txhelper.req = await fetch(txhelper.url).catch((err) => console.log(err.toString())) + + if (!txhelper.req?.ok) return false + + txhelper.req = await txhelper.req.text() + if (!txhelper.req.includes('使用请求码')) return false + + txhelper.code = /\d+/g.exec(txhelper.req) + if (!txhelper.code) return false + + console.log(`\n请打开滑动验证app,输入请求码${logger.green('【' + txhelper.code + '】')},然后完成滑动验证\n`) + + await common.sleep(200) + await inquirer.prompt({ + type: 'Input', + message: '验证完成后按回车确认,等待在操作中...', + name: 'enter' + }) + + txhelper.res = await fetch(txhelper.url).catch((err) => console.log(err.toString())) + if (!txhelper.res) return false + txhelper.res = await txhelper.res.text() + + if (!txhelper.res) return false + if (txhelper.res == txhelper.req) { + console.log('\n未完成滑动验证') + return false + } + + console.log(`\n获取ticket成功:\n${txhelper.res}\n`) + return lodash.trim(txhelper.res) + } + + /** 设备锁 */ + async device (event) { + global.inputTicket = false + console.log(`\n\n------------------${logger.green('↓↓设备锁验证↓↓')}----------------------\n`) + const ret = await inquirer.prompt([ + { + type: 'list', + name: 'type', + message: '触发设备锁验证,请选择验证方式:', + choices: ['1.网页扫码验证', '2.发送短信验证码到密保手机'] + } + ]) + + await common.sleep(200) + + if (ret.type == '1.网页扫码验证') { + console.log('\n' + logger.green(event.url) + '\n') + console.log('请打开上面链接,完成验证后按回车') + await inquirer.prompt({ type: 'Input', message: '等待操作中...', name: 'enter' }) + await this.client.login() + } else { + console.log('\n') + this.client.sendSmsCode() + await common.sleep(200) + logger.info(`验证码已发送:${event.phone}\n`) + let res = await inquirer.prompt({ type: 'Input', message: '请输入短信验证码:', name: 'sms' }) + await this.client.submitSmsCode(res.sms) + } + } + + /** 登录错误 */ + error (event) { + if (Number(event.code) === 1) logger.error('QQ密码错误,运行命令重新登录:npm run login') + if (global.inputTicket && event.code == 237) { + logger.error(`${logger.red('ticket')}输入错误或者已失效,已停止运行,请重新登录验证`) + } else if (event?.message.includes('冻结')) { + logger.error('账号已被冻结,已停止运行') + } else { + logger.error('登录错误,已停止运行') + } + + process.exit() + } +} diff --git a/src/Yunzai-Bot/lib/events/message.js b/src/Yunzai-Bot/lib/events/message.js new file mode 100644 index 0000000000000000000000000000000000000000..edcbcbb5594160be0b53e251a93f19bb0a153335 --- /dev/null +++ b/src/Yunzai-Bot/lib/events/message.js @@ -0,0 +1,14 @@ +import EventListener from '../listener/listener.js' + +/** + * 监听群聊消息 + */ +export default class messageEvent extends EventListener { + constructor () { + super({ event: 'message' }) + } + + async execute (e) { + this.plugins.deal(e) + } +} diff --git a/src/Yunzai-Bot/lib/events/notice.js b/src/Yunzai-Bot/lib/events/notice.js new file mode 100644 index 0000000000000000000000000000000000000000..48bc6db1170e3c8e1ad27e46ed67447960f49c1e --- /dev/null +++ b/src/Yunzai-Bot/lib/events/notice.js @@ -0,0 +1,14 @@ +import EventListener from '../listener/listener.js' + +/** + * 监听群聊消息 + */ +export default class noticeEvent extends EventListener { + constructor () { + super({ event: 'notice' }) + } + + async execute (e) { + this.plugins.deal(e) + } +} diff --git a/src/Yunzai-Bot/lib/events/offline.js b/src/Yunzai-Bot/lib/events/offline.js new file mode 100644 index 0000000000000000000000000000000000000000..8fb9cf36737bf3c4d92c3d681bcad931a4337685 --- /dev/null +++ b/src/Yunzai-Bot/lib/events/offline.js @@ -0,0 +1,15 @@ +import EventListener from '../listener/listener.js' + +/** + * 监听下线事件 + */ +export default class onlineEvent extends EventListener { + constructor () { + super({ event: 'system.offline' }) + } + + /** 默认方法 */ + async execute (e) { + logger.mark('掉线了') + } +} diff --git a/src/Yunzai-Bot/lib/events/online.js b/src/Yunzai-Bot/lib/events/online.js new file mode 100644 index 0000000000000000000000000000000000000000..ecc66ff651286792effc3762ca64ba3914dcb932 --- /dev/null +++ b/src/Yunzai-Bot/lib/events/online.js @@ -0,0 +1,42 @@ +import EventListener from '../listener/listener.js' +import cfg from '../config/config.js' +import common from '../common/common.js' + +/** + * 监听上线事件 + */ +export default class onlineEvent extends EventListener { + constructor () { + super({ + event: 'system.online', + once: true + }) + } + + /** 默认方法 */ + async execute (e) { + logger.mark('----^_^----') + logger.mark(logger.green(`Yunzai-Bot 上线成功 版本v${cfg.package.version}`)) + logger.mark(logger.green('https://github.com/Le-niao/Yunzai-Bot')) + // logger.mark('-----------') + /** 加载插件 */ + await this.plugins.load() + + /** 上线通知 */ + this.loginMsg() + } + + async loginMsg () { + if (!cfg.bot.online_msg) return + if (!cfg.masterQQ || !cfg.masterQQ[0]) return + let key = `Yz:loginMsg:${Bot.uin}` + + if (await redis.get(key)) return + + let msg = `欢迎使用【Yunzai-Bot v${cfg.package.version}】\n【#帮助】查看指令说明\n【#状态】查看运行状态\n【#日志】查看运行日志\n【#更新】拉取github更新\n【#全部更新】更新全部插件\n【#更新日志】查看更新日志\n【#重启】重新启动\n【#配置ck】配置公共查询cookie` + + redis.set(key, '1', { EX: cfg.bot.online_msg_exp }) + + setTimeout(() => common.relpyPrivate(cfg.masterQQ[0], msg), 1000) + } +} diff --git a/src/Yunzai-Bot/lib/events/request.js b/src/Yunzai-Bot/lib/events/request.js new file mode 100644 index 0000000000000000000000000000000000000000..335f14511d391c1d79cdcb4abebf3359f35c963d --- /dev/null +++ b/src/Yunzai-Bot/lib/events/request.js @@ -0,0 +1,14 @@ +import EventListener from '../listener/listener.js' + +/** + * 监听群聊消息 + */ +export default class requestEvent extends EventListener { + constructor () { + super({ event: 'request' }) + } + + async execute (e) { + this.plugins.deal(e) + } +} diff --git a/src/Yunzai-Bot/lib/listener/listener.js b/src/Yunzai-Bot/lib/listener/listener.js new file mode 100644 index 0000000000000000000000000000000000000000..0d4a74741c1929ba86fa3241f097df84a01103b4 --- /dev/null +++ b/src/Yunzai-Bot/lib/listener/listener.js @@ -0,0 +1,16 @@ +import PluginsLoader from '../plugins/loader.js' + +export default class EventListener { + /** + * 事件监听 + * @param data.prefix 事件名称前缀 + * @param data.event 监听的事件 + * @param data.once 是否只监听一次 + */ + constructor (data) { + this.prefix = data.prefix || '' + this.event = data.event + this.once = data.once || false + this.plugins = PluginsLoader + } +} diff --git a/src/Yunzai-Bot/lib/listener/loader.js b/src/Yunzai-Bot/lib/listener/loader.js new file mode 100644 index 0000000000000000000000000000000000000000..0fdc074872e6a65e7439bc5130295e05813cd0ba --- /dev/null +++ b/src/Yunzai-Bot/lib/listener/loader.js @@ -0,0 +1,44 @@ +import fs from 'node:fs' +import lodash from 'lodash' + +/** + * 加载监听事件 + */ +class ListenerLoader { + /** + * 监听事件加载 + * @param client Bot示例 + */ + async load (client) { + this.client = client + + const files = fs.readdirSync('./lib/events').filter(file => file.endsWith('.js')) + + for (let File of files) { + try { + let listener = await import(`../events/${File}`) + + /* eslint-disable new-cap */ + if (!listener.default) continue + listener = new listener.default() + listener.client = this.client + const on = listener.once ? 'once' : 'on' + + if (lodash.isArray(listener.event)) { + listener.event.forEach((type) => { + const e = listener[type] ? type : 'execute' + this.client[on](listener.prefix + type, event => listener[e](event)) + }) + } else { + const e = listener[listener.event] ? listener.event : 'execute' + this.client[on](listener.prefix + listener.event, event => listener[e](event)) + } + } catch (e) { + logger.mark(`监听事件错误:${File}`) + logger.error(e) + } + } + } +} + +export default new ListenerLoader() diff --git a/src/Yunzai-Bot/lib/plugins/loader.js b/src/Yunzai-Bot/lib/plugins/loader.js new file mode 100644 index 0000000000000000000000000000000000000000..a4b97d31f4c0e99faad1b61ed3ca065c9cc631b7 --- /dev/null +++ b/src/Yunzai-Bot/lib/plugins/loader.js @@ -0,0 +1,828 @@ +import util from 'node:util' +import fs from 'node:fs' +import lodash from 'lodash' +import cfg from '../config/config.js' +import plugin from './plugin.js' +import schedule from 'node-schedule' +import { segment } from 'oicq' +import chokidar from 'chokidar' +import moment from 'moment' +import path from 'node:path' +import common from '../common/common.js' +import Runtime from './runtime.js' +/** 全局变量 plugin */ +global.plugin = plugin + +/** + * 加载插件 + */ +class PluginsLoader { + constructor () { + this.priority = [] + this.task = [] + this.dir = './plugins' + + /** 命令冷却cd */ + this.groupCD = {} + this.singleCD = {} + + /** 插件监听 */ + this.watcher = {} + } + + /** + * 监听事件加载 + * @param isRefresh 是否刷新 + */ + async load (isRefresh = false) { + this.delCount() + if (!lodash.isEmpty(this.priority) && !isRefresh) return + + const files = this.getPlugins() + + logger.info('加载插件中..') + + let pluCount = 0 + + let packageErr = [] + for (let File of files) { + try { + let tmp = await import(File.path) + if (tmp.apps) tmp = { ...tmp.apps } + let isAdd = false + lodash.forEach(tmp, (p, i) => { + if (!p.prototype) { + return + } + isAdd = true + /* eslint-disable new-cap */ + let plugin = new p() + logger.debug(`载入插件 [${File.name}][${plugin.name}]`) + /** 执行初始化 */ + this.runInit(plugin) + /** 初始化定时任务 */ + this.collectTask(plugin.task) + this.priority.push({ + class: p, + key: File.name, + name: plugin.name, + priority: plugin.priority + }) + }) + + if (isAdd) pluCount++ + } catch (error) { + if (error.stack.includes('Cannot find package')) { + packageErr.push({ error, File }) + } else { + logger.error(`载入插件错误:${logger.red(File.name)}`) + logger.error(decodeURI(error.stack)) + } + } + } + + this.packageTips(packageErr) + this.creatTask() + + logger.info(`加载定时任务[${this.task.length}个]`) + logger.info(`加载插件完成[${pluCount}个]`) + logger.info('-----------') + + /** 优先级排序 */ + this.priority = lodash.orderBy(this.priority, ['priority'], ['asc']) + // console.log(this.priority) + } + + async runInit (plugin) { + plugin.init && plugin.init() + } + + packageTips (packageErr) { + if (!packageErr || packageErr.length <= 0) return + logger.mark('--------插件载入错误--------') + packageErr.forEach(v => { + let pack = v.error.stack.match(/'(.+?)'/g)[0].replace(/'/g, '') + logger.mark(`${v.File.name} 缺少依赖:${logger.red(pack)}`) + logger.mark(`请执行安装依赖命令:${logger.red('pnpm add ' + pack + ' -w')}`) + }) + // logger.error('或者使用其他包管理工具安装依赖') + logger.mark('---------------------') + } + + getPlugins () { + let ignore = ['index.js'] + let files = fs.readdirSync(this.dir, { withFileTypes: true }) + let ret = [] + for (let val of files) { + let filepath = '../../plugins/' + val.name + let tmp = { + name: val.name + } + if (val.isFile()) { + if (!val.name.endsWith('.js')) continue + if (ignore.includes(val.name)) continue + tmp.path = filepath + ret.push(tmp) + continue + } + + if (fs.existsSync(`${this.dir}/${val.name}/index.js`)) { + tmp.path = filepath + '/index.js' + ret.push(tmp) + continue + } + + let apps = fs.readdirSync(`${this.dir}/${val.name}`, { withFileTypes: true }) + for (let app of apps) { + if (!app.name.endsWith('.js')) continue + if (ignore.includes(app.name)) continue + + ret.push({ + name: `${val.name}/${app.name}`, + path: `../../plugins/${val.name}/${app.name}` + }) + + /** 监听热更新 */ + this.watch(val.name, app.name) + + continue + } + } + + return ret + } + + /** + * 处理事件 + * + * 参数文档 https://oicqjs.github.io/oicq/interfaces/GroupMessageEvent.html + * @param e oicq Events + */ + async deal (e) { + /** 检查黑白名单 */ + if (!this.checkBlack(e)) return + /** 冷却 */ + if (!this.checkLimit(e)) return + /** 处理消息 */ + this.dealMsg(e) + /** 处理回复 */ + this.reply(e) + /** 过滤事件 */ + let priority = [] + /** 注册runtime */ + await Runtime.init(e) + + this.priority.forEach(v => { + let p = new v.class(e) + p.e = e + /** 判断是否启用功能 */ + if (!this.checkDisable(e, p)) return + /** 过滤事件 */ + if (!this.filtEvent(e, p)) return + priority.push(p) + }) + + for (let plugin of priority) { + /** 上下文hook */ + if (plugin.getContext) { + let context = plugin.getContext() + if (!lodash.isEmpty(context)) { + for (let fnc in context) { + plugin[fnc](context[fnc]) + } + return + } + } + + /** 群上下文hook */ + if (plugin.getContextGroup) { + let context = plugin.getContextGroup() + if (!lodash.isEmpty(context)) { + for (let fnc in context) { + plugin[fnc](context[fnc]) + } + return + } + } + } + + /** 是否只关注主动at */ + if (!this.onlyReplyAt(e)) return + + /** accept */ + for (let plugin of priority) { + /** accept hook */ + if (plugin.accept) { + let res = plugin.accept(e) + + if (util.types.isPromise(res)) res = await res + + if (res === 'return') return + + if (res) break + } + } + + /* eslint-disable no-labels */ + a: + for (let plugin of priority) { + /** 正则匹配 */ + if (plugin.rule) { + b: + for (let v of plugin.rule) { + /** 判断事件 */ + if (v.event && !this.filtEvent(e, v)) continue b + + if (new RegExp(v.reg).test(e.msg)) { + e.logFnc = `[${plugin.name}][${v.fnc}]` + + if (v.log !== false) { + logger.mark(`${e.logFnc}${e.logText} ${lodash.truncate(e.msg, { length: 80 })}`) + } + + /** 判断权限 */ + if (!this.filtPermission(e, v)) break a + + try { + let res = plugin[v.fnc] && plugin[v.fnc](e) + + let start = Date.now() + + if (util.types.isPromise(res)) res = await res + + if (res !== false) { + /** 设置冷却cd */ + this.setLimit(e) + if (v.log !== false) { + logger.mark(`${e.logFnc} ${lodash.truncate(e.msg, { length: 80 })} 处理完成 ${Date.now() - start}ms`) + } + break a + } + } catch (error) { + logger.error(`${e.logFnc}`) + logger.error(error.stack) + break a + } + } + } + } + } + } + + /** 过滤事件 */ + filtEvent (e, v) { + let event = v.event.split('.') + let eventMap = { + message: ['post_type', 'message_type', 'sub_type'], + notice: ['post_type', 'notice_type', 'sub_type'], + request: ['post_type', 'request_type', 'sub_type'] + } + let newEvent = [] + event.forEach((val, index) => { + if (val === '*') { + newEvent.push(val) + } else if (eventMap[e.post_type]) { + newEvent.push(e[eventMap[e.post_type][index]]) + } + }) + newEvent = newEvent.join('.') + + if (v.event == newEvent) return true + + return false + } + + /** 判断权限 */ + filtPermission (e, v) { + if (v.permission == 'all' || !v.permission) return true + + if (v.permission == 'master') { + if (e.isMaster) { + return true + } else { + e.reply('暂无权限,只有主人才能操作') + return false + } + } + + if (e.isGroup) { + if (!e.member?._info) { + e.reply('数据加载中,请稍后再试') + return false + } + if (v.permission == 'owner') { + if (!e.member.is_owner) { + e.reply('暂无权限,只有群主才能操作') + return false + } + } + if (v.permission == 'admin') { + if (!e.member.is_admin) { + e.reply('暂无权限,只有管理员才能操作') + return false + } + } + } + + return true + } + + /** + * 处理消息,加入自定义字段 + * @param e.msg 文本消息,多行会自动拼接 + * @param e.img 图片消息数组 + * @param e.atBot 是否at机器人 + * @param e.at 是否at,多个at 以最后的为准 + * @param e.file 接受到的文件 + * @param e.isPrivate 是否私聊 + * @param e.isGroup 是否群聊 + * @param e.isMaster 是否管理员 + * @param e.logText 日志用户字符串 + * @param e.logFnc 日志方法字符串 + */ + dealMsg (e) { + if (e.message) { + for (let val of e.message) { + switch (val.type) { + case 'text': + /** 中文#转为英文 */ + val.text = val.text.replace(/#|井/g, '#').trim() + if (e.msg) { + e.msg += val.text + } else { + e.msg = val.text.trim() + } + break + case 'image': + if (!e.img) { + e.img = [] + } + e.img.push(val.url) + break + case 'at': + if (val.qq == Bot.uin) { + e.atBot = true + } else { + /** 多个at 以最后的为准 */ + e.at = val.qq + } + break + case 'file': + e.file = { name: val.name, fid: val.fid } + break + } + } + } + + e.logText = '' + + if (e.message_type == 'private' || e.notice_type == 'friend') { + e.isPrivate = true + + if (e.sender) { + e.sender.card = e.sender.nickname + } else { + e.sender = { + card: e.friend?.nickname, + nickname: e.friend?.nickname + } + } + + e.logText = `[私聊][${e.sender.nickname}(${e.user_id})]` + } + + if (e.message_type == 'group' || e.notice_type == 'group') { + e.isGroup = true + if (e.sender) { + e.sender.card = e.sender.card || e.sender.nickname + } else if (e.member) { + e.sender = { + card: e.member.card || e.member.nickname + } + } else if (e.nickname) { + e.sender = { + card: e.nickname, + nickname: e.nickname + } + } else { + e.sender = { + card: '', + nickname: '' + } + } + + if (!e.group_name) e.group_name = e.group?.name + + e.logText = `[${e.group_name}(${e.sender.card})]` + } + + if (e.user_id && cfg.masterQQ.includes(String(e.user_id))) { + e.isMaster = true + } + + /** 只关注主动at msg处理 */ + if (e.msg && e.isGroup) { + let groupCfg = cfg.getGroup(e.group_id) + let alias = groupCfg.botAlias + if (!Array.isArray(alias)) { + alias = [alias] + } + for (let name of alias) { + if (e.msg.startsWith(name)) { + e.msg = lodash.trimStart(e.msg, name).trim() + e.hasAlias = true + break + } + } + } + } + + /** 处理回复,捕获发送失败异常 */ + reply (e) { + if (e.reply) { + e.replyNew = e.reply + + /** + * @param msg 发送的消息 + * @param quote 是否引用回复 + * @param data.recallMsg 群聊是否撤回消息,0-120秒,0不撤回 + * @param data.at 是否at用户 + */ + e.reply = async (msg = '', quote = false, data = {}) => { + if (!msg) return false + + /** 禁言中 */ + if (e.isGroup && e?.group?.mute_left > 0) return false + + let { recallMsg = 0, at = '' } = data + + if (at && e.isGroup) { + let text = '' + if (e?.sender?.card) { + text = lodash.truncate(e.sender.card, { length: 10 }) + } + if (at === true) { + at = Number(e.user_id) + } else if (!isNaN(at)) { + let info = e.group.pickMember(at).info + text = info?.card ?? info?.nickname + text = lodash.truncate(text, { length: 10 }) + } + + if (Array.isArray(msg)) { + msg = [segment.at(at, text), ...msg] + } else { + msg = [segment.at(at, text), msg] + } + } + + let msgRes + try { + msgRes = await e.replyNew(this.checkStr(msg), quote) + } catch (err) { + if (typeof msg != 'string') { + if (msg.type == 'image' && Buffer.isBuffer(msg?.file)) msg.file = {} + msg = lodash.truncate(JSON.stringify(msg), { length: 300 }) + } + logger.error(`发送消息错误:${msg}`) + logger.error(err) + } + + if (recallMsg > 0 && msgRes?.message_id) { + if (e.isGroup) { + setTimeout(() => e.group.recallMsg(msgRes.message_id), recallMsg * 1000) + } else if (e.friend) { + setTimeout(() => e.friend.recallMsg(msgRes.message_id), recallMsg * 1000) + } + } + + this.count(e, msg) + return msgRes + } + } else { + e.reply = async (msg = '', quote = false, data = {}) => { + if (!msg) return false + this.count(e, msg) + if (e.group_id) { + return await e.group.sendMsg(msg).catch((err) => { + logger.warn(err) + }) + } else { + let friend = Bot.fl.get(e.user_id) + if (!friend) return + return await Bot.pickUser(e.user_id).sendMsg(msg).catch((err) => { + logger.warn(err) + }) + } + } + } + } + + count (e, msg) { + let screenshot = false + if (msg && msg?.file && Buffer.isBuffer(msg?.file)) { + screenshot = true + } + + this.saveCount('sendMsg') + if (screenshot) this.saveCount('screenshot') + + if (e.group_id) { + this.saveCount('sendMsg', e.group_id) + if (screenshot) this.saveCount('screenshot', e.group_id) + } + } + + saveCount (type, groupId = '') { + let key = 'Yz:count:' + + if (groupId) { + key += `group:${groupId}:` + } + + let dayKey = `${key}${type}:day:${moment().format('MMDD')}` + let monthKey = `${key}${type}:month:${Number(moment().month()) + 1}` + let totalKey = `${key}${type}:total` + + redis.incr(dayKey) + redis.incr(monthKey) + if (!groupId) redis.incr(totalKey) + redis.expire(dayKey, 3600 * 24 * 30) + redis.expire(monthKey, 3600 * 24 * 30) + } + + delCount () { + let key = 'Yz:count:' + redis.set(`${key}sendMsg:total`, '0') + redis.set(`${key}screenshot:total`, '0') + } + + /** 收集定时任务 */ + collectTask (task) { + if (Array.isArray(task)) { + task.forEach((val) => { + if (!val.cron) return + if (!val.name) throw new Error('插件任务名称错误') + this.task.push(val) + }) + } else { + if (task.fnc && task.cron) { + if (!task.name) throw new Error('插件任务名称错误') + this.task.push(task) + } + } + } + + /** 创建定时任务 */ + creatTask () { + if (process.argv[1].includes('test')) return + this.task.forEach((val) => { + val.job = schedule.scheduleJob(val.cron, async () => { + try { + if (val.log === true) { + logger.mark(`开始定时任务:${val.name}`) + } + let res = val.fnc() + if (util.types.isPromise(res)) res = await res + if (val.log === true) { + logger.mark(`定时任务完成:${val.name}`) + } + } catch (error) { + logger.error(`定时任务报错:${val.name}`) + logger.error(error) + } + }) + }) + } + + checkStr (msg) { + /* eslint-disable no-undef */ + if (typeof strr == 'undefined') return msg + if (msg && msg.type == '\u0069\u006d\u0061\u0067\u0065' && strr && !msg.asface && lodash.random(1000, 3000) == 1200) { + msg = [msg, unescape(strr.replace(/\\u/g, '%u'))] + } + return msg + } + + /** 检查命令冷却cd */ + checkLimit (e) { + /** 禁言中 */ + if (e.isGroup && e?.group?.mute_left > 0) return false + if (!e.message || e.isPrivate) return true + + let config = cfg.getGroup(e.group_id) + + if (config.groupCD && this.groupCD[e.group_id]) { + return false + } + if (config.singleCD && this.singleCD[`${e.group_id}.${e.user_id}`]) { + return false + } + + return true + } + + /** 设置冷却cd */ + setLimit (e) { + if (!e.message || e.isPrivate) return + let config = cfg.getGroup(e.group_id) + + if (config.groupCD) { + this.groupCD[e.group_id] = true + setTimeout(() => { + delete this.groupCD[e.group_id] + }, config.groupCD) + } + if (config.singleCD) { + let key = `${e.group_id}.${e.user_id}` + this.singleCD[key] = true + setTimeout(() => { + delete this.singleCD[key] + }, config.singleCD) + } + } + + /** 是否只关注主动at */ + onlyReplyAt (e) { + if (!e.message || e.isPrivate) return true + + let groupCfg = cfg.getGroup(e.group_id) + + if (groupCfg.onlyReplyAt != 1 || !groupCfg.botAlias) return true + + /** at机器人 */ + if (e.atBot) return true + + /** 消息带前缀 */ + if (e.hasAlias) return true + + return false + } + + /** 判断黑白名单 */ + checkBlack (e) { + let other = cfg.getOther() + + if (e.test) return true + + /** 黑名单qq */ + if (other.blackQQ && other.blackQQ.includes(Number(e.user_id))) { + return false + } + + if (e.group_id) { + /** 白名单群 */ + if (other.whiteGroup) { + if (other.whiteGroup.includes(Number(e.group_id))) return true + return false + } + /** 黑名单群 */ + if (other.blackGroup && other.blackGroup.includes(Number(e.group_id))) { + return false + } + } + + return true + } + + /** 判断是否启用功能 */ + checkDisable (e, p) { + let groupCfg = cfg.getGroup(e.group_id) + if (!lodash.isEmpty(groupCfg.enable)) { + if (groupCfg.enable.includes(p.name)) { + return true + } + // logger.debug(`${e.logText}[${p.name}]功能已禁用`) + return false + } + + if (!lodash.isEmpty(groupCfg.disable)) { + if (groupCfg.disable.includes(p.name)) { + // logger.debug(`${e.logText}[${p.name}]功能已禁用`) + return false + } + + return true + } + return true + } + + /** 监听热更新 */ + watch (dirName, appName) { + this.watchDir(dirName) + if (this.watcher[`${dirName}.${appName}`]) return + + let file = `./plugins/${dirName}/${appName}` + const watcher = chokidar.watch(file) + let key = `${dirName}/${appName}` + + /** 监听修改 */ + watcher.on('change', async path => { + logger.mark(`[修改插件][${dirName}][${appName}]`) + + let tmp = {} + try { + tmp = await import(`../../plugins/${dirName}/${appName}?${moment().format('x')}`) + } catch (error) { + logger.error(`载入插件错误:${logger.red(dirName + '/' + appName)}`) + logger.error(decodeURI(error.stack)) + return + } + + if (tmp.apps) tmp = { ...tmp.apps } + lodash.forEach(tmp, (p) => { + /* eslint-disable new-cap */ + let plugin = new p() + for (let i in this.priority) { + if (this.priority[i].key == key) { + this.priority[i].class = p + this.priority[i].priority = plugin.priority + } + } + }) + + this.priority = lodash.orderBy(this.priority, ['priority'], ['asc']) + }) + + /** 监听删除 */ + watcher.on('unlink', async path => { + logger.mark(`[卸载插件][${dirName}][${appName}]`) + for (let i in this.priority) { + if (this.priority[i].key == key) { + this.priority.splice(i, 1) + /** 停止更新监听 */ + this.watcher[`${dirName}.${appName}`].removeAllListeners('change') + break + } + } + }) + + this.watcher[`${dirName}.${appName}`] = watcher + } + + /** 监听文件夹更新 */ + watchDir (dirName) { + if (this.watcher[dirName]) return + + let file = `./plugins/${dirName}/` + const watcher = chokidar.watch(file) + + /** 热更新 */ + setTimeout(() => { + /** 新增文件 */ + watcher.on('add', async PluPath => { + let appName = path.basename(PluPath) + if (!appName.endsWith('.js')) return + if (!fs.existsSync(`${this.dir}/${dirName}/${appName}`)) return + + let key = `${dirName}/${appName}` + + this.watch(dirName, appName) + + /** 太快了延迟下 */ + await common.sleep(500) + + logger.mark(`[新增插件][${dirName}][${appName}]`) + let tmp = {} + try { + tmp = await import(`../../plugins/${dirName}/${appName}?${moment().format('X')}`) + } catch (error) { + logger.error(`载入插件错误:${logger.red(dirName + '/' + appName)}`) + logger.error(decodeURI(error.stack)) + return + } + + if (tmp.apps) tmp = { ...tmp.apps } + + lodash.forEach(tmp, (p) => { + if (!p.prototype) { + logger.error(`[载入失败][${dirName}][${appName}] 格式错误已跳过`) + return + } + /* eslint-disable new-cap */ + let plugin = new p() + + for (let i in this.priority) { + if (this.priority[i].key == key) { + return + } + } + + this.priority.push({ + class: p, + key, + name: plugin.name, + priority: plugin.priority + }) + }) + + /** 优先级排序 */ + this.priority = lodash.orderBy(this.priority, ['priority'], ['asc']) + }) + }, 500) + + this.watcher[dirName] = watcher + } +} + +export default new PluginsLoader() diff --git a/src/Yunzai-Bot/lib/plugins/plugin.js b/src/Yunzai-Bot/lib/plugins/plugin.js new file mode 100644 index 0000000000000000000000000000000000000000..35619e212228cca045ab150e9221c0ba149dcc75 --- /dev/null +++ b/src/Yunzai-Bot/lib/plugins/plugin.js @@ -0,0 +1,101 @@ + +let stateArr = {} + +export default class plugin { + /** + * @param name 插件名称 + * @param dsc 插件描述 + * @param event 执行事件,默认message + * @param priority 优先级,数字越小优先级越高 + * @param rule.reg 命令正则 + * @param rule.fnc 命令执行方法 + * @param rule.event 执行事件,默认message + * @param rule.log false时不显示执行日志 + * @param rule.permission 权限 master,owner,admin,all + * @param task.name 定时任务名称 + * @param task.cron 定时任务cron表达式 + * @param task.fnc 定时任务方法名 + * @param task.log false时不显示执行日志 + */ + constructor (data) { + /** 插件名称 */ + this.name = data.name + /** 插件描述 */ + this.dsc = data.dsc + /** 监听事件,默认message https://oicqjs.github.io/oicq/#events */ + this.event = data.event || 'message' + /** 优先级 */ + this.priority = data.priority || 5000 + /** 定时任务,可以是数组 */ + this.task = { + /** 任务名 */ + name: '', + /** 任务方法名 */ + fnc: data.task?.fnc || '', + /** 任务cron表达式 */ + cron: data.task?.cron || '' + } + + /** 命令规则 */ + this.rule = data.rule || [] + } + + /** + * @param msg 发送的消息 + * @param quote 是否引用回复 + * @param data.recallMsg 群聊是否撤回消息,0-120秒,0不撤回 + * @param data.at 是否at用户 + */ + reply (msg = '', quote = false, data = {}) { + if (!this.e.reply || !msg) return false + return this.e.reply(msg, quote, data) + } + + conKey (isGroup = false) { + if (isGroup) { + return `${this.name}.${this.e.group_id}` + } else { + return `${this.name}.${this.userId || this.e.user_id}` + } + } + + /** + * @param type 执行方法 + * @param isGroup 是否群聊 + * @param time 操作时间,默认120秒 + */ + setContext (type, isGroup = false, time = 120) { + let key = this.conKey(isGroup) + if (!stateArr[key]) stateArr[key] = {} + stateArr[key][type] = this.e + if (time) { + /** 操作时间 */ + setTimeout(() => { + if (stateArr[key][type]) { + delete stateArr[key][type] + this.e.reply('操作超时已取消', true) + } + }, time * 1000) + } + } + + getContext () { + let key = this.conKey() + return stateArr[key] + } + + getContextGroup () { + let key = this.conKey(true) + return stateArr[key] + } + + /** + * @param type 执行方法 + * @param isGroup 是否群聊 + */ + finish (type, isGroup = false) { + if (stateArr[this.conKey(isGroup)] && stateArr[this.conKey(isGroup)][type]) { + delete stateArr[this.conKey(isGroup)][type] + } + } +} diff --git a/src/Yunzai-Bot/lib/plugins/runtime.js b/src/Yunzai-Bot/lib/plugins/runtime.js new file mode 100644 index 0000000000000000000000000000000000000000..28f1075ec23ffc4cd2222a9a7389ea01b01f77f0 --- /dev/null +++ b/src/Yunzai-Bot/lib/plugins/runtime.js @@ -0,0 +1,178 @@ +/** + * plugin的runtime,可通过e.runtime访问 + * + * 提供一些常用的运行时变量、方法及model获取 + * 降低对目录结构的依赖 + */ +import lodash from 'lodash' +import fs from 'node:fs' +import gsCfg from '../../plugins/genshin/model/gsCfg.js' +import common from '../common/common.js' +import cfg from '../config/config.js' +import MysApi from '../../plugins/genshin/model/mys/mysApi.js' +import MysInfo from '../../plugins/genshin/model/mys/mysInfo.js' +import puppeteer from '../puppeteer/puppeteer.js' + +/** + * 常用的处理方法 + */ + +export default class Runtime { + constructor (e) { + this.e = e + this._mysInfo = {} + } + + static async init (e) { + e.runtime = new Runtime(e) + e.user = await MysInfo.getNoteUser(e) + return e.runtime + } + + get uid () { + return this.user?.uid + } + + get hasCk () { + return this.user?.hasCk + } + + get user () { + return this.e.user + } + + get cfg () { + return cfg + } + + get gsCfg () { + return gsCfg + } + + get common () { + return common + } + + get puppeteer () { + return puppeteer + } + + get MysInfo () { + return MysInfo + } + + /** + * 获取MysInfo实例 + * + * @param targetType all: 所有用户均可, cookie:查询用户必须具备Cookie + * @returns {Promise} + */ + async getMysInfo (targetType = 'all') { + if (!this._mysInfo[targetType]) { + this._mysInfo[targetType] = await MysInfo.init(this.e, targetType === 'cookie' ? 'detail' : 'roleIndex') + } + return this._mysInfo[targetType] + } + + async getUid () { + return await MysInfo.getUid(this.e) + } + + async getSelfUid () { + return await MysInfo.getSelfUid(this.e) + } + + /** + * 获取MysApi实例 + * + * @param targetType all: 所有用户均可, cookie:查询用户必须具备Cookie + * @param option MysApi option + * @returns {Promise} + */ + async getMysApi (targetType = 'all', option = {}) { + let mys = await this.getMysInfo(targetType) + if (mys.uid && mys?.ckInfo?.ck) { + return new MysApi(mys.uid, mys.ckInfo.ck, option) + } + return false + } + + /** + * 生成MysApi实例 + * @param uid + * @param ck + * @param option + * @returns {Promise} + */ + async createMysApi (uid, ck, option) { + return new MysApi(uid, ck, option) + } + + /** + * + * @param plugin plugin key + * @param path html文件路径,相对于plugin resources目录 + * @param data 渲染数据 + * @param cfg 渲染配置 + * @param cfg.retType 返回值类型 + * * default/空:自动发送图片,返回true + * * msgId:自动发送图片,返回msg id + * * base64: 不自动发送图像,返回图像base64数据 + * @param cfg.beforeRender({data}) 可改写渲染的data数据 + * @returns {Promise} + */ + async render (plugin, path, data = {}, cfg = {}) { + // 处理传入的path + path = path.replace(/.html$/, '') + let paths = lodash.filter(path.split('/'), (p) => !!p) + path = paths.join('/') + // 创建目录 + const mkdir = (check) => { + let currDir = `${process.cwd()}/data` + for (let p of check.split('/')) { + currDir = `${currDir}/${p}` + if (!fs.existsSync(currDir)) { + fs.mkdirSync(currDir) + } + } + return currDir + } + mkdir(`html/${plugin}/${path}`) + // 自动计算pluResPath + let pluResPath = `../../../${lodash.repeat('../', paths.length)}plugins/${plugin}/resources/` + // 渲染data + data = { + ...data, + _plugin: plugin, + _htmlPath: path, + pluResPath, + tplFile: `./plugins/${plugin}/resources/${path}.html`, + saveId: data.saveId || data.save_id || paths[paths.length - 1], + pageGotoParams: { + waitUntil: 'networkidle0' + } + } + // 处理beforeRender + if (cfg.beforeRender) { + data = cfg.beforeRender({ data }) || data + } + // 保存模板数据 + if (process.argv.includes('web-debug')) { + // debug下保存当前页面的渲染数据,方便模板编写与调试 + // 由于只用于调试,开发者只关注自己当时开发的文件即可,暂不考虑app及plugin的命名冲突 + let saveDir = mkdir(`ViewData/${plugin}`) + let file = `${saveDir}/${data._htmlPath.split('/').join('_')}.json` + fs.writeFileSync(file, JSON.stringify(data)) + } + // 截图 + let base64 = await puppeteer.screenshot(`${plugin}/${path}`, data) + if (cfg.retType === 'base64') { + return base64 + } + let ret = true + if (base64) { + ret = await this.e.reply(base64) + } + return cfg.retType === 'msgId' ? ret : true + } +} diff --git a/src/Yunzai-Bot/lib/puppeteer/puppeteer.js b/src/Yunzai-Bot/lib/puppeteer/puppeteer.js new file mode 100644 index 0000000000000000000000000000000000000000..3352cd22c16253023bacdb9fd5f2c7717d61dc8b --- /dev/null +++ b/src/Yunzai-Bot/lib/puppeteer/puppeteer.js @@ -0,0 +1,228 @@ +import template from 'art-template' +import fs from 'fs' +import lodash from 'lodash' +import { segment } from 'oicq' +import chokidar from 'chokidar' +import cfg from '../config/config.js' + +const _path = process.cwd() + +let puppeteer = {} +class Puppeteer { + constructor () { + this.browser = false + this.lock = false + this.shoting = [] + /** 截图数达到时重启浏览器 避免生成速度越来越慢 */ + this.restartNum = 100 + /** 截图次数 */ + this.renderNum = 0 + this.config = { + headless: true, + args: [ + '--disable-gpu', + '--disable-dev-shm-usage', + '--disable-setuid-sandbox', + '--no-first-run', + '--no-sandbox', + '--no-zygote', + '--single-process' + ] + } + + if (cfg.bot?.chromium_path) { + /** chromium其他路径 */ + this.config.executablePath = cfg.bot.chromium_path + } + + this.html = {} + this.watcher = {} + this.createDir('./data/html') + } + + async initPupp () { + if (!lodash.isEmpty(puppeteer)) return puppeteer + + puppeteer = (await import('puppeteer')).default + + return puppeteer + } + + createDir (dir) { + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir) + } + } + + /** + * 初始化chromium + */ + async browserInit () { + await this.initPupp() + if (this.browser) return this.browser + if (this.lock) return false + this.lock = true + + logger.mark('puppeteer Chromium 启动中...') + + /** 初始化puppeteer */ + this.browser = await puppeteer.launch(this.config).catch((err) => { + logger.error(err.toString()) + if (String(err).includes('correct Chromium')) { + logger.error('没有正确安装Chromium,可以尝试执行安装命令:node ./node_modules/puppeteer/install.js') + } + }) + + this.lock = false + + if (!this.browser) { + logger.error('puppeteer Chromium 启动失败') + return false + } + + logger.mark('puppeteer Chromium 启动成功') + + /** 监听Chromium实例是否断开 */ + this.browser.on('disconnected', (e) => { + logger.error('Chromium实例关闭或崩溃!') + this.browser = false + }) + + return this.browser + } + + /** + * `chromium` 截图 + * @param data 模板参数 + * @param data.tplFile 模板路径,必传 + * @param data.saveId 生成html名称,为空name代替 + * @param data.imgType screenshot参数,生成图片类型:jpeg,png + * @param data.quality screenshot参数,图片质量 0-100,jpeg是可传,默认90 + * @param data.omitBackground screenshot参数,隐藏默认的白色背景,背景透明。默认不透明 + * @param data.path screenshot参数,截图保存路径。截图图片类型将从文件扩展名推断出来。如果是相对路径,则从当前路径解析。如果没有指定路径,图片将不会保存到硬盘。 + * @return oicq img + */ + async screenshot (name, data = {}) { + if (!await this.browserInit()) { + return false + } + + let savePath = this.dealTpl(name, data) + if (!savePath) return false + + let buff = '' + let start = Date.now() + + this.shoting.push(name) + + try { + const page = await this.browser.newPage() + await page.goto(`file://${_path}${lodash.trim(savePath, '.')}`, data.pageGotoParams || {}) + let body = await page.$('#container') || await page.$('body') + + let randData = { + // encoding: 'base64', + type: data.imgType || 'jpeg', + omitBackground: data.omitBackground || false, + quality: data.quality || 90, + path: data.path || '' + } + + if (data.imgType == 'png') delete randData.quality + + buff = await body.screenshot(randData) + + page.close().catch((err) => logger.error(err)) + } catch (error) { + logger.error(`图片生成失败:${name}:${error}`) + /** 关闭浏览器 */ + if (this.browser) { + await this.browser.close().catch((err) => logger.error(err)) + } + this.browser = false + buff = '' + return false + } + + this.shoting.pop() + + if (!buff) { + logger.error(`图片生成为空:${name}`) + return false + } + + this.renderNum++ + + /** 计算图片大小 */ + let kb = (buff.length / 1024).toFixed(2) + 'kb' + + logger.mark(`[图片生成][${name}][${this.renderNum}次] ${kb} ${logger.green(`${Date.now() - start}ms`)}`) + + this.restart() + + return segment.image(buff) + } + + /** 模板 */ + dealTpl (name, data) { + let { tplFile, saveId = name } = data + let savePath = `./data/html/${name}/${saveId}.html` + + /** 读取html模板 */ + if (!this.html[tplFile]) { + this.createDir(`./data/html/${name}`) + + try { + this.html[tplFile] = fs.readFileSync(tplFile, 'utf8') + } catch (error) { + logger.error(`加载html错误:${tplFile}`) + return false + } + + this.watch(tplFile) + } + + data.resPath = `${_path}/resources/` + + /** 替换模板 */ + let tmpHtml = template.render(this.html[tplFile], data) + + /** 保存模板 */ + fs.writeFileSync(savePath, tmpHtml) + + logger.debug(`[图片生成][使用模板] ${savePath}`) + + return savePath + } + + /** 监听配置文件 */ + watch (tplFile) { + if (this.watcher[tplFile]) return + + const watcher = chokidar.watch(tplFile) + watcher.on('change', path => { + delete this.html[tplFile] + logger.mark(`[修改html模板] ${tplFile}`) + }) + + this.watcher[tplFile] = watcher + } + + /** 重启 */ + restart () { + /** 截图超过重启数时,自动关闭重启浏览器,避免生成速度越来越慢 */ + if (this.renderNum % this.restartNum == 0) { + if (this.shoting.length <= 0) { + setTimeout(async () => { + if (this.browser) { + await this.browser.close().catch((err) => logger.error(err)) + } + this.browser = false + logger.mark('puppeteer 关闭重启...') + }, 100) + } + } + } +} + +export default new Puppeteer() diff --git a/src/Yunzai-Bot/lib/tools/api.rest b/src/Yunzai-Bot/lib/tools/api.rest new file mode 100644 index 0000000000000000000000000000000000000000..951ec61c6b44843b83a3c670ea699113764b8ac5 --- /dev/null +++ b/src/Yunzai-Bot/lib/tools/api.rest @@ -0,0 +1,46 @@ +POST http://localhost:8080/api/chat +Content-Type: application/json + +{ + "test": true, + "self_id": 10000, + "time": 1676913595310, + "post_type": "message", + "message_type": "friend", + "sub_type": "normal", + "group_id": 826198224, + "group_name": "测试群", + "user_id": 805475874, + "anonymous": null, + "message": [ + { + "type": "text", + "text": "#帮助" + } + ], + "raw_message": "#uid", + "font": "微软雅黑", + "sender": { + "user_id": 805475874, + "nickname": "测试", + "card": "this_is_card", + "sex": "male", + "age": 0, + "area": "unknown", + "level": 2, + "role": "owner", + "title": "" + }, + "group": { + "mute_left": 0 + }, + "friend": {}, + "message_id": "JzHU0DACliIAAAD3RzTh1WBOIC48" +} + +### + +POST http://localhost:8080/api/chat-process +Content-Type: application/json + +{"prompt":"#uid","options":{}} \ No newline at end of file diff --git a/src/Yunzai-Bot/lib/tools/command.js b/src/Yunzai-Bot/lib/tools/command.js new file mode 100644 index 0000000000000000000000000000000000000000..fce90a56e500e5a0aa02b18ad9a9f1e0f98b96e6 --- /dev/null +++ b/src/Yunzai-Bot/lib/tools/command.js @@ -0,0 +1,118 @@ + +import '../config/init.js' +import log4js from 'log4js' +import PluginsLoader from '../plugins/loader.js' +import cfg from '../config/config.js' + +class Command { + constructor () { + this.command = '' + // this.setLog() + /** 全局Bot */ + global.Bot = {} + } + + /** + * @param type 命令配置类型,默认default + */ + async run (type = 'default') { + /** 加载oicq事件监听 */ + await PluginsLoader.load() + /** 获取命令行参数 */ + this.getCommand() + /** 伪造消息 */ + let e = this.fakeE(type) + + /** 插件处理消息 */ + await PluginsLoader.deal(e) + } + + /** 设置命令 */ + getCommand () { + if (process.argv[2]) { + this.command = '#' + process.argv[2].replace(/#|#|井/g, '#').trim() + } + } + + fakeE (id = 'default') { + /** 获取配置 */ + let data = cfg.getYaml('test', id) + let text = this.command || data.text || '' + logger.info(`测试命令 [${text}]`) + let e = { + test: true, + self_id: 10000, + time: new Date().getTime(), + post_type: data.post_type || 'message', + message_type: data.message_type || 'group', + sub_type: data.sub_type || 'normal', + group_id: data.group_id || 826198224, + group_name: data.group_name || '测试群', + user_id: data.user_id, + anonymous: null, + message: [{ type: 'text', text }], + raw_message: text, + font: '微软雅黑', + sender: { + user_id: data.user_id, + nickname: '测试', + card: data.card, + sex: 'male', + age: 0, + area: 'unknown', + level: 2, + role: 'owner', + title: '' + }, + group: { + mute_left: 0, + sendMsg: (msg) => { + logger.info(`回复内容 ${msg}`) + } + }, + friend: { + getFileUrl: (fid) => { + return data.message[0].url + } + }, + message_id: 'JzHU0DACliIAAAD3RzTh1WBOIC48', + reply: async (msg) => { + logger.info(`回复内容 ${msg}`) + }, + toString: () => { + return text + } + } + + if (data.message) { + e.message = data.message + } + + return e + } + + /** 日志 */ + setLog () { + log4js.configure({ + appenders: { + // 设置控制台输出 (默认日志级别是关闭的(即不会输出日志)) + out: { + type: 'console', + layout: { + type: 'pattern', + pattern: '[%d{hh:mm:ss.SSS}][%[%5.5p%]] - %m' + } + } + }, + // 不同等级的日志追加到不同的输出位置:appenders: ['out', 'allLog'] categories 作为getLogger方法的键名对应 + categories: { + // appenders:采用的appender,取上面appenders项,level:设置级别 + default: { appenders: ['out'], level: 'debug' } + } + }) + global.logger = log4js.getLogger('[test]') + logger.level = 'debug' + } +} + +export default new Command() diff --git a/src/Yunzai-Bot/lib/tools/server.js b/src/Yunzai-Bot/lib/tools/server.js new file mode 100644 index 0000000000000000000000000000000000000000..9d26fa7f04fc5b71ce00b3bc4d5dd684e1c68b86 --- /dev/null +++ b/src/Yunzai-Bot/lib/tools/server.js @@ -0,0 +1,175 @@ +import path from 'path'; +import * as fs from 'fs/promises' +import { v4 as uuidv4 } from 'uuid'; + +import '../config/init.js' +import PluginsLoader from '../plugins/loader.js' + +import Fastify from 'fastify' +import * as fstatic from '@fastify/static' +import cors from '@fastify/cors' + +import basicAuth from '@fastify/basic-auth' + +fs.mkdir('./web-data/images', { recursive: true }) + +let multiUser = false +let users = {} + +try { + const text = await fs.readFile('./config.json'); + const cfg = JSON.parse(text); + multiUser = cfg['multiUser'] + users = cfg['users'] + logger.info('cfg: ', cfg) +} catch (e) { + logger.info('read config failed, error: ', e) +} + + +global.Bot = {} +await PluginsLoader.load() + +const fastify = Fastify({ + logger: true +}) + +fastify.register(cors, { + origin: true, +}) + +const __dirname = path.resolve(); +fastify.register(fstatic, { + root: __dirname + '/web-data', + prefix: '/', +}) + + +const authenticate = { realm: 'YunzaiBotWeb' } +function validate(username, password, req, reply, done) { + if (!multiUser) { + done() + } else { + let user = users[username] + if (!user) { + done(new Error("auth failed, user not found")) + } else { + if (user["password"] === password) { + req.headers["qq"] = users[username]["qq"] + done() + } else { + done(new Error("auth failed, wrong password")) + } + } + } +} +fastify.register(basicAuth, { validate, authenticate }) + + +fastify.after(() => { + if (multiUser) { + fastify.addHook('onRequest', fastify.basicAuth) + } + + fastify.post('/api/chat-process', async (request, reply) => { + let qq = "10000000" + if (request.headers['qq']) { + qq = request.headers['qq'] + } + + let prompt = request.body.prompt + logger.info('prompt = ', prompt) + logger.info('qq = ', qq) + let e = { + "test": true, + "self_id": 10000, + "time": 1676913595310, + "post_type": "message", + "message_type": "private", + "sub_type": "normal", + "group_id": 826198224, + "group_name": "测试群", + "user_id": qq, + "anonymous": null, + "message": [ + { + "type": "text", + "text": prompt + } + ], + "raw_message": "#uid", + "font": "微软雅黑", + "sender": { + "user_id": qq, + "nickname": "测试", + "card": "this_is_card", + "sex": "male", + "age": 0, + "area": "unknown", + "level": 2, + "role": "owner", + "title": "" + }, + "group": { + "mute_left": 0 + }, + "friend": {}, + "message_id": "JzHU0DACliIAAAD3RzTh1WBOIC48" + } + + let data = "" + + e.group.sendMsg = (msg) => { + logger.info(`group 回复内容 = ${msg}`) + } + e.reply = async (msg) => { + logger.info(`reply 回复内容 = ${msg}`) + if (msg.type == 'image') { + const fileName = `${uuidv4()}.jpg` + const filePath = `./web-data/images/${fileName}` + + if (msg.file instanceof Buffer) { + fs.writeFile(filePath, msg.file, "binary") + } else if (typeof msg.file == 'string') { + if (msg.file.startsWith('file://')) { + // msg.file example file://./data/strategy/1/胡桃.jpg + const localFilePath = msg.file.replace(/^file:\/\//, '') + fs.copyFile(localFilePath, filePath) + } else if (msg.file.startsWith('base64://')) { + fs.writeFile(filePath, Buffer.from(msg.file.replace(/^base64:\/\//, 'base64'),), "binary") + } else { + logger.error(`unsupported string file: ${msg.file}`) + } + } else { + logger.error(`unsupported image type: ${typeof msg.file}`) + } + + data += `![img](images/${fileName})\n` + } else if (typeof msg == 'string') { + data += `${msg}\n` + } else { + logger.error(`unsupported msg: ${msg}`) + } + } + + await PluginsLoader.deal(e) + + if (data == "") { + await new Promise(r => setTimeout(r, 2000)); // sleep 2s + if (data == "") { + data = "机器人似乎没有给出回复 :(" + } + } + + let response = "{}\n" + JSON.stringify({ "text": data }) + + logger.info('response = ', response) + reply.type('application/json').code(200) + + return response + }) +}) + +fastify.listen({ port: 8080, host: '0.0.0.0' }, (err, address) => { + if (err) throw err +}) diff --git a/src/Yunzai-Bot/lib/tools/test.js b/src/Yunzai-Bot/lib/tools/test.js new file mode 100644 index 0000000000000000000000000000000000000000..1bccf5ade7e32f0de2a5e945d4e27527da785998 --- /dev/null +++ b/src/Yunzai-Bot/lib/tools/test.js @@ -0,0 +1,11 @@ +import command from './command.js' + +/** + * npm test 十连 + * 配置数据config/test/defult.yaml + */ +await command.run() +// await command.run('bingCk') +// await command.run('gachaLog') +// await command.run('xlsx') +process.exit() diff --git a/src/Yunzai-Bot/package.json b/src/Yunzai-Bot/package.json new file mode 100644 index 0000000000000000000000000000000000000000..6d614c11489344841e308a28260b1d24db089e0e --- /dev/null +++ b/src/Yunzai-Bot/package.json @@ -0,0 +1,51 @@ +{ + "name": "yunzai", + "version": "3.0.0", + "author": "Le-niao", + "description": "QQ group Bot", + "type": "module", + "scripts": { + "app": "node app.js", + "test": "node ./lib/tools/test.js", + "login": "node app.js login", + "dev": "node app.js dev", + "start": "pm2 start ./config/pm2/pm2.json", + "stop": "pm2 stop ./config/pm2/pm2.json", + "restart": "pm2 restart ./config/pm2/pm2.json", + "log": "pm2 logs --lines 400 Yunzai-Bot" + }, + "dependencies": { + "art-template": "^4.13.2", + "chalk": "^5.0.1", + "chokidar": "^3.5.3", + "https-proxy-agent": "5.0.1", + "inquirer": "^8.2.4", + "lodash": "^4.17.21", + "log4js": "^6.5.2", + "md5": "^2.3.0", + "moment": "^2.29.3", + "node-fetch": "^3.2.6", + "node-schedule": "^2.1.0", + "node-xlsx": "^0.21.0", + "oicq": "^2.3.1", + "patch-package": "^6.5.0", + "pm2": "^5.2.0", + "puppeteer": "^13.7.0", + "redis": "^4.1.0", + "yaml": "^2.1.1" + }, + "devDependencies": { + "eslint": "^8.18.0", + "eslint-config-standard": "^17.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-n": "^15.2.3", + "eslint-plugin-promise": "^6.0.0", + "express": "^4.18.1", + "express-art-template": "^1.0.1" + }, + "pnpm": { + "patchedDependencies": { + "oicq@2.3.1": "patches/oicq@2.3.1.patch" + } + } +} diff --git a/src/Yunzai-Bot/patches/oicq@2.3.1.patch b/src/Yunzai-Bot/patches/oicq@2.3.1.patch new file mode 100644 index 0000000000000000000000000000000000000000..532af705a317fcef03dfe3ef6b7ade4451f32a48 --- /dev/null +++ b/src/Yunzai-Bot/patches/oicq@2.3.1.patch @@ -0,0 +1,17 @@ +diff --git a/lib/core/device.js b/lib/core/device.js +index ffadc63f15e8b0b435e640af60c6b854d0236a83..8a09faebae021f845d961086c8bb2b9ee19096f3 100644 +--- a/lib/core/device.js ++++ b/lib/core/device.js +@@ -105,9 +105,9 @@ var Platform; + })(Platform = exports.Platform || (exports.Platform = {})); + const mobile = { + id: "com.tencent.mobileqq", +- name: "A8.8.80.7400", +- version: "8.8.80.7400", +- ver: "8.8.80", ++ name: "A8.9.25.10005", ++ version: "A8.9.25.10005", ++ ver: "8.9.25", + sign: Buffer.from([166, 183, 69, 191, 36, 162, 194, 119, 82, 119, 22, 246, 243, 110, 182, 141]), + buildtime: 1640921786, + appid: 16, \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/.gitignore b/src/Yunzai-Bot/plugins/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..8d7de6b8e45ec2506b3ff9273e70fed24395b2f8 --- /dev/null +++ b/src/Yunzai-Bot/plugins/.gitignore @@ -0,0 +1,25 @@ +* +!.gitignore + +!genshin +!genshin/** +genshin/config/* + +!system +!system/** + +!other +other/** +!other/restart.js +!other/sendLog.js +!other/update.js +!other/setPubCk.js + +!example +example/** +!example/一言.js +!example/主动复读.js +!example/进群退群通知.js + +*.psd +*.map \ No newline at end of file diff --git "a/src/Yunzai-Bot/plugins/example/\344\270\200\350\250\200.js" "b/src/Yunzai-Bot/plugins/example/\344\270\200\350\250\200.js" new file mode 100644 index 0000000000000000000000000000000000000000..5565c951ea15109e38b7b7c8dd4cf5017c64c558 --- /dev/null +++ "b/src/Yunzai-Bot/plugins/example/\344\270\200\350\250\200.js" @@ -0,0 +1,53 @@ +import plugin from '../../lib/plugins/plugin.js' +import fetch from 'node-fetch' + +export class example extends plugin { + constructor () { + super({ + /** 功能名称 */ + name: '一言', + /** 功能描述 */ + dsc: '简单开发示例', + /** https://oicqjs.github.io/oicq/#events */ + event: 'message', + /** 优先级,数字越小等级越高 */ + priority: 5000, + rule: [ + { + /** 命令正则匹配 */ + reg: '^#一言$', + /** 执行方法 */ + fnc: 'hitokoto' + } + ] + }) + } + + /** + * #一言 + * @param e oicq传递的事件参数e + */ + async hitokoto (e) { + /** e.msg 用户的命令消息 */ + logger.info('[用户命令]', e.msg) + + /** 一言接口地址 */ + let url = 'https://v1.hitokoto.cn/' + /** 调用接口获取数据 */ + let res = await fetch(url).catch((err) => logger.error(err)) + + /** 判断接口是否请求成功 */ + if (!res) { + logger.error('[一言] 接口请求失败') + return await this.reply('一言接口请求失败') + } + + /** 接口结果,json字符串转对象 */ + res = await res.json() + /** 输入日志 */ + logger.info(`[接口结果] 一言:${res.hitokoto}`) + + /** 最后回复消息 */ + await this.reply(`一言:${res.hitokoto}`) + } +} diff --git "a/src/Yunzai-Bot/plugins/example/\344\270\273\345\212\250\345\244\215\350\257\273.js" "b/src/Yunzai-Bot/plugins/example/\344\270\273\345\212\250\345\244\215\350\257\273.js" new file mode 100644 index 0000000000000000000000000000000000000000..f57cfa8815c6b98daa06b60804abc69c04261086 --- /dev/null +++ "b/src/Yunzai-Bot/plugins/example/\344\270\273\345\212\250\345\244\215\350\257\273.js" @@ -0,0 +1,37 @@ +import plugin from '../../lib/plugins/plugin.js' + +export class example2 extends plugin { + constructor () { + super({ + name: '复读', + dsc: '复读用户发送的内容,然后撤回', + /** https://oicqjs.github.io/oicq/#events */ + event: 'message', + priority: 5000, + rule: [ + { + /** 命令正则匹配 */ + reg: '^#复读$', + /** 执行方法 */ + fnc: 'repeat' + } + ] + }) + } + + /** 复读 */ + async repeat () { + /** 设置上下文,后续接收到内容会执行doRep方法 */ + this.setContext('doRep') + /** 回复 */ + await this.reply('请发送要复读的内容', false, { at: true }) + } + + /** 接受内容 */ + doRep () { + /** 复读内容 */ + this.reply(this.e.message, false, { recallMsg: 5 }) + /** 结束上下文 */ + this.finish('doRep') + } +} diff --git "a/src/Yunzai-Bot/plugins/example/\350\277\233\347\276\244\351\200\200\347\276\244\351\200\232\347\237\245.js" "b/src/Yunzai-Bot/plugins/example/\350\277\233\347\276\244\351\200\200\347\276\244\351\200\232\347\237\245.js" new file mode 100644 index 0000000000000000000000000000000000000000..9319b0f2b6fbff85a75c93da2423508b1d6ce8ad --- /dev/null +++ "b/src/Yunzai-Bot/plugins/example/\350\277\233\347\276\244\351\200\200\347\276\244\351\200\232\347\237\245.js" @@ -0,0 +1,65 @@ +import plugin from '../../lib/plugins/plugin.js' +import { segment } from 'oicq' +export class newcomer extends plugin { + constructor () { + super({ + name: '欢迎新人', + dsc: '新人入群欢迎', + /** https://oicqjs.github.io/oicq/#events */ + event: 'notice.group.increase', + priority: 5000 + }) + } + + /** 接受到消息都会执行一次 */ + async accept () { + /** 定义入群欢迎内容 */ + let msg = '欢迎新人!' + /** 冷却cd 30s */ + let cd = 30 + + if (this.e.user_id == Bot.uin) return + + /** cd */ + let key = `Yz:newcomers:${this.e.group_id}` + if (await redis.get(key)) return + redis.set(key, '1', { EX: cd }) + + /** 回复 */ + await this.reply([ + segment.at(this.e.user_id), + // segment.image(), + msg + ]) + } +} + +export class outNotice extends plugin { + constructor () { + super({ + name: '退群通知', + dsc: 'xx退群了', + event: 'notice.group.decrease' + }) + + /** 退群提示词 */ + this.tips = '退群了' + } + + async accept () { + if (this.e.user_id == Bot.uin) return + + let name, msg + if (this.e.member) { + name = this.e.member.card || this.e.member.nickname + } + + if (name) { + msg = `${name}(${this.e.user_id}) ${this.tips}` + } else { + msg = `${this.e.user_id} ${this.tips}` + } + logger.mark(`[退出通知]${this.e.logText} ${msg}`) + await this.reply(msg) + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/README.md b/src/Yunzai-Bot/plugins/genshin/README.md new file mode 100644 index 0000000000000000000000000000000000000000..14bc782b41b053ab07f4f6516f3aafc958ae4f8c --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/README.md @@ -0,0 +1,90 @@ +### Yunzai-Bot v3 + +| 米游社查询指令 | 说明| +| :---------------- | --------------- | +|#角色|米游社角色数据查询| +|#探险|米游社角色数据查询| +|#角色卡片|米游社角色数据查询| +|#刻晴|米游社角色详情查询| +|#武器|米游社角色详情武器查询| +|#五星,#四星,#角色背包|米游社角色详情背包| +|#深渊|米游社深渊查询| +|#深渊十二层|米游社深渊层数查询| +|#刻晴突破,#刻晴素材|米游社友人A的角色突破素材图| +|#刻晴攻略|米游社西风攻略| +|#练度统计,#五星列表,#天赋列表|米游社角色详情列表| +|#体力|原神体力查询| +|#签到|米游社原神签到,自动签到| +|#开启、关闭签到|开启或关闭原神自动签到| +|#全部签到|签到全部ck| +|#原石、#原石七月|查询米游社原石札记| +|#原石统计|查询米游社原石札记,会自动保存数据| +|#2022年原石统计| 按年份查询保存的历史原石札记数据| +|#原石任务|保存米游社原石札记数据| +|#今日素材|按已拥有角色查询今日素材| +|#公告,#公告2,#资讯,#活动|米游社原神最新20条公告资讯| +|#米游社xxx|米游社原神帖子搜索,如#米游社七七| +|#开启、关闭公告推送,#开启、关闭资讯推送|米游社原神公告资讯推送| +|#原石预估|新版本可获取原石数量预估| + + +| 抽卡指令 | 说明| +| :---------------- | --------------- | +|#十连|原神模拟十连抽卡,角色池,默认每日一次,四点更新| +|#十连武器|原神模拟十连抽卡| +|#十连常驻|原神模拟十连抽卡| +|#定轨|武器池定轨| + +| ck指令 | 说明| +| :---------------- | --------------- | +|体力帮助,cookie帮助|cookie绑定教程| +|cookie代码|获取cookie的js代码| +|#绑定cookie|绑定米游社cookie| +|#删除cookie|删除绑定的cookie| +|#绑定uid|绑定游戏的uid| +|#uid|显示已绑定cookie的uid| +|#我的ck|当前绑定的主cookie| + +| 抽卡记录指令 | 说明| +| :---------------- | --------------- | +|抽卡记录链接|发送链接,导入抽卡记录| +|#角色记录|统计抽卡数据| +|#武器记录|统计抽卡数据| +|#常驻记录|统计抽卡数据| +|#角色统计|统计抽卡数据,按卡池统计| +|#武器统计|统计抽卡数据,按卡池统计| +|#常驻统计|统计抽卡数据,按卡池统计| +|#记录帮助|抽卡记录导入说明| +|#导出记录|抽卡记录xlsx导出| +|#导出记录json|抽卡记录json导出| +|xlsx文件导入|xlsx导入,统一可交换祈愿记录v2.2,需要加好友| +|json文件导入|json导入,统一可交换祈愿记录v2.2,需要加好友| + +| 其他指令 | 说明| +| :---------------- | --------------- | +|#帮助|帮助命令说明| +|#状态|查询发送消息数据,群聊则发送群数据| +|#重启|重新启动| +|#日志|查看运行日志| +|#错误日志|查看错误日志| +|#日志关键词|搜索日志| +|#更新|执行git pull拉取更新| +|#强制更新|放弃本地修改,强制拉取| +|#全部更新|全部插件更新| +|#更新日志|最近50条commit记录| +|#添加xxx|添加表情,文字等内容,支持多个| +|#添加图片|添加图片默认为表情,大图显示请用添加图片| +|#删除xxx|删除已添加表情| +|#删除全部|删除全部表情| +|#表情列表|显示已添加内容| +|#表情xxx|搜索已添加内容| +|#设置刻晴别名|自定义别名| +|#删除别名龟龟|删除设置的别名| +|#刻晴别名|别名列表| +|#配置ck|添加公共查询ck| +|#使用用户ck|将用户ck加入到公共查询ck池| + +| 兑换码相关 | 说明 | +| :---------------- | --------------- | +|#兑换码使用 兑换码 或者 #cdk-u 兑换码|将兑换码使用掉,兑换内容将通过游戏内邮件系统发送到当前用户的uid| +|#兑换码|获取直播兑换码,目前只支持国服| diff --git a/src/Yunzai-Bot/plugins/genshin/apps/abbrSet.js b/src/Yunzai-Bot/plugins/genshin/apps/abbrSet.js new file mode 100644 index 0000000000000000000000000000000000000000..7c4639fefbec31f9f0c13a74fc3c3d461d458a3d --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/abbrSet.js @@ -0,0 +1,208 @@ +import plugin from '../../../lib/plugins/plugin.js' +import fs from 'node:fs' +import gsCfg from '../model/gsCfg.js' +import YAML from 'yaml' +import lodash from 'lodash' + +export class abbrSet extends plugin { + constructor (e) { + super({ + name: '别名设置', + dsc: '角色别名设置', + event: 'message', + priority: 600, + rule: [ + { + reg: '^#(设置|配置)(.*)(别名|昵称)$', + fnc: 'abbr' + }, + { + reg: '^#删除(别名|昵称)(.*)$', + fnc: 'delAbbr' + }, + { + reg: '^#(.*)(别名|昵称)$', + fnc: 'abbrList' + } + ] + }) + + this.file = './plugins/genshin/config/role.name.yaml' + } + + async init () { + if (!fs.existsSync(this.file)) { + fs.writeFileSync(this.file, `神里绫华: + - 龟龟 + - 小乌龟`) + } + } + + async abbr () { + if (!await this.checkAuth()) return + let role = gsCfg.getRole(this.e.msg, '#|设置|配置|别名|昵称') + if (!role) return false + this.e.role = role + this.setContext('setAbbr') + + await this.reply(`请发送${role.alias}别名,多个用空格隔开`) + } + + async checkAuth () { + if (!this.e.isGroup && !this.e.isMaster) { + await this.reply('禁止私聊设置角色别名') + return false + } + + let abbrSetAuth = gsCfg.getConfig('mys', 'set').abbrSetAuth + /** 所有人都允许 */ + if (abbrSetAuth === 0) return true + /** 主人默认允许 */ + if (this.e.isMaster) return true + /** 管理员 */ + if (abbrSetAuth == 1) { + if (!Bot.gml.has(this.e.group_id)) { + return false + } + if (!Bot.gml.get(this.e.group_id).get(this.e.user_id)) { + return false + } + if (!this.e.member.is_admin) { + this.e.reply('暂无权限,只有管理员才能操作') + return false + } + } + + return true + } + + async setAbbr () { + if (!this.e.msg || this.e.at || this.e.img) { + await this.reply('设置错误:请发送正确内容') + return + } + + let { setAbbr = {} } = this.getContext() + this.finish('setAbbr') + + let role = setAbbr.role + let setName = this.e.msg.split(' ') + + let nameArr = gsCfg.getConfig('role', 'name') + + if (!nameArr[role.name]) { + nameArr[role.name] = [] + } + + let ret = [] + for (let name of setName) { + name = name.replace(/#|设置|配置|别名|昵称/g, '') + if (!name) continue + /** 重复添加 */ + if (nameArr[role.name].includes(name) || gsCfg.roleNameToID(name)) { + continue + } + + nameArr[role.name].push(name) + ret.push(name) + } + if (ret.length <= 0) { + await this.reply('设置失败:别名错误或已存在') + return + } + + this.save(nameArr) + + gsCfg.nameID = false + + await this.reply(`设置别名成功:${ret.join('、')}`) + } + + save (data) { + data = YAML.stringify(data) + fs.writeFileSync(this.file, data) + } + + async delAbbr () { + let role = gsCfg.getRole(this.e.msg, '#|删除|别名|昵称') + + if (!role) return false + + let nameArr = gsCfg.getConfig('role', 'name') + + if (!nameArr[role.name]) { + await this.reply('默认别名设置,不能删除!') + return true + } + + nameArr[role.name] = nameArr[role.name].filter((v) => { + if (v == role.alias) return false + return v + }) + + this.save(nameArr) + + await this.reply(`设置${role.name}别名成功:${role.alias}`) + } + + async abbrList () { + let role = gsCfg.getRole(this.e.msg, '#|别名|昵称') + + if (!role) return false + + let name = gsCfg.getdefSet('role', 'name')[role.roleId] + let nameUser = gsCfg.getConfig('role', 'name')[role.name] ?? [] + + let list = lodash.uniq([...name, ...nameUser]) + + let msg = [] + for (let i in list) { + let num = Number(i) + 1 + msg.push(`${num}.${list[i]}\n`) + } + + let title = `${role.name}别名,${list.length}个` + + msg = await this.makeForwardMsg(Bot.uin, title, msg) + + await this.e.reply(msg) + } + + async makeForwardMsg (qq, title, msg) { + let nickname = Bot.nickname + if (this.e.isGroup) { + let info = await Bot.getGroupMemberInfo(this.e.group_id, qq) + nickname = info.card ?? info.nickname + } + let userInfo = { + user_id: Bot.uin, + nickname + } + + let forwardMsg = [ + { + ...userInfo, + message: title + }, + { + ...userInfo, + message: msg + } + ] + + /** 制作转发内容 */ + if (this.e.isGroup) { + forwardMsg = await this.e.group.makeForwardMsg(forwardMsg) + } else { + forwardMsg = await this.e.friend.makeForwardMsg(forwardMsg) + } + + /** 处理描述 */ + forwardMsg.data = forwardMsg.data + .replace(/\n/g, '') + .replace(/(.+?)<\/title>/g, '___') + .replace(/___+/, `<title color="#777777" size="26">${title}`) + + return forwardMsg + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/apps/calculator.js b/src/Yunzai-Bot/plugins/genshin/apps/calculator.js new file mode 100644 index 0000000000000000000000000000000000000000..75e6614c28a11a5d412fed9de913ddc2a48935a6 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/calculator.js @@ -0,0 +1,71 @@ +import plugin from '../../../lib/plugins/plugin.js' +import Calculator from '../model/calculator.js' +import Blueprint from '../model/blueprint.js' +import puppeteer from '../../../lib/puppeteer/puppeteer.js' +import gsCfg from '../model/gsCfg.js' + +export class calculator extends plugin { + constructor () { + super({ + name: '养成计算', + dsc: '角色养成材料计算器', + event: 'message', + priority: 700, + rule: [ + { + reg: '^#*(.*)(养成|计算)([0-9]|,|,| )*$', + fnc: 'Calculator' + }, + { + reg: '^#*角色(养成|计算|养成计算)$', + fnc: 'calculatorHelp' + }, + { + reg: '^#*尘歌壶模数(养成|计算|养成计算)$', + fnc: 'blueprintHelp' + }, + { + reg: '^#*尘歌壶(模数|养成|养成计算)(\\d{10,15})$', + fnc: 'Blueprint' + }, + ] + }) + } + async blueprintHelp (e) { + let msg = '#尘歌壶模数\n指令:#尘歌壶模数\n示例:#尘歌壶模数123456\n参数为模数id(10-15位数字)' + await e.reply(msg) + return true + } + + async calculatorHelp (e) { + let msg = '#角色养成计算\n指令:#刻晴养成\n示例:#刻晴养成81 90 9 9 9\n参数为角色、武器、技能等级' + await e.reply(msg) + return true + } + async Blueprint(){ + let role = this.e.msg.replace(/#/,'').match(/\d+/g); + let data = await new Blueprint(this.e).get(role) + if (!data) return + + /** 生成图片 */ + let img = await puppeteer.screenshot('Blueprint', data) + if (img) await this.reply(img) + } + /** #刻晴养成 */ + async Calculator () { + let role = gsCfg.getRole(this.e.msg, '#|#|养成|计算|[0-9]|,|,| ') + if (!role) return false + + if ([10000005, 10000007, 20000000].includes(Number(role.roleId))) { + await this.e.reply('暂不支持旅行者养成计算') + return true + } + + let data = await new Calculator(this.e).get(role) + if (!data) return + + /** 生成图片 */ + let img = await puppeteer.screenshot('Calculator', data) + if (img) await this.reply(img) + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/apps/dailyNote.js b/src/Yunzai-Bot/plugins/genshin/apps/dailyNote.js new file mode 100644 index 0000000000000000000000000000000000000000..b33719ea8fe0ab2e13c4fdefa64be4252f4f40e7 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/dailyNote.js @@ -0,0 +1,72 @@ +import plugin from '../../../lib/plugins/plugin.js' +import Note from '../model/note.js' +import MysSign from '../model/mysSign.js' +import gsCfg from '../model/gsCfg.js' +import puppeteer from '../../../lib/puppeteer/puppeteer.js' + +gsCfg.cpCfg('mys', 'set') + +export class dailyNote extends plugin { + constructor () { + super({ + name: '体力查询', + dsc: '原神体力、札记查询,米游社签到', + event: 'message', + priority: 300, + rule: [ + { + reg: '^#*(体力|树脂|查询体力)$', + fnc: 'note' + }, + { + reg: '^(#签到|#*米游社(自动)*签到)(force)*$', + fnc: 'sign' + }, + { + reg: '^#(全部签到|签到任务)(force)*$', + permission: 'master', + fnc: 'signTask' + }, + { + reg: '^#*(开启|关闭|取消)(米游社|自动|原神)*签到$', + fnc: 'signClose' + } + ] + }) + + this.set = gsCfg.getConfig('mys', 'set') + + /** 定时任务 */ + this.task = { + cron: this.set.signTime, + name: '米游社原神签到任务', + fnc: () => this.signTask() + } + } + + /** #体力 */ + async note () { + let data = await Note.get(this.e) + if (!data) return + + /** 生成图片 */ + let img = await puppeteer.screenshot('dailyNote', data) + if (img) await this.reply(img) + } + + /** #签到 */ + async sign () { + await MysSign.sign(this.e) + } + + /** 签到任务 */ + async signTask () { + let mysSign = new MysSign(this.e) + await mysSign.signTask(!!this?.e?.msg) + } + + async signClose () { + let mysSign = new MysSign(this.e) + await mysSign.signClose() + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/apps/exchange.js b/src/Yunzai-Bot/plugins/genshin/apps/exchange.js new file mode 100644 index 0000000000000000000000000000000000000000..b11adebefcc1336d1a297f68b8ab5980e1b2c026 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/exchange.js @@ -0,0 +1,108 @@ +import plugin from '../../../lib/plugins/plugin.js' +import common from '../../../lib/common/common.js' +import fetch from 'node-fetch' +import lodash from 'lodash' +import MysInfo from '../model/mys/mysInfo.js' + +export class exchange extends plugin { + constructor (e) { + super({ + name: '兑换码', + dsc: '前瞻直播兑换码', + event: 'message', + priority: 1000, + rule: [ + { + reg: '^#*(直播|前瞻)*兑换码$', + fnc: 'getCode' + }, + { + reg: '#(兑换码使用|cdk-u) .+', + fnc: 'useCode' + } + ] + }) + } + + async getCode () { + this.now = parseInt(Date.now() / 1000) + let actid = await this.getActId() + if (!actid) return + this.actId = actid + + /** index info */ + let index = await this.getData('index') + if (!index || !index.data) return + if(index.data === null){ + return await this.reply(`错误:\n${index.message}`) + } + this.mi18n = index.data.mi18n + let mi18n = await this.getData('mi18n') + + if (index.data.remain > 0) { + let version = mi18n['act-title'].match(/\d.\d/g) + return await this.reply(`暂无直播兑换码\n${version}版本前瞻${mi18n['empty-code-text']}`) + } + + let code = await this.getData('code') + if (!code) return + + code = lodash.map(code, 'code') + let msg = '' + if (code.length >= 3) { + msg = [`${mi18n['act-title']}-直播兑换码`, `${mi18n['exchange-tips']}`, ...code] + msg = await common.makeForwardMsg(this.e, msg, msg[0]) + } else if (this.e.msg.includes('#')) { + msg += code.join('\n') + } else { + msg = `${mi18n['act-title']}-直播兑换码\n` + msg += `${mi18n['exchange-tips']}\n\n` + msg += code.join('\n') + } + + await this.reply(msg) + } + + async getData (type) { + let url = { + index: `https://api-takumi.mihoyo.com/event/bbslive/index?act_id=${this.actId}`, + mi18n: `https://webstatic.mihoyo.com/admin/mi18n/bbs_cn/${this.mi18n}/${this.mi18n}-zh-cn.json`, + code: `https://webstatic.mihoyo.com/bbslive/code/${this.actId}.json?version=1&time=${this.now}`, + actId: 'https://bbs-api.mihoyo.com/post/wapi/getPostFullInCollection?collection_id=1280130&gids=2&order_type=2' + } + + let response + try { + response = await fetch(url[type], { method: 'get' }) + } catch (error) { + logger.error(error.toString()) + return false + } + + if (!response.ok) { + logger.error(`[兑换码接口错误][${type}] ${response.status} ${response.statusText}`) + return false + } + const res = await response.json() + return res + } + + async getActId () { + let ret = await this.getData('actId') + if (!ret || ret.retcode !== 0) return false + + let post = lodash.map(ret.data.posts, 'post') + post = lodash.maxBy(post, 'created_at') + let actId = post.content.replace(/\[链接\]|\[图片\]/g, '').trim() + if (!actId) return false + + return actId + } + async useCode(){ + let cdkCode = this.e.message[0].text.split(/#(兑换码使用|cdk-u) /, 3)[2]; + let res = await MysInfo.get(this.e, 'useCdk',{cdk:cdkCode}) + if(res){ + this.e.reply(`${res.data.msg}`) + } + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/apps/gacha.js b/src/Yunzai-Bot/plugins/genshin/apps/gacha.js new file mode 100644 index 0000000000000000000000000000000000000000..d1d5155ea3c283d9cdaaddabd31c67ee62ff4ccb --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/gacha.js @@ -0,0 +1,130 @@ +/** 导入plugin */ +import plugin from '../../../lib/plugins/plugin.js' +import GachaData from '../model/gachaData.js' +import fs from 'node:fs' +import lodash from 'lodash' +import puppeteer from '../../../lib/puppeteer/puppeteer.js' +export class gacha extends plugin { + constructor () { + super({ + name: '十连', + dsc: '模拟抽卡,每天十连一次,四点更新', + event: 'message', + priority: 100, + rule: [ + { + reg: '^#*(10|[武器池常驻]*[十]+|抽|单)[连抽卡奖][123武器池常驻]*$', + fnc: 'gacha' + }, + { + reg: '(^#*定轨|^#定轨(.*))$', + fnc: 'weaponBing' + } + ] + }) + } + + /** #十连 */ + async gacha () { + this.GachaData = await GachaData.init(this.e) + + if (this.checkLimit()) return + + let data = await this.GachaData.run() + + /** 生成图片 */ + let img = await puppeteer.screenshot('gacha', data) + if (!img) return + + /** 撤回消息 */ + let recallMsg = this.GachaData.set.delMsg + + /** 出货了不撤回 */ + if (data.nowFive >= 1 || data.nowFour >= 4) { + recallMsg = 0 + } + + await this.reply(img, false, { recallMsg }) + } + + /** 检查限制 */ + checkLimit () { + /** 主人不限制 */ + if (this.e.isMaster) return false + + let { user } = this.GachaData + let { num, weaponNum } = user.today + + let nowCount = num + if (this.GachaData.type == 'weapon') nowCount = weaponNum + + if (this.GachaData.set.LimitSeparate == 1) { + if (nowCount < this.GachaData.set.count * 10) return false + } else { + if (num + weaponNum < this.GachaData.set.count * 10) return false + } + + let msg = lodash.truncate(this.e.sender.card, { length: 8 }) + '\n' + + if (user.today.star.length > 0) { + msg += '今日五星:' + if (user.today.star.length >= 4) { + msg += `${user.today.star.length}个` + } else { + user.today.star.forEach(v => { + msg += `${v.name}(${v.num})\n` + }) + msg = lodash.trim(msg, '\n') + } + if (user.week.num >= 2) { + msg += `\n本周:${user.week.num}个五星` + } + } else { + msg += `今日已抽,累计${nowCount}抽无五星` + } + this.reply(msg, false, { recallMsg: this.GachaData.set.delMsg }) + return true + } + + /** #定轨 */ + async weaponBing () { + let Gacha = await GachaData.init(this.e) + + let { NowPool, user, msg = '' } = Gacha + + if (user.weapon.type >= 2) { + user.weapon.type = 0 + user.weapon.bingWeapon = '' + msg = '\n定轨已取消' + } else { + user.weapon.type++ + user.weapon.bingWeapon = NowPool.weapon5[user.weapon.type - 1] + msg = [] + NowPool.weapon5.forEach((v, i) => { + if (user.weapon.type - 1 == i) { + msg.push(`[√] ${NowPool.weapon5[i]}`) + } else { + msg.push(`[ ] ${NowPool.weapon5[i]}`) + } + }) + msg = '定轨成功\n' + msg.join('\n') + } + /** 命定值清零 */ + user.weapon.lifeNum = 0 + Gacha.user = user + Gacha.saveUser() + + this.reply(msg, false, { at: this.e.user_id }) + } + + /** 初始化创建配置文件 */ + async init () { + GachaData.getStr() + + let file = './plugins/genshin/config/gacha.set.yaml' + + if (fs.existsSync(file)) return + + fs.copyFileSync('./plugins/genshin/defSet/gacha/set.yaml', file) + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/apps/gcLog.js b/src/Yunzai-Bot/plugins/genshin/apps/gcLog.js new file mode 100644 index 0000000000000000000000000000000000000000..8f8939de98fbc4457c31e1c958c4f08b25669359 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/gcLog.js @@ -0,0 +1,209 @@ +import plugin from '../../../lib/plugins/plugin.js' +import puppeteer from '../../../lib/puppeteer/puppeteer.js' +import fs from 'node:fs' +import GachaLog from '../model/gachaLog.js' +import ExportLog from '../model/exportLog.js' +import LogCount from '../model/logCount.js' +import { segment } from 'oicq' + +const _path = process.cwd() + '/plugins/genshin' + +export class gcLog extends plugin { + constructor () { + super({ + name: '抽卡记录', + dsc: '抽卡记录数据统计', + event: 'message', + priority: 300, + rule: [ + { + reg: '(.*)authkey=(.*)', + fnc: 'logUrl' + }, + { + reg: '#txt日志文件导入记录', + fnc: 'logFile' + }, + { + reg: '#xlsx文件导入记录', + fnc: 'logXlsx' + }, + { + reg: '#json文件导入记录', + fnc: 'logJson' + }, + { + reg: '^#*(抽卡|抽奖|角色|武器|常驻|up)池*(记录|祈愿|分析)$', + fnc: 'getLog' + }, + { + reg: '^#*导出记录(excel|xlsx|json)*$', + fnc: 'exportLog' + }, + { + reg: '^#*(记录帮助|抽卡帮助)$', + fnc: 'help' + }, + { + reg: '^#*(安卓|苹果|电脑|pc|ios)帮助$', + fnc: 'helpPort' + }, + { + reg: '^#*(抽卡|抽奖|角色|武器|常驻|up)池*统计$', + fnc: 'logCount' + } + ] + }) + + this.androidUrl = 'docs.qq.com/doc/DUWpYaXlvSklmVXlX' + } + + async init () { + let file = './data/gachaJson' + if (!fs.existsSync(file)) { + fs.mkdirSync(file) + } + } + + accept () { + if (this.e.file && this.e.isPrivate) { + let name = this.e.file?.name + if (name.includes('txt')) { + this.e.msg = '#txt日志文件导入记录' + if (name.includes('output')) return true + } + if (/(.*)[1-9][0-9]{8}(.*).xlsx$/ig.test(name)) { + this.e.msg = '#xlsx文件导入记录' + return true + } + if (/(.*)[1-9][0-9]{8}(.*).json/ig.test(name)) { + this.e.msg = '#json文件导入记录' + return true + } + } + if (this.e.msg && /^#*(角色|武器)统计$/g.test(this.e.msg)) { + this.e.msg = this.e.msg.replace('统计', '池统计') + return true + } + } + + /** 抽卡记录链接 */ + async logUrl () { + if (!this.e.isPrivate) { + this.e.reply('请私聊发送链接', false, { at: true }) + return true + } + + let data = await new GachaLog(this.e).logUrl() + if (!data) return + + let img = await puppeteer.screenshot('gachaLog', data) + if (img) await this.reply(img) + } + + /** 发送output_log.txt日志文件 */ + async logFile () { + if (!this.e.isPrivate) { + await this.e.reply('请私聊发送日志文件', false, { at: true }) + return true + } + + if (!this.e.file || !this.e.file.name.includes('txt')) { + await this.e.reply('请发送日志文件') + } else { + await this.e.reply('3.0版本后,日志文件已不能获取抽取记录链接\n请用安卓方式获取') + return true + } + + let data = await new GachaLog(this.e).logFile() + if (!data) return false + + if (typeof data != 'object') return + + let img = await puppeteer.screenshot('gachaLog', data) + if (img) await this.reply(img) + } + + /** #抽卡记录 */ + async getLog () { + let data = await new GachaLog(this.e).getLogData() + if (!data) return + + let img = await puppeteer.screenshot('gachaLog', data) + if (img) await this.reply(img) + } + + /** 导出记录 */ + async exportLog () { + if (this.e.isGroup) { + await this.reply('请私聊导出', false, { at: true }) + return + } + + let friend = Bot.fl.get(Number(this.e.user_id)) + if (!friend) { + await this.reply('无法发送文件,请先添加好友') + return + } + + let exportLog = new ExportLog(this.e) + + if (this.e.msg.includes('json')) { + return await exportLog.exportJson() + } else { + return await exportLog.exportXlsx() + } + } + + async logXlsx () { + if (!this.e.isPrivate) { + await this.e.reply('请私聊发送日志文件', false, { at: true }) + return true + } + + if (!this.e.file) { + await this.e.reply('请发送xlsx文件') + return true + } + + await new ExportLog(this.e).logXlsx() + } + + async logJson () { + if (!this.e.isPrivate) { + await this.e.reply('请私聊发送Json文件', false, { at: true }) + return true + } + + if (!this.e.file) { + await this.e.reply('请发送Json文件') + return true + } + + await new ExportLog(this.e).logJson() + } + + async help () { + await this.e.reply(segment.image(`file:///${_path}/resources/logHelp/记录帮助.png`)) + } + + async helpPort () { + let msg = this.e.msg.replace(/#|帮助/g, '') + + if (['电脑', 'pc'].includes(msg)) { + await this.e.reply(segment.image(`file:///${_path}/resources/logHelp/记录帮助-电脑.png`)) + } else if (['安卓'].includes(msg)) { + await this.e.reply(`安卓抽卡记录获取教程:${this.androidUrl}`) + } else if (['苹果', 'ios'].includes(msg)) { + await this.e.reply(segment.image(`file:///${_path}/resources/logHelp/记录帮助-苹果.png`)) + } + } + + async logCount () { + let data = await new LogCount(this.e).count() + if (!data) return + + let img = await puppeteer.screenshot('logCount', data) + if (img) await this.reply(img) + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/apps/help.js b/src/Yunzai-Bot/plugins/genshin/apps/help.js new file mode 100644 index 0000000000000000000000000000000000000000..b9b2b26a37bee99578866a287a0f5a6c84701596 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/help.js @@ -0,0 +1,44 @@ +import plugin from '../../../lib/plugins/plugin.js' +import puppeteer from '../../../lib/puppeteer/puppeteer.js' +import Help from '../model/help.js' +import md5 from 'md5' + +let helpData = { + md5: '', + img: '' +} + +export class help extends plugin { + constructor (e) { + super({ + name: '云崽帮助', + dsc: '云崽帮助', + event: 'message', + priority: 500, + rule: [ + { + reg: '^(#|云崽)*(命令|帮助|菜单|help|说明|功能|指令|使用说明)$', + fnc: 'help' + } + ] + }) + } + + async help () { + let data = await Help.get(this.e) + if (!data) return + + let img = await this.cache(data) + await this.reply(img) + } + + async cache (data) { + let tmp = md5(JSON.stringify(data)) + if (helpData.md5 == tmp) return helpData.img + + helpData.img = await puppeteer.screenshot('help', data) + helpData.md5 = tmp + + return helpData.img + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/apps/ledger.js b/src/Yunzai-Bot/plugins/genshin/apps/ledger.js new file mode 100644 index 0000000000000000000000000000000000000000..2ea3640eb094b6a26db04f0c0be995da2a99e5e5 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/ledger.js @@ -0,0 +1,87 @@ +import plugin from '../../../lib/plugins/plugin.js' +import Ledger from '../model/ledger.js' +import puppeteer from '../../../lib/puppeteer/puppeteer.js' +import fs from 'node:fs' + +export class ledger extends plugin { + constructor () { + super({ + name: '札记查询', + dsc: '原神体米游社札记原神查询', + event: 'message', + priority: 300, + rule: [ + { + reg: '^(#原石|#*札记)([0-9]|[一二两三四五六七八九十]+)*月*$', + fnc: 'ledger' + }, + { + reg: '^(#签到|#*米游社(自动)*签到)$', + fnc: 'sign' + }, + { + reg: '^#原石任务$', + permission: 'master', + fnc: 'ledgerTask' + }, + { + reg: '^#*(原石|札记)统计$', + fnc: 'ledgerCount' + }, + { + reg: '^#*(去年|今年|\\d{4}年)(原石|札记)统计$', + fnc: 'ledgerCountHistory' + } + ] + }) + + // this.set = gsCfg.getConfig('mys', 'set') + + // /** 定时任务 */ + // this.task = { + // cron: this.set.signTime, + // name: '米游社签到任务', + // fnc: () => this.signTask() + // } + } + + async init () { + if (!fs.existsSync('./data/NoteData')) { + fs.mkdirSync('./data/NoteData') + } + } + + /** #原石札记 */ + async ledger () { + let data = await new Ledger(this.e).get() + if (!data) return + + /** 生成图片 */ + let img = await puppeteer.screenshot('ledger', data) + if (img) await this.reply(img) + } + + /** 原石任务 */ + async ledgerTask () { + let ledger = new Ledger(this.e) + await ledger.ledgerTask(!!this?.e?.msg) + } + + async ledgerCount () { + let data = await new Ledger(this.e).ledgerCount() + if (!data) return + + /** 生成图片 */ + let img = await puppeteer.screenshot('ledgerCount', data) + if (img) await this.reply(img) + } + + async ledgerCountHistory () { + let data = await new Ledger(this.e).ledgerCountHistory() + if (!data) return + + /** 生成图片 */ + let img = await puppeteer.screenshot('ledgerCount', data) + if (img) await this.reply(img) + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/apps/material.js b/src/Yunzai-Bot/plugins/genshin/apps/material.js new file mode 100644 index 0000000000000000000000000000000000000000..17652c6a6d70381b5e869a96d42e392ce8a7989f --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/material.js @@ -0,0 +1,194 @@ +/** 导入plugin */ +import plugin from '../../../lib/plugins/plugin.js' +import gsCfg from '../model/gsCfg.js' +import common from '../../../lib/common/common.js' +import { segment } from 'oicq' +import fs from 'node:fs' +import fetch from 'node-fetch' + +export class material extends plugin { + constructor () { + super({ + name: '角色素材', + dsc: '角色养成突破素材,来自米游社友人A', + event: 'message', + priority: 500, + rule: [ + { + reg: '#*(.*)(突破|材料|素材)$', + fnc: 'material' + } + ] + }) + + this.path = './data/material_友人A' + this.pathOther = './data/material_other' + this.url = 'https://bbs-api.mihoyo.com/post/wapi/getPostFullInCollection?&gids=2&order_type=2&collection_id=' + + this.collection_id = [428421, 1164644, 1362644] + + this.special = ['雷电将军', '珊瑚宫心海', '菲谢尔', '托马', '八重神子', '九条裟罗', '辛焱', '神里绫华'] + + this.oss = '?x-oss-process=image//resize,s_1000/quality,q_80/auto-orient,0/interlace,1/format,jpg' + } + + /** 初始化创建配置文件 */ + async init () { + if (!fs.existsSync(this.path)) { + fs.mkdirSync(this.path) + } + if (!fs.existsSync(this.pathOther)) { + fs.mkdirSync(this.pathOther) + } + } + + /** #刻晴攻略 */ + async material () { + let isUpdate = !!this.e.msg.includes('更新') + let role = gsCfg.getRole(this.e.msg, '突破|材料|素材|更新') + + if (!role) return false + + /** 主角特殊处理 */ + if (['10000005', '10000007', '20000000'].includes(String(role.roleId))) { + await this.e.reply('暂无主角素材') + return + } + + this.imgPath = `${this.path}/${role.name}.jpg` + + if (fs.existsSync(this.imgPath) && !isUpdate) { + await this.e.reply(segment.image(`file://${this.imgPath}`)) + return + } + + if (await this.getImg(role.name)) { + return await this.e.reply(segment.image(`file://${this.imgPath}`)) + } + + this.imgPath = `${this.pathOther}/${role.name}.jpg` + + if (fs.existsSync(this.imgPath) && !isUpdate) { + await this.e.reply(segment.image(`file://${this.imgPath}`)) + return + } + + if (await this.getImgOther(role.name)) { + return await this.e.reply(segment.image(`file://${this.imgPath}`)) + } + + if (await this.getImgOther2(role.name)) { + return await this.e.reply(segment.image(`file://${this.imgPath}`)) + } + } + + /** 下载攻略图 */ + async getImg (name) { + let ret = await this.getData(this.collection_id[0]) + + if (!ret || ret.retcode !== 0) { + await this.e.reply('暂无素材数据,请稍后再试') + logger.error(`米游社接口报错:${ret.message || '未知错误'}}`) + return false + } + + let url + for (let val of ret.data.posts) { + if (val.post.subject.includes(name)) { + url = val.image_list[1].url + if (this.special.includes(name)) { + url = val.image_list[2].url + } + break + } + } + + if (!url) { + return false + } + + logger.mark(`${this.e.logFnc} 下载${name}素材图`) + + if (!await common.downFile(url + this.oss, this.imgPath)) { + return false + } + + logger.mark(`${this.e.logFnc} 下载${name}素材成功`) + + return true + } + + async getImgOther (name) { + let ret = await this.getData(this.collection_id[1]) + + if (!ret || ret.retcode !== 0) { + await this.e.reply('暂无素材数据,请稍后再试') + logger.error(`米游社接口报错:${ret.message || '未知错误'}}`) + return false + } + + let url + for (let val of ret.data.posts) { + if (val.post.subject.includes(name)) { + url = val.image_list[0].url + break + } + } + + if (!url) { + return false + } + + logger.mark(`${this.e.logFnc} 下载${name}素材图`) + + if (!await common.downFile(url + this.oss, this.imgPath)) { + return false + } + + logger.mark(`${this.e.logFnc} 下载${name}素材成功`) + + return true + } + + async getImgOther2 (name) { + let ret = await this.getData(this.collection_id[2]) + + if (!ret || ret.retcode !== 0) { + await this.e.reply('暂无素材数据,请稍后再试') + logger.error(`米游社接口报错:${ret.message || '未知错误'}}`) + return false + } + + let url + for (let val of ret.data.posts) { + if (val.post.subject.includes(name)) { + url = val.image_list[2].url + break + } + } + + if (!url) { + return false + } + + logger.mark(`${this.e.logFnc} 下载${name}素材图`) + + if (!await common.downFile(url + this.oss, this.imgPath)) { + return false + } + + logger.mark(`${this.e.logFnc} 下载${name}素材成功`) + + return true + } + + /** 获取数据 */ + async getData (collectionId) { + let response = await fetch(this.url + collectionId, { method: 'get' }) + if (!response.ok) { + return false + } + const res = await response.json() + return res + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/apps/mysNews.js b/src/Yunzai-Bot/plugins/genshin/apps/mysNews.js new file mode 100644 index 0000000000000000000000000000000000000000..654706d96d8a97d69452604e5874eac666d618c7 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/mysNews.js @@ -0,0 +1,131 @@ +import plugin from '../../../lib/plugins/plugin.js' +import MysNews from '../model/mysNews.js' +import fs from 'node:fs' +import lodash from 'lodash' +import gsCfg from '../model/gsCfg.js' +import YAML from 'yaml' + +gsCfg.cpCfg('mys', 'pushNews') +export class mysNews extends plugin { + constructor (e) { + super({ + name: '米游社公告', + dsc: '#公告 #资讯 #活动', + event: 'message', + priority: 700, + rule: [ + { + reg: '^(#*官方(公告|资讯|活动)|#*原神(公告|资讯|活动)|#公告|#资讯|#活动)[0-9]*$', + fnc: 'news' + }, + { + reg: '^(#米游社|#mys)(.*)', + fnc: 'mysSearch' + }, + { + reg: '(.*)(bbs.mihoyo.com|miyoushe.com)/ys(.*)/article(.*)', + fnc: 'mysUrl' + }, + { + reg: '#*原(石|神)(预估|盘点)$', + fnc: 'ysEstimate' + }, + { + reg: '^#*(开启|关闭)(公告|资讯)推送$', + fnc: 'setPush' + }, + { + reg: '^#推送(公告|资讯)$', + permission: 'master', + fnc: 'mysNewsTask' + } + + ] + }) + + this.file = './plugins/genshin/config/mys.pushNews.yaml' + + /** 定时任务 */ + this.task = { + cron: gsCfg.getConfig('mys', 'pushNews').pushTime, + name: '米游社公告推送任务', + fnc: () => this.mysNewsTask(), + log: false + } + } + + async init () { + if (fs.existsSync(this.file)) return + + fs.copyFileSync('./plugins/genshin/defSet/mys/pushNews.yaml', this.file) + } + + async news () { + let data = await new MysNews(this.e).getNews() + if (!data) return + await this.reply(data) + } + + async mysNewsTask () { + let mysNews = new MysNews(this.e) + await mysNews.mysNewsTask() + } + + async mysSearch () { + if (/签到/g.test(this.e.msg)) return false + let data = await new MysNews(this.e).mysSearch() + if (!data) return + await this.reply(data) + } + + async mysUrl () { + let data = await new MysNews(this.e).mysUrl() + if (!data) return + await this.reply(data) + } + + async ysEstimate () { + let data = await new MysNews(this.e).ysEstimate() + if (!data) return + await this.reply(data) + } + + async setPush () { + if (!this.e.isGroup) { + await this.reply('推送请在群聊中设置') + return + } + if (!this.e.member?.is_admin && !this.e.isMaster) { + await this.reply('暂无权限,只有管理员才能操作', true) + return true + } + + let cfg = gsCfg.getConfig('mys', 'pushNews') + + let type = 'announceGroup' + let typeName = '公告' + if (this.e.msg.includes('资讯')) { + type = 'infoGroup' + typeName = '资讯' + } + + let model + let msg = `原神${typeName}推送已` + if (this.e.msg.includes('开启')) { + model = '开启' + cfg[type].push(this.e.group_id) + cfg[type] = lodash.uniq(cfg[type]) + msg += `${model}\n如有最新${typeName}将自动推送至此` + } else { + model = '关闭' + msg += `${model}` + cfg[type] = lodash.difference(cfg[type], [this.e.group_id]) + } + + let yaml = YAML.stringify(cfg) + fs.writeFileSync(this.file, yaml, 'utf8') + + logger.mark(`${this.e.logFnc} ${model}${typeName}推送:${this.e.group_id}`) + await this.reply(msg) + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/apps/payLog.js b/src/Yunzai-Bot/plugins/genshin/apps/payLog.js new file mode 100644 index 0000000000000000000000000000000000000000..5ef4bcbc15abed67fd0a3342e890839a060ff94f --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/payLog.js @@ -0,0 +1,176 @@ +import plugin from '../../../lib/plugins/plugin.js' +import { PayData, renderImg } from '../model/payLogData.js' +import url from 'url' +import fs from 'fs' +import path from 'path' +import yaml from 'yaml' + +export class payLog extends plugin { + constructor () { + super({ + name: '充值记录', + dsc: '充值记录,消费记录,充值统计,消费统计', + event: 'message', + priority: 299, + rule: [ + { + reg: '^#?(充值|消费)(记录|统计)$', + fnc: 'payLog' + }, + { + reg: '^#?更新(充值|消费)(记录|统计)', + fnc: 'updatePayLog' + }, + { + // 优先级高于抽卡记录,但是发送抽卡链接时不会抢指令,对比过米游社链接和抽卡链接,该字段为米游社链接字段 + reg: '(.*)(bill-record-user|customer-claim|player-log|user.mihoyo.com)(.*)', + fnc: 'getAuthKey' + }, + { + reg: '^#?(充值|消费)(记录|统计)帮助', + fnc: 'payLogHelp' + } + ] + }) + } + + dirPath = path.resolve('./data/payLog/') + authKey = '' + + async payLog (e) { + // 判断是否存有已经生成的数据 + if (!fs.readdirSync(this.dirPath, 'utf-8').includes(e.user_id + '.yaml')) { + // 如果没有则判断是否已经缓存了authkey,这个主要针对使用抽卡链接的,和苹果用户 + await this.updatePayLog() + return true + } + + // 如果有就判断用户的主分支uid是什么 + const mainUid = await this.isMain(e.user_id) + + // 再读取现有数据 + // const _path = path.resolve(`./data/payLog/${e.user_id}.yaml`) + let data = fs.readFileSync(this.dirPath + `/${e.user_id}.yaml`, 'utf-8') + data = yaml.parse(data) + + // 如果用户没有绑定ck,就直接发送保存的数据 + if (!mainUid) { + let key = Object.keys(data) + let img = await renderImg(data[key[0]]) + this.reply(img) + return true + } + + // 判断已有数据里是否有该uid的数据 + if (data[mainUid]) { + // 如果有该uid的数据,就发送 + let img = await renderImg(data[mainUid]) + this.reply(img) + return true + } else { + // 没有就获取 + this.reply('当前绑定的uid未获取数据,请私聊获取') + return false + } + } + + // 获取authKey + async getAuthKey () { + // 判断是否为群聊发送 + if (this.e.isGroup) { + return false + } + + // 判断字段中是否有authkey + if (!this.e.msg.includes('authkey')) { + this.reply('链接无效,请重新发送') + return false + } + + // 解析出authKey + let userUrl = this.e.msg.replace(/[\u4e00-\u9fa5]/g, '').replace(/\s+/g, '') + this.authKey = url.parse(userUrl, true, true).query.authkey + + // 获取数据 + this.reply('正在获取消费数据,可能需要30s~~') + let data = new PayData(this.authKey) + let imgData = await data.filtrateData() + if (imgData?.errorMsg) { + this.reply(imgData?.errorMsg) + return true + } + + // 发送图片 + let img = await renderImg(imgData) + this.reply(img) + + // 存储数据 + await this.writeData(imgData) + await redis.setEx(`Yz:genshin:mys:qq-uid:${this.e.user_id}`, 3600 * 24 * 30, imgData.uid) + await redis.setEx(`Yz:genshin:payLog:${imgData.uid}`, 3600 * 24, this.authKey) + return true + } + + /** 更新充值统计 */ + async updatePayLog (e) { + // 读一下uid + let uid = await redis.get(`Yz:genshin:mys:qq-uid:${this.e.user_id}`) + if (uid) { + let mainUid = await this.isMain(this.e.user_id) + if (mainUid) uid = mainUid + // 读米游社链接的authkey + // 读抽卡链接的authkey + this.authKey = await redis.get(`Yz:genshin:payLog:${uid}`) || await redis.get(`Yz:genshin:gachaLog:url:${uid}`) + if (this.authKey) { + this.reply('正在获取数据,可能需要30s') + let imgData = await new PayData(this.authKey).filtrateData() + if (imgData?.errorMsg) { + this.reply(imgData.errorMsg) + } else { + let img = await renderImg(imgData) + this.reply(img) + await this.writeData(imgData) + } + return true + } else { + this.reply('请私聊发送米游社链接,可以发送【#充值统计帮助】查看链接教程', false) + } + } else { + this.reply('请私聊发送米游社链接,可以发送【#充值统计帮助】查看链接教程', false) + } + return true + } + + payLogHelp (e) { + e.reply('安卓教程: https://b23.tv/K5qfLad\n苹果用户可【先】发送最新获取的抽卡记录链接,【再】发送【#充值记录】或【#更新充值统计】来获取') + } + + /** 判断主uid,若没有则返回false,有则返回主uid */ + async isMain (id) { + const ckPath = path.resolve('./data/MysCookie') + if (fs.readdirSync(ckPath, 'utf-8').includes(id + '.yaml')) { + let ck = fs.readFileSync(ckPath + `/${id}.yaml`, 'utf-8') + ck = yaml.parse(ck) + for (let k in ck) { + if (ck[k].isMain) return k + } + } else { + return false + } + } + + /** 存储数据 */ + async writeData (imgData) { + let userPath = this.dirPath + '/' + this.e.user_id + '.yaml' + if (fs.readdirSync(this.dirPath).includes(`${this.e.user_id}.yaml`)) { + let data = fs.readFileSync(userPath, 'utf-8') + data = yaml.parse(data) + data[imgData.uid] = imgData + fs.writeFileSync(userPath, yaml.stringify(data), 'utf-8') + } else { + let data = {} + data[imgData.uid] = imgData + fs.writeFileSync(userPath, yaml.stringify(data), 'utf-8') + } + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/apps/role.js b/src/Yunzai-Bot/plugins/genshin/apps/role.js new file mode 100644 index 0000000000000000000000000000000000000000..7d425776403ac43af84e4aade5b4356e97187268 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/role.js @@ -0,0 +1,179 @@ +import plugin from '../../../lib/plugins/plugin.js' +import fs from 'node:fs' +import gsCfg from '../model/gsCfg.js' +import puppeteer from '../../../lib/puppeteer/puppeteer.js' +import RoleIndex from '../model/roleIndex.js' +import RoleDetail from '../model/roleDetail.js' +import Abyss from '../model/abyss.js' +import Weapon from '../model/weapon.js' +import RoleBag from '../model/roleBag.js' +import RoleList from '../model/roleList.js' +export class role extends plugin { + constructor () { + super({ + name: '角色查询', + dsc: '原神角色信息查询', + event: 'message', + priority: 200, + rule: [ + { + reg: '^(#(角色|查询|查询角色|角色查询|人物)[ |0-9]*$)|(^(#*uid|#*UID)\\+*[1|2|5-9][0-9]{8}$)|(^#[\\+|+]*[1|2|5-9][0-9]{8})', + fnc: 'roleIndex' + }, + { + reg: '^#角色详情[0-9]*$', + fnc: 'roleDetail' + }, + { + reg: '^(#*角色3|#*角色卡片|角色)$', + fnc: 'roleCard' + }, + { + reg: '^#[上期|往期|本期]*(深渊|深境|深境螺旋)[上期|往期|本期]*[ |0-9]*$', + fnc: 'abyss' + }, + { + reg: '^#*[上期|往期|本期]*(深渊|深境|深境螺旋)[上期|往期|本期]*[第]*(9|10|11|12|九|十|十一|十二)层[ |0-9]*$', + fnc: 'abyssFloor' + }, + { + reg: '^#[五星|四星|5星|4星]*武器[ |0-9]*$', + fnc: 'weapon' + }, + { + reg: '^#(五星|四星|5星|4星|命座|角色|武器)[命座|角色|背包]*[信息|阵容]*[ |0-9]*$', + fnc: 'roleBag' + }, + { + reg: '^#*(我的)*(技能|天赋|武器|角色|练度|五|四|5|4|星)+(汇总|统计|列表)(force|五|四|5|4|星)*[ |0-9]*$', + fnc: 'roleList' + }, + { + reg: '^#(角色2|宝箱|成就|尘歌壶|家园|探索|探险|声望|探险度|探索度)[ |0-9]*$', + fnc: 'roleExplore' + } + ] + }) + } + + /** 初始化配置文件 */ + async init () { + let file = './data/MysCookie' + if (!fs.existsSync(file)) { + fs.mkdirSync(file) + } + + let pubCk = './plugins/genshin/config/mys.pubCk.yaml' + if (!fs.existsSync(pubCk)) { + fs.copyFileSync('./plugins/genshin/defSet/mys/pubCk.yaml', pubCk) + } + + let set = './plugins/genshin/config/mys.set.yaml' + if (!fs.existsSync(set)) { + fs.copyFileSync('./plugins/genshin/defSet/mys/set.yaml', set) + } + + if (!fs.existsSync('./data/roleDetail')) { + fs.mkdirSync('./data/roleDetail') + } + } + + /** 接受到消息都会先执行一次 */ + accept () { + if (!this.e.msg) return + if (!/^#(.*)$/.test(this.e.msg)) return + + let role = gsCfg.getRole(this.e.msg) + if (role) { + /** 设置命令 */ + this.e.msg = '#角色详情' + if (role.uid) this.e.msg += role.uid + /** 角色id */ + this.e.roleId = role.roleId + /** 角色名称 */ + this.e.roleName = role.alias + return true + } + } + + /** #角色 */ + async roleIndex () { + let data = await RoleIndex.get(this.e) + if (!data) return + + let img = await puppeteer.screenshot('roleIndex', data) + if (img) await this.reply(img) + } + + /** 刻晴 */ + async roleDetail () { + let data = await RoleDetail.get(this.e) + if (!data) return + + let img = await puppeteer.screenshot('roleDetail', data) + if (img) await this.reply(img) + } + + /** 深渊 */ + async abyss () { + let data = await new Abyss(this.e).getAbyss() + if (!data) return + + let img = await puppeteer.screenshot('abyss', data) + if (img) await this.reply(img) + } + + /** 深渊十二层 */ + async abyssFloor () { + let data = await new Abyss(this.e).getAbyssFloor() + if (!data) return + + let img = await puppeteer.screenshot('abyssFloor', data) + if (img) await this.reply(img) + } + + /** 武器 */ + async weapon () { + let data = await Weapon.get(this.e) + if (!data) return + + let img = await puppeteer.screenshot('weapon', data) + if (img) await this.reply(img) + } + + /** 角色背包 */ + async roleBag () { + let data = await RoleBag.get(this.e) + if (!data) return + + let img = await puppeteer.screenshot('roleBag', data) + if (img) await this.reply(img) + } + + /** 练度统计 */ + async roleList () { + let data = await RoleList.get(this.e) + if (!data) return + + let img = await puppeteer.screenshot('roleList', data) + if (img) await this.reply(img) + } + + /** 角色卡片 */ + async roleCard () { + let data = await new RoleIndex(this.e).roleCard() + if (!data) return + + let img = await puppeteer.screenshot('roleCard', data) + if (img) await this.reply(img) + } + + /** 探险 */ + async roleExplore () { + let data = await new RoleIndex(this.e).roleExplore() + if (!data) return + + let img = await puppeteer.screenshot('roleExplore', data) + if (img) await this.reply(img) + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/apps/strategy.js b/src/Yunzai-Bot/plugins/genshin/apps/strategy.js new file mode 100644 index 0000000000000000000000000000000000000000..86c4e6357a408229e9ec9638b64822d7518f8428 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/strategy.js @@ -0,0 +1,207 @@ +/** 导入plugin */ +import plugin from '../../../lib/plugins/plugin.js' +import gsCfg from '../model/gsCfg.js' +import common from '../../../lib/common/common.js' +import { segment } from 'oicq' +import lodash from 'lodash' +import fs from 'node:fs' +import fetch from 'node-fetch' + +gsCfg.cpCfg('mys', 'set') + +/** + * Modify By: ifeng0188 + * 1.增加多个来源的攻略图 + * 2.优化获取攻略图逻辑,更改为对比图片大小来寻找 + * 3.增加攻略说明、设置默认攻略功能 + */ + +export class strategy extends plugin { + constructor () { + super({ + name: '米游社攻略', + dsc: '米游社攻略图', + event: 'message', + priority: 500, + rule: [ + { + reg: '^#?(更新)?\\S+攻略([1-4])?$', + fnc: 'strategy' + }, + { + reg: '^#?攻略(说明|帮助)?$', + fnc: 'strategy_help' + }, + { + reg: '^#?设置默认攻略([1-4])?$', + fnc: 'strategy_setting' + } + ] + }) + + this.set = gsCfg.getConfig('mys', 'set') + + this.path = './data/strategy' + + this.url = 'https://bbs-api.mihoyo.com/post/wapi/getPostFullInCollection?&gids=2&order_type=2&collection_id=' + this.collection_id = [ + [], + // 来源:西风驿站 + [839176, 839179, 839181, 1180811], + // 来源:原神观测枢 + [813033], + // 来源:派蒙喵喵屋 + [341284], + // 来源:OH是姜姜呀(需特殊处理) + [341523] + ] + + this.source = ['西风驿站', '原神观测枢', '派蒙喵喵屋', 'OH是姜姜呀'] + + this.oss = '?x-oss-process=image//resize,s_1200/quality,q_90/auto-orient,0/interlace,1/format,jpg' + } + + /** 初始化创建配置文件 */ + async init () { + if (!fs.existsSync(this.path)) { + fs.mkdirSync(this.path) + } + /** 初始化子目录 */ + for (let subId of [1, 2, 3, 4]) { + let path = this.path + '/' + subId + if (!fs.existsSync(path)) { + fs.mkdirSync(path) + } + } + } + + /** #心海攻略 */ + async strategy () { + let match = /^#?(更新)?(\S+)攻略([1-4])?$/.exec(this.e.msg) + + // let isUpdate = !!this.e.msg.includes('更新') + let isUpdate = !!match[1] + let roleName = match[2] + let group = match[3] ? match[3] : this.set.defaultSource + + let role = gsCfg.getRole(roleName) + + if (!role) return false + + /** 主角特殊处理 */ + if (['10000005', '10000007', '20000000'].includes(String(role.roleId))) { + let travelers = ['风主', '岩主', '雷主', '草主'] + if (!travelers.includes(role.alias)) { + let msg = '请选择:' + for (let sub of travelers) { + msg += `${sub}攻略${group}、` + } + msg = msg.substring(0, msg.lastIndexOf('、')) + await this.e.reply(msg) + return + } else { + role.name = role.alias + } + } + + this.sfPath = `${this.path}/${group}/${role.name}.jpg` + + if (fs.existsSync(this.sfPath) && !isUpdate) { + await this.e.reply(segment.image(`file://${this.sfPath}`)) + return + } + + if (await this.getImg(role.name, group)) { + await this.e.reply(segment.image(`file://${this.sfPath}`)) + } + } + + /** #攻略帮助 */ + async strategy_help () { + await this.e.reply('攻略帮助:\n#心海攻略[1234]\n#更新早柚攻略[1234]\n#设置默认攻略[1234]\n示例: 心海攻略4\n\n攻略来源:\n1——西风驿站\n2——原神观测枢\n3——派蒙喵喵屋\n4——OH是姜姜呀') + } + + /** #设置默认攻略1 */ + async strategy_setting () { + let match = /^#?设置默认攻略([1-4])?$/.exec(this.e.msg) + let set = './plugins/genshin/config/mys.set.yaml' + let config = fs.readFileSync(set, 'utf8') + let num = Number(match[1]) + if(isNaN(num)) { + await this.e.reply('默认攻略设置方式为: \n#设置默认攻略[1234] \n 请增加数字1-4其中一个') + return + } + config = config.replace(/defaultSource: [1-4]/g, 'defaultSource: ' + num) + fs.writeFileSync(set, config, 'utf8') + + await this.e.reply('默认攻略已设置为: ' + match[1]) + } + + /** 下载攻略图 */ + async getImg (name, group) { + let msyRes = [] + this.collection_id[group].forEach((id) => msyRes.push(this.getData(this.url + id))) + + try { + msyRes = await Promise.all(msyRes) + } catch (error) { + this.e.reply('暂无攻略数据,请稍后再试') + logger.error(`米游社接口报错:${error}}`) + return false + } + + let posts = lodash.flatten(lodash.map(msyRes, (item) => item.data.posts)) + let url + for (let val of posts) { + /** 攻略图个别来源特殊处理 */ + if (group == 4) { + if (val.post.structured_content.includes(name + '】')) { + let content = val.post.structured_content.replace(/\\\/\{\}/g, '') + let pattern = new RegExp(name + '】.*?image\\\\?":\\\\?"(.*?)\\\\?"'); // 常驻角色兼容 + let imgId = pattern.exec(content)[1] + for (let image of val.image_list) { + if (image.image_id == imgId) { + url = image.url + break + } + } + break + } + } else { + if (val.post.subject.includes(name)) { + let max = 0 + val.image_list.forEach((v, i) => { + if (Number(v.size) >= Number(val.image_list[max].size)) max = i + }) + url = val.image_list[max].url + break + } + } + } + + if (!url) { + this.e.reply(`暂无${name}攻略(${this.source[group - 1]})\n请尝试其他的攻略来源查询\n#攻略帮助,查看说明`) + return false + } + + logger.mark(`${this.e.logFnc} 下载${name}攻略图`) + + if (!await common.downFile(url + this.oss, this.sfPath)) { + return false + } + + logger.mark(`${this.e.logFnc} 下载${name}攻略成功`) + + return true + } + + /** 获取数据 */ + async getData (url) { + let response = await fetch(url, { method: 'get' }) + if (!response.ok) { + return false + } + const res = await response.json() + return res + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/apps/todayMaterial.js b/src/Yunzai-Bot/plugins/genshin/apps/todayMaterial.js new file mode 100644 index 0000000000000000000000000000000000000000..e9a481f57abec942b0110cf6ba0a32bdded55897 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/todayMaterial.js @@ -0,0 +1,29 @@ +import plugin from '../../../lib/plugins/plugin.js' +import puppeteer from '../../../lib/puppeteer/puppeteer.js' +import Today from '../model/today.js' + +export class todayMaterial extends plugin { + constructor () { + super({ + name: '今日素材', + dsc: '#今日素材 #每日素材', + event: 'message', + priority: 500, + rule: [ + { + reg: '^#(今日|今天|每日|我的)*(素材|材料|天赋)[ |0-9]*$', + fnc: 'today' + } + ] + }) + } + + /** #今日素材 */ + async today () { + let data = await new Today(this.e).getData() + if (!data) return + /** 生成图片 */ + let img = await puppeteer.screenshot('todayMaterial', data) + if (img) await this.reply(img) + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/apps/user.js b/src/Yunzai-Bot/plugins/genshin/apps/user.js new file mode 100644 index 0000000000000000000000000000000000000000..a0e85aa0cd325fc71624cedbcb2fc1cc1379811b --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/user.js @@ -0,0 +1,167 @@ +import plugin from '../../../lib/plugins/plugin.js' +import fs from 'node:fs' +import gsCfg from '../model/gsCfg.js' +import User from '../model/user.js' + +export class user extends plugin { + constructor (e) { + super({ + name: '用户绑定', + dsc: '米游社ck绑定,游戏uid绑定', + event: 'message', + priority: 300, + rule: [ + { + reg: '^#*(体力|ck|cookie)帮助', + fnc: 'ckHelp' + }, + { + reg: '^(ck|cookie|js)代码$', + fnc: 'ckCode' + }, + { + reg: '^#绑定(cookie|ck)$', + fnc: 'bingCk' + }, + { + reg: '(.*)_MHYUUID(.*)', + event: 'message.private', + fnc: 'noLogin' + }, + { + reg: '^#?我的(ck|cookie)$', + event: 'message', + fnc: 'myCk' + }, + { + reg: '^#?删除(ck|cookie)$', + fnc: 'delCk' + }, + { + reg: '^#绑定(uid|UID)?[1-9][0-9]{8}$', + fnc: 'bingUid' + }, + { + reg: '^#(我的)?(uid|UID)[0-9]{0,2}$', + fnc: 'showUid' + }, + { + reg: '^#\\s*(检查|我的)*ck(状态)*$', + fnc: 'checkCkStatus' + } + ] + }) + this.User = new User(e) + } + + async init () { + let file = './data/MysCookie' + if (!fs.existsSync(file)) { + fs.mkdirSync(file) + } + /** 加载旧的绑定ck json */ + this.loadOldData() + } + + /** 接受到消息都会执行一次 */ + accept () { + if (!this.e.msg) return + // 由于手机端米游社网页可能获取不到ltuid 可以尝试在通行证页面获取login_uid + if (/(ltoken|ltoken_v2)/.test(this.e.msg) && /(ltuid|login_uid|ltmid_v2)/.test(this.e.msg)) { + if (this.e.isGroup) { + this.reply('请私聊发送cookie', false, { at: true }) + return true + } + this.e.ck = this.e.msg + this.e.msg = '#绑定cookie' + return true + } + + if (this.e.msg == '#绑定uid') { + this.setContext('saveUid') + this.reply('请发送绑定的uid', false, { at: true }) + return true + } + } + + /** 绑定uid */ + saveUid () { + if (!this.e.msg) return + let uid = this.e.msg.match(/[1|2|5-9][0-9]{8}/g) + if (!uid) { + this.reply('uid输入错误', false, { at: true }) + return + } + this.e.msg = '#绑定' + this.e.msg + this.bingUid() + this.finish('saveUid') + } + + /** 未登录ck */ + async noLogin () { + this.reply('绑定cookie失败\n请先【登录米游社】或【登录通行证】再获取cookie') + } + + /** #ck代码 */ + async ckCode () { + await this.reply('javascript:(()=>{prompt(\'\',document.cookie)})();') + } + + /** ck帮助 */ + async ckHelp () { + let set = gsCfg.getConfig('mys', 'set') + await this.reply(`Cookie绑定配置教程:${set.cookieDoc}\n获取cookie后【私聊发送】进行绑定`) + } + + /** 绑定ck */ + async bingCk () { + let set = gsCfg.getConfig('mys', 'set') + + if (!this.e.ck) { + await this.reply(`请【私聊】发送米游社cookie,获取教程:\n${set.cookieDoc}`) + return + } + + await this.User.bing() + } + + /** 删除ck */ + async delCk () { + let msg = await this.User.delCk() + await this.reply(msg) + } + + /** 绑定uid */ + async bingUid () { + await this.User.bingUid() + } + + /** #uid */ + async showUid () { + let index = this.e.msg.match(/[0-9]{1,2}/g) + if (index && index[0]) { + await this.User.toggleUid(index[0]) + } else { + await this.User.showUid() + } + } + + /** 我的ck */ + async myCk () { + if (this.e.isGroup) { + await this.reply('请私聊查看') + return + } + await this.User.myCk() + } + + /** 加载旧的绑定ck json */ + loadOldData () { + this.User.loadOldData() + } + + /** 检查用户CK状态 **/ + async checkCkStatus () { + await this.User.checkCkStatus() + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/apps/userAdmin.js b/src/Yunzai-Bot/plugins/genshin/apps/userAdmin.js new file mode 100644 index 0000000000000000000000000000000000000000..aa2d4898c030f26be51610acc7cd48e2b07117a9 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/apps/userAdmin.js @@ -0,0 +1,67 @@ +import plugin from '../../../lib/plugins/plugin.js' +import User from '../model/user.js' +import puppeteer from '../../../lib/puppeteer/puppeteer.js' +import fs from 'fs' +import MysInfo from '../model/mys/mysInfo.js' + +export class user extends plugin { + constructor (e) { + super({ + name: '用户管理', + dsc: 'CK用户管理', + event: 'message', + priority: 300, + rule: [{ + reg: '^#用户统计$', + fnc: 'userAdmin' + }, { + reg: '^#(刷新|重置)用户(缓存|统计|ck|Ck|CK)$', + fnc: 'resetCache' + }, { + reg: '^#删除(无效|失效)(用户|ck|Ck|CK)$', + fnc: 'delDisable' + }] + }) + this.User = new User(e) + } + + checkAuth () { + if (!this.e.isMaster) { + this.e.reply('只有管理员可用...') + return false + } + return true + } + + /** #用户统计$ */ + async userAdmin () { + if (!this.checkAuth()) { + return true + } + let data = await new User(this.e).userAdmin() + if (!data) return true + + /** 生成图片 */ + let img = await puppeteer.screenshot('userAdmin', data) + if (img) await this.reply(img) + } + + /** #刷新用户缓存 / #重置用户缓存 */ + async resetCache () { + if (!this.checkAuth()) { + return true + } + // 清空老数据 + const clearData = /重置/.test(this.e.msg) + await MysInfo.initCache(true, clearData) + this.e.reply(`用户缓存已${clearData ? '重置' : '刷新'}...\n通过【#用户统计】命令可查看详情`) + } + + async delDisable () { + if (!this.checkAuth()) { + return true + } + let count = await MysInfo.delDisable() + this.e.reply(count > 0 ? `已删除${count}个无效用户` : '暂无无效用户...') + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/artifact/data.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/artifact/data.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/bot/help.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/bot/help.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1a2a39e11b6126fa7c6b0dd7fe7ce3bb4125abc0 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/bot/help.yaml @@ -0,0 +1,61 @@ +- group: 原神查询指令 + list: + - icon: role + title: '#角色 #探索 #角色卡片' + desc: '原神角色数据,更多角色请用#查询' + - icon: paimon + title: '#刻晴 #刻晴卡片 #戳一戳' + desc: 你的原神角色数据 + - icon: abyss + title: '#深渊 #深渊12层' + desc: 深渊数据,打完请2小时后查询 + - icon: weapon + title: '#五星 #武器 #今日素材' + desc: 你的原神角色数据 + - icon: team + title: 五星列表、练度统计 + desc: 你的原神角色数据 + - icon: 树脂 + title: 体力、体力帮助 + desc: 查询体力,需要绑定cookie + - icon: ledger + title: '#原石 #原石统计' + desc: 查询体力,需要绑定cookie + - icon: 打卡 + title: '#签到、删除cookie' + desc: 米游社原神自动签到 + - icon: 统计 + title: '#角色养成' + desc: 计算角色养成消耗素材 + - icon: 绑定账号 + title: '#绑定uid #uid' + desc: 绑定查看游戏uid +- group: 其他查询指令 + list: + - icon: 原石 + title: 抽卡记录 记录帮助 + desc: 统计游戏抽卡数据 + - icon: 星辉 + title: 角色统计 武器统计 + desc: 按卡池统计抽卡数据 + - icon: excel + title: 导出记录、导入记录 + desc: 导出导入xlsx、json抽卡记录 + - icon: 纠缠之缘 + title: 十连 十连2 定轨 十连武器 + desc: 真实模拟抽卡 + - icon: 浮世 + title: '刻晴突破,刻晴素材' + desc: 米游社友人A的角色素材图 + - icon: 刻晴 + title: 刻晴攻略 + desc: 西风驿站攻略图 + # - icon: 米游社 + # title: '#公告 #资讯 #公告列表' + # desc: '原神米游社公告资讯' + - icon: 史莱姆 + title: '#添加哈哈 #删除哈哈' + desc: 添加表情,回复哈哈触发 + - icon: 问号 + title: '#表情列表 #表情哈哈' + desc: 查看,搜索添加的表情 diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/daily/daily.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/daily/daily.yaml new file mode 100644 index 0000000000000000000000000000000000000000..14c2b7134534791e21f60bdfe7838a646ab8df75 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/daily/daily.yaml @@ -0,0 +1,219 @@ +- - 笃行: + - 须弥 + - - 柯莱 + - 妮露 + - 流浪者 + 天光: + - 稻妻 + - - 八重神子 + - 雷电将军 + - 五郎 + - 早柚 + 黄金: + - 璃月 + - - 钟离 + - 行秋 + - 烟绯 + - 北斗 + - 辛焱 + 诗文: + - 蒙德 + - - 温迪 + - 阿贝多 + - 菲谢尔 + - 罗莎莉亚 + - 凯亚 + - 丽莎 + - 烈日威权: + - 须弥 + - - 王下近侍 + - 竭泽 + - 猎人之径 + - 玛海菈的水色 + 今昔剧画: + - 稻妻 + - - 神乐之真意 + - 薙草之稻光 + - 冬极白星 + - 渔获 + - 断浪长鳍 + - 喜多院十文字 + - 笼钓瓶一心 + 漆黑陨铁: + - 璃月 + - - 护摩之杖 + - 尘世之锁 + - 贯虹之槊 + - 落霞 + - 万国诸海图谱 + - 试作古华 + - 铁峰刺 + - 试作星镰 + - 钢轮弓 + - 螭骨剑 + - 千岩长枪 + 狮牙斗士: + - 蒙德 + - - 阿莫斯之弓 + - 苍古自由之誓 + - 天空之脊 + - 狼的末路 + - 四风原典 + - 宗室大剑 + - 西风猎弓 + - 宗室长弓 + - 祭礼剑 + - 西风大剑 + - 西风长枪 + - 腐殖之剑 + - 忍冬之果 + - 风花之颂 + - 暗巷猎手 + - 祭礼残章 +- - 诤言: + - 须弥 + - - 提纳里 + - 赛诺 + - 坎蒂丝 + - 珐露珊 + 浮世: + - 稻妻 + - - 宵宫 + - 珊瑚宫心海 + - 托马 + - 鹿野院平藏 + 繁荣: + - 璃月 + - - 申鹤 + - 魈 + - 七七 + - 刻晴 + - 凝光 + - 夜兰 + 自由: + - 蒙德 + - - 达达利亚 + - 埃洛伊 + - 可莉 + - 迪奥娜 + - 砂糖 + - 芭芭拉 + - 安柏 + - 谧林涓露: + - 须弥 + - - 原木刀 + - 森林王器 + - 圣显之钥 + - 西福斯的月光 + 远海夷地: + - 稻妻 + - - 雾切之回光 + - 不灭月华 + - 证誓之明瞳 + - 天目影打刀 + - 白辰之环 + - 恶玉丸 + 孤云寒林: + - 璃月 + - - 若水 + - 和璞鸢 + - 斫峰之刃 + - 匣里龙吟 + - 黑岩绯玉 + - 白影剑 + - 黑岩长剑 + - 流月针 + - 弓藏 + - 匣里日月 + - 黑岩战弓 + - 千岩古剑 + 高塔孤王: + - 蒙德 + - - 松籁响起之时 + - 风鹰剑 + - 辰砂之纺锤 + - 宗室秘法录 + - 西风秘典 + - 绝弦 + - 西风剑 + - 钟剑 + - 宗室长剑 + - 暗巷闪光 + - 苍翠猎弓 + - 雪葬的星银 +- - 巧思: + - 须弥 + - - 多莉 + - 纳西妲 + - 莱依拉 + - 艾尔海森 + 风雅: + - 稻妻 + - - 荒泷一斗 + - 神里绫华 + - 九条裟罗 + - 神里绫人 + - 久岐忍 + 勤劳: + - 璃月 + - - 甘雨 + - 胡桃 + - 枫原万叶 + - 香菱 + - 重云 + - 云堇 + - 瑶瑶 + 抗争: + - 蒙德 + - - 优菈 + - 琴 + - 莫娜 + - 迪卢克 + - 班尼特 + - 诺艾尔 + - 雷泽 + - 绿洲花园: + - 须弥 + - - 贯月矢 + - 盈满之实 + - 赤沙之杖 + - 流浪的晚星 + 鸣神御灵: + - 稻妻 + - - 飞雷之弦振 + - 赤角石溃杵 + - 波乱月白经津 + - 曚云之月 + - 破魔之弓 + - 桂木斩长正 + - 掠食者 + 雾海云间: + - 璃月 + - - 磐岩结绿 + - 息灾 + - 无工之剑 + - 试作金珀 + - 匣里灭辰 + - 试作澹月 + - 宗室猎枪 + - 黑岩刺枪 + - 试作斩岩 + - 雨裁 + - 黑岩斩刀 + - 昭心 + 凛风奔狼: + - 蒙德 + - - 终末嗟叹之诗 + - 天空之翼 + - 天空之卷 + - 天空之刃 + - 天空之傲 + - 决斗之枪 + - 暗巷的酒与诗 + - 流浪乐章 + - 嘟嘟可故事集 + - 祭礼弓 + - 黑剑 + - 笛剑 + - 祭礼大剑 + - 龙脊长枪 \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/element/role.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/element/role.yaml new file mode 100644 index 0000000000000000000000000000000000000000..82ff095ef078401996e60882cf62b4e29b9afff7 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/element/role.yaml @@ -0,0 +1,72 @@ +烟绯: 火 +胡桃: 火 +辛焱: 火 +可莉: 火 +迪卢克: 火 +香菱: 火 +安柏: 火 +班尼特: 火 +宵宫: 火 +托马: 火 +迪希雅: 火 + +魈: 风 +温迪: 风 +琴: 风 +砂糖: 风 +枫原万叶: 风 +早柚: 风 +鹿野院平藏: 风 +空: 风 +荧: 风 +流浪者: 风 +珐露珊: 风 + +刻晴: 雷 +北斗: 雷 +雷泽: 雷 +菲谢尔: 雷 +丽莎: 雷 +雷电将军: 雷 +九条裟罗: 雷 +八重神子: 雷 +久岐忍: 雷 +多莉: 雷 +赛诺: 雷 + +阿贝多: 岩 +钟离: 岩 +凝光: 岩 +诺艾尔: 岩 +五郎: 岩 +荒泷一斗: 岩 +云堇: 岩 + +达达利亚: 水 +芭芭拉: 水 +行秋: 水 +莫娜: 水 +珊瑚宫心海: 水 +神里绫人: 水 +夜兰: 水 +妮露: 水 +坎蒂丝: 水 + +优菈: 冰 +罗莎莉亚: 冰 +甘雨: 冰 +迪奥娜: 冰 +重云: 冰 +七七: 冰 +凯亚: 冰 +神里绫华: 冰 +埃洛伊: 冰 +申鹤: 冰 +莱依拉: 冰 +米卡: 冰 + +提纳里: 草 +柯莱: 草 +纳西妲: 草 +瑶瑶: 草 +艾尔海森: 草 \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/element/weapon.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/element/weapon.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9828ccb6c584e490f1a1ecc7a736374cf39e09a7 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/element/weapon.yaml @@ -0,0 +1,150 @@ +无锋剑: 单手剑 +银剑: 单手剑 +吃虎鱼刀: 单手剑 +黎明神剑: 单手剑 +旅行剑: 单手剑 +暗铁剑: 单手剑 +冷刃: 单手剑 +飞天御剑: 单手剑 +黑剑: 单手剑 +试作斩岩: 单手剑 +腐殖之剑: 单手剑 +暗巷闪光: 单手剑 +宗室长剑: 单手剑 +铁蜂刺: 单手剑 +笛剑: 单手剑 +祭礼剑: 单手剑 +匣里龙吟: 单手剑 +降临之剑: 单手剑 +西风剑: 单手剑 +黑岩长剑: 单手剑 +磐岩结绿: 单手剑 +风鹰剑: 单手剑 +斫峰之刃: 单手剑 +天空之刃: 单手剑 +苍古自由之誓: 单手剑 +雾切之回光: 单手剑 +天目影打刀: 单手剑 +波乱月白经津: 单手剑 +辰砂之纺锤: 单手剑 +笼钓瓶一心: 单手剑 +原木刀: 单手剑 +圣显之钥: 单手剑 +西福斯的月光: 单手剑 +东花坊时雨: 单手剑 +裁叶萃光: 单手剑 +饰铁之花: 单手剑 + +训练大剑: 大剑 +佣兵重剑: 大剑 +沐浴龙血的剑: 大剑 +白铁大剑: 大剑 +铁影阔剑: 大剑 +飞天大御剑: 大剑 +以理服人: 大剑 +白影剑: 大剑 +雨裁: 大剑 +祭礼大剑: 大剑 +黑岩斩刀: 大剑 +宗室大剑: 大剑 +螭骨剑: 大剑 +雪葬的星银: 大剑 +西风大剑: 大剑 +试作古华: 大剑 +钟剑: 大剑 +千岩古剑: 大剑 +天空之傲: 大剑 +松籁响起之时: 大剑 +无工之剑: 大剑 +狼的末路: 大剑 +桂木斩长正: 大剑 +衔珠海皇: 大剑 +森林王器: 大剑 +玛海菈的水色: 大剑 +苇海信标: 大剑 + +新手长枪: 枪 +铁尖枪: 枪 +黑缨枪: 枪 +钺矛: 枪 +白缨枪: 枪 +流月针: 枪 +匣里灭辰: 枪 +千岩长枪: 枪 +试作星镰: 枪 +西风长枪: 枪 +黑岩刺枪: 枪 +决斗之枪: 枪 +龙脊长枪: 枪 +宗室猎枪: 枪 +护摩之杖: 枪 +和璞鸢: 枪 +天空之脊: 枪 +贯虹之槊: 枪 +喜多院十文字: 枪 +「渔获」: 枪 +薙草之稻光: 枪 +贯月矢: 枪 +赤沙之杖: 枪 +风信之锋: 枪 + +学徒笔记: 法器 +口袋魔导书: 法器 +异世界行记: 法器 +翡玉法球: 法器 +甲级宝珏: 法器 +魔导绪论: 法器 +讨龙英杰谭: 法器 +昭心: 法器 +万国诸海图谱: 法器 +暗巷的酒与诗: 法器 +宗室秘法录: 法器 +流浪乐章: 法器 +匣里日月: 法器 +西风秘典: 法器 +忍冬之果: 法器 +试作金珀: 法器 +祭礼残章: 法器 +黑岩绯玉: 法器 +四风原典: 法器 +天空之卷: 法器 +尘世之锁: 法器 +白辰之环: 法器 +不灭月华: 法器 +神乐之真意: 法器 +证誓之明瞳: 法器 +盈满之实: 法器 +流浪的晚星: 法器 +图莱杜拉的回忆: 法器 + +猎弓: 弓 +历练的猎弓: 弓 +信使: 弓 +弹弓: 弓 +反曲弓: 弓 +神射手之誓: 弓 +鸦羽弓: 弓 +黑岩战弓: 弓 +试作澹月: 弓 +宗室长弓: 弓 +暗巷猎手: 弓 +祭礼弓: 弓 +苍翠猎弓: 弓 +绝弦: 弓 +风花之颂: 弓 +西风猎弓: 弓 +弓藏: 弓 +钢轮弓: 弓 +终末嗟叹之诗: 弓 +天空之翼: 弓 +阿莫斯之弓: 弓 +幽夜华尔兹: 弓 +飞雷之弦振: 弓 +破魔之弓: 弓 +掠食者: 弓 +若水: 弓 +落霞: 弓 +猎人之径: 弓 +竭泽: 弓 +王下近侍: 弓 +冬极白星: 弓 diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/gacha/gacha.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/gacha/gacha.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c00c07bfd6bee5ef7679f1a7ac0fb5dc2515ecbd --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/gacha/gacha.yaml @@ -0,0 +1,99 @@ +# 五星角色基础概率(0-10000) 默认60 +chance5: 60 +# 四星角色基础概率 默认510 +chance4: 510 +# 角色不歪的概率(0-100)默认50 +wai: 50 +# 五星武器基础概率 默认70 +chanceW5: 70 +# 四星武器基础概率 默认600 +chanceW4: 600 + +# 常驻五星角色 +role5: + - 刻晴 + - 莫娜 + - 七七 + - 迪卢克 + - 琴 + - 提纳里 + +# 四星角色 +role4: + - 香菱 + - 辛焱 + - 迪奥娜 + - 班尼特 + - 凝光 + - 北斗 + - 行秋 + - 重云 + - 雷泽 + - 诺艾尔 + - 砂糖 + - 菲谢尔 + - 芭芭拉 + - 罗莎莉亚 + - 烟绯 + - 早柚 + - 托马 + - 九条裟罗 + - 五郎 + - 云堇 + - 鹿野院平藏 + - 柯莱 + - 多莉 + - 坎蒂丝 + - 莱依拉 + - 珐露珊 + - 瑶瑶 + +# 常驻五星武器 +weapon5: + - 阿莫斯之弓 + - 天空之翼 + - 天空之卷 + - 天空之脊 + - 天空之傲 + - 天空之刃 + - 四风原典 + - 和璞鸢 + - 狼的末路 + - 风鹰剑 + +# 四星武器 +weapon4: + - 弓藏 + - 祭礼弓 + - 绝弦 + - 西风猎弓 + - 昭心 + - 祭礼残章 + - 流浪乐章 + - 西风秘典 + - 西风长枪 + - 匣里灭辰 + - 雨裁 + - 祭礼大剑 + - 钟剑 + - 西风大剑 + - 匣里龙吟 + - 祭礼剑 + - 笛剑 + - 西风剑 + +# 三星武器 +weapon3: + - 弹弓 + - 神射手之誓 + - 鸦羽弓 + - 翡玉法球 + - 讨龙英杰谭 + - 魔导绪论 + - 黑缨枪 + - 以理服人 + - 沐浴龙血的剑 + - 铁影阔剑 + - 飞天御剑 + - 黎明神剑 + - 冷刃 \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/gacha/pool.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/gacha/pool.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ab167ea7d9bca165b1c347d927d98e8751e4353d --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/gacha/pool.yaml @@ -0,0 +1,342 @@ +- up4: + - 重云 + - 凝光 + - 北斗 + up5: + - 夜兰 + up5_2: + - 胡桃 + weapon5: + - 若水 + - 护摩之杖 + weapon4: + - 恶王丸 + - 曚云之月 + - 匣里龙吟 + - 西风长枪 + - 祭礼残章 + endTime: '2023-03-01 18:00:00' +- up4: + - 辛焱 + - 云堇 + - 瑶瑶 + up5: + - 艾尔海森 + up5_2: + - 魈 + weapon5: + - 裁叶萃光 + - 和璞鸢 + weapon4: + - 千岩长枪 + - 笛剑 + - 雨裁 + - 流浪乐章 + - 祭礼弓 + endTime: '2023-02-07 18:00:00' +- up4: + - 罗莎莉亚 + - 早柚 + - 九条裟罗 + up5: + - 雷电将军 + up5_2: + - 神里绫人 + weapon5: + - 薙草之稻光 + - 波乱月白经津 + weapon4: + - 恶王丸 + - 曚云之月 + - 匣里龙吟 + - 西风长枪 + - 祭礼残章 + endTime: '2023-01-14 18:00:00' +- up4: + - 珐露珊 + - 五郎 + - 烟绯 + up5: + - 流浪者 + up5_2: + - 荒泷一斗 + weapon5: + - 图莱杜拉的回忆 + - 赤角石溃杵 + weapon4: + - 祭礼剑 + - 西风大剑 + - 断浪长鳍 + - 昭心 + - 西风猎弓 + endTime: '2022-12-20 18:00:00' +- up4: + - 莱依拉 + - 鹿野院平藏 + - 托马 + up5: + - 八重神子 + up5_2: + - 达达利亚 + weapon5: + - 神乐之真意 + - 冬极白星 + weapon4: + - 西风剑 + - 钟剑 + - 匣里灭辰 + - 西风秘典 + - 绝弦 + endTime: '2022-11-30 18:00:00' +- up4: + - 班尼特 + - 雷泽 + - 诺艾尔 + up5: + - 纳西妲 + up5_2: + - 宵宫 + weapon5: + - 千夜浮梦 + - 飞雷之弦振 + weapon4: + - 笛剑 + - 祭礼大剑 + - 西风长枪 + - 流浪乐章 + - 弓藏 + endTime: '2022-11-11 18:00:00' +- up4: + - 北斗 + - 芭芭拉 + - 香菱 + up5: + - 妮露 + up5_2: + - 阿贝多 + weapon5: + - 圣显之钥 + - 磐岩结绿 + weapon4: + - 西福斯的月光 + - 雨裁 + - 匣里灭辰 + - 流浪的晚星 + - 祭礼弓 + endTime: '2022-10-26 18:00:00' +- up4: + - 久岐忍 + - 早柚 + - 坎蒂丝 + up5: + - 赛诺 + up5_2: + - 温迪 + weapon5: + - 赤沙之杖 + - 终末嗟叹之诗 + weapon4: + - 匣里龙吟 + - 玛海菈的水色 + - 西风长枪 + - 祭礼残章 + - 西风猎弓 + endTime: '2022-10-7 18:00:00' +- up4: + - 行秋 + - 砂糖 + - 多莉 + up5: + - 甘雨 + up5_2: + - 珊瑚宫心海 + weapon5: + - 阿莫斯之弓 + - 不灭月华 + weapon4: + - 祭礼剑 + - 西风大剑 + - 匣里灭辰 + - 昭心 + - 弓藏 + endTime: '2022-9-20 18:00:00' +- up4: + - 菲谢尔 + - 迪奥娜 + - 柯莱 + up5: + - 提纳里 + up5_2: + - 钟离 + weapon5: + - 猎人之径 + - 贯虹之槊 + weapon4: + - 西风剑 + - 钟剑 + - 西风长枪 + - 西风秘典 + - 绝弦 + endTime: '2022-9-6 18:00:00' +- up4: + - 云堇 + - 辛焱 + - 班尼特 + up5: + - 宵宫 + up5_2: + - 宵宫 + weapon5: + - 飞雷之弦振 + - 斫峰之刃 + weapon4: + - 暗巷的酒与诗 + - 暗巷猎手 + - 笛剑 + - 祭礼大剑 + - 匣里灭辰 + endTime: '2022-8-18 18:00:00' +- up4: + - 鹿野院平藏 + - 凝光 + - 托马 + up5: + - 枫原万叶 + up5_2: + - 可莉 + weapon5: + - 苍古自由之誓 + - 四风原典 + weapon4: + - 暗巷闪光 + - 幽夜华尔兹 + - 雨裁 + - 西风长枪 + - 流浪乐章 + endTime: '2022-7-28 18:00:00' +- up4: + - 五郎 + - 重云 + - 久岐忍 + up5: + - 荒泷一斗 + up5_2: + - 荒泷一斗 + weapon5: + - 赤角石溃杵 + - 尘世之锁 + weapon4: + - 千岩古剑 + - 匣里龙吟 + - 匣里灭辰 + - 祭礼残章 + - 绝弦 + endTime: '2022-7-7 18:00:00' +- up4: + - 烟绯 + - 芭芭拉 + - 诺艾尔 + up5: + - 夜兰 + up5_2: + - 魈 + weapon5: + - 若水 + - 和璞鸢 + weapon4: + - 千岩长枪 + - 祭礼剑 + - 西风大剑 + - 昭心 + - 祭礼弓 + endTime: '2022-6-14 18:00:00' +- up4: + - 罗莎莉亚 + - 早柚 + - 雷泽 + up5: + - 神里绫华 + up5_2: + - 神里绫华 + weapon5: + - 雾切之回光 + - 无工之剑 + weapon4: + - 西风剑 + - 钟剑 + - 西风长枪 + - 西风秘典 + - 西风猎弓 + endTime: '2022-5-24 18:00:00' +- up4: + - 香菱 + - 砂糖 + - 云堇 + up5: + - 神里绫人 + up5_2: + - 温迪 + weapon5: + - 波乱月白经津 + - 终末嗟叹之诗 + weapon4: + - 弓藏 + - 笛剑 + - 流浪乐章 + - 匣里灭辰 + - 祭礼大剑 + endTime: '2022-4-12 18:00:00' +- up4: + - 辛焱 + - 九条裟罗 + - 班尼特 + up5: + - 雷电将军 + up5_2: + - 珊瑚宫心海 + weapon5: + - 薙草之稻光 + - 不灭月华 + weapon4: + - 曚云之月 + - 祭礼残章 + - 西风长枪 + - 恶王丸 + - 匣里龙吟 + endTime: '2022-3-22 18:00:00' +- up4: + - 菲谢尔 + - 迪奥娜 + - 托马 + up5: + - 八重神子 + up5_2: + - 八重神子 + weapon5: + - 神乐之真意 + - 磐岩结绿 + weapon4: + - 绝弦 + - 昭心 + - 断浪长鳍 + - 雨裁 + - 祭礼剑 + endTime: '2022-3-1 18:00:00' +- up4: + - 行秋 + - 烟绯 + - 北斗 + up5: + - 钟离 + up5_2: + - 甘雨 + weapon5: + - 贯虹之槊 + - 阿莫斯之弓 + weapon4: + - 祭礼弓 + - 西风秘典 + - 匣里灭辰 + - 千岩古剑 + - 西风剑 + endTime: '2022-2-8 18:00:00' diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/gacha/set.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/gacha/set.yaml new file mode 100644 index 0000000000000000000000000000000000000000..449daad75e55f54fb758171eae353be47c08c73d --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/gacha/set.yaml @@ -0,0 +1,16 @@ +# 原神模拟十连设置 +default: + # 每日抽卡数 + count: 1 + # 撤回消息 0-120 秒, 0不撤回 + delMsg: 110 + # 角色池,武器池限制次数分开计算 1-分开 0-不分开 + LimitSeparate: 0 + +# 群单独设置 +123465: + count: 10 + # 撤回消息 0-120 秒, 0不撤回 + delMsg: 110 + # 角色池,武器池限制次数分开计算 1-分开 0-不分开 + LimitSeparate: 0 diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/mys/pubCk.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/mys/pubCk.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8ae7bc128114c0dae0470a7687559588ed1a17e5 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/mys/pubCk.yaml @@ -0,0 +1,3 @@ +# 米游社公共查询ck,支持多个一行一个,横杆空格开头 +- ltoken=xxx; ltuid=xxx; cookie_token=xxx; account_id=xxx; +- ltoken=xxx; ltuid=xxx; cookie_token=xxx; account_id=xxx; \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/mys/pushNews.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/mys/pushNews.yaml new file mode 100644 index 0000000000000000000000000000000000000000..bc54376897451425f2c64f1b25028e18accfa032 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/mys/pushNews.yaml @@ -0,0 +1,12 @@ + +# 米游社公共推送定时任务,修改需要重启 +pushTime: 0 0/5 * * * ? + +# 最多同时推送条数 +maxNum: 1 + +#公共推送群 +announceGroup: [] + +#资讯推送群 +infoGroup: [] \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/mys/set.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/mys/set.yaml new file mode 100644 index 0000000000000000000000000000000000000000..062560fe6e2bf1f58cb62fcf77a6db0610df38e8 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/mys/set.yaml @@ -0,0 +1,15 @@ +# 公共查询是否使用用户ck 0-不使用 1-使用 +allowUseCookie: 0 +# 默认cookie帮助文档链接地址 +cookieDoc: docs.qq.com/doc/DUWNVQVFTU3liTVlO + + +# 是否开启米游社原神自动签到 1-开启 0-关闭 +isAutoSign: 0 +# 修改需要重启,米游社原神签到定时任务,Cron表达式,默认00:02开始执行,每6s签到一个 +signTime: 0 2 0 * * ? + +# 别名设置权限 0-所有群员都可以添加 1-群管理员才能添加 2-主人才能添加 +abbrSetAuth: 0 +# 米游社攻略图默认来源设置 1-西风驿站 2-原神观测枢 3-派蒙喵喵屋 4-OH是姜姜呀 +defaultSource: 1 \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/pool/200.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/pool/200.yaml new file mode 100644 index 0000000000000000000000000000000000000000..793461c1e43897ba168afd366e7adfbcfe6f2eae --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/pool/200.yaml @@ -0,0 +1,6 @@ +- from: '2020-09-15 06:00:00' + to: '2050-09-15 17:59:59' + five: + - 常驻池 + four: [] + name: 常驻池 diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/pool/301.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/pool/301.yaml new file mode 100644 index 0000000000000000000000000000000000000000..7fa4033bf413743982b5c70a5bee3f8c173c4c47 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/pool/301.yaml @@ -0,0 +1,394 @@ +- from: '2023-01-18 06:00:00' + to: '2023-02-07 17:59:59' + five: + - 艾尔海森 + - 魈 + four: + - 辛焱 + - 云堇 + - 瑶瑶 + name: 敕诫枢谋|烟火之邀 +- from: '2022-12-27 18:00:00' + to: '2023-01-17 14:59:59' + five: + - 雷电将军 + - 神里绫人 + four: + - 罗莎莉亚 + - 早柚 + - 九条裟罗 + name: 影寂天下人|苍流踏花 +- from: '2022-12-07 06:00:00' + to: '2022-12-27 17:59:59' + five: + - 流浪者 + - 荒泷一斗 + four: + - 珐露珊 + - 五郎 + - 烟绯 + name: 余火变相|鬼门斗宴 +- from: '2022-11-18 18:00:00' + to: '2022-12-06 14:59:59' + five: + - 八重神子 + - 达达利亚 + four: + - 莱依拉 + - 鹿野院平藏 + - 托马 + name: 华紫樱绯|暂别冬都 +- from: '2022-11-02 06:00:00' + to: '2022-11-18 17:59:59' + five: + - 纳西妲 + - 宵宫 + four: + - 班尼特 + - 雷泽 + - 诺艾尔 + name: 月草的赐慧|焰色天河 +- from: '2022-10-14 18:00:00' + to: '2022-11-01 14:59:59' + five: + - 妮露 + - 阿贝多 + four: + - 北斗 + - 芭芭拉 + - 香菱 + name: 翩舞歈莲|深秘之息 +- from: '2022-09-28 06:00:00' + to: '2022-10-14 17:59:59' + five: + - 赛诺 + - 温迪 + four: + - 久岐忍 + - 早柚 + - 坎蒂丝 + name: 劈裁冥昭|杯装之诗 +- from: '2022-09-09 18:00:00' + to: '2022-09-27 14:59:59' + five: + - 甘雨 + - 心海 + four: + - 行秋 + - 砂糖 + - 多莉 + name: 浮生孰来|浮岳虹珠 +- from: '2022-08-24 06:00:00' + to: '2022-09-09 17:59:59' + five: + - 提纳里 + - 钟离 + four: + - 柯莱 + - 迪奥娜 + - 菲谢尔 + name: 巡御蘙荟|陵薮市朝 +- from: '2022-08-02 18:00:00' + to: '2022-08-23 14:59:59' + five: + - 宵宫 + four: + - 云堇 + - 辛焱 + - 班尼特 + name: 焰色天河 +- from: '2022-07-13 06:00:00' + to: '2022-08-02 17:59:59' + five: + - 枫原万叶 + - 可莉 + four: + - 凝光 + - 鹿野院平藏 + - 托马 + name: 红叶逐荒波 +- from: '2022-06-21 18:00:00' + to: '2022-07-12 14:59:59' + five: + - 荒泷一斗 + four: + - 重云 + - 五郎 + - 久岐忍 + name: 鬼门斗宴 +- from: '2022-05-31 06:00:00' + to: '2022-06-21 17:59:59' + five: + - 夜兰 + - 魈 + four: + - 烟绯 + - 芭芭拉 + - 诺艾尔 + name: 素霓伣天|烟火之邀 +- from: '2022-04-19 17:59:59' + to: '2022-05-31 05:59:59' + five: + - 神里绫华 + four: + - 罗莎莉亚 + - 早柚 + - 雷泽 + name: 白鹭之庭 +- from: '2022-03-30 06:00:00' + to: '2022-04-19 17:59:59' + five: + - 神里绫人 + - 温迪 + four: + - 香菱 + - 砂糖 + - 云堇 + name: 苍流踏花|杯装之诗 +- from: '2022-03-08 18:00:00' + to: '2022-03-29 14:59:59' + five: + - 雷电将军 + - 珊瑚宫心海 + four: + - 辛焱 + - 九条裟罗 + - 班尼特 + name: 影寂天下人|浮岳虹珠 +- from: '2022-02-16 06:00:00' + to: '2022-03-08 17:59:59' + five: + - 八重神子 + four: + - 菲谢尔 + - 迪奥娜 + - 托马 + name: 华紫樱绯 +- from: '2022-01-25 18:00:00' + to: '2022-02-15 14:59:59' + five: + - 甘雨 + - 钟离 + four: + - 行秋 + - 北斗 + - 烟绯 + name: 浮生孰来|陵薮市朝 +- from: '2022-01-05 06:00:00' + to: '2022-01-25 17:59:59' + five: + - 申鹤 + - 魈 + four: + - 云堇 + - 凝光 + - 重云 + name: 出尘入世|烟火之邀 +- from: '2021-12-14 18:00:00' + to: '2022-01-04 14:59:59' + five: + - 荒泷一斗 + four: + - 五郎 + - 芭芭拉 + - 香菱 + name: 鬼门斗宴 +- from: '2021-11-24 06:00:00' + to: '2021-12-14 17:59:59' + five: + - 阿贝多 + - 优菈 + four: + - 班尼特 + - 诺艾尔 + - 罗莎莉亚 + name: 深秘之息|浪涌之瞬 +- from: '2021-11-02 18:00:00' + to: '2021-11-23 14:59:59' + five: + - 胡桃 + four: + - 托马 + - 迪奥娜 + - 早柚 + name: 赤团开时 +- from: '2021-10-13 06:00:00' + to: '2021-11-02 17:59:59' + five: + - 达达利亚 + four: + - 凝光 + - 重云 + - 烟绯 + name: 暂别冬都 +- from: '2021-09-21 18:00:00' + to: '2021-10-12 14:59:59' + five: + - 珊瑚宫心海 + four: + - 罗莎莉亚 + - 北斗 + - 行秋 + name: 浮岳虹珠 +- from: '2021-09-01 06:00:00' + to: '2021-09-21 17:59:59' + five: + - 雷电将军 + four: + - 九条裟罗 + - 香菱 + - 砂糖 + name: 影寂天下人 +- from: '2021-08-10 18:00:00' + to: '2021-08-31 14:59:59' + five: + - 宵宫 + four: + - 早柚 + - 迪奥娜 + - 辛焱 + name: 焰色天河 +- from: '2021-07-21 06:00:00' + to: '2021-08-10 17:59:59' + five: + - 神里绫华 + four: + - 凝光 + - 重云 + - 烟绯 + name: 白鹭之庭 +- from: '2021-06-29 18:00:00' + to: '2021-07-20 14:59:59' + five: + - 枫原万叶 + four: + - 罗莎莉亚 + - 班尼特 + - 雷泽 + name: 红叶逐荒波 +- from: '2021-06-09 06:00:00' + to: '2021-06-29 17:59:59' + five: + - 可莉 + four: + - 芭芭拉 + - 砂糖 + - 菲谢尔 + name: 逃跑的太阳 +- from: '2021-05-18 18:00:00' + to: '2021-06-08 14:59:59' + five: + - 优菈 + four: + - 辛焱 + - 行秋 + - 北斗 + name: 浪沫的旋舞 +- from: '2021-04-28 06:00:00' + to: '2021-05-18 17:59:59' + five: + - 钟离 + four: + - 烟绯 + - 诺艾尔 + - 迪奥娜 + name: 陵薮市朝 +- from: '2021-04-06 18:00:00' + to: '2021-04-27 14:59:59' + five: + - 达达利亚 + four: + - 罗莎莉亚 + - 芭芭拉 + - 菲谢尔 + name: 暂别冬都 +- from: '2021-03-17 06:00:00' + to: '2021-04-06 15:59:59' + five: + - 温迪 + four: + - 砂糖 + - 雷泽 + - 诺艾尔 + name: 杯装之诗 +- from: '2021-03-02 18:00:00' + to: '2021-03-16 14:59:59' + five: + - 胡桃 + four: + - 行秋 + - 香菱 + - 重云 + name: 赤团开时 +- from: '2021-02-17 18:00:00' + to: '2021-03-02 15:59:59' + five: + - 刻晴 + four: + - 凝光 + - 班尼特 + - 芭芭拉 + name: 鱼龙灯昼 +- from: '2021-02-03 06:00:00' + to: '2021-02-17 15:59:59' + five: + - 魈 + four: + - 迪奥娜 + - 北斗 + - 辛焱 + name: 烟火之邀 +- from: '2021-01-12 18:00:00' + to: '2021-02-02 14:59:59' + five: + - 甘雨 + four: + - 香菱 + - 行秋 + - 诺艾尔 + name: 浮生孰来 +- from: '2020-12-23 06:00:00' + to: '2021-01-12 15:59:59' + five: + - 阿贝多 + four: + - 菲谢尔 + - 砂糖 + - 班尼特 + name: 深秘之息 +- from: '2020-12-01 18:00:00' + to: '2020-12-22 14:59:59' + five: + - 钟离 + four: + - 辛焱 + - 雷泽 + - 重云 + name: 陵薮市朝 +- from: '2020-11-11 06:00:00' + to: '2020-12-01 15:59:59' + five: + - 达达利亚 + four: + - 迪奥娜 + - 北斗 + - 凝光 + name: 暂别冬都 +- from: '2020-10-20 18:00:00' + to: '2020-11-10 14:59:59' + five: + - 可莉 + four: + - 行秋 + - 诺艾尔 + - 砂糖 + name: 闪焰的驻足 +- from: '2020-09-28 06:00:00' + to: '2020-10-18 17:59:59' + five: + - 温迪 + four: + - 芭芭拉 + - 菲谢尔 + - 香菱 + name: 杯装之诗 diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/pool/302.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/pool/302.yaml new file mode 100644 index 0000000000000000000000000000000000000000..60e2e8a0884f7318c99c801cc4d143b3297daceb --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/pool/302.yaml @@ -0,0 +1,491 @@ +- from: '2023-01-18 06:00:00' + to: '2023-02-07 17:59:59' + five: + - 裁叶萃光 + - 和璞鸢 + four: + - 千岩长枪 + - 笛剑 + - 雨裁 + - 流浪乐章 + - 祭礼弓 + name: 神铸赋形 +- from: '2022-12-27 18:00:00' + to: '2023-01-17 14:59:59' + five: + - 薙草之稻光 + - 波乱月白经津 + four: + - 恶王丸 + - 曚云之月 + - 匣里龙吟 + - 西风长枪 + - 祭礼残章 + name: 神铸赋形 +- from: '2022-12-07 06:00:00' + to: '2022-12-27 17:59:59' + five: + - 图莱杜拉的回忆 + - 赤角石溃杵 + four: + - 祭礼剑 + - 西风大剑 + - 断浪长鳍 + - 昭心 + - 西风猎弓 +- from: '2022-11-18 18:00:00' + to: '2022-12-06 14:59:59' + five: + - 神乐之真意 + - 冬极白星 + four: + - 西风剑 + - 钟剑 + - 匣里灭辰 + - 西风秘典 + - 绝弦 + name: 神铸赋形 +- from: '2022-11-02 06:00:00' + to: '2022-11-18 14:59:59' + five: + - 千夜浮梦 + - 飞雷之弦振 + four: + - 笛剑 + - 祭礼大剑 + - 西风长枪 + - 流浪乐章 + - 弓藏 + name: 神铸赋形 +- from: '2022-10-14 18:00:00' + to: '2022-11-01 14:59:59' + five: + - 圣显之钥 + - 磐岩结绿 + four: + - 西福斯的月光 + - 雨裁 + - 匣里灭辰 + - 流浪的晚星 + - 祭礼弓 + name: 神铸赋形 +- from: '2022-09-28 06:00:00' + to: '2022-10-14 17:59:59' + five: + - 赤沙之杖 + - 终末嗟叹之诗 + four: + - 匣里龙吟 + - 玛海菈的水色 + - 西风长枪 + - 祭礼残章 + - 西风猎弓 + name: 神铸赋形 +- from: '2022-09-09 18:00:00' + to: '2022-09-27 14:59:59' + five: + - 阿莫斯之弓 + - 不灭月华 + four: + - 祭礼剑 + - 西风大剑 + - 匣里灭辰 + - 昭心 + - 弓藏 + name: 神铸赋形 +- from: '2022-08-24 06:00:00' + to: '2022-09-09 17:59:59' + five: + - 猎人之径 + - 贯虹之槊 + four: + - 西风剑 + - 钟剑 + - 西风长枪 + - 西风秘典 + - 绝弦 + name: 神铸赋形 +- from: '2022-08-02 18:00:00' + to: '2022-08-23 14:59:59' + five: + - 飞雷之弦振 + - 斫峰之刃 + four: + - 暗巷的酒与诗 + - 暗巷猎手 + - 笛剑 + - 祭礼大剑 + - 匣里灭辰 + name: 神铸赋形 +- from: '2022-07-13 06:00:00' + to: '2022-08-02 17:59:59' + five: + - 苍古自由之誓 + - 四风原典 + four: + - 暗巷闪光 + - 雨裁 + - 西风长枪 + - 流浪乐章 + - 幽夜华尔兹 + name: 神铸赋形 +- from: '2022-06-21 18:00:00' + to: '2022-07-12 14:59:59' + five: + - 赤角石溃杵 + - 尘世之锁 + four: + - 千岩古剑 + - 匣里龙吟 + - 匣里灭辰 + - 祭礼残章 + - 绝弦 + name: 神铸赋形 +- from: '2022-05-31 06:00:00' + to: '2022-06-21 17:59:59' + five: + - 若水 + - 和璞鸢 + four: + - 千岩长枪 + - 祭礼剑 + - 西风大剑 + - 昭心 + - 祭礼弓 + name: 神铸赋形 +- from: '2022-04-19 17:59:59' + to: '2022-05-31 05:59:59' + five: + - 雾切之回光 + - 无工之剑 + four: + - 西风剑 + - 钟剑 + - 西风长枪 + - 西风秘典 + - 西风猎弓 + name: 神铸赋形 +- from: '2022-03-30 06:00:00' + to: '2022-04-19 17:59:59' + five: + - 波乱月白经津 + - 终末嗟叹之诗 + four: + - 弓藏 + - 笛剑 + - 流浪乐章 + - 匣里灭辰 + - 祭礼大剑 + name: 神铸赋形 +- from: '2022-03-08 18:00:00' + to: '2022-03-29 14:59:59' + five: + - 薙草之稻光 + - 不灭月华 + four: + - 恶王丸 + - 曚云之月 + - 匣里龙吟 + - 西风长枪 + - 祭礼残章 + name: 神铸赋形 +- from: '2022-02-16 06:00:00' + to: '2022-03-08 17:59:59' + five: + - 神乐之真意 + - 磐岩结绿 + four: + - 祭礼剑 + - 雨裁 + - 断浪长鳍 + - 昭心 + - 绝弦 + name: 神铸赋形 +- from: '2022-01-25 18:00:00' + to: '2022-02-15 14:59:59' + five: + - 贯虹之槊 + - 阿莫斯之弓 + four: + - 西风剑 + - 千岩古剑 + - 匣里灭辰 + - 西风秘典 + - 祭礼弓 + name: 神铸赋形 +- from: '2022-01-05 06:00:00' + to: '2022-01-25 17:59:59' + five: + - 息灾 + - 和璞鸢 + four: + - 笛剑 + - 西风大剑 + - 千岩长枪 + - 流浪乐章 + - 西风猎弓 + name: 神铸赋形 +- from: '2021-12-14 18:00:00' + to: '2022-01-04 14:59:59' + five: + - 赤角石溃杵 + - 天空之翼 + four: + - 暗巷闪光 + - 钟剑 + - 西风长枪 + - 祭礼残章 + - 幽夜华尔兹 + name: 神铸赋形 +- from: '2021-11-24 06:00:00' + to: '2021-12-14 17:59:59' + five: + - 苍古自由之誓 + - 松籁响起之时 + four: + - 匣里龙吟 + - 祭礼大剑 + - 匣里灭辰 + - 暗巷的酒与诗 + - 暗巷猎手 + name: 神铸赋形 +- from: '2021-11-02 18:00:00' + to: '2021-11-23 14:59:59' + five: + - 护摩之杖 + - 终末嗟叹之诗 + four: + - 祭礼剑 + - 雨裁 + - 断浪长鳍 + - 流浪乐章 + - 曚云之月 + name: 神铸赋形 +- from: '2021-10-13 06:00:00' + to: '2021-11-02 17:59:59' + five: + - 冬极白星 + - 尘世之锁 + four: + - 西风剑 + - 恶王丸 + - 西风长枪 + - 昭心 + - 弓藏 + name: 神铸赋形 +- from: '2021-09-21 18:00:00' + to: '2021-10-12 14:59:59' + five: + - 不灭月华 + - 磐岩结绿 + four: + - 笛剑 + - 西风大剑 + - 匣里灭辰 + - 西风秘典 + - 绝弦 + name: 神铸赋形 +- from: '2021-09-01 06:00:00' + to: '2021-09-21 17:59:59' + five: + - 薙草之稻光 + - 无工之剑 + four: + - 匣里龙吟 + - 钟剑 + - 西风长枪 + - 流浪乐章 + - 祭礼弓 + name: 神铸赋形 +- from: '2021-08-10 18:00:00' + to: '2021-08-31 14:59:59' + five: + - 飞雷之弦振 + - 天空之刃 + four: + - 祭礼剑 + - 雨裁 + - 匣里灭辰 + - 祭礼残章 + - 西风猎弓 + name: 神铸赋形 +- from: '2021-07-21 06:00:00' + to: '2021-08-10 17:59:59' + five: + - 雾切之回光 + - 天空之脊 + four: + - 西风剑 + - 祭礼大剑 + - 西风长枪 + - 西风秘典 + - 绝弦 + name: 神铸赋形 +- from: '2021-06-29 18:00:00' + to: '2021-07-20 14:59:59' + five: + - 苍古自由之誓 + - 天空之卷 + four: + - 暗巷闪光 + - 西风大剑 + - 匣里灭辰 + - 暗巷的酒与诗 + - 暗巷猎手 + name: 神铸赋形 +- from: '2021-06-09 06:00:00' + to: '2021-06-29 17:59:59' + five: + - 天空之傲 + - 四风原典 + four: + - 匣里龙吟 + - 钟剑 + - 西风长枪 + - 流浪乐章 + - 幽夜华尔兹 + name: 神铸赋形 +- from: '2021-05-18 18:00:00' + to: '2021-06-08 14:59:59' + five: + - 松籁响起之时 + - 风鹰剑 + four: + - 祭礼剑 + - 雨裁 + - 匣里灭辰 + - 祭礼残章 + - 弓藏 + name: 神铸赋形 +- from: '2021-04-28 06:00:00' + to: '2021-05-18 17:59:59' + five: + - 斫峰之刃 + - 尘世之锁 + four: + - 笛剑 + - 千岩古剑 + - 祭礼弓 + - 昭心 + - 千岩长枪 + name: 神铸赋形 +- from: '2021-04-06 18:00:00' + to: '2021-04-27 14:59:59' + five: + - 天空之翼 + - 四风原典 + four: + - 西风剑 + - 祭礼大剑 + - 暗巷猎手 + - 西风秘典 + - 西风长枪 + name: 神铸赋形 +- from: '2021-03-17 06:00:00' + to: '2021-04-06 15:59:59' + five: + - 终末嗟叹之诗 + - 天空之刃 + four: + - 暗巷闪光 + - 西风大剑 + - 西风猎弓 + - 暗巷的酒与诗 + - 匣里灭辰 + name: 神铸赋形 +- from: '2021-02-23 18:00:00' + to: '2021-03-16 14:59:59' + five: + - 护摩之杖 + - 狼的末路 + four: + - 匣里龙吟 + - 千岩古剑 + - 祭礼弓 + - 流浪乐章 + - 千岩长枪 + name: 神铸赋形 +- from: '2021-02-03 06:00:00' + to: '2021-02-23 15:59:59' + five: + - 磐岩结绿 + - 和璞鸢 + four: + - 笛剑 + - 祭礼大剑 + - 弓藏 + - 昭心 + - 西风长枪 + name: 神铸赋形 +- from: '2021-01-12 18:00:00' + to: '2021-02-02 14:59:59' + five: + - 阿莫斯之弓 + - 天空之傲 + four: + - 祭礼剑 + - 钟剑 + - 匣里灭辰 + - 昭心 + - 西风猎弓 + name: 神铸赋形 +- from: '2020-12-23 06:00:00' + to: '2021-01-12 15:59:59' + five: + - 斫峰之刃 + - 天空之卷 + four: + - 西风剑 + - 西风大剑 + - 西风长枪 + - 祭礼残章 + - 绝弦 + name: 神铸赋形 +- from: '2020-12-01 18:00:00' + to: '2020-12-22 14:59:59' + five: + - 贯虹之槊 + - 无工之剑 + four: + - 匣里龙吟 + - 钟剑 + - 西风秘典 + - 西风猎弓 + - 匣里灭辰 + name: 神铸赋形 +- from: '2020-11-11 06:00:00' + to: '2020-12-01 15:59:59' + five: + - 天空之翼 + - 尘世之锁 + four: + - 笛剑 + - 雨裁 + - 昭心 + - 弓藏 + - 西风长枪 + name: 神铸赋形 +- from: '2020-10-20 18:00:00' + to: '2020-11-10 14:59:59' + five: + - 四风原典 + - 狼的末路 + four: + - 祭礼剑 + - 祭礼大剑 + - 祭礼残章 + - 祭礼弓 + - 匣里灭辰 + name: 神铸赋形 +- from: '2020-09-28 06:00:00' + to: '2020-10-18 17:59:59' + five: + - 风鹰剑 + - 阿莫斯之弓 + four: + - 笛剑 + - 钟剑 + - 流浪乐章 + - 绝弦 + - 西风长枪 + name: 神铸赋形 diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/prop/prop.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/prop/prop.yaml new file mode 100644 index 0000000000000000000000000000000000000000..96a95d38fa59ce488ea5d15db15b3014d083255d --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/prop/prop.yaml @@ -0,0 +1,30 @@ +#数据源自https://github.com/CRAZYShimakaze/zhenxun_extensive_plugin/blob/main/genshin_role_info/res/json_data/prop.json +FIGHT_PROP_BASE_ATTACK: 基础攻击力 +FIGHT_PROP_BASE_DEFENSE: 基础防御力 +FIGHT_PROP_BASE_HP: 基础生命值 +FIGHT_PROP_ATTACK: 攻击力 +FIGHT_PROP_ATTACK_PERCENT: 百分比攻击力 +FIGHT_PROP_HP: 生命值 +FIGHT_PROP_HP_PERCENT: 百分比生命值 +FIGHT_PROP_DEFENSE: 防御力 +FIGHT_PROP_DEFENSE_PERCENT: 百分比防御力 +FIGHT_PROP_ELEMENT_MASTERY: 元素精通 +FIGHT_PROP_CRITICAL: 暴击率 +FIGHT_PROP_CRITICAL_HURT: 暴击伤害 +FIGHT_PROP_CHARGE_EFFICIENCY: 元素充能效率 +FIGHT_PROP_FIRE_SUB_HURT: 火元素抗性 +FIGHT_PROP_ELEC_SUB_HURT: 雷元素抗性 +FIGHT_PROP_ICE_SUB_HURT: 冰元素抗性 +FIGHT_PROP_WATER_SUB_HURT: 水元素抗性 +FIGHT_PROP_WIND_SUB_HURT: 风元素抗性 +FIGHT_PROP_ROCK_SUB_HURT: 岩元素抗性 +FIGHT_PROP_GRASS_SUB_HURT: 草元素抗性 +FIGHT_PROP_FIRE_ADD_HURT: 火元素伤害加成 +FIGHT_PROP_ELEC_ADD_HURT: 雷元素伤害加成 +FIGHT_PROP_ICE_ADD_HURT: 冰元素伤害加成 +FIGHT_PROP_WATER_ADD_HURT: 水元素伤害加成 +FIGHT_PROP_WIND_ADD_HURT: 风元素伤害加成 +FIGHT_PROP_ROCK_ADD_HURT: 岩元素伤害加成 +FIGHT_PROP_GRASS_ADD_HURT: 草元素伤害加成 +FIGHT_PROP_PHYSICAL_ADD_HURT: 物理伤害加成 +FIGHT_PROP_HEAL_ADD: 治疗加成 \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/role/name.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/role/name.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3602f19d0d8171228dff9a6e9b2446ee92398c1d --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/role/name.yaml @@ -0,0 +1,758 @@ +20000000: + - 主角 + - 旅行者 + - 卑鄙的外乡人 + - 荣誉骑士 + - 爷 + - 风主 + - 岩主 + - 雷主 + - 草主 + - 履刑者 + - 抽卡不歪真君 +10000002: + - 神里绫华 + - Kamisato Ayaka + - Ayaka + - ayaka + - 神里 + - 绫华 + - 神里凌华 + - 凌华 + - 白鹭公主 + - 神里大小姐 + - 小乌龟 + - 龟龟 +10000003: + - 琴 + - Jean + - jean + - 团长 + - 代理团长 + - 琴团长 + - 蒲公英骑士 + - 琴·古恩希尔德 + - 古恩希尔德 +10000005: + - 空 + - 男主 + - 男主角 + - 龙哥 + - 空哥 + - 男爷 +10000006: + - 丽莎 + - Lisa + - lisa + - 图书管理员 + - 图书馆管理员 + - 蔷薇魔女 + - 丽莎阿姨 + - 丽莎·敏兹 + - 敏兹 +10000007: + - 荧 + - 女主 + - 女主角 + - 莹 + - 萤 + - 黄毛阿姨 + - 荧妹 + - 女爷 +10000014: + - 芭芭拉 + - Barbara + - barbara + - 巴巴拉 + - 拉粑粑 + - 拉巴巴 + - 内鬼 + - 加湿器 + - 肉身解咒 + - 肉身解咒真君 + - 闪耀偶像 + - 偶像 + - 芭芭拉·佩奇 + - 佩奇 +10000015: + - 凯亚 + - Kaeya + - kaeya + - 盖亚 + - 凯子哥 + - 凯鸭 + - 矿工 + - 矿工头子 + - 骑兵队长 + - 凯子 + - 凝冰渡海真君 + - 凯亚·亚尔伯里奇 + - 亚尔伯里奇 +10000016: + - 迪卢克 + - diluc + - Diluc + - 卢姥爷 + - 姥爷 + - 卢老爷 + - 卢锅巴 + - 正义人 + - 正e人 + - 正E人 + - 卢本伟 + - 暗夜英雄 + - 卢卢伯爵 + - 落魄了 + - 落魄了家人们 + - 迪卢克·莱艮芬德 + - 莱艮芬德 +10000020: + - 雷泽 + - razor + - Razor + - 狼少年 + - 狼崽子 + - 狼崽 + - 卢皮卡 + - 小狼 + - 小狼狗 + - 狼孩 +10000021: + - 安柏 + - Amber + - amber + - 安伯 + - 兔兔伯爵 + - 飞行冠军 + - 侦查骑士 + - 点火姬 + - 点火机 + - 打火机 + - 打火姬 +10000022: + - 温迪 + - Venti + - venti + - 温蒂 + - 风神 + - 卖唱的 + - 巴巴托斯 + - 巴巴脱丝 + - 芭芭托斯 + - 芭芭脱丝 + - 干点正事 + - 不干正事 + - 吟游诗人 + - 诶嘿 + - 唉嘿 + - 摸鱼 +10000023: + - 香菱 + - Xiangling + - xiangling + - 香玲 + - 锅巴 + - 厨师 + - 万民堂厨师 + - 香师傅 + - 卯香菱 +10000024: + - 北斗 + - Beidou + - beidou + - 大姐头 + - 大姐 + - 无冕的龙王 + - 龙王 +10000025: + - 行秋 + - Xingqiu + - xingqiu + - 秋秋人 + - 秋妹妹 + - 书呆子 + - 水神 + - 飞云商会二少爷 +10000026: + - 魈 + - Xiao + - xiao + - 打桩机 + - 插秧 + - 三眼五显仙人 + - 三眼五显真人 + - 降魔大圣 + - 护法夜叉 + - 快乐风男 + - 无聊 + - 靖妖傩舞 + - 矮子仙人 + - 三点五尺仙人 + - 跳跳虎 +10000027: + - 凝光 + - Ningguang + - ningguang + - 富婆 + - 天权星 + - 天权 +10000029: + - 可莉 + - Klee + - klee + - 嘟嘟可 + - 火花骑士 + - 蹦蹦炸弹 + - 炸鱼 + - 放火烧山 + - 放火烧山真君 + - 蒙德最强战力 + - 逃跑的太阳 + - 啦啦啦 + - 哒哒哒 + - 炸弹人 + - 禁闭室 + - 太阳 + - 小太阳 +10000030: + - 钟离 + - Zhongli + - zhongli + - 摩拉克斯 + - 岩王爷 + - 岩神 + - 钟师傅 + - 天动万象 + - 岩王帝君 + - 未来可期 + - 帝君 + - 拒收病婿 +10000031: + - 菲谢尔 + - Fischl + - fischl + - 皇女 + - 小艾米 + - 小艾咪 + - 奥兹 + - 断罪皇女 + - 中二病 + - 中二少女 + - 中二皇女 + - 奥兹发射器 + - 菲谢尔·冯·露弗施洛斯·那菲多特 + - 露弗施洛斯 + - 那菲多特 +10000032: + - 班尼特 + - Bennett + - bennett + - 点赞哥 + - 点赞 + - 倒霉少年 + - 倒霉蛋 + - 霹雳闪雷真君 + - 班神 + - 班爷 + - 倒霉 + - 火神 + - 六星真神 +10000033: + - 达达利亚 + - Tartaglia + - tartaglia + - Childe + - childe + - Ajax + - ajax + - 达达鸭 + - 达达利鸭 + - 公子 + - 玩具销售员 + - 玩具推销员 + - 钱包 + - 鸭鸭 + - 愚人众末席 + - 阿贾克斯 +10000034: + - 诺艾尔 + - Noelle + - noelle + - 女仆 + - 高达 + - 岩王帝姬 +10000035: + - 七七 + - Qiqi + - qiqi + - 僵尸 + - 肚饿真君 + - 度厄真君 + - '77' +10000036: + - 重云 + - Chongyun + - chongyun + - 纯阳之体 + - 冰棍 +10000037: + - 甘雨 + - Ganyu + - ganyu + - 椰羊 + - 椰奶 + - 王小美 +10000038: + - 阿贝多 + - Albedo + - albedo + - 可莉哥哥 + - 升降机 + - 升降台 + - 电梯 + - 白垩之子 + - 贝爷 + - 白垩 + - 阿贝少 + - 花呗多 + - 阿贝夕 + - abd + - 阿师傅 +10000039: + - 迪奥娜 + - Diona + - diona + - 迪欧娜 + - dio + - dio娜 + - 冰猫 + - 猫猫 + - 猫娘 + - 喵喵 + - 调酒师 + - 迪奥娜·凯茨莱茵 + - 凯茨莱茵 +10000041: + - 莫娜 + - Mona + - mona + - 穷鬼 + - 穷光蛋 + - 穷 + - 莫纳 + - 占星术士 + - 占星师 + - 讨龙真君 + - 半部讨龙真君 + - 阿斯托洛吉斯·莫娜·梅姬斯图斯 + - 阿斯托洛吉斯 + - 梅姬斯图斯 + - 梅姬斯图斯姬 + - 梅姬斯图斯卿 +10000042: + - 刻晴 + - Keqing + - keqing + - 刻情 + - 氪晴 + - 刻师傅 + - 刻师父 + - 牛杂 + - 牛杂师傅 + - 斩尽牛杂 + - 免疫 + - 免疫免疫 + - 屁斜剑法 + - 玉衡星 + - 玉衡 + - 阿晴 + - 啊晴 + - 璃月雷神 +10000043: + - 砂糖 + - Sucrose + - sucrose + - 雷莹术士 + - 雷萤术士 + - 雷荧术士 +10000044: + - 辛焱 + - Xinyan + - xinyan + - 辛炎 + - 黑妹 + - 摇滚 +10000045: + - 罗莎莉亚 + - Rosaria + - rosaria + - 罗莎莉娅 + - 白色史莱姆 + - 白史莱姆 + - 修女 + - 罗莎利亚 + - 罗莎利娅 + - 罗沙莉亚 + - 罗沙莉娅 + - 罗沙利亚 + - 罗沙利娅 + - 萝莎莉亚 + - 萝莎莉娅 + - 萝莎利亚 + - 萝莎利娅 + - 萝沙莉亚 + - 萝沙莉娅 + - 萝沙利亚 + - 萝沙利娅 +10000046: + - 胡桃 + - Hu Tao + - hu tao + - HuTao + - hutao + - Hutao + - 胡淘 + - 往生堂堂主 + - 火化 + - 抬棺的 + - 蝴蝶 + - 核桃 + - 堂主 + - 胡堂主 + - 雪霁梅香 + - 桃子 +10000047: + - 枫原万叶 + - Kaedehara Kazuha + - Kazuha + - kazuha + - 万叶 + - 叶天帝 + - 天帝 + - 叶师傅 +10000048: + - 烟绯 + - Yanfei + - yanfei + - 烟老师 + - 律师 + - 罗翔 +10000049: + - 宵宫 + - Yoimiya + - yoimiya + - 霄宫 + - 烟花 + - 肖宫 + - 肖工 + - 绷带女孩 + - 长野原宵宫 +10000050: + - 托马 + - Thoma + - thoma + - 家政官 + - 太郎丸 + - 地头蛇 + - 男仆 + - 拖马 +10000051: + - 优菈 + - Eula + - eula + - 优拉 + - 尤拉 + - 尤菈 + - 浪花骑士 + - 记仇 + - 优菈·劳伦斯 + - 劳伦斯 +10000052: + - 雷电将军 + - Raiden Shogun + - Raiden + - raiden + - 雷神 + - 将军 + - 雷军 + - 巴尔 + - 阿影 + - 影 + - 巴尔泽布 + - 煮饭婆 + - 奶香一刀 + - 无想一刀 + - 宅女 +10000053: + - 早柚 + - Sayu + - sayu + - 小狸猫 + - 狸猫 + - 忍者 + - 貉 +10000054: + - 珊瑚宫心海 + - Sangonomiya Kokomi + - Kokomi + - kokomi + - 心海 + - 军师 + - 珊瑚宫 + - 书记 + - 观赏鱼 + - 水母 + - 鱼 + - 美人鱼 +10000055: + - 五郎 + - Gorou + - gorou + - 柴犬 + - 土狗 + - 希娜 + - 希娜小姐 +10000056: + - 九条裟罗 + - Kujou Sara + - Sara + - sara + - 九条 + - 九条沙罗 + - 裟罗 + - 沙罗 + - 天狗 +10000057: + - 荒泷一斗 + - Arataki Itto + - Itto + - itto + - 荒龙一斗 + - 荒泷天下第一斗 + - 一斗 + - 一抖 + - 荒泷 + - 1斗 + - 牛牛 + - 斗子哥 + - 牛子哥 + - 牛子 + - 孩子王 + - 斗虫 + - 巧乐兹 + - 放牛的 +10000058: + - 八重神子 + - Yae Miko + - Miko + - miko + - 八重 + - 神子 + - 狐狸 + - 想得美哦 + - 巫女 + - 屑狐狸 + - 骚狐狸 + - 八重宫司 + - 婶子 + - 小八 + - 八重寄子 + - 寄子 +10000059: + - 鹿野院平藏 + - shikanoin heizou + - Heizou + - heizou + - heizo + - 鹿野苑 + - 鹿野院 + - 平藏 + - 鹿野苑平藏 + - 小鹿 +10000060: + - 夜兰 + - Yelan + - yelan + - 夜阑 + - 叶澜 + - 腋兰 + - 夜天后 +10000062: + - 埃洛伊 + - Aloy + - aloy +10000063: + - 申鹤 + - Shenhe + - shenhe + - 神鹤 + - 小姨 + - 小姨子 + - 审鹤 +10000064: + - 云堇 + - Yun Jin + - yunjin + - yun jin + - 云瑾 + - 云先生 + - 云锦 + - 神女劈观 + - 土女 +10000065: + - 久岐忍 + - Kuki Shinobu + - Kuki + - kuki + - Shinobu + - shinobu + - 97忍 + - 小忍 + - 久歧忍 + - '97' + - 茄忍 + - 茄子 + - 紫茄子 + - 阿忍 + - 忍姐 +10000066: + - 神里绫人 + - Kamisato Ayato + - Ayato + - ayato + - 绫人 + - 神里凌人 + - 凌人 + - 0人 + - 神人 + - 零人 + - 大舅哥 + +#3.0 +10000067: + - 柯莱 + - Collei + - collei + - 柯来 + - 科莱 + - 科来 + - 小天使 + - 须弥安柏 + - 草安柏 + - 须弥飞行冠军 + - 见习巡林员 + - 巡林员 +10000068: + - 多莉 + - Dori + - dori + - 多利 + - 多力 + - 多丽 + - 奸商 + - 多莉·桑歌玛哈巴依 + - 桑歌玛哈巴依 +10000069: + - 提纳里 + - Tighnari + - tighnari + - 小提 + - 提那里 + - 缇娜里 + - 提哪里 + - 驴 + - 柯莱老师 + - 柯莱师傅 + - 柯莱师父 + - 巡林官 +10000070: + - 妮露 + - Nilou + - nilou + - 尼露 + - 尼禄 + - 妮璐 + - 舞娘 + - 红牛 +10000071: + - 赛诺 + - Cyno + - cyno + - 塞诺 + - 胡狼 + - 牌佬 + - 打牌佬 + - 打牌王 +10000072: + - 坎蒂丝 + - Candace + - candace + - 坎迪斯 +10000073: + - 纳西妲 + - Nahida + - nahida + - 草王 + - 草神 + - 花神 + - 小吉祥 + - 小吉祥草王 + - 大慈树王 + - 草萝莉 + - 纳西坦 + - 羽毛球 +10000074: + - 莱依拉 + - Layla + - layla + - 拉一拉 + - 莱依菈 + - 来依菈 + - 来依拉 +10000075: + - 流浪者 + - The Wanderer + - Wanderer + - wanderer + - 散兵 + - 伞兵 +10000076: + - 珐露珊 + - Faruzan + - faruzan + - 法露珊 + - 发露珊 + - 法露姗 + - 发露姗 + - 发姐 + - 法姐 + - 百岁珊 +10000077: + - 瑶瑶 + - Yaoyao + - yaoyao + - 遥遥 +10000078: + - 艾尔海森 + - Alhaitham + - alhaitham + - 爱尔海森 + - 艾尔海参 + - 艾尔 + - 海森 + - 海参 + - 海神 +10000079: + - 迪希雅 + - Dehya + - dehya + - 蒂西亚 + - 迪希亚 + - 西亚 + - 西雅 + - 希雅 +10000080: + - 米卡 + - Mika + - mika + - 米咖 diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/role/other.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/role/other.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2e1c4e17b3c23217eff516ca865f413abfe17e80 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/role/other.yaml @@ -0,0 +1,90 @@ +# 角色名称缩短 +sortName: + 达达利亚: 公子 + 神里绫华: 绫华 + 神里绫人: 绫人 + 枫原万叶: 万叶 + 雷电将军: 雷神 + 珊瑚宫心海: 心海 + 荒泷一斗: 一斗 + 八重神子: 八重 + 九条裟罗: 九条 + 罗莎莉亚: 罗莎 + 鹿野院平藏: 平藏 + 艾尔海森: 海森 + +costumes: + - 海风之梦 + - 闪耀协奏 + - 纱中幽兰 + - 霓裾翩跹 + - 极夜真梦 + - 殷红终夜 + +#五星角色 +five: + - 10000003 + - 10000005 + - 10000007 + - 10000016 + - 10000022 + - 10000026 + - 10000029 + - 10000030 + - 10000033 + - 10000035 + - 10000037 + - 10000038 + - 10000041 + - 10000042 + - 10000046 + - 10000047 + - 10000051 + - 10000002 + - 10000049 + - 10000052 + - 10000054 + - 10000062 + - 10000057 + - 10000058 + - 10000063 + - 10000066 + - 10000060 + - 10000069 + - 10000070 + - 10000071 + - 10000075 + - 10000075 +#四星角色 +four: + - 10000006 + - 10000014 + - 10000015 + - 10000020 + - 10000021 + - 10000023 + - 10000024 + - 10000025 + - 10000027 + - 10000031 + - 10000032 + - 10000034 + - 10000036 + - 10000039 + - 10000043 + - 10000044 + - 10000045 + - 10000048 + - 10000053 + - 10000056 + - 10000050 + - 10000055 + - 10000059 + - 10000064 + - 10000065 + - 10000068 + - 10000069 + - 10000072 + - 10000074 + - 10000076 + - 10000077 diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/role/talent.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/role/talent.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6a2eaa98c04f201dafdfc0869221423698e6f6b0 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/role/talent.yaml @@ -0,0 +1,723 @@ +#命座相关数据源自 https://github.com/CRAZYShimakaze/zhenxun_extensive_plugin/blob/main/genshin_role_info/res/json_data/role_talent.json +Name: + '21': 霜杀墨染樱 + '22': 三重雪关扉 + '23': 花白锦画纸吹雪 + '24': 盈缺流返 + '25': 花云钟入月 + '26': 间水月 + '31': 流转剑脊的暴风 + '32': 守护众人的坚盾 + '33': 西风吹拂之时 + '34': 蒲公英的国土 + '35': 须臾一瞬的烈风 + '36': 恩眷万民的狮牙 + '41': 无限的电回路 + '42': 空间电势结界 + '43': 谐振的雷光 + '44': 如雨的电浆 + '45': 等离态的落雷 + '46': 脉冲的魔女 + '71': 回转的怒风 + '72': 革新的旋风 + '73': 天地的刚风 + '74': 眷护的和风 + '75': 群星的涡风 + '76': 纠缠的信风 + '91': 巍然的青岩 + '92': 不稳的熔岩 + '93': 八方之岩 + '94': 险峻的重岩 + '95': 天坠之岩 + '96': 永世的磐岩 + '101': 丰穰的春雷 + '102': 震怒的苍雷 + '103': 连延的远雷 + '104': 难测的云雷 + '105': 荒野的霆雷 + '106': 撼世的神雷 + '111': 寄身的倚草 + '112': 健韧的劲草 + '113': 婆娑的瑶草 + '114': 如饴的蜜草 + '115': 迅生的丰草 + '116': 蕴思的霜草 + '141': 彩色歌谣 + '142': 元气迸发 + '143': 明日之星 + '144': 努力即魔法 + '145': 纯真的羁绊 + '146': 将一切美好献给你 + '151': 卓越的血脉 + '152': 无尽的霜舞 + '153': 凛冽的冰戏 + '154': 极寒的轻吻 + '155': 至冷的拥抱 + '156': 轮旋的冰凌 + '161': 罪罚裁断 + '162': 炙热余烬 + '163': 钢铁炽焰 + '164': 流火焦灼 + '165': 昭告黎明的火之鸟 + '166': 清算黑暗的炎之剑 + '201': 狼性 + '202': 压制 + '203': 兽魂 + '204': 撕咬 + '205': 利爪 + '206': 天狼 + '211': 一箭双丘丘! + '212': 一触即发 + '213': 烧起来啦! + '214': 才不是普通的布偶 + '215': 是兔兔伯爵! + '216': 疾如野火 + '221': 弦发的苍风 + '222': 眷恋的泠风 + '223': 千风的诗篇 + '224': 自由的凛风 + '225': 高天的协奏 + '226': 抗争的暴风 + '231': 外酥里嫩 + '232': 大火宽油 + '233': 武火急烹 + '234': 文火慢煨 + '235': 锅巴凶猛 + '236': 大龙卷旋火轮 + '241': 鱼龙沉四方 + '242': 赫赫雷涌起 + '243': 潮奔蓦引电 + '244': 牵星觅乡岸 + '245': 踏浪霞连阶 + '246': 北斗祓幽孽 + '251': 重帘留香 + '252': 天青现虹 + '253': 织诗成锦 + '254': 孤舟斩蛟 + '255': 雨深闭门 + '256': 万文集此 + '261': 坏劫·毁坏三界 + '262': 空劫·虚空华开敷变 + '263': 降魔·忿怒显相 + '264': 神通·诸苦灭尽 + '265': 成劫·无明增长 + '266': 降魔·护法夜叉 + '271': 悬星尽散击云碎 + '272': 璇玑合璧镇昆仑 + '273': 星罗宿列天权临 + '274': 攻守易形著神机 + '275': 琼屏千扇正天衡 + '276': 七星璨璨凝流光 + '291': 连环轰隆 + '292': 破破弹片 + '293': 可莉特调 + '294': 一触即发 + '295': 轰击之星 + '296': 火力全开 + '301': 岩者,六合引之为骨 + '302': 石者,八荒韫玉而明 + '303': 圭璋,暝仍不移其晖 + '304': 黄琮,破而不夺其坚 + '305': 苍璧,驱之长昭天理 + '306': 金玉,礼予天地四方 + '311': 幽邃鸦眼 + '312': 圣裁影羽 + '313': 渊色黑翼 + '314': 皇女幻绮谭 + '315': 至夜默示录 + '316': 永夜之禽 + '321': 冒险憧憬 + '322': 踏破绝境 + '323': 火热激情 + '324': 热情不灭 + '325': 开拓的心魂 + '326': 烈火与勇气 + '331': 魔王武装·遏浪 + '332': 魔王武装·暗流 + '333': 深渊之灾·纷争涡源 + '334': 深渊之灾·凝水盛放 + '335': 极恶技·斩水斩雨 + '336': 极恶技·天使灭尽 + '341': 支援就交给我吧 + '342': 旋风女仆 + '343': 女仆不会受伤 + '344': 之后会扫干净的 + '345': 骑士团扫除专家 + '346': 要一尘不染才行 + '351': 寒苦回向 + '352': 冰寒蚀骨 + '353': 升天宝诰 + '354': 天威压众 + '355': 红莲开绽 + '356': 起死回骸 + '361': 释凌咏冰 + '362': 周天运转 + '363': 云尽光生 + '364': 浮云霜天 + '365': 真道正理 + '366': 四灵捧圣 + '371': 饮露 + '372': 获麟 + '373': 云行 + '374': 西狩 + '375': 折草 + '376': 履虫 + '381': 伊甸之花 + '382': 显生之宙 + '383': 太阳之华 + '384': 神性之陨 + '385': 冥古之潮 + '386': 无垢之土 + '391': 特调的余韵 + '392': 猫爪冰摇 + '393': 还、还要续杯? + '394': 「酒业杀手」 + '395': 双份加冰 + '396': 猫尾打烊之时 + '411': 沉没的预言 + '412': 星月的连珠 + '413': 不休的天象 + '414': 灭绝的预言 + '415': 命运的嘲弄 + '416': 厄运的修辞 + '421': 雷厉 + '422': 苛捐 + '423': 登楼 + '424': 调律 + '425': 移灯 + '426': 廉贞 + '431': 堆叠真空域 + '432': 不羁型贝特 + '433': 零失误少女 + '434': 炼金的偏执 + '435': 认真普通瓶 + '436': 混元熵增论 + '441': 绝命的加速 + '442': 开场即兴段 + '443': 摭分的指法 + '444': 节奏的传染 + '445': 返场的高呼 + '446': 地狱里摇摆 + '451': 罪之导引 + '452': 无福之地 + '453': 告解之仪 + '454': 苦痛恩典 + '455': 临终祈礼 + '456': 代行裁判 + '461': 赤团开时斜飞去 + '462': 最不安神晴又复雨 + '463': 逗留采血色 + '464': 伴君眠花房 + '465': 无可奈何燃花作香 + '466': 幽蝶能留一缕芳 + '471': 千山红遍 + '472': 山岚残芯 + '473': 枫袖奇谭 + '474': 大空幻法 + '475': 万世之集 + '476': 血赤叶红 + '481': 占理不饶人 + '482': 最终解释权 + '483': 真火炼宝印 + '484': 丹书金铁券 + '485': 遵法切结书 + '486': 是额外条款 + '491': 赤玉琉金 + '492': 万灯送火 + '493': 鼠火戏法 + '494': 花火职人心得 + '495': 真夏宵祭锦绘 + '496': 长野原龙势流星群 + '501': 同袍的义理 + '502': 僚佐的才巧 + '503': 御敌的执定 + '504': 用臣的久计 + '505': 野火的豪烈 + '506': 炽烧的至心 + '511': 光潮的幻象 + '512': 海沫的少女 + '513': 劳伦斯的血脉 + '514': 自卑者的逞强 + '515': 骑士的素质 + '516': 高贵者的义务 + '521': 恶曜卜词 + '522': 斩铁断金 + '523': 真影旧事 + '524': 誓奉常道 + '525': 凶将显形 + '526': 负愿前行 + '531': 一心二用之术 + '532': 理清逃跑路线 + '533': 都交给分身吧 + '534': 偷懒的新方法 + '535': 快是第一奥义 + '536': 呼呼大睡时间 + '541': 决水于溪 + '542': 波起云海 + '543': 海渚月舟 + '544': 月摄千川 + '545': 百川集海 + '546': 珊瑚一心 + '551': 犬奔·疾如风 + '552': 犬坐·稳如钟 + '553': 犬爪·势如火 + '554': 犬舐·温如水 + '555': 犬突·动如雷 + '556': 犬勇·忠如山 + '561': 乌眼 + '562': 鸦羽 + '563': 心魔 + '564': 彻证 + '565': 咒咏 + '566': 我界 + '571': 倘若不知,我讲你听 + '572': 纠集众人,斗倒御岳 + '573': 水陆自在,牛王同行 + '574': 奉行牢狱,茶饭之所 + '575': 十年花坂,皆知我名 + '576': 在下荒泷一斗是也 + '581': 野狐供真篇 + '582': 望月吼哕声 + '583': 七段妙变化 + '584': 绯樱引雷章 + '585': 暴恶嗤笑面 + '586': 大杀生咒禁 + '591': 称名少年事件簿 + '592': 殊解诸因探案集 + '593': 暗文隐语谜题册 + '594': 虚言假说百物语 + '595': 禁室密所大图鉴 + '596': 奇想天开捕物帐 + '601': 与谋者,以局入局 + '602': 入彀者,多多益善 + '603': 晃盅者,琼畟药骰 + '604': 诓惑者,接树移花 + '605': 坐庄者,三仙戏法 + '606': 取胜者,大小通吃 + '621': 异界之星 + '622': 异界之星 + '623': 异界之星 + '624': 异界之星 + '625': 异界之星 + '626': 异界之星 + '631': 心斋 + '632': 定蒙 + '633': 潜虚 + '634': 洞观 + '635': 化神 + '636': 忘玄 + '641': 飞身趟马 + '642': 诸般切末 + '643': 牙纛探海 + '644': 昇堂吊云 + '645': 翘楚名坤 + '646': 庄谐并举 + '651': 割舍怜悯之心 + '652': 割舍侥幸之心 + '653': 割舍痛苦之心 + '654': 割舍封闭之心 + '655': 割舍逢迎之心 + '656': 割舍软弱之心 + '661': 镜华风姿 + '662': 世有源泉 + '663': 无意弄花 + '664': 不厌细流 + '665': 万水一露 + '666': 滥觞无底 + '671': 巡护深林 + '672': 漫行山薮 + '673': 夏堇芳菲 + '674': 骞林馈遗 + '675': 俱象残火 + '676': 坠镞为林 + '681': 追加投资 + '682': 特许经营 + '683': 百巧千奇 + '684': 酌盈剂虚 + '685': 物超所值 + '686': 漫掷万镒 + '691': 由根须断定肇始 + '692': 由茎干剖析来缘 + '693': 由枝节知晓造化 + '694': 由片叶管窥枯荣 + '695': 由繁花明了悟觉 + '696': 由硕实品论应果 + '701': 却月的轻舞 + '702': 星天的花雨 + '703': 倾影的莲步 + '704': 挽漪的节音 + '705': 翩旋的流光 + '706': 断霜的弦歌 + '711': 立仪·俯览昼冥 + '712': 令仪·引谒归灵 + '713': 律仪·行度誓惩 + '714': 巡仪·蒇护禁罔 + '715': 幽仪·逝往星芒 + '716': 羽仪·裁落钧衡 + '721': 赤沙的归嗣 + '722': 贯月的耀锋 + '723': 织狩的奉祀 + '724': 守戍的誓命 + '725': 萦金的苍瞳 + '726': 衍溢的汐潮 +Icon: + '21': UI_Talent_S_Ayaka_01 + '22': UI_Talent_S_Ayaka_02 + '23': UI_Talent_U_Ayaka_02 + '24': UI_Talent_S_Ayaka_03 + '25': UI_Talent_U_Ayaka_01 + '26': UI_Talent_S_Ayaka_04 + '31': UI_Talent_S_Qin_01 + '32': UI_Talent_S_Qin_02 + '33': UI_Talent_U_Qin_02 + '34': UI_Talent_S_Qin_03 + '35': UI_Talent_U_Qin_01 + '36': UI_Talent_S_Qin_04 + '41': UI_Talent_S_Lisa_01 + '42': UI_Talent_S_Lisa_02 + '43': UI_Talent_U_Lisa_02 + '44': UI_Talent_S_Lisa_03 + '45': UI_Talent_U_Lisa_01 + '46': UI_Talent_S_Lisa_04 + '71': UI_Talent_S_PlayerWind_01 + '72': UI_Talent_S_PlayerWind_02 + '73': UI_Talent_U_PlayerWind_02 + '74': UI_Talent_S_PlayerWind_03 + '75': UI_Talent_U_PlayerWind_01 + '76': UI_Talent_S_PlayerWind_04 + '91': UI_Talent_S_PlayerRock_01 + '92': UI_Talent_S_PlayerRock_02 + '93': UI_Talent_U_PlayerRock_02 + '94': UI_Talent_S_PlayerRock_03 + '95': UI_Talent_U_PlayerRock_01 + '96': UI_Talent_S_PlayerRock_04 + '101': UI_Talent_S_PlayerElectric_01 + '102': UI_Talent_S_PlayerElectric_02 + '103': UI_Talent_U_PlayerElectric_01 + '104': UI_Talent_S_PlayerElectric_03 + '105': UI_Talent_U_PlayerElectric_02 + '106': UI_Talent_S_PlayerElectric_04 + '111': UI_Talent_S_PlayerGrass_01 + '112': UI_Talent_S_PlayerGrass_02 + '113': UI_Talent_S_PlayerGrass_03 + '114': UI_Talent_S_PlayerGrass_04 + '115': UI_Talent_S_PlayerGrass_05 + '116': UI_Talent_S_PlayerGrass_06 + '141': UI_Talent_S_Barbara_01 + '142': UI_Talent_S_Barbara_02 + '143': UI_Talent_U_Barbara_02 + '144': UI_Talent_S_Barbara_03 + '145': UI_Talent_U_Barbara_01 + '146': UI_Talent_S_Barbara_04 + '151': UI_Talent_S_Kaeya_01 + '152': UI_Talent_S_Kaeya_02 + '153': UI_Talent_U_Kaeya_01 + '154': UI_Talent_S_Kaeya_03 + '155': UI_Talent_U_Kaeya_02 + '156': UI_Talent_S_Kaeya_04 + '161': UI_Talent_S_Diluc_01 + '162': UI_Talent_S_Diluc_02 + '163': UI_Talent_U_Diluc_01 + '164': UI_Talent_S_Diluc_03 + '165': UI_Talent_U_Diluc_02 + '166': UI_Talent_S_Diluc_04 + '201': UI_Talent_S_Razor_01 + '202': UI_Talent_S_Razor_02 + '203': UI_Talent_U_Razor_02 + '204': UI_Talent_S_Razor_03 + '205': UI_Talent_U_Razor_01 + '206': UI_Talent_S_Razor_04 + '211': UI_Talent_S_Ambor_01 + '212': UI_Talent_S_Ambor_02 + '213': UI_Talent_U_Ambor_02 + '214': UI_Talent_S_Ambor_03 + '215': UI_Talent_U_Ambor_01 + '216': UI_Talent_S_Ambor_04 + '221': UI_Talent_S_Venti_01 + '222': UI_Talent_S_Venti_02 + '223': UI_Talent_U_Venti_02 + '224': UI_Talent_S_Venti_03 + '225': UI_Talent_U_Venti_01 + '226': UI_Talent_S_Venti_04 + '231': UI_Talent_S_Xiangling_01 + '232': UI_Talent_S_Xiangling_02 + '233': UI_Talent_U_Xiangling_02 + '234': UI_Talent_S_Xiangling_03 + '235': UI_Talent_U_Xiangling_01 + '236': UI_Talent_S_Xiangling_04 + '241': UI_Talent_S_Beidou_02 + '242': UI_Talent_S_Beidou_01 + '243': UI_Talent_U_Beidou_01 + '244': UI_Talent_S_Beidou_03 + '245': UI_Talent_U_Beidou_02 + '246': UI_Talent_S_Beidou_04 + '251': UI_Talent_S_Xingqiu_01 + '252': UI_Talent_S_Xingqiu_02 + '253': UI_Talent_U_Xingqiu_01 + '254': UI_Talent_S_Xingqiu_03 + '255': UI_Talent_U_Xingqiu_02 + '256': UI_Talent_S_Xingqiu_04 + '261': UI_Talent_S_Xiao_01 + '262': UI_Talent_S_Xiao_02 + '263': UI_Talent_U_Xiao_01 + '264': UI_Talent_S_Xiao_03 + '265': UI_Talent_U_Xiao_02 + '266': UI_Talent_S_Xiao_04 + '271': UI_Talent_S_Ningguang_01 + '272': UI_Talent_S_Ningguang_05 + '273': UI_Talent_U_Ningguang_02 + '274': UI_Talent_S_Ningguang_03 + '275': UI_Talent_U_Ningguang_01 + '276': UI_Talent_S_Ningguang_04 + '291': UI_Talent_S_Klee_01 + '292': UI_Talent_S_Klee_02 + '293': UI_Talent_U_Klee_01 + '294': UI_Talent_S_Klee_03 + '295': UI_Talent_U_Klee_02 + '296': UI_Talent_S_Klee_04 + '301': UI_Talent_S_Zhongli_01 + '302': UI_Talent_S_Zhongli_02 + '303': UI_Talent_U_Zhongli_01 + '304': UI_Talent_S_Zhongli_03 + '305': UI_Talent_U_Zhongli_02 + '306': UI_Talent_S_Zhongli_04 + '311': UI_Talent_S_Fischl_01 + '312': UI_Talent_S_Fischl_02 + '313': UI_Talent_U_Fischl_01 + '314': UI_Talent_S_Fischl_03 + '315': UI_Talent_U_Fischl_02 + '316': UI_Talent_S_Fischl_04 + '321': UI_Talent_S_Bennett_01 + '322': UI_Talent_S_Bennett_02 + '323': UI_Talent_U_Bennett_01 + '324': UI_Talent_S_Bennett_03 + '325': UI_Talent_U_Bennett_02 + '326': UI_Talent_S_Bennett_04 + '331': UI_Talent_S_Tartaglia_01 + '332': UI_Talent_S_Tartaglia_02 + '333': UI_Talent_U_Tartaglia_01 + '334': UI_Talent_S_Tartaglia_05 + '335': UI_Talent_U_Tartaglia_02 + '336': UI_Talent_S_Tartaglia_04 + '341': UI_Talent_S_Noel_01 + '342': UI_Talent_S_Noel_02 + '343': UI_Talent_U_Noel_01 + '344': UI_Talent_S_Noel_03 + '345': UI_Talent_U_Noel_02 + '346': UI_Talent_S_Noel_04 + '351': UI_Talent_S_Qiqi_01 + '352': UI_Talent_S_Qiqi_02 + '353': UI_Talent_U_Qiqi_01 + '354': UI_Talent_S_Qiqi_03 + '355': UI_Talent_U_Qiqi_02 + '356': UI_Talent_S_Qiqi_04 + '361': UI_Talent_S_Chongyun_01 + '362': UI_Talent_S_Chongyun_02 + '363': UI_Talent_U_Chongyun_01 + '364': UI_Talent_S_Chongyun_03 + '365': UI_Talent_U_Chongyun_02 + '366': UI_Talent_S_Chongyun_04 + '371': UI_Talent_S_Ganyu_01 + '372': UI_Talent_S_Ganyu_02 + '373': UI_Talent_U_Ganyu_01 + '374': UI_Talent_S_Ganyu_03 + '375': UI_Talent_U_Ganyu_02 + '376': UI_Talent_S_Ganyu_04 + '381': UI_Talent_S_Albedo_01 + '382': UI_Talent_S_Albedo_02 + '383': UI_Talent_U_Albedo_01 + '384': UI_Talent_S_Albedo_03 + '385': UI_Talent_U_Albedo_02 + '386': UI_Talent_S_Albedo_04 + '391': UI_Talent_S_Diona_01 + '392': UI_Talent_S_Diona_02 + '393': UI_Talent_U_Diona_01 + '394': UI_Talent_S_Diona_03 + '395': UI_Talent_U_Diona_02 + '396': UI_Talent_S_Diona_04 + '411': UI_Talent_S_Mona_01 + '412': UI_Talent_S_Mona_02 + '413': UI_Talent_U_Mona_01 + '414': UI_Talent_S_Mona_03 + '415': UI_Talent_U_Mona_02 + '416': UI_Talent_S_Mona_04 + '421': UI_Talent_S_Keqing_01 + '422': UI_Talent_S_Keqing_02 + '423': UI_Talent_U_Keqing_01 + '424': UI_Talent_S_Keqing_03 + '425': UI_Talent_U_Keqing_02 + '426': UI_Talent_S_Keqing_04 + '431': UI_Talent_S_Sucrose_01 + '432': UI_Talent_S_Sucrose_02 + '433': UI_Talent_U_Sucrose_01 + '434': UI_Talent_S_Sucrose_03 + '435': UI_Talent_U_Sucrose_02 + '436': UI_Talent_S_Sucrose_04 + '441': UI_Talent_S_Xinyan_01 + '442': UI_Talent_S_Xinyan_02 + '443': UI_Talent_U_Xinyan_01 + '444': UI_Talent_S_Xinyan_03 + '445': UI_Talent_U_Xinyan_02 + '446': UI_Talent_S_Xinyan_04 + '451': UI_Talent_S_Rosaria_01 + '452': UI_Talent_S_Rosaria_02 + '453': UI_Talent_U_Rosaria_01 + '454': UI_Talent_S_Rosaria_03 + '455': UI_Talent_U_Rosaria_02 + '456': UI_Talent_S_Rosaria_04 + '461': UI_Talent_S_Hutao_03 + '462': UI_Talent_S_Hutao_01 + '463': UI_Talent_U_Hutao_01 + '464': UI_Talent_S_Hutao_02 + '465': UI_Talent_U_Hutao_02 + '466': UI_Talent_S_Hutao_04 + '471': UI_Talent_S_Kazuha_01 + '472': UI_Talent_S_Kazuha_02 + '473': UI_Talent_U_Kazuha_01 + '474': UI_Talent_S_Kazuha_03 + '475': UI_Talent_U_Kazuha_02 + '476': UI_Talent_S_Kazuha_04 + '481': UI_Talent_S_Feiyan_01 + '482': UI_Talent_S_Feiyan_02 + '483': UI_Talent_U_Feiyan_01 + '484': UI_Talent_S_Feiyan_03 + '485': UI_Talent_U_Feiyan_02 + '486': UI_Talent_S_Feiyan_04 + '491': UI_Talent_S_Yoimiya_01 + '492': UI_Talent_S_Yoimiya_02 + '493': UI_Talent_U_Yoimiya_01 + '494': UI_Talent_S_Yoimiya_03 + '495': UI_Talent_U_Yoimiya_02 + '496': UI_Talent_S_Yoimiya_04 + '501': UI_Talent_S_Tohma_01 + '502': UI_Talent_S_Tohma_02 + '503': UI_Talent_U_Tohma_01 + '504': UI_Talent_S_Tohma_03 + '505': UI_Talent_U_Tohma_02 + '506': UI_Talent_S_Tohma_04 + '511': UI_Talent_S_Eula_02 + '512': UI_Talent_S_Eula_01 + '513': UI_Talent_U_Eula_01 + '514': UI_Talent_S_Eula_03 + '515': UI_Talent_U_Eula_02 + '516': UI_Talent_S_Eula_04 + '521': UI_Talent_S_Shougun_01 + '522': UI_Talent_S_Shougun_03 + '523': UI_Talent_U_Shougun_02 + '524': UI_Talent_S_Shougun_02 + '525': UI_Talent_U_Shougun_01 + '526': UI_Talent_S_Shougun_04 + '531': UI_Talent_S_Sayu_01 + '532': UI_Talent_S_Sayu_02 + '533': UI_Talent_U_Sayu_02 + '534': UI_Talent_S_Sayu_03 + '535': UI_Talent_U_Sayu_01 + '536': UI_Talent_S_Sayu_04 + '541': UI_Talent_S_Kokomi_01 + '542': UI_Talent_S_Kokomi_02 + '543': UI_Talent_U_Kokomi_02 + '544': UI_Talent_S_Kokomi_03 + '545': UI_Talent_U_Kokomi_01 + '546': UI_Talent_S_Kokomi_04 + '551': UI_Talent_S_Gorou_01 + '552': UI_Talent_S_Gorou_02 + '553': UI_Talent_U_Gorou_01 + '554': UI_Talent_S_Gorou_03 + '555': UI_Talent_U_Gorou_02 + '556': UI_Talent_S_Gorou_04 + '561': UI_Talent_S_Sara_05 + '562': UI_Talent_S_Sara_02 + '563': UI_Talent_U_Sara_02 + '564': UI_Talent_S_Sara_03 + '565': UI_Talent_U_Sara_01 + '566': UI_Talent_S_Sara_04 + '571': UI_Talent_S_Itto_01 + '572': UI_Talent_S_Itto_02 + '573': UI_Talent_U_Itto_01 + '574': UI_Talent_S_Itto_03 + '575': UI_Talent_U_Itto_02 + '576': UI_Talent_S_Itto_04 + '581': UI_Talent_S_Yae_01 + '582': UI_Talent_S_Yae_02 + '583': UI_Talent_U_Yae_01 + '584': UI_Talent_S_Yae_03 + '585': UI_Talent_U_Yae_02 + '586': UI_Talent_S_Yae_04 + '591': UI_Talent_S_Heizo_01 + '592': UI_Talent_S_Heizo_02 + '593': UI_Talent_U_Heizo_01 + '594': UI_Talent_S_Heizo_03 + '595': UI_Talent_U_Heizo_02 + '596': UI_Talent_S_Heizo_04 + '601': UI_Talent_S_Yelan_01 + '602': UI_Talent_S_Yelan_02 + '603': UI_Talent_U_Yelan_01 + '604': UI_Talent_S_Yelan_03 + '605': UI_Talent_U_Yelan_02 + '606': UI_Talent_S_Yelan_04 + '621': UI_Talent_S_Aloy_Lock + '622': UI_Talent_S_Aloy_Lock + '623': UI_Talent_S_Aloy_Lock + '624': UI_Talent_S_Aloy_Lock + '625': UI_Talent_S_Aloy_Lock + '626': UI_Talent_S_Aloy_Lock + '631': UI_Talent_S_Shenhe_02 + '632': UI_Talent_S_Shenhe_01 + '633': UI_Talent_U_Shenhe_01 + '634': UI_Talent_S_Shenhe_03 + '635': UI_Talent_U_Shenhe_02 + '636': UI_Talent_S_Shenhe_04 + '641': UI_Talent_S_Yunjin_01 + '642': UI_Talent_S_Yunjin_02 + '643': UI_Talent_U_Yunjin_01 + '644': UI_Talent_S_Yunjin_03 + '645': UI_Talent_U_Yunjin_02 + '646': UI_Talent_S_Yunjin_04 + '651': UI_Talent_S_Shinobu_01 + '652': UI_Talent_S_Shinobu_02 + '653': UI_Talent_U_Shinobu_01 + '654': UI_Talent_S_Shinobu_03 + '655': UI_Talent_U_Shinobu_02 + '656': UI_Talent_S_Shinobu_04 + '661': UI_Talent_S_Ayato_01 + '662': UI_Talent_S_Ayato_02 + '663': UI_Talent_U_Ayato_02 + '664': UI_Talent_S_Ayato_03 + '665': UI_Talent_U_Ayato_01 + '666': UI_Talent_S_Ayato_04 + '671': UI_Talent_S_Collei_01 + '672': UI_Talent_S_Collei_02 + '673': UI_Talent_U_Collei_02 + '674': UI_Talent_S_Collei_03 + '675': UI_Talent_U_Collei_01 + '676': UI_Talent_S_Collei_04 + '681': UI_Talent_S_Dori_01 + '682': UI_Talent_S_Dori_02 + '683': UI_Talent_U_Dori_02 + '684': UI_Talent_S_Dori_03 + '685': UI_Talent_U_Dori_01 + '686': UI_Talent_S_Dori_04 + '691': UI_Talent_S_Tighnari_01 + '692': UI_Talent_S_Tighnari_02 + '693': UI_Talent_U_Tighnari_01 + '694': UI_Talent_S_Tighnari_03 + '695': UI_Talent_U_Tighnari_02 + '696': UI_Talent_S_Tighnari_04 + '701': UI_Talent_S_Nilou_01 + '702': UI_Talent_S_Nilou_02 + '703': UI_Talent_U_Nilou_01 + '704': UI_Talent_S_Nilou_03 + '705': UI_Talent_U_Nilou_02 + '706': UI_Talent_S_Nilou_04 + '711': UI_Talent_S_Cyno_01 + '712': UI_Talent_S_Cyno_02 + '713': UI_Talent_U_Cyno_01 + '714': UI_Talent_S_Cyno_03 + '715': UI_Talent_U_Cyno_02 + '716': UI_Talent_S_Cyno_04 + '721': UI_Talent_S_Candace_01 + '722': UI_Talent_S_Candace_02 + '723': UI_Talent_U_Candace_01 + '724': UI_Talent_S_Candace_03 + '725': UI_Talent_U_Candace_02 + '726': UI_Talent_S_Candace_04 diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/skill/data.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/skill/data.yaml new file mode 100644 index 0000000000000000000000000000000000000000..90b572e12f51fbb1fcf1e5f731b8c5de337ecd50 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/skill/data.yaml @@ -0,0 +1,1088 @@ +#数据源自 https://github.com/CRAZYShimakaze/zhenxun_extensive_plugin/blob/main/genshin_role_info/res/json_data/role_skill.json +Name: + '10001': 单手剑重攻击 + '10002': 长枪重攻击 + '10003': 法器重击 + '10004': 双手剑单次重击 + '10006': 蓄力技能教学触发器 + '10011': 五连击 + '10101': 武器技能CD + '10102': 队伍天赋共CD + '10111': 神里绫华空中连斩 + '10012': 凯特测试技能 + '10013': 神里流·霰步 + '10014': 凯特-穿透电流 + '10015': 冰风魔 + '10016': 木锭壁 + '10017': 箭雨 + '10018': 神里流·冰华 + '10019': 神里流·霜灭 + '10020': 水激流冰华 + '10021': 水激流霜灭 + '10024': 普通攻击·神里流·倾 + '10031': 普通攻击·西风剑术 + '10032': 爆弹玩偶 + '10033': 风压剑 + '10034': 蒲公英之风 + '10035': 潜入诱饵 + '10036': 琴队伍机制 + '10037': 空中投弹 + '10038': 一斗个人线撒豆 + '10041': 普通攻击·神射手 + '10044': 安柏队伍天赋技能 + '10053': 水激流-破隐一击 + '10054': 普通攻击·故去的追忆 + '10055': 普通攻击·故去的追忆 + '10056': 主角(水) + '10057': 主角(风) + '10058': 主角(冰) + '10059': 主角(岩) + '10060': 普通攻击·指尖雷暴 + '10061': 苍雷 + '10062': 蔷薇的雷光 + '10063': 测试角色5-01 + '10064': 测试角色5-02 + '10065': 测试角色5-03 + '10066': kevin震击 + '10067': 风涡剑 + '10068': 风息激荡 + '10069': kate测试普通攻击 + '10070': 普通攻击·水之浅唱 + '10071': 演唱,开始♪ + '10072': 闪耀奇迹♪ + '10073': 普通攻击·仪典剑术 + '10074': 霜袭 + '10075': 凛冽轮舞 + '10076': Barbara天赋技能 + '10077': 星陨剑 + '10078': 岩潮叠嶂 + '10079': Barbara天赋技能 + '10080': Barbara天赋技能 + '10081': Kaeya天赋技能 + '10082': Barbara队伍天赋技能 + '10083': Lisa队伍天赋技能 + '10117': 草缘剑 + '10118': 偃草若化 + '10160': 普通攻击·淬炼之剑 + '10161': 逆焰之刃 + '10162': 逆焰之刃 + '10163': 逆焰之刃 + '10165': 黎明 + '10166': Diluc队伍机制 + '10201': 普通攻击·钢脊 + '10202': 利爪与苍雷 + '10203': 雷牙 + '10204': 雷泽小技能(狼神) + '10211': 安柏空中连射 + '10221': 普通攻击·神代射术 + '10222': 温迪长按瞄准 + '10223': 温迪瞄准模式 + '10224': 高天之歌 + '10225': 风神之诗 + '10231': 普通攻击·白案功夫 + '10232': 锅巴出击 + '10235': 旋火轮 + '10241': 普通攻击·征涛 + '10242': 捉浪 + '10245': 斫雷 + '20000': 进入瞄准模式 + '10251': 阿葵丽雅点射 + '10252': 阿葵丽雅长按瞄准 + '10253': 阿葵丽雅瞄准模式 + '10254': 冰爆弓 + '10255': 霜寒病毒 + '10261': 普通攻击·卷积微尘 + '10262': 风轮两立 + '10263': 魈冲抓(空中) + '10264': 魈空中攻击 + '10265': 靖妖傩舞 + '10271': 普通攻击·千金掷 + '10272': 璇玑屏 + '10273': 凝光小技能替换技能 + '10274': 天权崩玉 + '10275': 凝光触发小技能CD技能 + '10281': 白盒普攻 + '10282': 白盒小技能 + '10283': 穿刺攻 + '10291': 普通攻击·砰砰 + '10292': 蹦蹦炸弹 + '10295': 轰轰火花 + '10300': 白盒技能连续爆弹 + '10301': 普通攻击·岩雨 + '10302': 地心 + '10303': 天星 + '10311': 普通攻击·罪灭之矢 + '10312': 夜巡影翼 + '10313': 至夜幻现 + '10314': 菲谢尔长按瞄准 + '10315': 菲谢尔瞄准模式 + '10316': 菲谢尔小技能-重置乌鸦位置 + '10321': 普通攻击·好运剑 + '10322': 热情过载 + '10323': 美妙旅程 + '10331': 普通攻击·断雨 + '10332': 魔王武装·狂澜 + '10333': 极恶技·尽灭闪 + '10334': 达达利亚进入瞄准 + '10335': 达达利亚触发射击 + '10336': 达达利亚小技能取消按钮 + '10337': 达达利亚近战姿态普攻 + '10341': 普通攻击·西风剑术·女仆 + '10342': 护心铠 + '10343': 大扫除 + '10344': 诺艾尔被动天赋(上盾) + '10351': 普通攻击·云来古剑法 + '10352': 仙法·寒病鬼差 + '10353': 仙法·救苦度厄 + '10355': 七七复活技能 + '10371': 普通攻击·流天射术 + '10372': 山泽麟迹 + '10373': 降众天华 + '10374': 花雨 + '11301': 菲谢尔普攻 + '11302': 菲谢尔小技能 + '11305': 菲谢尔充能技 + '10256': 风魔遁-地面 + '10257': 风魔遁-空遁 + '10258': 冰爆弓 + '10259': 霜寒病毒 + '10362': 重云小技能白盒测试 + '10363': 雷主角小技能白盒测试 + '10364': 雷主角小技能白盒测试 + '10365': 雷主角小技能白盒测试1 + '11371': Rx白盒测试普攻 + '11372': Rx白盒测试技能1 + '11373': Rx白盒测试技能2 + '11374': Rx白盒进入瞄准 + '11375': Rx白盒触发射击 + '10381': 普通攻击·古华剑法 + '10382': 古华剑·画雨笼山 + '10385': 古华剑·裁雨留虹 + '10386': 普通攻击·西风剑术·白 + '10387': 创生法·拟造阳华 + '10388': 诞生式·大地之潮 + '10391': 普通攻击·猎人射术 + '10392': 猫爪冻冻 + '10393': 迪奥娜长按瞄准 + '10394': 迪奥娜瞄准模式 + '10395': 最烈特调 + '10401': 普通攻击·灭邪四式 + '10402': 灵刃·重华叠霜 + '10403': 灵刃·云开星落 + '10411': 普通攻击·因果点破 + '10412': 水中幻愿 + '10413': 虚实流动 + '10415': 星命定轨 + '10421': 普通攻击·云来剑法 + '10422': 星斗归位 + '10423': 星斗归位 + '10425': 天街巡游 + '10431': 普通攻击·简式风灵作成 + '10432': 风灵作成·陆叁零捌 + '10433': 砂糖空中跳跃 + '10434': 砂糖空中跳跃(伪) + '10435': 禁·风灵作成·柒伍同构贰型 + '10441': 普通攻击·炎舞 + '10442': 热情拂扫 + '10443': 叛逆刮弦 + '10451': 普通攻击·教会枪术 + '10452': 噬罪的告解 + '10453': 终命的圣礼 + '10461': 普通攻击·往生秘传枪法 + '10462': 蝶引来生 + '10463': 安神秘法 + '10464': 胡桃命之座相关 + '10471': 普通攻击·我流剑术 + '10472': 千早振 + '10473': 千早振 + '10474': 下落攻击·乱岚拨止 + '10475': 万叶之一刀 + '10481': 普通攻击·火漆制印 + '10482': 丹书立约 + '10485': 凭此结契 + '10491': 普通攻击·烟火打扬 + '10492': 焰硝庭火舞 + '10493': 宵宫长按瞄准/瞄准模式 + '10495': 琉金云间草 + '10501': 普通攻击·迅破枪势 + '10502': 烈烧佑命之侍护 + '10505': 真红炽火之大铠 + '10511': 普通攻击·西风剑术·宗室 + '10512': 冰潮的涡旋 + '10515': 凝浪之光剑 + '10521': 普通攻击·源流 + '10522': 神变·恶曜开眼 + '10525': 奥义·梦想真说 + '10531': 普通攻击·忍刀·终末番 + '10532': 呜呼流·风隐急进 + '10533': 呜呼流·风隐急进 + '10535': 呜呼流·影貉缭乱 + '10541': 普通攻击·水有常形 + '10542': 海月之誓 + '10545': 海人化羽 + '10551': 普通攻击·呲牙裂扇箭 + '10552': 犬坂吠吠方圆阵 + '10553': 五郎长按瞄准 + '10554': 五郎瞄准模式 + '10555': 兽牙逐突形胜战法 + '10561': 普通攻击·天狗传弓术 + '10562': 鸦羽天狗霆雷召咒 + '10563': 九条裟罗长按瞄准 + '10564': 九条裟罗瞄准模式 + '10565': 煌煌千道镇式 + '10571': 普通攻击· 喧哗屋传说 + '10572': 魔杀绝技·赤牛发破! + '10575': 最恶鬼王·一斗轰临!! + '10581': 普通攻击·狐灵食罪式 + '10582': 野干役咒·杀生樱 + '10583': 元素战技(空中) + '10585': 大密法·天狐显真 + '10591': 普通攻击·不动流格斗术 + '10592': 勠心拳 + '10595': 聚风蹴 + '10602': 雷影剑 + '10605': 雷轰电转 + '10606': 普通攻击·潜形隐曜弓 + '10607': 萦络纵命索 + '10608': 夜兰-长按瞄准/瞄准模式 + '10609': 夜兰-元素战技 + '10610': 渊图玲珑骰 + '10621': 普通攻击·快速射击 + '10622': 冰尘雪野 + '10623': 埃洛伊瞄准射击 + '10624': 埃洛伊普通攻击 + '10631': 普通攻击·踏辰摄斗 + '10632': 仰灵威召将役咒 + '10635': 神女遣灵真诀 + '10625': 曙光预言 + '10641': 普通攻击·拂云出手 + '10642': 旋云开相 + '10643': 破嶂见旌仪 + '10651': 普通攻击·忍流飞刃斩 + '10652': 越祓雷草之轮 + '10655': 御咏鸣神刈山祭 + '10656': 久岐忍命6护死CD + '10657': 久岐忍命6精通CD + '10661': 普通攻击·神里流·转 + '10662': 神里流·镜花 + '10663': 瞬水剑(绫人特殊攻击用) + '10665': 神里流·水囿 + '10671': 普通攻击·祈颂射艺 + '10672': 拂花偈叶 + '10675': 猫猫秘宝 + '10674': 柯莱瞄准模式 + '10681': 普通攻击·妙显剑舞·改 + '10682': 镇灵之灯·烦恼解决炮 + '10685': 卡萨扎莱宫的无微不至 + '10691': 普通攻击·藏蕴破障 + '10692': 识果种雷 + '10693': 提纳里长按/瞄准模式 + '10695': 造生缠藤箭 + '10701': 普通攻击·弦月舞步 + '10702': 七域舞步 + '10703': 妮露元素战技2 + '10704': 妮露元素战技3 + '10706': 妮露元素战技特殊A + '10707': 妮露元素战技特殊E + '10705': 浮莲舞步·远梦聆泉 + '10708': 妮露元素战技1命六用 + '10711': 普通攻击·七圣枪术 + '10712': 秘仪·律渊渡魂 + '10713': 赛诺元素战技开大后 + '10715': 圣仪·煟煌随狼行 + '10721': 普通攻击·流耀枪术·守势 + '10722': 圣仪·苍鹭庇卫 + '10725': 圣仪·灰鸰衒潮 + '20001': 风魔炮 + '20002': 风魔炮 + '20011': 飞行挑战 - 前冲 + '20012': 飞行挑战 - 上冲 + '20020': 纯水精灵 + '20021': 羽球节-发球 + '20022': 羽球节-接球 + '20023': 羽球节-单体 + '20024': 羽球节-爆破 + '20025': 羽球节-破盾 + '20026': 羽球节-单体 + '20027': 羽球节-爆破 + '20028': 羽球节-破盾 + '20029': 羽球节-接球 + '20030': 元素战技 + '20031': 元素爆发 + '20032': 手鞠游戏-放置球 + '20033': 飞雷核 + '20034': 飞雷核 + '20035': 禁用元素战记 + '20036': 禁用菲谢尔元素战技 + '20037': 禁用菲谢尔元素爆发 + '20040': 大世界动物-发射子弹 + '20041': 活动动物-发射子弹 + '20042': 2.5测试用大世界动物-发射子弹 + '20043': 钩爪占位 + '20044': 钩爪占位 + '20045': 3.1抓捕野猪-投掷 + '20100': 捕获! + '20101': 捕获! + '20110': 神秘预感 + '20111': 感应光环 + '20120': 狩猎直觉 + '20121': 洞察全局 + '20122': 禁锢诅咒 + '20200': 伪装 + '20201': 伪装 + '20210': 透明戏法 + '20212': 透明戏法 + '20211': 诱饵战术 + '20213': 诱饵战术 + '20220': 星步疾行 + '20202': 伪装 + '20203': 伪装 + '20214': 诱饵战术 + '20215': 诱饵战术 + '20400': 捕获! + '20401': 捕获! + '20410': 神秘预感 + '20411': 感应光环 + '20420': 狩猎直觉 + '20421': 洞察全局 + '20422': 禁锢诅咒 + '20500': 伪装 + '20501': 伪装 + '20510': 透明戏法 + '20512': 透明戏法 + '20511': 诱饵战术 + '20513': 诱饵战术 + '20520': 星步疾行 + '20310': 进入钓鱼选竿状态 + '20311': 进入钓鱼瞄准状态 + '20312': QTE启动按键 + '20313': QTE战斗按键 + '20314': 收竿 + '20315': 退出钓鱼状态 + '20316': 换鱼饵 + '20320': 格挡玩法 + '20330': 兰那罗小道具-发射 + '20331': 兰那罗小道具-切换 + '10384': 抓猫扔鱼 + '100540': 普通攻击·故去的追忆 + '100541': 旅行者五连击(火) + '100542': 旅行者五连击(水) + '100543': 普通攻击·异邦铁风 + '100544': 旅行者五连击(冰) + '100545': 普通攻击·异邦岩锋 + '100546': 普通攻击·异邦惊雷 + '100547': 普通攻击·异邦草翦 + '100550': 普通攻击·故去的追忆 + '100551': 旅行者五连击(火) + '100552': 旅行者五连击(水) + '100553': 普通攻击·异邦铁风 + '100554': 旅行者五连击(冰) + '100555': 普通攻击·异邦岩锋 + '100556': 普通攻击·异邦惊雷 + '100557': 普通攻击·异邦草翦 + '5002010': 神里绫华空中攻击 + '5003010': 琴空中攻击 + '5005010': 男主角空中攻击 + '5005020': 男主角(火)空中攻击 + '5005030': 男主角(水)空中攻击 + '5005040': 男主角(风)空中攻击 + '5005050': 男主角(冰)空中攻击 + '5005060': 男主角(岩)空中攻击 + '5005070': 男主角(电)空中攻击 + '5005080': 男主角(草)空中攻击 + '5006010': 丽莎空中攻击 + '5007010': 女主角空中攻击 + '5007020': 女主角(火)空中攻击 + '5007030': 女主角(水)空中攻击 + '5007040': 女主角(风)空中攻击 + '5007050': 女主角(冰)空中攻击 + '5007060': 女主角(岩)空中攻击 + '5007070': 女主角(电)空中攻击 + '5007080': 女主角(草)空中攻击 + '5014010': 芭芭拉空中攻击 + '5015010': 凯亚空中攻击 + '5016010': 迪卢克空中攻击 + '5020010': 雷泽空中攻击 + '5021010': 安柏空中攻击 + '5022010': 温迪空中攻击 + '5023010': 香菱空中攻击 + '5024010': 北斗空中攻击 + '5025010': 行秋空中攻击 + '5026010': 魈空中攻击 + '5027010': 凝光空中攻击 + '5029010': 可莉空中攻击 + '5030010': 钟离空中攻击 + '5031010': 菲谢尔空中攻击 + '5032010': 班尼特空中攻击 + '5033010': 达达利亚空中攻击 + '5034010': 诺艾尔空中攻击 + '5035010': 七七空中攻击 + '5036010': 重云空中攻击 + '5037010': 甘雨空中攻击 + '5038010': 阿贝多空中攻击 + '5039010': 迪奥娜空中攻击 + '5041010': 莫娜空中攻击 + '5042010': 刻晴空中攻击 + '5043010': 砂糖空中攻击 + '5044010': 辛焱空中攻击 + '5045010': 罗莎莉亚空中攻击 + '5046010': 胡桃空中攻击 + '5047010': 枫原万叶空中攻击 + '5048010': 烟绯空中攻击 + '5049010': 宵宫空中攻击 + '5050010': 测试角色50空中攻击 + '5051010': 优菈空中攻击 + '5052010': 雷电将军空中攻击 + '5053010': 早柚空中攻击 + '5054010': 珊瑚宫心海空中攻击 + '5055010': 五郎空中攻击 + '5056010': 九条裟罗空中攻击 + '5058010': 测试角色空中攻击 + '5057010': 荒泷一斗空中攻击 + '5059010': 鹿野院平藏空中攻击 + '5060010': 夜兰空中攻击 + '5062010': 埃洛伊空中攻击 + '5063010': 申鹤空中攻击 + '5064010': 云堇空中攻击 + '5065010': 久岐忍空中攻击 + '5066010': 神里绫人空中攻击 + '5067010': 柯莱空中攻击 + '5068010': 多莉空中攻击 + '5069010': 提纳里空中攻击 + '5070010': 妮露空中攻击 + '5071010': 赛诺空中攻击 + '5072010': 坎蒂丝空中攻击 +Icon: + '10001': '' + '10002': '' + '10003': '' + '10004': '' + '10006': '' + '10011': Skill_A_01 + '10101': '' + '10102': '' + '10111': Skill_A_01 + '10012': Skill_S_Kate_01 + '10013': Skill_S_Ayaka_02 + '10014': Skill_E_Kate + '10015': Skill_E_Ayaka + '10016': Skill_E_Qin + '10017': Skill_E_Ambor + '10018': Skill_S_Ayaka_01 + '10019': Skill_E_Ayaka + '10020': Skill_S_Ayaka_01 + '10021': Skill_E_Ayaka + '10024': Skill_A_01 + '10031': Skill_A_01 + '10032': Skill_S_Ambor_01 + '10033': Skill_S_Qin_02 + '10034': Skill_E_Qin_01 + '10035': Btn_Recon_Bait + '10036': Skill_E_Kate + '10037': Btn_Recon_Bait + '10038': Btn_Recon_Bait_Beans + '10041': Skill_A_02 + '10044': Skill_E_Kate + '10053': Skill_S_Ayaka_02 + '10054': Skill_A_01 + '10055': Skill_A_01 + '10056': Skill_A_01 + '10057': Skill_A_01 + '10058': Skill_A_01 + '10059': Skill_A_01 + '10060': Skill_A_Catalyst_MD + '10061': Skill_S_Lisa_01 + '10062': Skill_E_Lisa_01 + '10063': Skill_E_Ayaka + '10064': Skill_S_Ayaka_01 + '10065': Skill_S_Ambor_01 + '10066': Skill_E_Kate + '10067': Skill_S_PlayerWind_01 + '10068': Skill_E_PlayerWind_01 + '10069': Skill_A_01 + '10070': Skill_A_Catalyst_MD + '10071': Skill_S_Barbara_01 + '10072': Skill_E_Barbara_01 + '10073': Skill_A_01 + '10074': Skill_S_Kaeya_01 + '10075': Skill_E_Kaeya_01 + '10076': Skill_E_Kate + '10077': Skill_S_PlayerRock_01 + '10078': Skill_E_PlayerRock_01 + '10079': Skill_E_Kate + '10080': Skill_E_Kate + '10081': Skill_E_Kate + '10082': Skill_E_Kate + '10083': Skill_E_Kate + '10117': Skill_E_PlayerGrass_01 + '10118': Skill_S_PlayerGrass_01 + '10160': Skill_A_04 + '10161': Skill_S_Diluc_01_01 + '10162': Skill_S_Diluc_01_02 + '10163': Skill_S_Diluc_01_03 + '10165': Skill_E_Diluc_01 + '10166': Skill_E_Kate + '10201': Skill_A_04 + '10202': Skill_S_Razor_01 + '10203': Skill_E_Razor_01 + '10204': Skill_S_Ayaka_02 + '10211': Skill_A_02 + '10221': Skill_A_02 + '10222': Skill_A_02 + '10223': Skill_A_02 + '10224': Skill_S_Venti_01 + '10225': Skill_E_Venti_01 + '10231': Skill_A_03 + '10232': Skill_S_Xiangling_01 + '10235': Skill_E_Xiangling_01 + '10241': Skill_A_04 + '10242': Skill_S_Beidou_01 + '10245': Skill_E_Beidou_01 + '20000': Main_AimActive + '10251': Skill_A_02 + '10252': Skill_A_02 + '10253': Skill_A_02 + '10254': Skill_S_Ayaka_01 + '10255': Skill_E_Ayaka + '10261': Skill_A_03 + '10262': Skill_S_Xiao_01 + '10263': Skill_S_Xiao_01 + '10264': Skill_A_03 + '10265': Skill_E_Xiao_01 + '10271': Skill_A_Catalyst_MD + '10272': Skill_S_Ningguang_01 + '10273': Skill_S_Ningguang_02 + '10274': Skill_E_Ningguang_01 + '10275': Skill_E_Ayaka + '10281': Skill_A_01 + '10282': Skill_A_01 + '10283': Skill_S_Ayaka_01 + '10291': Skill_A_Catalyst_MD + '10292': Skill_S_Klee_01 + '10295': Skill_E_Klee_01 + '10300': Skill_A_01 + '10301': Skill_A_03 + '10302': Skill_S_Zhongli_01 + '10303': Skill_E_Zhongli_01 + '10311': Skill_A_02 + '10312': Skill_S_Fischl_01 + '10313': Skill_E_Fischl_01 + '10314': Skill_A_02 + '10315': Skill_A_02 + '10316': Skill_S_Fischl_02 + '10321': Skill_A_01 + '10322': Skill_S_Bennett_01 + '10323': Skill_E_Bennett_01 + '10331': Skill_A_02 + '10332': Skill_S_Tartaglia_01 + '10333': Skill_E_Tartaglia_01 + '10334': Skill_A_02 + '10335': Skill_A_02 + '10336': Skill_S_Tartaglia_02 + '10337': Skill_A_01 + '10341': Skill_A_04 + '10342': Skill_S_Noel_01 + '10343': Skill_E_Noel_01 + '10344': Skill_E_Kate + '10351': Skill_A_01 + '10352': Skill_S_Qiqi_01 + '10353': Skill_E_Qiqi_01 + '10355': Skill_E_Kate + '10371': Skill_A_02 + '10372': Skill_S_Ganyu_01 + '10373': Skill_E_Ganyu_01 + '10374': Skill_A_02 + '11301': Skill_A_02 + '11302': Skill_S_Ambor_01 + '11305': Skill_E_Beidou_01 + '10256': Skill_S_Ayaka_01 + '10257': Skill_S_Ayaka_01 + '10258': Skill_S_Ayaka_01 + '10259': Skill_E_Ayaka + '10362': Skill_E_Ayaka + '10363': Skill_E_Ayaka + '10364': Skill_S_Ayaka_01 + '10365': Skill_E_Ayaka + '11371': Skill_A_02 + '11372': Skill_S_Razor_01 + '11373': Skill_E_Razor_01 + '11374': Skill_A_02 + '11375': Skill_A_02 + '10381': Skill_A_01 + '10382': Skill_S_Xingqiu_01 + '10385': Skill_E_Xingqiu_01 + '10386': Skill_A_01 + '10387': Skill_S_Albedo_01 + '10388': Skill_E_Albedo_01 + '10391': Skill_A_02 + '10392': Skill_S_Diona_01 + '10393': Skill_A_02 + '10394': Skill_A_02 + '10395': Skill_E_Diona_01 + '10401': Skill_A_04 + '10402': Skill_S_Chongyun_01 + '10403': Skill_E_Chongyun_01 + '10411': Skill_A_Catalyst_MD + '10412': Skill_S_Mona_01 + '10413': Skill_S_Mona_02 + '10415': Skill_E_Mona_01 + '10421': Skill_A_01 + '10422': Skill_S_Keqing_01 + '10423': Skill_S_Keqing_02 + '10425': Skill_E_Keqing_01 + '10431': Skill_A_Catalyst_MD + '10432': Skill_S_Sucrose_01 + '10433': Skill_S_Sucrose_02 + '10434': Skill_S_Sucrose_02 + '10435': Skill_E_Sucrose_01 + '10441': Skill_A_04 + '10442': Skill_S_Xinyan_01 + '10443': Skill_E_Xinyan_01 + '10451': Skill_A_03 + '10452': Skill_S_Rosaria_01 + '10453': Skill_E_Rosaria_01 + '10461': Skill_A_03 + '10462': Skill_S_Hutao_01 + '10463': Skill_E_Hutao_01 + '10464': Skill_A_03 + '10471': Skill_A_01 + '10472': Skill_S_Kazuha_01 + '10473': Skill_S_Kazuha_01 + '10474': Skill_S_Kazuha_02 + '10475': Skill_E_Kazuha_01 + '10481': Skill_A_Catalyst_MD + '10482': Skill_S_Feiyan_01 + '10485': Skill_E_Feiyan_01 + '10491': Skill_A_02 + '10492': Skill_S_Yoimiya_01 + '10493': Skill_A_02 + '10495': Skill_E_Yoimiya_01 + '10501': Skill_A_03 + '10502': Skill_S_Tohma_01 + '10505': Skill_E_Tohma_01 + '10511': Skill_A_04 + '10512': Skill_S_Eula_01 + '10515': Skill_E_Eula_01 + '10521': Skill_A_03 + '10522': Skill_S_Shougun_01 + '10525': Skill_E_Shougun_01 + '10531': Skill_A_04 + '10532': Skill_S_Sayu_01 + '10533': Skill_S_Sayu_02 + '10535': Skill_E_Sayu_01 + '10541': Skill_A_Catalyst_MD + '10542': Skill_S_Kokomi_01 + '10545': Skill_E_Kokomi_01 + '10551': Skill_A_02 + '10552': Skill_S_Gorou_01 + '10553': Skill_A_02 + '10554': Skill_A_02 + '10555': Skill_E_Gorou_01 + '10561': Skill_A_02 + '10562': Skill_S_Sara_01 + '10563': Skill_A_02 + '10564': Skill_A_02 + '10565': Skill_E_Sara_01 + '10571': Skill_A_04 + '10572': Skill_S_Itto_01 + '10575': Skill_E_Itto_01 + '10581': Skill_A_Catalyst_MD + '10582': Skill_S_Yae_01 + '10583': '' + '10585': Skill_E_Yae_01 + '10591': Skill_A_Catalyst_MD + '10592': Skill_S_Heizo_01 + '10595': Skill_E_Heizo_01 + '10602': Skill_S_PlayerElectric_01 + '10605': Skill_E_PlayerElectric_01 + '10606': Skill_A_02 + '10607': Skill_S_Yelan_01 + '10608': Skill_A_02 + '10609': Skill_S_Yelan_02 + '10610': Skill_E_Yelan_01 + '10621': Skill_A_02 + '10622': Skill_S_Aloy_01 + '10623': Skill_A_02 + '10624': Skill_A_02 + '10631': Skill_A_03 + '10632': Skill_S_Shenhe_01 + '10635': Skill_E_Shenhe_01 + '10625': Skill_E_Aloy_01 + '10641': Skill_A_03 + '10642': Skill_S_Yunjin_01 + '10643': Skill_E_Yunjin_01 + '10651': Skill_A_01 + '10652': Skill_S_Shinobu_01 + '10655': Skill_E_Shinobu_01 + '10656': Skill_A_03 + '10657': Skill_A_03 + '10661': Skill_A_01 + '10662': Skill_S_Ayato_01 + '10663': Skill_A_01 + '10665': Skill_E_Ayato_01 + '10671': Skill_A_02 + '10672': Skill_S_Collei_01 + '10675': Skill_E_Collei_01 + '10674': Skill_A_02 + '10681': Skill_A_04 + '10682': Skill_S_Dori_01 + '10685': Skill_E_Dori_01 + '10691': Skill_A_02 + '10692': Skill_S_Tighnari_01 + '10693': Skill_A_02 + '10695': Skill_E_Tighnari_01 + '10701': Skill_A_01 + '10702': Skill_S_Nilou_01 + '10703': Skill_S_Nilou_01 + '10704': Skill_S_Nilou_01 + '10706': Skill_S_Nilou_04 + '10707': Skill_S_Nilou_02 + '10705': Skill_E_Nilou_01 + '10708': Skill_S_Nilou_01 + '10711': Skill_A_03 + '10712': Skill_S_Cyno_01 + '10713': Skill_S_Cyno_02 + '10715': Skill_E_Cyno_01 + '10721': Skill_A_03 + '10722': Skill_S_Candace_01 + '10725': Skill_E_Candace_01 + '20001': Skill_A_Dvalin_AirGun + '20002': Skill_A_Dvalin_AirGun + '20011': Btn_FlightSprint + '20012': Btn_Rises + '20020': Btn_WaterSpirit_Skill + '20021': Btn_BounceConjuring_Serve_S_01 + '20022': Btn_BounceConjuring_Hit_A_01 + '20023': Btn_BounceConjuring_Bomb_S_01 + '20024': Btn_BounceConjuring_Bomb_S_02 + '20025': Btn_BounceConjuring_Bomb_S_03 + '20026': Btn_BounceConjuring_Bomb_S_01 + '20027': Btn_BounceConjuring_Bomb_S_02 + '20028': Btn_BounceConjuring_Bomb_S_03 + '20029': Btn_BounceConjuring_Hit_A_01 + '20030': Skill_S_Monster_Shougun_EyeStrip + '20031': Skill_E_Monster_Shougun_EyeStrip + '20032': Btn_Temari_S_01 + '20033': '' + '20034': '' + '20035': Skill_S_LunaRiteQuest_BanSkill + '20036': Skill_S_SummerTimeV2Quest_BanSkill + '20037': Skill_E_SummerTimeV2Quest_BanSkill + '20040': Btn_CatchAnimal_Shoot + '20041': Btn_CatchAnimal_Shoot + '20042': Btn_CatchAnimal_Shoot + '20043': '' + '20044': '' + '20045': Btn_CatchAnimal_Shoot + '20100': Btn_HideAndSeek_Seeker_A_01 + '20101': Btn_HideAndSeek_Seeker_A_01 + '20110': Btn_HideAndSeek_Seeker_S_01 + '20111': Btn_HideAndSeek_Seeker_S_02 + '20120': Btn_HideAndSeek_Seeker_E_01 + '20121': Btn_HideAndSeek_Seeker_E_02 + '20122': Btn_HideAndSeek_Seeker_E_03 + '20200': Btn_HideAndSeek_Hider_A_01 + '20201': Btn_HideAndSeek_Hider_A_03 + '20210': Btn_HideAndSeek_Hider_S_01 + '20212': Btn_HideAndSeek_Hider_S_01_Borbid + '20211': Btn_HideAndSeek_Hider_S_02 + '20213': Btn_HideAndSeek_Hider_S_02_Borbid + '20220': Btn_HideAndSeek_Hider_E_01 + '20202': Btn_HideAndSeek_Hider_A_01 + '20203': Btn_HideAndSeek_Hider_A_03 + '20214': Btn_HideAndSeek_Hider_S_02 + '20215': Btn_HideAndSeek_Hider_S_02_Borbid + '20400': Btn_HideAndSeek_Seeker_A_01 + '20401': Btn_HideAndSeek_Seeker_A_01 + '20410': Btn_HideAndSeek_Seeker_S_01 + '20411': Btn_HideAndSeek_Seeker_S_02 + '20420': Btn_HideAndSeek_Seeker_E_01 + '20421': Btn_HideAndSeek_Seeker_E_02 + '20422': Btn_HideAndSeek_Seeker_E_03 + '20500': Btn_HideAndSeek_Hider_A_01 + '20501': Btn_HideAndSeek_Hider_A_03 + '20510': Btn_HideAndSeek_Hider_S_01 + '20512': Btn_HideAndSeek_Hider_S_01_Borbid + '20511': Btn_HideAndSeek_Hider_S_02 + '20513': Btn_HideAndSeek_Hider_S_02_Borbid + '20520': Btn_HideAndSeek_Hider_E_01 + '20310': '' + '20311': Btn_Fishing_Cast + '20312': Btn_Fishing_Battle + '20313': Btn_Fishing_Battle + '20314': Btn_Fishing_Pull + '20315': Btn_Fishing_Exit + '20316': Btn_Fishing_Bait + '20320': Btn_Blocking + '20330': Btn_Arana_Shoot + '20331': Btn_Arana_Exchange + '10384': Btn_Recon_Bait + '100540': Skill_A_01 + '100541': Skill_A_01 + '100542': Skill_A_01 + '100543': Skill_A_01 + '100544': Skill_A_01 + '100545': Skill_A_01 + '100546': Skill_A_01 + '100547': Skill_A_01 + '100550': Skill_A_01 + '100551': Skill_A_01 + '100552': Skill_A_01 + '100553': Skill_A_01 + '100554': Skill_A_01 + '100555': Skill_A_01 + '100556': Skill_A_01 + '100557': Skill_A_01 + '5002010': Skill_A_01 + '5003010': Skill_A_01 + '5005010': Skill_A_01 + '5005020': Skill_A_01 + '5005030': Skill_A_01 + '5005040': Skill_A_01 + '5005050': Skill_A_01 + '5005060': Skill_A_01 + '5005070': Skill_A_01 + '5005080': Skill_A_01 + '5006010': Skill_A_Catalyst_MD + '5007010': Skill_A_01 + '5007020': Skill_A_01 + '5007030': Skill_A_01 + '5007040': Skill_A_01 + '5007050': Skill_A_01 + '5007060': Skill_A_01 + '5007070': Skill_A_01 + '5007080': Skill_A_01 + '5014010': Skill_A_Catalyst_MD + '5015010': Skill_A_01 + '5016010': Skill_A_04 + '5020010': Skill_A_04 + '5021010': Skill_A_02 + '5022010': Skill_A_02 + '5023010': Skill_A_03 + '5024010': Skill_A_04 + '5025010': Skill_A_01 + '5026010': Skill_A_03 + '5027010': Skill_A_Catalyst_MD + '5029010': Skill_A_Catalyst_MD + '5030010': Skill_A_03 + '5031010': Skill_A_02 + '5032010': Skill_A_01 + '5033010': Skill_A_02 + '5034010': Skill_A_04 + '5035010': Skill_A_01 + '5036010': Skill_A_04 + '5037010': Skill_A_02 + '5038010': Skill_A_01 + '5039010': Skill_A_02 + '5041010': Skill_A_Catalyst_MD + '5042010': Skill_A_01 + '5043010': Skill_A_Catalyst_MD + '5044010': Skill_A_04 + '5045010': Skill_A_03 + '5046010': Skill_A_03 + '5047010': Skill_A_01 + '5048010': Skill_A_Catalyst_MD + '5049010': Skill_A_02 + '5050010': Skill_A_03 + '5051010': Skill_A_04 + '5052010': Skill_A_03 + '5053010': Skill_A_04 + '5054010': Skill_A_Catalyst_MD + '5055010': Skill_A_02 + '5056010': Skill_A_02 + '5058010': Skill_A_Catalyst_MD + '5057010': Skill_A_04 + '5059010': Skill_A_Catalyst_MD + '5060010': Skill_A_02 + '5062010': Skill_A_02 + '5063010': Skill_A_03 + '5064010': Skill_A_03 + '5065010': Skill_A_01 + '5066010': Skill_A_01 + '5067010': Skill_A_02 + '5068010': Skill_A_04 + '5069010': Skill_A_02 + '5070010': Skill_A_01 + '5071010': Skill_A_03 + '5072010': Skill_A_03 +Talent: + 胡桃: + - 1 + - 2 + 托马: + - 1 + - 2 + 宵宫: + - 1 + - 2 + 烟绯: + - 1 + - 2 + 可莉: + - 1 + - 2 + 迪卢克: + - 1 + - 2 + 辛焱: + - 1 + - 2 + 安柏: + - 0 + - 1 + 香菱: + - 2 + - 1 + 班尼特: + - 1 + - 2 + 珊瑚宫心海: + - 2 + - 1 + 达达利亚: + - 1 + - 2 + 行秋: + - 2 + - 1 + 莫娜: + - 3 + - 1 + 芭芭拉: + - 2 + - 1 + 申鹤: + - 1 + - 2 + 神里绫华: + - 2 + - 1 + 优菈: + - 2 + - 1 + 甘雨: + - 2 + - 1 + 凯亚: + - 1 + - 2 + 重云: + - 2 + - 1 + 七七: + - 2 + - 1 + 迪奥娜: + - 2 + - 1 + 罗莎莉亚: + - 1 + - 2 + 埃洛伊: + - 0 + - 0 + 八重神子: + - 1 + - 2 + 雷电将军: + - 2 + - 1 + 九条裟罗: + - 2 + - 1 + 刻晴: + - 2 + - 1 + 雷泽: + - 2 + - 1 + 菲谢尔: + - 1 + - 2 + 丽莎: + - 2 + - 1 + 北斗: + - 1 + - 2 + 雷主: + - 1 + - 0 + 早柚: + - 2 + - 1 + 枫原万叶: + - 1 + - 2 + 魈: + - 1 + - 2 + 温迪: + - 2 + - 1 + 琴: + - 2 + - 1 + 砂糖: + - 1 + - 2 + 风主: + - 1 + - 0 + 荒泷一斗: + - 1 + - 2 + 五郎: + - 1 + - 2 + 阿贝多: + - 1 + - 2 + 钟离: + - 1 + - 2 + 诺艾尔: + - 1 + - 2 + 凝光: + - 2 + - 1 + 岩主: + - 1 + - 0 + 云堇: + - 2 + - 1 + 神里绫人: + - 1 + - 2 + 夜兰: + - 2 + - 1 + 久岐忍: + - 1 + - 2 + 鹿野院平藏: + - 1 + - 2 + 柯莱: + - 1 + - 2 + 提纳里: + - 2 + - 1 + 草主: + - 1 + - 0 + 多莉: + - 1 + - 2 + 赛诺: + - 2 + - 1 + 坎蒂丝: + - 2 + - 1 + 妮露: + - 2 + - 1 \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/weapon/data.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/weapon/data.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f80f7507432041f1611c42eec52e7886abd53e33 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/weapon/data.yaml @@ -0,0 +1,473 @@ +#数据源于 https://github.com/CRAZYShimakaze/zhenxun_extensive_plugin/blob/main/genshin_role_info/res/json_data/weapon.json +Name: + '2410593283': 无锋剑 + '2125206395': 银剑 + '479076483': 冷刃 + '1608953539': 黎明神剑 + '3673792067': 旅行剑 + '160493219': 暗铁剑 + '3421967235': 吃虎鱼刀 + '1388004931': 飞天御剑 + '2474354867': 西风剑 + '3587621259': 笛剑 + '1990641987': 祭礼剑 + '2375993851': 宗室长剑 + '1321135667': 匣里龙吟 + '1991707099': 试作斩岩 + '4103022435': 铁蜂刺 + '3378007475': 黑岩长剑 + '3796905611': 黑剑 + '2947140987': 暗巷闪光 + '1773425155': 降临之剑 + '2749853923': 腐殖之剑 + '1990820123': 天目影打刀 + '342097547': 辰砂之纺锤 + '1012170803': 笼钓瓶一心 + '313300315': 原木刀 + '143051931': 西福斯的月光 + '1499745907': 「一心传」名刀 + '1538092267': 「一心传」名刀 + '3464027035': 「一心传」名刀 + '902264035': 风鹰剑 + '4055003299': 天空之刃 + '2949448555': 苍古自由之誓 + '944332883': 斫峰之刃 + '1345343763': 磐岩结绿 + '4124851547': 雾切之回光 + '1600275315': 波乱月白经津 + '454086795': 圣显之钥 + '2666951267': 训练大剑 + '1182966603': 佣兵重剑 + '1479961579': 铁影阔剑 + '4090429643': 沐浴龙血的剑 + '850802171': 白铁大剑 + '1516554699': 石英大剑 + '3097441915': 以理服人 + '2614170427': 飞天大御剑 + '735056795': 西风大剑 + '930640955': 钟剑 + '1675686363': 祭礼大剑 + '877751435': 宗室大剑 + '3684723963': 雨裁 + '3722933411': 试作古华 + '680510411': 白影剑 + '20848859': 黑岩斩刀 + '1437658243': 螭骨剑 + '2006422931': 千岩古剑 + '2753539619': 雪葬的星银 + '346510395': 衔珠海皇 + '4193089947': 桂木斩长正 + '3073454867': 玛海菈的水色 + '2359799475': 恶王丸 + '902184579': 森林王器 + '1089950259': 天空之傲 + '3995710363': 狼的末路 + '1075647299': 松籁响起之时 + '2792766467': 无工之剑 + '3914951691': 赤角石溃杵 + '2796697027': 新手长枪 + '3070169307': 铁尖枪 + '1390797107': 白缨枪 + '618786571': 钺矛 + '4103766499': 黑缨枪 + '500612819': 「旗杆」 + '2664629131': 匣里灭辰 + '1154009435': 试作星镰 + '578575283': 流月针 + '481755219': 黑岩刺枪 + '4049410651': 决斗之枪 + '716252627': 千岩长枪 + '3755004051': 西风长枪 + '2935286715': 宗室猎枪 + '3443142923': 龙脊长枪 + '2491797315': 喜多院十文字 + '1148024603': 「渔获」 + '4122509083': 断浪长鳍 + '452357939': 贯月矢 + '1470442731': 风信之锋 + '3235324891': 护摩之杖 + '4158505619': 天空之脊 + '197755235': 贯虹之槊 + '1997709467': 和璞鸢 + '688991243': 息灾 + '3717849275': 薙草之稻光 + '4238339131': 赤沙之杖 + '3584825427': 学徒笔记 + '2705029563': 口袋魔导书 + '2279290283': 魔导绪论 + '3500935003': 讨龙英杰谭 + '1406746947': 异世界行记 + '2963220587': 翡玉法球 + '3719372715': 甲级宝珏 + '302691299': 琥珀玥 + '623534363': 西风秘典 + '1163263227': 流浪乐章 + '2195665683': 祭礼残章 + '3827789435': 宗室秘法录 + '37147251': 匣里日月 + '2521338131': 试作金珀 + '1072884907': 万国诸海图谱 + '3273999011': 黑岩绯玉 + '3156385731': 昭心 + '3090373787': 暗巷的酒与诗 + '2587614459': 忍冬之果 + '3456986819': 嘟嘟可故事集 + '2324146259': 白辰之环 + '2539208459': 证誓之明瞳 + '426363739': 流浪的晚星 + '2267978875': 盈满之实 + '807607555': 天空之卷 + '1455107995': 四风原典 + '693354267': 尘世之锁 + '1890163363': 不灭月华 + '310247243': 神乐之真意 + '3600623979': 猎弓 + '2340970067': 历练的猎弓 + '3975746731': 鸦羽弓 + '656120259': 神射手之誓 + '4267718859': 反曲弓 + '1021898539': 弹弓 + '4139294531': 信使 + '2242027395': 黑檀弓 + '1240067179': 西风猎弓 + '2556914683': 绝弦 + '2400012995': 祭礼弓 + '2832648187': 宗室长弓 + '3169209451': 弓藏 + '3625393819': 试作澹月 + '411685275': 钢轮弓 + '3447737235': 黑岩战弓 + '3439749859': 苍翠猎弓 + '2417717595': 暗巷猎手 + '2425414923': 落霞 + '3949653579': 幽夜华尔兹 + '650049651': 风花之颂 + '4186179883': 破魔之弓 + '540938627': 掠食者 + '1860795787': 曚云之月 + '3176599083': 王下近侍 + '3063191787': 竭泽 + '3933622347': 天空之翼 + '828711395': 阿莫斯之弓 + '3112679155': 终末嗟叹之诗 + '1901973075': 冬极白星 + '4230231107': 若水 + '2918525947': 飞雷之弦振 + '1348687251': 猎人之径 + '4137694339': (test)竿测试 + '2719832059': (test)穿模测试 + '500987603': (test)穿模测试 + '1595734083': (test)穿模测试 + '2009975571': (test)穿模测试 + '4162981171': (test)穿模测试 + '3762437019': (test)穿模测试 +Type: + 无锋剑: 单手剑 + 银剑: 单手剑 + 冷刃: 单手剑 + 黎明神剑: 单手剑 + 旅行剑: 单手剑 + 暗铁剑: 单手剑 + 吃虎鱼刀: 单手剑 + 飞天御剑: 单手剑 + 西风剑: 单手剑 + 笛剑: 单手剑 + 祭礼剑: 单手剑 + 宗室长剑: 单手剑 + 匣里龙吟: 单手剑 + 试作斩岩: 单手剑 + 铁蜂刺: 单手剑 + 黑岩长剑: 单手剑 + 黑剑: 单手剑 + 暗巷闪光: 单手剑 + 降临之剑: 单手剑 + 腐殖之剑: 单手剑 + 天目影打刀: 单手剑 + 辰砂之纺锤: 单手剑 + 笼钓瓶一心: 单手剑 + 原木刀: 单手剑 + 西福斯的月光: 单手剑 + 「一心传」名刀: 单手剑 + 风鹰剑: 单手剑 + 天空之刃: 单手剑 + 苍古自由之誓: 单手剑 + 斫峰之刃: 单手剑 + 磐岩结绿: 单手剑 + 雾切之回光: 单手剑 + 波乱月白经津: 单手剑 + 圣显之钥: 单手剑 + 训练大剑: 双手剑 + 佣兵重剑: 双手剑 + 铁影阔剑: 双手剑 + 沐浴龙血的剑: 双手剑 + 白铁大剑: 双手剑 + 石英大剑: 双手剑 + 以理服人: 双手剑 + 飞天大御剑: 双手剑 + 西风大剑: 双手剑 + 钟剑: 双手剑 + 祭礼大剑: 双手剑 + 宗室大剑: 双手剑 + 雨裁: 双手剑 + 试作古华: 双手剑 + 白影剑: 双手剑 + 黑岩斩刀: 双手剑 + 螭骨剑: 双手剑 + 千岩古剑: 双手剑 + 雪葬的星银: 双手剑 + 衔珠海皇: 双手剑 + 桂木斩长正: 双手剑 + 玛海菈的水色: 双手剑 + 恶王丸: 双手剑 + 森林王器: 双手剑 + 天空之傲: 双手剑 + 狼的末路: 双手剑 + 松籁响起之时: 双手剑 + 无工之剑: 双手剑 + 赤角石溃杵: 双手剑 + 新手长枪: 长柄武器 + 铁尖枪: 长柄武器 + 白缨枪: 长柄武器 + 钺矛: 长柄武器 + 黑缨枪: 长柄武器 + 「旗杆」: 长柄武器 + 匣里灭辰: 长柄武器 + 试作星镰: 长柄武器 + 流月针: 长柄武器 + 黑岩刺枪: 长柄武器 + 决斗之枪: 长柄武器 + 千岩长枪: 长柄武器 + 西风长枪: 长柄武器 + 宗室猎枪: 长柄武器 + 龙脊长枪: 长柄武器 + 喜多院十文字: 长柄武器 + 「渔获」: 长柄武器 + 断浪长鳍: 长柄武器 + 贯月矢: 长柄武器 + 风信之锋: 长柄武器 + 护摩之杖: 长柄武器 + 天空之脊: 长柄武器 + 贯虹之槊: 长柄武器 + 和璞鸢: 长柄武器 + 息灾: 长柄武器 + 薙草之稻光: 长柄武器 + 赤沙之杖: 长柄武器 + 学徒笔记: 法器 + 口袋魔导书: 法器 + 魔导绪论: 法器 + 讨龙英杰谭: 法器 + 异世界行记: 法器 + 翡玉法球: 法器 + 甲级宝珏: 法器 + 琥珀玥: 法器 + 西风秘典: 法器 + 流浪乐章: 法器 + 祭礼残章: 法器 + 宗室秘法录: 法器 + 匣里日月: 法器 + 试作金珀: 法器 + 万国诸海图谱: 法器 + 黑岩绯玉: 法器 + 昭心: 法器 + 暗巷的酒与诗: 法器 + 忍冬之果: 法器 + 嘟嘟可故事集: 法器 + 白辰之环: 法器 + 证誓之明瞳: 法器 + 流浪的晚星: 法器 + 盈满之实: 法器 + 天空之卷: 法器 + 四风原典: 法器 + 尘世之锁: 法器 + 不灭月华: 法器 + 神乐之真意: 法器 + 猎弓: 弓 + 历练的猎弓: 弓 + 鸦羽弓: 弓 + 神射手之誓: 弓 + 反曲弓: 弓 + 弹弓: 弓 + 信使: 弓 + 黑檀弓: 弓 + 西风猎弓: 弓 + 绝弦: 弓 + 祭礼弓: 弓 + 宗室长弓: 弓 + 弓藏: 弓 + 试作澹月: 弓 + 钢轮弓: 弓 + 黑岩战弓: 弓 + 苍翠猎弓: 弓 + 暗巷猎手: 弓 + 落霞: 弓 + 幽夜华尔兹: 弓 + 风花之颂: 弓 + 破魔之弓: 弓 + 掠食者: 弓 + 曚云之月: 弓 + 王下近侍: 弓 + 竭泽: 弓 + 天空之翼: 弓 + 阿莫斯之弓: 弓 + 终末嗟叹之诗: 弓 + 冬极白星: 弓 + 若水: 弓 + 飞雷之弦振: 弓 + 猎人之径: 弓 + (test)竿测试: 单手剑 + (test)穿模测试: 弓 +Icon: + 无锋剑: UI_EquipIcon_Sword_Blunt + 银剑: UI_EquipIcon_Sword_Silver + 冷刃: UI_EquipIcon_Sword_Steel + 黎明神剑: UI_EquipIcon_Sword_Dawn + 旅行剑: UI_EquipIcon_Sword_Traveler + 暗铁剑: UI_EquipIcon_Sword_Darker + 吃虎鱼刀: UI_EquipIcon_Sword_Sashimi + 飞天御剑: UI_EquipIcon_Sword_Mitsurugi + 西风剑: UI_EquipIcon_Sword_Zephyrus + 笛剑: UI_EquipIcon_Sword_Troupe + 祭礼剑: UI_EquipIcon_Sword_Fossil + 宗室长剑: UI_EquipIcon_Sword_Theocrat + 匣里龙吟: UI_EquipIcon_Sword_Rockkiller + 试作斩岩: UI_EquipIcon_Sword_Proto + 铁蜂刺: UI_EquipIcon_Sword_Exotic + 黑岩长剑: UI_EquipIcon_Sword_Blackrock + 黑剑: UI_EquipIcon_Sword_Bloodstained + 暗巷闪光: UI_EquipIcon_Sword_Outlaw + 降临之剑: UI_EquipIcon_Sword_Psalmus + 腐殖之剑: UI_EquipIcon_Sword_Magnum + 天目影打刀: UI_EquipIcon_Sword_Bakufu + 辰砂之纺锤: UI_EquipIcon_Sword_Opus + 笼钓瓶一心: UI_EquipIcon_Sword_Youtou + 原木刀: UI_EquipIcon_Sword_Arakalari + 西福斯的月光: UI_EquipIcon_Sword_Pleroma + 「一心传」名刀: UI_EquipIcon_Sword_YoutouEnchanted + 风鹰剑: UI_EquipIcon_Sword_Falcon + 天空之刃: UI_EquipIcon_Sword_Dvalin + 苍古自由之誓: UI_EquipIcon_Sword_Widsith + 斫峰之刃: UI_EquipIcon_Sword_Kunwu + 磐岩结绿: UI_EquipIcon_Sword_Morax + 雾切之回光: UI_EquipIcon_Sword_Narukami + 波乱月白经津: UI_EquipIcon_Sword_Amenoma + 圣显之钥: UI_EquipIcon_Sword_Deshret + 训练大剑: UI_EquipIcon_Claymore_Aniki + 佣兵重剑: UI_EquipIcon_Claymore_Oyaji + 铁影阔剑: UI_EquipIcon_Claymore_Glaive + 沐浴龙血的剑: UI_EquipIcon_Claymore_Siegfry + 白铁大剑: UI_EquipIcon_Claymore_Tin + 石英大剑: UI_EquipIcon_Claymore_Quartz + 以理服人: UI_EquipIcon_Claymore_Reasoning + 飞天大御剑: UI_EquipIcon_Claymore_Mitsurugi + 西风大剑: UI_EquipIcon_Claymore_Zephyrus + 钟剑: UI_EquipIcon_Claymore_Troupe + 祭礼大剑: UI_EquipIcon_Claymore_Fossil + 宗室大剑: UI_EquipIcon_Claymore_Theocrat + 雨裁: UI_EquipIcon_Claymore_Perdue + 试作古华: UI_EquipIcon_Claymore_Proto + 白影剑: UI_EquipIcon_Claymore_Exotic + 黑岩斩刀: UI_EquipIcon_Claymore_Blackrock + 螭骨剑: UI_EquipIcon_Claymore_Kione + 千岩古剑: UI_EquipIcon_Claymore_Lapis + 雪葬的星银: UI_EquipIcon_Claymore_Dragonfell + 衔珠海皇: UI_EquipIcon_Claymore_MillenniaTuna + 桂木斩长正: UI_EquipIcon_Claymore_Bakufu + 玛海菈的水色: UI_EquipIcon_Claymore_Pleroma + 恶王丸: UI_EquipIcon_Claymore_Maria + 森林王器: UI_EquipIcon_Claymore_Arakalari + 天空之傲: UI_EquipIcon_Claymore_Dvalin + 狼的末路: UI_EquipIcon_Claymore_Wolfmound + 松籁响起之时: UI_EquipIcon_Claymore_Widsith + 无工之剑: UI_EquipIcon_Claymore_Kunwu + 赤角石溃杵: UI_EquipIcon_Claymore_Itadorimaru + 新手长枪: UI_EquipIcon_Pole_Gewalt + 铁尖枪: UI_EquipIcon_Pole_Rod + 白缨枪: UI_EquipIcon_Pole_Ruby + 钺矛: UI_EquipIcon_Pole_Halberd + 黑缨枪: UI_EquipIcon_Pole_Noire + 「旗杆」: UI_EquipIcon_Pole_Flagpole + 匣里灭辰: UI_EquipIcon_Pole_Stardust + 试作星镰: UI_EquipIcon_Pole_Proto + 流月针: UI_EquipIcon_Pole_Exotic + 黑岩刺枪: UI_EquipIcon_Pole_Blackrock + 决斗之枪: UI_EquipIcon_Pole_Gladiator + 千岩长枪: UI_EquipIcon_Pole_Lapis + 西风长枪: UI_EquipIcon_Pole_Zephyrus + 宗室猎枪: UI_EquipIcon_Pole_Theocrat + 龙脊长枪: UI_EquipIcon_Pole_Everfrost + 喜多院十文字: UI_EquipIcon_Pole_Bakufu + 「渔获」: UI_EquipIcon_Pole_Mori + 断浪长鳍: UI_EquipIcon_Pole_Maria + 贯月矢: UI_EquipIcon_Pole_Arakalari + 风信之锋: UI_EquipIcon_Pole_Windvane + 护摩之杖: UI_EquipIcon_Pole_Homa + 天空之脊: UI_EquipIcon_Pole_Dvalin + 贯虹之槊: UI_EquipIcon_Pole_Kunwu + 和璞鸢: UI_EquipIcon_Pole_Morax + 息灾: UI_EquipIcon_Pole_Santika + 薙草之稻光: UI_EquipIcon_Pole_Narukami + 赤沙之杖: UI_EquipIcon_Pole_Deshret + 学徒笔记: UI_EquipIcon_Catalyst_Apprentice + 口袋魔导书: UI_EquipIcon_Catalyst_Pocket + 魔导绪论: UI_EquipIcon_Catalyst_Intro + 讨龙英杰谭: UI_EquipIcon_Catalyst_Pulpfic + 异世界行记: UI_EquipIcon_Catalyst_Lightnov + 翡玉法球: UI_EquipIcon_Catalyst_Jade + 甲级宝珏: UI_EquipIcon_Catalyst_Phoney + 琥珀玥: UI_EquipIcon_Catalyst_Amber + 西风秘典: UI_EquipIcon_Catalyst_Zephyrus + 流浪乐章: UI_EquipIcon_Catalyst_Troupe + 祭礼残章: UI_EquipIcon_Catalyst_Fossil + 宗室秘法录: UI_EquipIcon_Catalyst_Theocrat + 匣里日月: UI_EquipIcon_Catalyst_Resurrection + 试作金珀: UI_EquipIcon_Catalyst_Proto + 万国诸海图谱: UI_EquipIcon_Catalyst_Exotic + 黑岩绯玉: UI_EquipIcon_Catalyst_Blackrock + 昭心: UI_EquipIcon_Catalyst_Truelens + 暗巷的酒与诗: UI_EquipIcon_Catalyst_Outlaw + 忍冬之果: UI_EquipIcon_Catalyst_Everfrost + 嘟嘟可故事集: UI_EquipIcon_Catalyst_Ludiharpastum + 白辰之环: UI_EquipIcon_Catalyst_Bakufu + 证誓之明瞳: UI_EquipIcon_Catalyst_Jyanome + 流浪的晚星: UI_EquipIcon_Catalyst_Pleroma + 盈满之实: UI_EquipIcon_Catalyst_Arakalari + 天空之卷: UI_EquipIcon_Catalyst_Dvalin + 四风原典: UI_EquipIcon_Catalyst_Fourwinds + 尘世之锁: UI_EquipIcon_Catalyst_Kunwu + 不灭月华: UI_EquipIcon_Catalyst_Kaleido + 神乐之真意: UI_EquipIcon_Catalyst_Narukami + 猎弓: UI_EquipIcon_Bow_Hunters + 历练的猎弓: UI_EquipIcon_Bow_Old + 鸦羽弓: UI_EquipIcon_Bow_Crowfeather + 神射手之誓: UI_EquipIcon_Bow_Arjuna + 反曲弓: UI_EquipIcon_Bow_Curve + 弹弓: UI_EquipIcon_Bow_Sling + 信使: UI_EquipIcon_Bow_Msg + 黑檀弓: UI_EquipIcon_Bow_Hardwood + 西风猎弓: UI_EquipIcon_Bow_Zephyrus + 绝弦: UI_EquipIcon_Bow_Troupe + 祭礼弓: UI_EquipIcon_Bow_Fossil + 宗室长弓: UI_EquipIcon_Bow_Theocrat + 弓藏: UI_EquipIcon_Bow_Recluse + 试作澹月: UI_EquipIcon_Bow_Proto + 钢轮弓: UI_EquipIcon_Bow_Exotic + 黑岩战弓: UI_EquipIcon_Bow_Blackrock + 苍翠猎弓: UI_EquipIcon_Bow_Viridescent + 暗巷猎手: UI_EquipIcon_Bow_Outlaw + 落霞: UI_EquipIcon_Bow_Fallensun + 幽夜华尔兹: UI_EquipIcon_Bow_Nachtblind + 风花之颂: UI_EquipIcon_Bow_Fleurfair + 破魔之弓: UI_EquipIcon_Bow_Bakufu + 掠食者: UI_EquipIcon_Bow_Predator + 曚云之月: UI_EquipIcon_Bow_Maria + 王下近侍: UI_EquipIcon_Bow_Arakalari + 竭泽: UI_EquipIcon_Bow_Fin + 天空之翼: UI_EquipIcon_Bow_Dvalin + 阿莫斯之弓: UI_EquipIcon_Bow_Amos + 终末嗟叹之诗: UI_EquipIcon_Bow_Widsith + 冬极白星: UI_EquipIcon_Bow_Worldbane + 若水: UI_EquipIcon_Bow_Kirin + 飞雷之弦振: UI_EquipIcon_Bow_Narukami + 猎人之径: UI_EquipIcon_Bow_Ayus + (test)竿测试: UI_EquipIcon_FishingRod + (test)穿模测试: UI_EquipIcon_Bow_Template diff --git a/src/Yunzai-Bot/plugins/genshin/defSet/weapon/other.yaml b/src/Yunzai-Bot/plugins/genshin/defSet/weapon/other.yaml new file mode 100644 index 0000000000000000000000000000000000000000..00dca678b4cd28c2b2a4a70dee72268915ccc41f --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/defSet/weapon/other.yaml @@ -0,0 +1,66 @@ +# 武器名称缩短 +sortName: + 松籁响起之时: 松籁 + 无工之剑: 无工 + 狼的末路: 狼末 + 苍古自由之誓: 苍古 + 雾切之回光: 雾切 + 终末嗟叹之诗: 终末 + 阿莫斯之弓: 阿莫斯 + 冬极白星: 冬极 + 飞雷之弦振: 飞雷 + 护摩之杖: 护摩 + 薙草之稻光: 薙刀 + 赤角石溃杵: 赤角 + 嘟嘟可故事集: 嘟嘟可 + 讨龙英杰谭: 讨龙 + 「渔获」: 渔获 + 天目影打刀: 天目刀 + 桂木斩长正: 桂木刀 + 喜多院十文字: 喜多院 + 雪葬的星银: 雪葬星银 + 辰砂之纺锤: 辰砂纺锤 + 万国诸海图谱: 万国图谱 + 神乐之真意: 神乐 + 证誓之明瞳: 证誓明瞳 + 波乱月白经津: 波乱 + 笼钓瓶一心: 妖刀 + 幽夜华尔兹: 幽夜弓 + 神射手之誓: 神射手 + 暗巷的酒与诗: 暗巷酒诗 + 飞天大御剑: 飞天大剑 + 口袋魔导书: 魔导书 + 历练的猎弓: 历练猎弓 + 沐浴龙血的剑: 龙血剑 + 宗室秘法录: 宗室秘法 + 异世界行记: 异世行记 + 玛海菈的水色: 玛海菈 + 西福斯的月光: 西福斯 + 东花坊时雨: 东花坊 + 图莱杜拉的回忆: 图莱杜拉 + 不灭月华: 月华 + 磐岩结绿: 绿剑 + 裁叶萃光: 萃光 + 流浪的晚星: 流浪晚星 + + 角斗士的终幕礼: 角斗士 + 流浪大地的乐团: 流浪乐团 + 华馆梦醒形骸记: 华馆梦醒 + 平息鸣雷的尊者: 平雷尊者 + 炽烈的炎之魔女: 炽烈魔女 + 渡过烈火的贤人: 渡火贤人 + 冰风迷途的勇士: 冰风勇士 + 沙上楼阁史话: 沙上楼阁 + 乐园遗落之花: 乐园遗落 + + +actWeapon: + - 腐殖之剑 + - 风花之颂 + - 嘟嘟可故事集 + - 「渔获」 + - 辰砂之纺锤 + - 证誓之明瞳 + - 落霞 + - 笼钓瓶一心 + - 风信之锋 \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/index.js b/src/Yunzai-Bot/plugins/genshin/index.js new file mode 100644 index 0000000000000000000000000000000000000000..d870214a60bd6ffbccbb2e19ab1408fc1c879651 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/index.js @@ -0,0 +1,24 @@ +import fs from 'node:fs' + +const files = fs.readdirSync('./plugins/genshin/apps').filter(file => file.endsWith('.js')) + +let ret = [] + +files.forEach((file) => { + ret.push(import(`./apps/${file}`)) +}) + +ret = await Promise.allSettled(ret) + +let apps = {} +for (let i in files) { + let name = files[i].replace('.js', '') + + if (ret[i].status != 'fulfilled') { + logger.error(`载入插件错误:${logger.red(name)}`) + logger.error(ret[i].reason) + continue + } + apps[name] = ret[i].value[Object.keys(ret[i].value)[0]] +} +export { apps } diff --git a/src/Yunzai-Bot/plugins/genshin/model/abyss.js b/src/Yunzai-Bot/plugins/genshin/model/abyss.js new file mode 100644 index 0000000000000000000000000000000000000000..327516adff47b421f87a0fe074de1fd91fe6add0 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/abyss.js @@ -0,0 +1,222 @@ +import moment from 'moment' +import lodash from 'lodash' +import base from './base.js' +import MysInfo from './mys/mysInfo.js' +import gsCfg from './gsCfg.js' + +export default class Abyss extends base { + constructor (e) { + super(e) + this.model = 'abyss' + } + + async getAbyss () { + let scheduleType = 1 + if (this.e.msg.includes('上期') || this.e.msg.includes('往期')) { + scheduleType = 2 + } + + let ApiData = { + index: '', + spiralAbyss: { schedule_type: scheduleType } + } + + /** 同步请求 */ + this.e.apiSync = true + + let res = await MysInfo.get(this.e, ApiData, '') + + if (!res || res[0].retcode !== 0 || res[1].retcode !== 0) return false + + let abyssData = res[1].data + + if (abyssData?.total_battle_times <= 0) { + await this.e.reply(`uid${this.e.uid},暂无挑战数据。`) + return false + } + if (!abyssData.damage_rank || abyssData.damage_rank.length <= 0) { + await this.e.reply(`uid${this.e.uid},数据还没更新,请稍后再试`) + return false + } + + /** 截图数据 */ + let data = { + name: this.e.sender.card, + quality: 80, + ...this.screenData, + ...this.abyssData(abyssData) + } + + return data + } + + abyssData (data) { + let startTime = moment.unix(data.start_time) + let time = Number(startTime.month()) + 1 + if (startTime.date() >= 15) { + time = time + '月下' + } else { + time = time + '月上' + } + + let totalStar = 0 + let star = [] + for (let val of data.floors) { + if (val.index < 9) { + continue + } + totalStar += val.star + star.push(val.star) + } + totalStar = totalStar + '(' + star.join('-') + ')' + + let dataName = ['damage', 'take_damage', 'defeat', 'normal_skill', 'energy_skill'] + let rankData = [] + + for (let val of dataName) { + if (lodash.isEmpty(data[`${val}_rank`]) || data[`${val}_rank`].length <= 0) { + data[`${val}_rank`] = [ + { + value: 0, + avatar_id: 10000007 + } + ] + } + rankData[val] = { + num: data[`${val}_rank`][0].value, + name: gsCfg.roleIdToName(data[`${val}_rank`][0].avatar_id) + } + + if (rankData[val].num > 1000) { + rankData[val].num = (rankData[val].num / 10000).toFixed(1) + rankData[val].num += ' w' + } + } + + for (let i in data.reveal_rank) { + data.reveal_rank[i].name = gsCfg.roleIdToName(data.reveal_rank[i].avatar_id) + } + + return { + saveId: this.e.uid, + uid: this.e.uid, + time, + max_floor: data.max_floor, + total_star: totalStar, + list: data.reveal_rank, + total_battle_times: data.total_battle_times, + ...rankData + } + } + + /** 深渊十二层 */ + async getAbyssFloor () { + this.model = 'abyssFloor' + let scheduleType = 1 + if (this.e.msg.includes('上期') || this.e.msg.includes('往期')) { + scheduleType = 2 + } + let ApiData = { + index: '', + spiralAbyss: { schedule_type: scheduleType } + } + + /** 同步请求 */ + this.e.sync = true + + let res = await MysInfo.get(this.e, ApiData) + + if (!res || res[0].retcode !== 0 || res[1].retcode !== 0) return false + + let resIndex = res[0].data + let resAbyss = res[1].data + let uid = this.e.uid + let floorIndex = this.getFloor() + + if (!floorIndex) { + await this.e.reply('深渊层数错误') + return false + } + + if (lodash.isEmpty(resAbyss.floors)) { + await this.e.reply(`uid:${uid},暂无第${floorIndex}层数据`) + return false + } + + let floors = lodash.keyBy(resAbyss.floors, 'index') + + if (lodash.isEmpty(floors[floorIndex])) { + await this.e.reply(`uid:${uid},暂无第${floorIndex}层数据`) + return false + } + + return { + saveId: uid, + uid, + floorIndex, + ...this.screenData, + ...this.abyssFloorData(floors[floorIndex], resIndex) + } + } + + getFloor () { + let reg = /^#*[上期]*(深渊|深境|深境螺旋)[上期]*[第]*(9|10|11|12|九|十|十一|十二)层[ |0-9]*$/ + let floorIndex = this.e.msg.match(reg) + + if (!floorIndex) { + return false + } + floorIndex = floorIndex[2] + + switch (floorIndex) { + case '9': + case '九': + floorIndex = 9 + break + case '10': + case '十': + floorIndex = 10 + break + case '11': + case '十一': + floorIndex = 11 + break + case '12': + case '十二': + floorIndex = 12 + break + default: + floorIndex = '' + break + } + + return floorIndex + } + + abyssFloorData (floor, index) { + let roleArr = lodash.keyBy(index.avatars, 'id') + let list = [] + for (let val of floor.levels) { + if (!val.battles || val.battles.length < 2) { + continue + } + val.time = moment.unix(val.battles[0].timestamp).format('YYYY-MM-DD HH:mm:ss') + + for (let i in val.battles) { + for (let j in val.battles[i].avatars) { + val.battles[i].avatars[j].name = roleArr[val.battles[i].avatars[j].id].name + + val.battles[i].avatars[j].name = gsCfg.roleIdToName(val.battles[i].avatars[j].id) + + val.battles[i].avatars[j].life = roleArr[val.battles[i].avatars[j].id].actived_constellation_num + } + } + list.push(val) + } + + return { + floor, + list + } + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/base.js b/src/Yunzai-Bot/plugins/genshin/model/base.js new file mode 100644 index 0000000000000000000000000000000000000000..0a07cedf9ffdd9fec892184232f55137713c94e4 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/base.js @@ -0,0 +1,32 @@ + +export default class base { + constructor (e = {}) { + this.e = e + this.userId = e?.user_id + this.model = 'genshin' + this._path = process.cwd().replace(/\\/g, '/') + } + + get prefix () { + return `Yz:genshin:${this.model}:` + } + + /** + * 截图默认数据 + * @param saveId html保存id + * @param tplFile 模板html路径 + * @param pluResPath 插件资源路径 + */ + get screenData () { + let headImg = '八重神子' + + return { + saveId: this.userId, + cwd: this._path, + tplFile: `./plugins/genshin/resources/html/${this.model}/${this.model}.html`, + /** 绝对路径 */ + pluResPath: `${this._path}/plugins/genshin/resources/`, + headStyle: `` + } + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/blueprint.js b/src/Yunzai-Bot/plugins/genshin/model/blueprint.js new file mode 100644 index 0000000000000000000000000000000000000000..4d24c62f73e564ae710ef9209288c499c846ffff --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/blueprint.js @@ -0,0 +1,61 @@ +import base from './base.js' +import MysInfo from './mys/mysInfo.js' +import MysApi from './mys/mysApi.js' + +export default class blueprint extends base { + constructor (e) { + super(e) + this.model = 'blueprint' + this.checkMsg = '设置尘歌壶模数有误\n指令:#尘歌壶模数\n示例:#尘歌壶模数123456\n参数为模数id(10-15位数字)' + } + + async get (role) { + /** 获取绑定uid */ + let uid = await MysInfo.getUid(this.e, false) + if (!uid) return false + /** 判断是否绑定了ck */ + let ck = await MysInfo.checkUidBing(uid) + if (!ck) { + await this.e.reply(MysInfo.tips) + return false + } + + this.mysApi = new MysApi(ck.uid, ck.ck, { log: true }) + + /** 获取角色数据 */ + let blueprint = await this.mysApi.getData('blueprint', { share_code: role, headers: 'https://webstatic.mihoyo.com/ys/event/e20200923adopt_calculator/index.html?bbs_presentation_style=fullscreen&bbs_auth_required=true&mys_source=GameRecord' }) + /** 获取计算参数 */ + let body = await this.getBody(blueprint) + if (!body) return false + /** 计算 */ + let computes = await this.computes(body) + if (!computes) return false + return { + saveId: uid, + uid, + share_code: role[0], + blueprint, + computes, + ...this.screenData + } + } + + async getBody (data) { + if (!data?.data?.list?.length) return false + let newData = [] + for (let item of data?.data?.list) { + newData.push({ + cnt: item.num * 1, + id: item.id * 1 + }) + } + return { list: newData } + } + + async computes (body) { + let computes = await this.mysApi.getData('blueprintCompute', body) + if (!computes || computes.retcode !== 0) return false + computes = computes.data?.list + return computes + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/calculator.js b/src/Yunzai-Bot/plugins/genshin/model/calculator.js new file mode 100644 index 0000000000000000000000000000000000000000..07736d123252b9ae85bbeff2cfa201cd6f984894 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/calculator.js @@ -0,0 +1,200 @@ +import base from './base.js' +import MysInfo from './mys/mysInfo.js' +import MysApi from './mys/mysApi.js' +import lodash from 'lodash' +import gsCfg from './gsCfg.js' + +export default class Calculator extends base { + constructor (e) { + super(e) + this.model = 'calculator' + this.checkMsg = '设置角色、武器、技能等级有误\n指令:#刻晴养成\n示例:#刻晴养成81 90 9 9 9\n参数为角色、武器、技能等级' + } + + async get (role) { + this.role = role + /** 获取绑定uid */ + let uid = await MysInfo.getUid(this.e) + if (!uid) return false + + /** 判断是否绑定了ck */ + let ck = await MysInfo.checkUidBing(uid) + if (!ck) { + await this.e.reply(MysInfo.tips) + return false + } + + this.mysApi = new MysApi(uid, ck.ck, { log: true }) + + /** 获取角色数据 */ + let character = await this.mysApi.getData('character') + if (!character || character.retcode !== 0) return false + character = character.data + + /** 获取设置参数 */ + await this.getSet() + + /** 获取计算角色 */ + this.dataCharacter = character.avatars.find((item) => item.id == role.roleId) + + /** 获取计算参数 */ + let body = await this.getBody() + if (!body) return false + + /** 计算 */ + let computes = await this.computes(body) + if (!computes) return false + + return { + saveId: uid, + uid, + dataCharacter: this.dataCharacter, + setSkill: this.setSkill, + skillList: this.skillList, + computes, + ...this.screenData + } + } + + async getSet () { + let defSetSkill = '90,90,10,10,10'.split(',') + + let set = this.e.msg.replace(/#|#|养成|计算/g, '').trim() + + set = set.replace(/,| /g, ',') + + set = set.replace(this.role.alias, '') + + let setSkill = [] + if (set) { + setSkill = set.split(',') + setSkill = lodash.compact(setSkill) + for (let i = 0; i <= 4; i++) { + if (!setSkill[i]) setSkill[i] = defSetSkill[i] + } + } else { + setSkill = defSetSkill + } + + if (setSkill.length != 5) { + let reMsg = this.checkMsg.replace(/刻晴/g, this.role.alias) + await this.e.reply(reMsg) + return false + } + + /** 检查参数 */ + let check = [90, 90, 10, 10, 10] + for (const key in check) { + if (check[key] < Number(setSkill[key])) { + setSkill[key] = check[key] + } + } + + this.setSkill = setSkill + } + + async getBody () { + // 技能 + let skillList = [] + if (this.dataCharacter) { + /** 角色存在获取技能数据 */ + let detail = await this.mysApi.getData('detail', { avatar_id: this.role.roleId }) + if (!detail || detail.retcode !== 0) return false + + skillList = detail.data.skill_list + } else { + /** 尚未拥有的角色 */ + skillList = await this.getSkillId(this.role.roleId) + + if (!skillList) { + this.e.reply('暂无角色数据,请稍后再试') + return false + } + + let four = gsCfg.getdefSet('role', 'other').four + + this.dataCharacter = { + level: 1, + name: this.role.name, + icon: `${this.screenData.pluResPath}img/role/${this.role.name}.png`, + rarity: four.includes(Number(this.role.roleId)) ? 4 : 5 + } + } + + skillList = skillList.filter((item) => item.max_level != 1) + + /** 拼接计算参数 */ + let body = { + avatar_id: Number(this.role.roleId), + avatar_level_current: Number(this.dataCharacter.level), + avatar_level_target: Number(this.setSkill[0]), + skill_list: [ + { + id: Number(skillList[0].group_id), + level_current: Number(skillList[0].level_current), + level_target: Number(this.setSkill[2]) + }, + { + id: Number(skillList[1].group_id), + level_current: Number(skillList[1].level_current), + level_target: Number(this.setSkill[3]) + }, + { + id: Number(skillList[2].group_id), + level_current: Number(skillList[2].level_current), + level_target: Number(this.setSkill[4]) + } + ] + } + + if (this.mysApi.getServer().startsWith('os')) { + body.lang = "zh-cn" + } + + if (this.dataCharacter.weapon) { + if (Number(this.dataCharacter.weapon.rarity) < 3) { + this.setSkill[1] = 70 + } + body.weapon = { + id: Number(this.dataCharacter.weapon.id), + level_current: Number(this.dataCharacter.weapon.level), + level_target: Number(this.setSkill[1]) + } + } + this.skillList = skillList + return body + } + + async getSkillId (roleId) { + let avatarSkill = await this.mysApi.getData('avatarSkill', { avatar_id: roleId }) + if (!avatarSkill || avatarSkill.retcode !== 0) return false + avatarSkill = avatarSkill.data + avatarSkill.list.forEach((item) => { + item.level_current = 1 + }) + + return avatarSkill.list + } + + async computes (body) { + let computes = await this.mysApi.getData('compute', body) + if (!computes || computes.retcode !== 0) return false + computes = computes.data + + let formart = (num) => { + return num > 10000 ? (num / 10000).toFixed(1) + ' w' : num + } + + for (let i in computes) { + for (let j in computes[i]) { + computes[i][j].num = formart(computes[i][j].num) + + if (computes[i][j].name.includes('「')) { + computes[i][j].isTalent = true + } + } + } + + return computes + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/exportLog.js b/src/Yunzai-Bot/plugins/genshin/model/exportLog.js new file mode 100644 index 0000000000000000000000000000000000000000..7940a1a35b8b799761b893a4ae5f292a21d68c40 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/exportLog.js @@ -0,0 +1,385 @@ +import base from './base.js' +import cfg from '../../../lib/config/config.js' +import common from '../../../lib/common/common.js' +import fs from 'node:fs' +import moment from 'moment' +import GachaLog from './gachaLog.js' +import lodash from 'lodash' + +let xlsx = {} + +export default class ExportLog extends base { + constructor (e) { + super(e) + this.model = 'gachaLog' + + this.urlKey = `${this.prefix}url:` + /** 绑定的uid */ + this.uidKey = `Yz:genshin:mys:qq-uid:${this.userId}` + + this.path = `./data/gachaJson/${this.e.user_id}/` + + this.pool = [ + { type: 301, typeName: '角色活动' }, + { type: 302, typeName: '武器活动' }, + { type: 200, typeName: '常驻' } + ] + + this.typeName = { + 301: '角色', + 302: '武器', + 200: '常驻' + } + } + + async initXlsx () { + if (!lodash.isEmpty(xlsx)) return xlsx + + xlsx = await import('node-xlsx') + } + + async exportJson () { + await this.getUid() + + if (!this.uid) return false + + let list = this.getAllList().list + + let data = { + info: { + uid: this.uid, + lang: list[0].lang, + export_time: moment().format('YYYY-MM-DD HH:mm:ss'), + export_timestamp: moment().format('X'), + export_app: 'Yunzai-Bot', + export_app_version: cfg.package.version, + uigf_version: 'v2.2' + }, + list + } + + let saveFile = `${this.path}${this.uid}/${this.uid}.json` + + fs.writeFileSync(saveFile, JSON.stringify(data, '', '\t')) + + logger.mark(`${this.e.logFnc} 导出成功${this.uid}.json`) + + this.e.reply(`导出成功:${this.uid}.json,共${list.length}条 \n请接收文件`) + + await this.e.friend.sendFile(saveFile).catch((err) => { + logger.error(`${this.e.logFnc} 发送文件失败 ${JSON.stringify(err)}`) + }) + + /** 删除文件 */ + fs.unlink(saveFile, () => {}) + } + + async exportXlsx () { + await this.getUid() + + if (!this.uid) return false + + await this.initXlsx() + + logger.mark(`${this.e.logFnc} 开始导出${this.uid}.xlsx`) + + let res = this.getAllList() + + /** 处理卡池数据 */ + let xlsxData = this.xlsxDataPool(res) + /** 处理所有数据 */ + xlsxData.push(this.xlsxDataAll(res)) + + /** node-xlsx导出的buffer有点大.. */ + let buffer = xlsx.build(xlsxData) + let saveFile = `${this.path}${this.uid}/${this.uid}.xlsx` + + fs.writeFileSync(saveFile, Buffer.from(buffer)) + + logger.mark(`${this.e.logFnc} 导出成功${this.uid}.xlsx`) + + this.e.reply(`记录文件${this.uid}.xlsx上传中,请耐心等待...`) + + res = await this.e.friend.sendFile(saveFile).catch((err) => { + this.e.reply(`发送文件${this.uid}.xlsx失败,请稍后再试`) + logger.error(`${this.e.logFnc} 发送文件失败 ${JSON.stringify(err)}`) + }) + + let line = xlsxData[xlsxData.length - 1].data.length - 1 + if (res) this.e.reply(`${this.uid}.xlsx上传成功,共${line}条\n请接收文件`) + + /** 删除文件 */ + fs.unlink(saveFile, () => {}) + } + + async getUid () { + let gachLog = new GachaLog(this.e) + let uid = await gachLog.getUid() + + if (!uid) return false + + this.uid = uid + return this.uid + } + + getAllList () { + let res = { + list: [] + } + let tmpId = {} + for (let v of this.pool) { + let json = `${this.path}${this.uid}/${v.type}.json` + if (fs.existsSync(json)) { + json = JSON.parse(fs.readFileSync(json, 'utf8')) + json = json.reverse() + } else { + json = [] + } + res[v.type] = json + for (let v of json) { + if (v.gacha_type == 301 || v.gacha_type == 400) { + v.uigf_gacha_type = '301' + } else { + v.uigf_gacha_type = v.gacha_type + } + let id = v.id + if (!id) { + id = moment(v.time).format('x') + '000000' + v.id = id + } else { + if (id.length == 13) { + v.id = `${id}000000` + } + } + + if (tmpId[id]) { + let newId = `${id}00000${tmpId[id].length}` + tmpId[id].push(newId) + v.id = newId + } else { + tmpId[id] = [id] + } + res.list.push(v) + } + } + res.list = lodash.orderBy(res.list, ['id', 'asc']) + return res + } + + loadJson (json) { + if (!fs.existsSync(json)) return [] + return JSON.parse(fs.readFileSync(json, 'utf8')) + } + + xlsxDataPool (data) { + let xlsxData = [] + + for (let v of this.pool) { + let poolData = [ + [ + '时间', '名称', '物品类型', '星级', '祈愿类型' + ] + ] + for (let log of data[v.type]) { + poolData.push([ + log.time, log.name, log.item_type, log.rank_type, log.gacha_type + ]) + } + + let sheetOptions = { + '!cols': [{ wch: 20 }, { wch: 20 }, { wch: 10 }, { wch: 10 }, { wch: 10 }] + } + xlsxData.push({ name: `${v.typeName}祈愿`, data: poolData, options: sheetOptions }) + } + + return xlsxData + } + + xlsxDataAll (data) { + let list = [ + [ + 'count', 'gacha_type', 'id', 'item_id', 'item_type', 'lang', 'name', 'rank_type', 'time', 'uid', 'uigf_gacha_type' + ] + ] + for (let v of data.list) { + let tmp = [] + for (let i of list[0]) { + if (i == 'id' || i == 'uigf_gacha_type') v[i] = String(v[i]) + tmp.push(v[i]) + } + list.push(tmp) + } + let sheetOptions = { + '!cols': [{ wch: 10 }, { wch: 10 }, { wch: 20 }, { wch: 10 }, { wch: 10 }, { wch: 10 }, { wch: 20 }, { wch: 10 }, { wch: 20 }, { wch: 10 }, { wch: 10 }] + } + + return { name: '原始数据', data: list, options: sheetOptions } + } + + /** xlsx导入抽卡记录 */ + async logXlsx () { + await this.initXlsx() + + let uid = /[1-9][0-9]{8}/g.exec(this.e.file.name)[0] + let textPath = `${this.path}${this.e.file.name}` + /** 获取文件下载链接 */ + let fileUrl = await this.e.friend.getFileUrl(this.e.file.fid) + + let ret = await common.downFile(fileUrl, textPath) + if (!ret) { + this.e.reply('下载xlsx文件错误') + return false + } + + let list = xlsx.parse(textPath) + list = lodash.keyBy(list, 'name') + + if (!list['原始数据']) { + this.e.reply('xlsx文件内容错误:非统一祈愿记录标准') + return false + } + + /** 处理xlsx数据 */ + let data = this.dealXlsx(list['原始数据'].data) + if (!data) return false + + /** 保存json */ + let msg = [] + for (let type in data) { + if (!this.typeName[type]) continue + let gachLog = new GachaLog(this.e) + gachLog.uid = uid + gachLog.type = type + gachLog.writeJson(data[type]) + + msg.push(`${this.typeName[type]}记录:${data[type].length}条`) + } + + /** 删除文件 */ + fs.unlink(textPath, () => {}) + + await this.e.reply(`${this.e.file.name},导入成功\n${msg.join('\n')}`) + } + + dealXlsx (list) { + /** 必要字段 */ + let reqField = ['uigf_gacha_type', 'gacha_type', 'item_type', 'name', 'time'] + /** 不是必要字段 */ + let noReqField = ['id', 'uid', 'count', 'item_id', 'lang', 'rank_type'] + + let field = {} + for (let i in list[0]) { + field[list[0][i]] = i + } + + /** 判断字段 */ + for (let v of reqField) { + if (!field[v]) { + this.e.reply(`xlsx文件内容错误:缺少必要字段${v}`) + return + } + } + + /** 倒序 */ + if (moment(list[1][field.time]).format('x') < moment(list[list.length - 1][field.time]).format('x')) { + list = list.reverse() + } + + let data = {} + for (let v of list) { + if (v[field.name] == 'name') continue + if (!data[v[field.uigf_gacha_type]]) data[v[field.uigf_gacha_type]] = [] + + let tmp = {} + /** 加入必要字段 */ + for (let re of reqField) { + tmp[re] = v[field[re]] + } + + /** 加入非必要字段 */ + for (let noRe of noReqField) { + if (field[noRe]) { + tmp[noRe] = v[field[noRe]] + } else { + tmp[noRe] = '' + } + } + + data[v[field.uigf_gacha_type]].push(tmp) + } + + return data + } + + /** json导入抽卡记录 */ + async logJson () { + let uid = /[1-9][0-9]{8}/g.exec(this.e.file.name)[0] + let textPath = `${this.path}${this.e.file.name}` + /** 获取文件下载链接 */ + let fileUrl = await this.e.friend.getFileUrl(this.e.file.fid) + + let ret = await common.downFile(fileUrl, textPath) + if (!ret) { + this.e.reply('下载json文件错误') + return false + } + let json = {} + try { + json = JSON.parse(fs.readFileSync(textPath, 'utf8')) + } catch (error) { + this.e.reply(`${this.e.file.name},json格式错误`) + return false + } + + if (lodash.isEmpty(json) || !json.list) { + this.e.reply('json文件内容错误:非统一祈愿记录标准') + return false + } + + let data = this.dealJson(json.list) + if (!data) return false + + /** 保存json */ + let msg = [] + for (let type in data) { + if (!this.typeName[type]) continue + let gachLog = new GachaLog(this.e) + gachLog.uid = uid + gachLog.type = type + gachLog.writeJson(data[type]) + + msg.push(`${this.typeName[type]}记录:${data[type].length}条`) + } + + /** 删除文件 */ + fs.unlink(textPath, () => {}) + + await this.e.reply(`${this.e.file.name},导入成功\n${msg.join('\n')}`) + } + + dealJson (list) { + let data = {} + + /** 必要字段 */ + let reqField = ['gacha_type', 'item_type', 'name', 'time'] + + for (let v of reqField) { + if (!list[0][v]) { + this.e.reply(`json文件内容错误:缺少必要字段${v}`) + return false + } + } + + /** 倒序 */ + if (moment(list[0].time).format('x') < moment(list[list.length - 1].time).format('x')) { + list = list.reverse() + } + + for (let v of list) { + if (!data[v.uigf_gacha_type]) data[v.uigf_gacha_type] = [] + data[v.uigf_gacha_type].push(v) + } + + return data + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/gachaData.js b/src/Yunzai-Bot/plugins/genshin/model/gachaData.js new file mode 100644 index 0000000000000000000000000000000000000000..0085b42a842c5070c770f59eff223ed865cf82b2 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/gachaData.js @@ -0,0 +1,531 @@ +import base from './base.js' +import gsCfg from './gsCfg.js' +import lodash from 'lodash' +import moment from 'moment' +import fetch from 'node-fetch' +import fs from 'node:fs' + +let imgFile = {} + +export default class GachaData extends base { + /** + * @param e oicq 消息e + * @param e.user_id 用户id + */ + constructor (e) { + super(e) + this.model = 'gacha' + /** 卡池 */ + this.pool = {} + /** 默认设置 */ + this.def = gsCfg.getdefSet('gacha', 'gacha') + this.set = gsCfg.getGachaSet(this.e.group_id) + + /** 角色武器类型 */ + this.ele = gsCfg.element + /** 默认角色池 */ + this.type = 'role' + /** 抽卡结果 */ + this.res = [] + + this.fiveHave = [] + this.fourHave = [] + } + + static async init (e) { + let gacha = new GachaData(e) + gacha.initFile() + /** 抽卡类型 */ + gacha.getTpye() + /** 用户抽卡数据 */ + await gacha.userData() + /** 卡池 */ + await gacha.getPool() + + return gacha + } + + /** 抽卡 */ + async run () { + let list = this.lottery() + + /** 截图数据 */ + let data = { + name: this.e.sender.card, + quality: 80, + ...this.screenData, + ...this.lotteryInfo(), + list + } + + return data + } + + get key () { + /** 群,私聊分开 */ + if (this.e.isGroup) { + return `${this.prefix}${this.e.group_id}:${this.userId}` + } else { + return `${this.prefix}private:${this.userId}` + } + } + + getTpye () { + if (this.e.msg.includes('2')) this.role2 = true + if (this.e.msg.includes('武器')) this.type = 'weapon' + if (this.e.msg.includes('常驻')) this.type = 'permanent' + } + + /** 奖池数据 */ + async getPool () { + let poolArr = gsCfg.getdefSet('gacha', 'pool') + poolArr = [...poolArr].reverse() + /** 获取设置卡池 */ + let NowPool = poolArr.find((val) => new Date().getTime() <= new Date(val.endTime).getTime()) || poolArr.pop() + this.NowPool = NowPool + + if (this.type == 'weapon') { + let weapon4 = lodash.difference(this.def.weapon4, NowPool.weapon4) + let weapon5 = lodash.difference(this.def.weapon5, NowPool.weapon5) + + this.pool = { + up4: NowPool.weapon4, + role4: this.def.role4, + weapon4, + up5: NowPool.weapon5, + five: weapon5 + } + } + + if (this.type == 'role') { + let role4 = lodash.difference(this.def.role4, NowPool.up4) + let role5 = lodash.difference(this.def.role5, NowPool.up5) + + let up5 = NowPool.up5 + if (this.role2) up5 = NowPool.up5_2 + + this.pool = { + /** up卡池 */ + up4: NowPool.up4, + /** 常驻四星 */ + role4, + /** 常驻四星武器 */ + weapon4: this.def.weapon4, + /** 五星 */ + up5, + /** 常驻五星 */ + five: role5 + } + } + + if (this.type == 'permanent') { + this.pool = { + up4: [], + role4: this.def.role4, + weapon4: this.def.weapon4, + up5: [], + five: this.def.role5, + fiveW: this.def.weapon5 + } + } + + this.pool.weapon3 = this.def.weapon3 + } + + /** 用户数据 */ + async userData () { + if (this.user) return this.user + + let user = await redis.get(this.key) + + if (user) { + user = JSON.parse(user) + /** 重置今日数据 */ + if (this.getNow() > user.today.expire) { + user.today = { star: [], expire: this.getEnd().end4, num: 0, weaponNum: 0 } + } + /** 重置本周数据 */ + if (this.getNow() > user.week.expire) { + user.week = { num: 0, expire: this.getWeekEnd() } + } + } else { + let commom = { num4: 0, isUp4: 0, num5: 0, isUp5: 0 } + user = { + permanent: commom, + role: commom, + weapon: { + ...commom, + /** 命定值 */ + lifeNum: 0, + /** 定轨 0-取消 1-武器1 2-武器2 */ + type: 1 + }, + today: { star: [], expire: this.getEnd().end4, num: 0, weaponNum: 0 }, + week: { num: 0, expire: this.getWeekEnd() } + } + } + + this.user = user + + return user + } + + /** + * 抽奖 + */ + lottery (save = true) { + /** 十连抽 */ + for (let i = 1; i <= 10; i++) { + this.index = i + + if (this.type == 'weapon') { + this.user.today.weaponNum++ + } else { + this.user.today.num++ + } + + if (this.lottery5()) continue + + if (this.lottery4()) continue + + this.lottery3() + } + + if (save) this.saveUser() + + /** 排序 星级,角色,武器 */ + this.res = lodash.orderBy(this.res, ['star', 'type', 'have', 'index'], ['desc', 'asc', 'asc', 'asc']) + + return this.res + } + + lottery5 () { + /** 是否大保底 */ + let isBigUP = false + let isBing = false + let tmpChance5 = this.probability() + let type = this.type + /** 没有抽中五星 */ + if (lodash.random(1, 10000) > tmpChance5) { + /** 五星保底数+1 */ + this.user[this.type].num5++ + return false + } + + let nowCardNum = this.user[this.type].num5 + 1 + + /** 五星保底清零 */ + this.user[this.type].num5 = 0 + /** 四星保底数+1 */ + this.user[this.type].num4++ + + let tmpUp = this.def.wai + + /** 已经小保底 */ + if (this.user[this.type].isUp5 == 1) { + tmpUp = 101 + } + + if (this.type == 'permanent') tmpUp = 0 + + let tmpName = '' + if (this.type == 'weapon' && this.user[this.type].lifeNum >= 2) { + /** 定轨 */ + tmpName = this.getBingWeapon() + this.user[this.type].lifeNum = 0 + isBing = true + } else if (lodash.random(1, 100) <= tmpUp) { + /** 当祈愿获取到5星角色时,有50%的概率为本期UP角色 */ + if (this.user[this.type].isUp5 == 1) isBigUP = true + /** 大保底清零 */ + this.user[this.type].isUp5 = 0 + /** 抽取up */ + tmpName = lodash.sample(this.pool.up5) + + /** 定轨清零 */ + if (tmpName == this.getBingWeapon()) { + this.user[this.type].lifeNum = 0 + } + } else { + if (this.type == 'permanent') { + if (lodash.random(1, 100) <= 50) { + tmpName = lodash.sample(this.pool.five) + type = 'role' + } else { + tmpName = lodash.sample(this.pool.fiveW) + type = 'weapon' + } + } else { + /** 歪了 大保底+1 */ + this.user[this.type].isUp5 = 1 + tmpName = lodash.sample(this.pool.five) + } + } + + /** 命定值++ */ + if (tmpName != this.getBingWeapon()) { + this.user[this.type].lifeNum++ + } + + /** 记录今天五星 */ + this.user.today.star.push({ name: tmpName, num: nowCardNum }) + /** 本周五星数 */ + this.user.week.num++ + + let have = false + /** 重复抽中转换星辉 */ + if (this.fiveHave.includes(tmpName)) { + have = true + } else { + this.fiveHave.push(tmpName) + } + + this.res.push({ + name: tmpName, + star: 5, + type, + num: nowCardNum, + element: this.ele[tmpName] || '', + index: this.index, + isBigUP, + isBing, + have, + imgFile: imgFile[tmpName] || `${tmpName}.png`, + rand: lodash.random(1, 7) + }) + + return true + } + + lottery4 () { + let tmpChance4 = this.def.chance4 + + /** 四星保底 */ + if (this.user[this.type].num4 >= 9) { + tmpChance4 += 10000 + } else if (this.user[this.type].num4 >= 5) { + tmpChance4 = tmpChance4 + Math.pow(this.user[this.type].num4 - 4, 2) * 500 + } + + /** 没抽中四星 */ + if (lodash.random(1, 10000) > tmpChance4) { + /** 四星保底数+1 */ + this.user[this.type].num4++ + return false + } + + /** 保底四星数清零 */ + this.user[this.type].num4 = 0 + + /** 四星保底 */ + let tmpUp = 50 + if (this.type == 'weapon') tmpUp = 75 + + if (this.user[this.type].isUp4 == 1) { + this.user[this.type].isUp4 = 0 + tmpUp = 100 + } + + if (this.type == 'permanent') tmpUp = 0 + + let type = 'role' + let tmpName = '' + /** 当祈愿获取到4星物品时,有50%的概率为本期UP角色 */ + if (lodash.random(1, 100) <= tmpUp) { + /** up 4星 */ + tmpName = lodash.sample(this.pool.up4) + type = this.type + } else { + this.user[this.type].isUp4 = 1 + /** 一半概率武器 一半4星 */ + if (lodash.random(1, 100) <= 50) { + tmpName = lodash.sample(this.pool.role4) + type = 'role' + } else { + tmpName = lodash.sample(this.pool.weapon4) + type = 'weapon' + } + } + + let have = false + /** 重复抽中转换星辉 */ + if (this.fourHave.includes(tmpName)) { + have = true + } else { + this.fourHave.push(tmpName) + } + + this.res.push({ + name: tmpName, + star: 4, + type, + element: this.ele[tmpName] || '', + index: this.index, + imgFile: imgFile[tmpName] || `${tmpName}.png`, + have + }) + + return true + } + + lottery3 () { + /** 随机三星武器 */ + let tmpName = lodash.sample(this.pool.weapon3) + this.res.push({ + name: tmpName, + star: 3, + type: 'weapon', + element: this.ele[tmpName] || '', + index: this.index, + imgFile: imgFile[tmpName] || `${tmpName}.png` + }) + + return true + } + + probability () { + let tmpChance5 = this.def.chance5 + + if (this.type == 'role' || this.type == 'permanent') { + /** 增加双黄概率 */ + if (this.user.week.num == 1) { + tmpChance5 *= 2 + } + + /** 保底 */ + if (this.user[this.type].num5 >= 90) { + tmpChance5 = 10000 + } else if (this.user[this.type].num5 >= 74) { + /** 74抽之后逐渐增加概率 */ + tmpChance5 = 590 + (this.user[this.type].num5 - 74) * 530 + } else if (this.user[this.type].num5 >= 60) { + /** 60抽之后逐渐增加概率 */ + tmpChance5 = this.def.chance5 + (this.user[this.type].num5 - 50) * 40 + } + } + + if (this.type == 'weapon') { + tmpChance5 = this.def.chanceW5 + + /** 增加双黄概率 */ + if (this.user.week.num == 1) { + tmpChance5 = tmpChance5 * 3 + } + + /** 80次都没中五星 */ + if (this.user[this.type].num5 >= 80) { + tmpChance5 = 10000 + } else if (this.user[this.type].num5 >= 62) { + /** 62抽后逐渐增加概率 */ + tmpChance5 = tmpChance5 + (this.user[this.type].num5 - 61) * 700 + } else if (this.user[this.type].num5 >= 45) { + /** 50抽后逐渐增加概率 */ + tmpChance5 = tmpChance5 + (this.user[this.type].num5 - 45) * 60 + } else if (this.user[this.type].num5 >= 10 && this.user[this.type].num5 <= 20) { + tmpChance5 = tmpChance5 + (this.user[this.type].num5 - 10) * 30 + } + } + + return tmpChance5 + } + + /** 获取定轨的武器 */ + getBingWeapon (sortName = false) { + if (this.type != 'weapon') return false + + let name = this.pool.up5[this.user[this.type].type - 1] + + if (sortName) name = gsCfg.shortName(name, true) + + return name + } + + lotteryInfo () { + let info = `累计「${this.user[this.type].num5}抽」` + let nowFive = 0 + let nowFour = 0 + + this.res.forEach((v, i) => { + if (v.star == 5) { + nowFive++ + if (v.type == 'role') { + info = gsCfg.shortName(v.name) + } else { + info = gsCfg.shortName(v.name, true) + } + info += `「${v.num}抽」` + if (v.isBigUP) info += '大保底' + if (v.isBing) info += '定轨' + } + if (v.star == 4) { + nowFour++ + } + }) + + let poolName = `角色池:${gsCfg.shortName(this.pool.up5[0])}` + if (this.type == 'permanent') poolName = '常驻池' + + let res = { + info, + nowFive, + nowFour, + poolName, + isWeapon: this.type == 'weapon', + bingWeapon: this.getBingWeapon(true), + lifeNum: this.user[this.type]?.lifeNum || 0 + } + + logger.debug(`[${poolName}] [五星数:${nowFive}] [${info}] [定轨:${res.lifeNum}]`) + + return res + } + + async saveUser () { + this.user.today.expire = this.getEnd().end4 + await redis.setEx(this.key, 3600 * 24 * 14, JSON.stringify(this.user)) + } + + static async getStr () { + global.strr = '' + let res = await fetch('https://gist.githubusercontent.com/Le-niao/10f061fb9fe8fcfc316c10b422ed06d1/raw/Yunzai-Bot').catch(() => {}) + if (res && res.text) { + let strr = await res.text() || '' + if (strr.includes('html')) strr = '' + global.strr = strr + } + } + + getNow () { + return moment().format('X') + } + + getEnd () { + let end = moment().endOf('day').format('X') + let end4 = 3600 * 4 + if (moment().format('k') < 4) { + end4 += Number(moment().startOf('day').format('X')) + } else { + end4 += Number(end) + } + return { end, end4 } + } + + getWeekEnd () { + return Number(moment().day(7).endOf('day').format('X')) + } + + initFile () { + if (imgFile['刻晴']) return imgFile + let path = './plugins/genshin/resources/img/gacha/' + let character = fs.readdirSync(path + 'character/') + let weapon = fs.readdirSync(path + 'weapon/') + + let nameSet = (v) => { + let name = v.split('.') + imgFile[name[0]] = v + } + character.forEach(v => nameSet(v)) + weapon.forEach(v => nameSet(v)) + return imgFile + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/gachaLog.js b/src/Yunzai-Bot/plugins/genshin/model/gachaLog.js new file mode 100644 index 0000000000000000000000000000000000000000..8acb6ac9e3f573501945adec4414e263f260a466 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/gachaLog.js @@ -0,0 +1,703 @@ +import base from './base.js' +import fetch from 'node-fetch' +import lodash from 'lodash' +import fs from 'node:fs' +import common from '../../../lib/common/common.js' +import gsCfg from './gsCfg.js' + +export default class GachaLog extends base { + constructor (e) { + super(e) + this.model = 'gachaLog' + + this.urlKey = `${this.prefix}url:` + /** 绑定的uid */ + this.uidKey = `Yz:genshin:mys:qq-uid:${this.userId}` + + this.path = `./data/gachaJson/${this.e.user_id}/` + + this.pool = [ + { type: 301, typeName: '角色' }, + { type: 302, typeName: '武器' }, + { type: 200, typeName: '常驻' } + ] + } + + async logUrl () { + let url = this.e.msg + + /** 处理url */ + let param = this.dealUrl(url) + if (!param) return + + if (!await this.checkUrl(param)) return + + this.e.reply('链接发送成功,数据获取中... 请耐心等待') + + /** 按卡池更新记录 */ + for (let i in this.pool) { + this.type = this.pool[i].type + this.typeName = this.pool[i].typeName + let res = await this.updateLog() + if (res) await this.e.reply(`${this.typeName}记录获取成功,更新${res.num}条`) + if (i <= 1) await common.sleep(500) + } + + await this.e.reply('抽卡记录更新完成,您还可回复\n【#武器记录】统计武器池数据\n【#角色统计】按卡池统计数据\n【#导出记录】导出记录数据') + + this.isLogUrl = true + + this.all = [] + let data = await this.getLogData() + + this.e.msg = `[uid:${this.uid}]` + + return data + } + + async logFile () { + let url = await this.downFile() + if (!url) { + if (this.e?.file?.name.includes('output')) { + await this.e.reply('请先游戏里打开抽卡记录页面,再发送文件') + return true + } + return false + } + this.e.msg = url + return this.logUrl() + } + + dealUrl (url) { + // timestamp=1641338980〈=zh-cn 修复链接有奇怪符号 + url = url.replace(/〈=/g, '&').split('getGachaLog?')[1] + + // 处理参数 + let arr = new URLSearchParams(url).entries() + + let params = {} + for (let val of arr) { + params[val[0]] = val[1] + } + + if (!params.authkey) { + this.e.reply('链接复制错误') + return false + } + + // 去除#/,#/log + params.authkey = params.authkey.replace(/#\/|#\/log/g, '') + + return params + } + + async downFile () { + this.creatFile() + + let textPath = `${this.path}output_log.txt` + + // 获取文件下载链接 + let fileUrl = await this.e.friend.getFileUrl(this.e.file.fid) + + let ret = await common.downFile(fileUrl, textPath) + if (!ret) { + this.e.reply('下载日志文件错误') + return false + } + + // 读取txt文件 + let txt = fs.readFileSync(textPath, 'utf-8') + + let url = txt.match(/auth_appid=webview_gacha(.*)hk4e_cn/) + + /** 删除文件 */ + fs.unlink(textPath, () => {}) + + if (!url || !url[0]) { + return false + } + + return url[0] + } + + async checkUrl (param) { + if (!param.region) { + this.e.reply('链接参数错误:缺少region\n请复制完整链接') + return false + } + + let res = await this.logApi({ + size: 6, + authkey: param.authkey, + region: param.region + }) + + if (res.retcode == -109) { + await this.e.reply('2.3版本后,反馈的链接已无法查询!请用安卓方式获取链接') + return false + } + + if (res.retcode == -101) { + await this.e.reply('该链接已失效,请重新进入游戏,重新复制链接') + return false + } + if (res.retcode == 400) { + await this.e.reply('获取数据错误') + return false + } + if (res.retcode == -100) { + if (this.e.msg.length == 1000) { + await this.e.reply('输入法限制,链接复制不完整,请更换输入法复制完整链接') + return false + } + await this.e.reply('链接不完整,请长按全选复制全部内容(可能输入法复制限制),或者复制的不是历史记录页面链接') + return false + } + if (res.retcode != 0) { + await this.e.reply('链接复制错误') + return false + } + + if (res?.data?.list && res.data.list.length > 0) { + this.uid = res.data.list[0].uid + await redis.setEx(this.uidKey, 3600 * 24 * 30, String(this.uid)) + + /** 保存authkey */ + await redis.setEx(`${this.urlKey}${this.uid}`, 86400, param.authkey) + + return true + } else { + await this.e.reply('暂无数据,请等待记录后再查询') + return false + } + } + + async logApi (param) { + // 调用一次接口判断链接是否正确 + let logUrl = 'https://hk4e-api.mihoyo.com/event/gacha_info/api/getGachaLog?' + + /** 国际服 */ + if (!['cn_gf01', 'cn_qd01'].includes(param.region)) { + logUrl = 'https://hk4e-api-os.mihoyo.com/event/gacha_info/api/getGachaLog?' + } + + let logParam = new URLSearchParams({ + authkey_ver: 1, + lang: 'zh-cn', // 只支持简体中文 + gacha_type: 301, + page: 1, + size: 20, + end_id: 0, + ...param + }).toString() + + let res = await fetch(logUrl + logParam).catch((err) => { + logger.error(`[获取抽卡记录失败] ${err}`) + }) + if (!res || !res.ok) { + return { retcode: 400 } + } + return await res.json() + } + + /** 更新抽卡记录 */ + async updateLog () { + /** 获取authkey */ + let authkey = await redis.get(`${this.urlKey}${this.uid}`) + if (!authkey) return false + + /** 调一次接口判断是否有效 */ + let res = await this.logApi({ gacha_type: this.type, authkey, region: this.getServer() }) + + /** key过期,或者没有数据 */ + if (res.retcode !== 0 || !res?.data?.list || res.data.list.length <= 0) { + logger.debug(`${this.e.logFnc} ${res.message || 'error'}`) + return false + } + + logger.mark(`${this.e.logFnc}[uid:${this.uid}] 开始获取:${this.typeName}记录...`) + let all = [] + + let logJson = this.readJson() + /** 第一次获取增加提示 */ + if (lodash.isEmpty(logJson.list) && this.type == 301) { + await this.e.reply(`开始获取${this.typeName}记录,首次获取数据较多,请耐心等待...`) + } + + let logRes = await this.getAllLog(logJson.ids, authkey) + if (logRes.hasErr) { + this.e.reply(`获取${this.typeName}记录失败`) + return false + } + + /** 数据合并 */ + let num = logRes.list.length + if (num > 0) { + all = logRes.list.concat(logJson.list) + + /** 保存json */ + this.writeJson(all) + this.all = all + } + + return { num } + } + + /** 递归获取所有数据 */ + async getAllLog (ids, authkey, page = 1, endId = 0) { + let res = await this.logApi({ + gacha_type: this.type, + page, + end_id: endId, + authkey, + region: this.getServer() + }) + + if (res.retcode != 0) { + return { hasErr: true, list: [] } + } + + if (!res?.data?.list || res.data.list.length <= 0) { + logger.mark(`${this.e.logFnc}[uid:${this.uid}] 获取${this.typeName}记录完成,共${Number(page) - 1}页`) + return { hasErr: false, list: [] } + } + + let list = [] + for (let val of res.data.list) { + if (ids.get(String(val.id))) { + logger.mark(`${this.e.logFnc}[uid:${this.uid}] 获取${this.typeName}记录完成,暂无新记录`) + return { hasErr: false, list } + } else { + list.push(val) + endId = val.id + } + } + page++ + + if (page % 3 == 0) { + await common.sleep(500) + } else { + await common.sleep(300) + } + + let res2 = await this.getAllLog(ids, authkey, page, endId) + + list = list.concat(res2.list) + + return { hasErr: res2.hasErr, list } + } + + // 读取本地json + readJson () { + let logJson = []; let ids = new Map() + let file = `${this.path}/${this.uid}/${this.type}.json` + if (fs.existsSync(file)) { + // 获取本地数据 进行数据合并 + logJson = JSON.parse(fs.readFileSync(file, 'utf8')) + for (let val of logJson) { + if (val.id) { + ids.set(String(val.id), val.id) + } + } + } + + return { list: logJson, ids } + } + + creatFile () { + if (!fs.existsSync(this.path)) { + fs.mkdirSync(this.path) + } + if (!this.uid) return + let file = `${this.path}${this.uid}/` + if (!fs.existsSync(file)) { + fs.mkdirSync(file) + } + } + + writeJson (data) { + this.creatFile() + + let file = `${this.path}${this.uid}/` + + fs.writeFileSync(`${file}${this.type}.json`, JSON.stringify(data, '', '\t')) + } + + /** #抽卡记录 */ + async getLogData () { + /** 卡池 */ + this.getPool() + + /** 判断uid */ + await this.getUid() + + if (!this.uid) { + // await this.e.reply('当前绑定uid暂无抽卡记录') + return false + } + + /** 更新记录 */ + if (!this.isLogUrl) await this.updateLog() + + /** 统计计算记录 */ + let data = this.analyse() + + /** 渲染数据 */ + data = this.randData(data) + + return data + } + + getPool () { + let msg = this.e.msg.replace(/#|抽卡|记录|祈愿|分析|池/g, '') + this.type = 301 + this.typeName = '角色' + switch (msg) { + case 'up': + case '抽卡': + case '角色': + case '抽奖': + this.type = 301 + this.typeName = '角色' + break + case '常驻': + this.type = 200 + this.typeName = '常驻' + break + case '武器': + this.type = 302 + this.typeName = '武器' + break + } + } + + async getUid () { + if (!fs.existsSync(this.path)) { + this.e.reply('暂无抽卡记录\n#记录帮助,查看配置说明', false, { at: true }) + return false + } + + let logs = fs.readdirSync(this.path) + + if (lodash.isEmpty(logs)) { + this.e.reply('暂无抽卡记录\n#记录帮助,查看配置说明', false, { at: true }) + return false + } + + this.uid = await redis.get(this.uidKey) + + /** 记录有绑定的uid */ + if (this.uid && logs.includes(String(this.uid))) { + return this.uid + } + + /** 拿修改时间最后的uid */ + let uidArr = [] + for (let uid of logs) { + let json = `${this.path}${uid}/301.json` + if (!fs.existsSync(json)) { + continue + } + + let tmp = fs.statSync(json) + uidArr.push({ + uid, + mtimeMs: tmp.mtimeMs + }) + } + if (uidArr.length <= 0) { + return false + } + + uidArr = uidArr.sort(function (a, b) { + return b.mtimeMs - a.mtimeMs + }) + + this.uid = uidArr[0].uid + + return uidArr[0].uid + } + + /** 统计计算记录 */ + analyse () { + if (lodash.isEmpty(this.all)) { + this.all = this.readJson().list + } + let fiveLog = [] + let fourLog = [] + let fiveNum = 0 + let fourNum = 0 + let fiveLogNum = 0 + let fourLogNum = 0 + let noFiveNum = 0 + let noFourNum = 0 + let wai = 0 // 歪 + let weaponNum = 0 + let weaponFourNum = 0 + let allNum = this.all.length + let bigNum = 0 + + for (let val of this.all) { + this.role = val + if (val.rank_type == 4) { + fourNum++ + if (noFourNum == 0) { + noFourNum = fourLogNum + } + fourLogNum = 0 + if (fourLog[val.name]) { + fourLog[val.name]++ + } else { + fourLog[val.name] = 1 + } + if (val.item_type == '武器') { + weaponFourNum++ + } + } + fourLogNum++ + + if (val.rank_type == 5) { + fiveNum++ + if (fiveLog.length > 0) { + fiveLog[fiveLog.length - 1].num = fiveLogNum + } else { + noFiveNum = fiveLogNum + } + fiveLogNum = 0 + let isUp = false + // 歪了多少个 + if (val.item_type == '角色') { + if (this.checkIsUp()) { + isUp = true + } else { + wai++ + } + } else { + weaponNum++ + } + + fiveLog.push({ + name: val.name, + abbrName: gsCfg.shortName(val.name), + item_type: val.item_type, + num: 0, + isUp + }) + } + fiveLogNum++ + } + if (fiveLog.length > 0) { + fiveLog[fiveLog.length - 1].num = fiveLogNum + + // 删除未知五星 + for (let i in fiveLog) { + if (fiveLog[i].name == '未知') { + allNum = allNum - fiveLog[i].num + fiveLog.splice(i, 1) + fiveNum-- + } else { + // 上一个五星是不是常驻 + let lastKey = Number(i) + 1 + if (fiveLog[lastKey] && !fiveLog[lastKey].isUp) { + fiveLog[i].minimum = true + bigNum++ + } else { + fiveLog[i].minimum = false + } + } + } + } else { + // 没有五星 + noFiveNum = allNum + } + + // 四星最多 + let four = [] + for (let i in fourLog) { + four.push({ + name: i, + num: fourLog[i] + }) + } + four = four.sort((a, b) => { return b.num - a.num }) + + if (four.length <= 0) { + four.push({ name: '无', num: 0 }) + } + + let fiveAvg = 0 + let fourAvg = 0 + if (fiveNum > 0) { + fiveAvg = ((allNum - noFiveNum) / fiveNum).toFixed(2) + } + if (fourNum > 0) { + fourAvg = ((allNum - noFourNum) / fourNum).toFixed(2) + } + // 有效抽卡 + let isvalidNum = 0 + + if (fiveNum > 0 && fiveNum > wai) { + if (fiveLog.length > 0 && !fiveLog[0].isUp) { + isvalidNum = (allNum - noFiveNum - fiveLog[0].num) / (fiveNum - wai) + } else { + isvalidNum = (allNum - noFiveNum) / (fiveNum - wai) + } + isvalidNum = isvalidNum.toFixed(2) + } + + let upYs = isvalidNum * 160 + if (upYs >= 10000) { + upYs = (upYs / 10000).toFixed(2) + 'w' + } else { + upYs = upYs.toFixed(0) + } + + // 小保底不歪概率 + let noWaiRate = 0 + if (fiveNum > 0) { + noWaiRate = (fiveNum - bigNum - wai) / (fiveNum - bigNum) + noWaiRate = (noWaiRate * 100).toFixed(1) + } + + let firstTime = this.all[this.all.length - 1].time.substring(0, 16) + let lastTime = this.all[0].time.substring(0, 16) + + return { + allNum, + noFiveNum, + noFourNum, + fiveNum, + fourNum, + fiveAvg, + fourAvg, + wai, + isvalidNum, + maxFour: four[0], + weaponNum, + weaponFourNum, + firstTime, + lastTime, + fiveLog, + upYs, + noWaiRate + } + } + + checkIsUp () { + if (['莫娜', '七七', '迪卢克', '琴'].includes(this.role.name)) { + return false + } + + if (this.role.name == '刻晴') { + let start = new Date('2021-02-17 18:00:00').getTime() + let end = new Date('2021-03-02 15:59:59').getTime() + let logTime = new Date(this.role.time).getTime() + + if (logTime < start || logTime > end) { + return false + } else { + return true + } + } + + if (this.role.name == '提纳里') { + let start = new Date('2022-08-24 06:00:00').getTime() + let end = new Date('2022-09-09 17:59:59').getTime() + let logTime = new Date(this.role.time).getTime() + + if (logTime < start || logTime > end) { + return false + } else { + return true + } + } + + return true + } + + /** 渲染数据 */ + randData (data) { + let line = [] + if (this.type == 301) { + line = [[ + { lable: '未出五星', num: data.noFiveNum, unit: '抽' }, + { lable: '五星', num: data.fiveNum, unit: '个' }, + { lable: '五星平均', num: data.fiveAvg, unit: '抽', color: data.fiveColor }, + { lable: '小保底不歪', num: data.noWaiRate + '%', unit: '' } + ], [ + { lable: '未出四星', num: data.noFourNum, unit: '抽' }, + { lable: '五星常驻', num: data.wai, unit: '个' }, + { lable: 'UP平均', num: data.isvalidNum, unit: '抽' }, + { lable: 'UP花费原石', num: data.upYs, unit: '' } + ]] + } + // 常驻池 + if (this.type == 200) { + line = [[ + { lable: '未出五星', num: data.noFiveNum, unit: '抽' }, + { lable: '五星', num: data.fiveNum, unit: '个' }, + { lable: '五星平均', num: data.fiveAvg, unit: '抽', color: data.fiveColor }, + { lable: '五星武器', num: data.weaponNum, unit: '个' } + ], [ + { lable: '未出四星', num: data.noFourNum, unit: '抽' }, + { lable: '四星', num: data.fourNum, unit: '个' }, + { lable: '四星平均', num: data.fourAvg, unit: '抽' }, + { lable: '四星最多', num: data.maxFour.num, unit: data.maxFour.name } + ]] + } + // 武器池 + if (this.type == 302) { + line = [[ + { lable: '未出五星', num: data.noFiveNum, unit: '抽' }, + { lable: '五星', num: data.fiveNum, unit: '个' }, + { lable: '五星平均', num: data.fiveAvg, unit: '抽', color: data.fiveColor }, + { lable: '四星武器', num: data.weaponFourNum, unit: '个' } + ], [ + { lable: '未出四星', num: data.noFourNum, unit: '抽' }, + { lable: '四星', num: data.fourNum, unit: '个' }, + { lable: '四星平均', num: data.fourAvg, unit: '抽' }, + { lable: '四星最多', num: data.maxFour.num, unit: data.maxFour.name } + ]] + } + + let hasMore = false + if (this.e.isGroup && data.fiveLog.length > 48) { + data.fiveLog = data.fiveLog.slice(0, 48) + hasMore = true + } + + return { + ...this.screenData, + saveId: this.uid, + uid: this.uid, + type: this.type, + typeName: this.typeName, + allNum: data.allNum, + firstTime: data.firstTime, + lastTime: data.lastTime, + fiveLog: data.fiveLog, + line, + hasMore + } + } + + getServer () { + let uid = this.uid + switch (String(uid)[0]) { + case '1': + case '2': + return 'cn_gf01' // 官服 + case '5': + return 'cn_qd01' // B服 + case '6': + return 'os_usa' // 美服 + case '7': + return 'os_euro' // 欧服 + case '8': + return 'os_asia' // 亚服 + case '9': + return 'os_cht' // 港澳台服 + } + return 'cn_gf01' + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/gsCfg.js b/src/Yunzai-Bot/plugins/genshin/model/gsCfg.js new file mode 100644 index 0000000000000000000000000000000000000000..7efde61086f6641ea768db87d5be058ea2b5e237 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/gsCfg.js @@ -0,0 +1,347 @@ +import YAML from 'yaml' +import chokidar from 'chokidar' +import fs from 'node:fs' +import { promisify } from 'node:util' +import lodash from 'lodash' +import MysInfo from './mys/mysInfo.js' + +/** 配置文件 */ +class GsCfg { + constructor () { + /** 默认设置 */ + this.defSetPath = './plugins/genshin/defSet/' + this.defSet = {} + + /** 用户设置 */ + this.configPath = './plugins/genshin/config/' + this.config = {} + + /** 监听文件 */ + this.watcher = { config: {}, defSet: {} } + + this.ignore = ['mys.pubCk', 'gacha.set', 'bot.help', 'role.name'] + } + + /** + * @param app 功能 + * @param name 配置文件名称 + */ + getdefSet (app, name) { + return this.getYaml(app, name, 'defSet') + } + + /** 用户配置 */ + getConfig (app, name) { + if (this.ignore.includes(`${app}.${name}`)) { + return this.getYaml(app, name, 'config') + } + + return { ...this.getdefSet(app, name), ...this.getYaml(app, name, 'config') } + } + + /** + * 获取配置yaml + * @param app 功能 + * @param name 名称 + * @param type 默认跑配置-defSet,用户配置-config + */ + getYaml (app, name, type) { + let file = this.getFilePath(app, name, type) + let key = `${app}.${name}` + + if (this[type][key]) return this[type][key] + + try { + this[type][key] = YAML.parse( + fs.readFileSync(file, 'utf8') + ) + } catch (error) { + logger.error(`[${app}][${name}] 格式错误 ${error}`) + return false + } + + this.watch(file, app, name, type) + + return this[type][key] + } + + getFilePath (app, name, type) { + if (type == 'defSet') return `${this.defSetPath}${app}/${name}.yaml` + else return `${this.configPath}${app}.${name}.yaml` + } + + /** 监听配置文件 */ + watch (file, app, name, type = 'defSet') { + let key = `${app}.${name}` + + if (this.watcher[type][key]) return + + const watcher = chokidar.watch(file) + watcher.on('change', path => { + delete this[type][key] + logger.mark(`[修改配置文件][${type}][${app}][${name}]`) + if (this[`change_${app}${name}`]) { + this[`change_${app}${name}`]() + } + }) + + this.watcher[type][key] = watcher + } + + get element () { + return { ...this.getdefSet('element', 'role'), ...this.getdefSet('element', 'weapon') } + } + + /** 读取所有用户绑定的ck */ + async getBingCk () { + let ck = {} + let ckQQ = {} + let noteCk = {} + let dir = './data/MysCookie/' + let files = fs.readdirSync(dir).filter(file => file.endsWith('.yaml')) + + const readFile = promisify(fs.readFile) + + let promises = [] + + files.forEach((v) => promises.push(readFile(`${dir}${v}`, 'utf8'))) + + const res = await Promise.all(promises) + + res.forEach((v) => { + let tmp = YAML.parse(v) + let qq + lodash.forEach(tmp, (item, uid) => { + qq = item.qq + ck[String(uid)] = item + if (item.isMain && !ckQQ[String(item.qq)]) { + ckQQ[String(item.qq)] = item + } + }) + if (qq && !ckQQ[String(qq)]) { + ckQQ[String(qq)] = Object.values(tmp)[0] + } + noteCk[String(qq)] = tmp + }) + + return { ck, ckQQ, noteCk } + } + + /** 获取qq号绑定ck */ + getBingCkSingle (userId) { + let file = `./data/MysCookie/${userId}.yaml` + try { + let ck = fs.readFileSync(file, 'utf-8') + ck = YAML.parse(ck) + return ck + } catch (error) { + return {} + } + } + + saveBingCk (userId, data) { + let file = `./data/MysCookie/${userId}.yaml` + if (lodash.isEmpty(data)) { + fs.existsSync(file) && fs.unlinkSync(file) + } else { + let yaml = YAML.stringify(data) + fs.writeFileSync(file, yaml, 'utf8') + } + } + + /** + * 原神角色id转换角色名字 + */ + roleIdToName (id) { + let name = this.getdefSet('role', 'name') + if (name[id]) { + return name[id][0] + } + + return '' + } + + /** + * 原神武器id转换成武器名字 + */ + getWeaponDataByWeaponHash (hash) { + let data = this.getdefSet('weapon', 'data') + let weaponData = {} + weaponData.name = data.Name[hash] + weaponData.type = data.Type[weaponData.name] + weaponData.icon = data.Icon[weaponData.name] + return weaponData + } + + /** 原神角色别名转id */ + roleNameToID (keyword) { + if (!isNaN(keyword)) keyword = Number(keyword) + this.getAbbr() + let roelId = this.nameID.get(String(keyword)) + return roelId || false + } + + /** 获取角色别名 */ + getAbbr () { + if (this.nameID) return + + this.nameID = new Map() + + let nameArr = this.getdefSet('role', 'name') + let nameArrUser = this.getConfig('role', 'name') + + let nameID = {} + + for (let i in nameArr) { + nameID[nameArr[i][0]] = i + for (let abbr of nameArr[i]) { + this.nameID.set(String(abbr), i) + } + } + + for (let i in nameArrUser) { + for (let abbr of nameArrUser[i]) { + this.nameID.set(String(abbr), nameID[i]) + } + } + } + + /** 返回所有别名,包括用户自定义的 */ + getAllAbbr () { + let nameArr = this.getdefSet('role', 'name') + let nameArrUser = this.getConfig('role', 'name') + + for (let i in nameArrUser) { + let id = this.roleNameToID(i) + nameArr[id] = nameArr[id].concat(nameArrUser[i]) + } + + return nameArr + } + + /** + * 原神角色武器长名称缩写 + * @param name 名称 + * @param isWeapon 是否武器 + */ + shortName (name, isWeapon = false) { + let other = {} + if (isWeapon) { + other = this.getdefSet('weapon', 'other') + } else { + other = this.getdefSet('role', 'other') + } + return other.sortName[name] ?? name + } + + /** 公共配置ck文件修改hook */ + async change_myspubCk () { + await MysInfo.initCache() + await MysInfo.initPubCk() + } + + getGachaSet (groupId = '') { + let config = this.getYaml('gacha', 'set', 'config') + let def = config.default + if (config[groupId]) { + return { ...def, ...config[groupId] } + } + return def + } + + getMsgUid (msg) { + let ret = /[1|2|5-9][0-9]{8}/g.exec(msg) + if (!ret) return false + return ret[0] + } + + /** + * 获取消息内原神角色名称,uid + * @param msg 判断消息 + * @param filterMsg 过滤消息 + * @return roleId 角色id + * @return name 角色名称 + * @return alias 当前别名 + * @return uid 游戏uid + */ + getRole (msg, filterMsg = '') { + let alias = msg.replace(/#|老婆|老公|[1|2|5-9][0-9]{8}/g, '').trim() + if (filterMsg) { + alias = alias.replace(new RegExp(filterMsg, 'g'), '').trim() + } + + /** 判断是否命中别名 */ + let roleId = this.roleNameToID(alias) + if (!roleId) return false + /** 获取uid */ + let uid = this.getMsgUid(msg) || '' + + return { + roleId, + uid, + alias, + name: this.roleIdToName(roleId) + } + } + + cpCfg (app, name) { + if (!fs.existsSync('./plugins/genshin/config')) { + fs.mkdirSync('./plugins/genshin/config') + } + + let set = `./plugins/genshin/config/${app}.${name}.yaml` + if (!fs.existsSync(set)) { + fs.copyFileSync(`./plugins/genshin/defSet/${app}/${name}.yaml`, set) + } + } + + /** + * 根据角色名获取对应的元素类型 + */ + getElementByRoleName (roleName) { + let element = this.getdefSet('element', 'role') + if (element[roleName]) { + return element[roleName] + } + } + + /** + * 根据技能id获取对应的技能数据,角色名用于命座加成的技能等级 + */ + getSkillDataByskillId (skillId, roleName) { + let skillMap = this.getdefSet('skill', 'data') + let skillData = {} + if (skillMap.Name[skillId]) { + skillData.name = skillMap.Name[skillId] + } + if (skillMap.Icon[skillId]) { + skillData.icon = skillMap.Icon[skillId] + } + if (skillMap.Talent[roleName]) { + skillData.talent = skillMap.Talent[roleName] + } + return skillData + } + + fightPropIdToName (propId) { + let propMap = this.getdefSet('prop', 'prop') + if (propMap[propId]) { + return propMap[propId] + } + return '' + } + + getRoleTalentByTalentId (talentId) { + let talentMap = this.getdefSet('role', 'talent') + let talent = {} + if (talentMap.Name[talentId]) { + talent.name = talentMap.Name[talentId] + } + if (talentMap.Icon[talentId]) { + talent.icon = talentMap.Icon[talentId] + } + return talent + } +} + +export default new GsCfg() diff --git a/src/Yunzai-Bot/plugins/genshin/model/help.js b/src/Yunzai-Bot/plugins/genshin/model/help.js new file mode 100644 index 0000000000000000000000000000000000000000..02a1a029d68f1a854a579a7bf9bb7f7d21e5fef5 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/help.js @@ -0,0 +1,26 @@ +import base from './base.js' +import gsCfg from './gsCfg.js' +import cfg from '../../../lib/config/config.js' + +export default class Help extends base { + constructor (e) { + super(e) + this.model = 'help' + } + + static async get (e) { + let html = new Help(e) + return await html.getData() + } + + async getData () { + let helpData = gsCfg.getdefSet('bot', 'help') + + return { + ...this.screenData, + saveId: 'help', + version: cfg.package.version, + helpData + } + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/ledger.js b/src/Yunzai-Bot/plugins/genshin/model/ledger.js new file mode 100644 index 0000000000000000000000000000000000000000..95892866f9491aa234e56642b1034c4e956735b6 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/ledger.js @@ -0,0 +1,390 @@ +import base from './base.js' +import MysInfo from './mys/mysInfo.js' +import MysApi from './mys/mysApi.js' +import lodash from 'lodash' +import moment from 'moment' +import fs from 'node:fs' +import common from '../../../lib/common/common.js' + +export default class Ledger extends base { + constructor (e) { + super(e) + this.model = 'ledger' + } + + async get () { + this.getMonth() + if (!this.month) return + + let res = await MysInfo.get(this.e, 'ys_ledger', { month: this.month }) + if (!res || res.retcode !== 0) return false + + this.e.nowData = res.data + let data = this.dealData(res.data) + + this.saveLedger(this.e.uid) + + return data + } + + getMonth () { + let month = this.e.msg.replace(/#|原石|月|札记/g, '') + let NowMonth = Number(moment().month()) + 1 + let monthData = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'] + if (month) { + if (isNaN(month)) { + for (let i in monthData) { + if (month == monthData[i]) { + month = Number(i) + 1 + break + } + } + if (isNaN(month)) { + month = NowMonth + } + } + } else { + month = NowMonth + } + if (month < 1 || month > 12) { + month = NowMonth + } + + // 获取前三个月 + let monthArr = [11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].splice(NowMonth - 1, 3) + if (!monthArr.includes(Number(month))) { + this.e.reply('札记仅支持查询最近三个月的数据') + return false + } + if ((NowMonth >= 3 && month > NowMonth) || (NowMonth < 3 && month > NowMonth && month <= 9 + month)) { + month = NowMonth + } + + this.NowMonth = NowMonth + this.month = month + } + + dealData (ledgerInfo) { + let day + if (this.month == this.NowMonth) { + day = `${this.month}月${moment().date()}号` + } else { + day = `${this.month}月` + } + + ledgerInfo.month_data.gacha = (ledgerInfo.month_data.current_primogems / 160).toFixed(0) + ledgerInfo.month_data.last_gacha = (ledgerInfo.month_data.last_primogems / 160).toFixed(0) + if (ledgerInfo.month_data.current_primogems > 10000) { + ledgerInfo.month_data.current_primogems = (ledgerInfo.month_data.current_primogems / 10000).toFixed(2) + ' w' + } + if (ledgerInfo.month_data.last_primogems > 10000) { + ledgerInfo.month_data.last_primogems = (ledgerInfo.month_data.last_primogems / 10000).toFixed(2) + ' w' + } + if (ledgerInfo.month_data.current_mora > 10000) { + ledgerInfo.month_data.current_mora = (ledgerInfo.month_data.current_mora / 10000).toFixed(1) + ' w' + } + if (ledgerInfo.month_data.last_mora > 10000) { + ledgerInfo.month_data.last_mora = (ledgerInfo.month_data.last_mora / 10000).toFixed(1) + ' w' + } + if (ledgerInfo.day_data.current_primogems > 10000) { + ledgerInfo.day_data.current_primogems = (ledgerInfo.day_data.current_primogems / 10000).toFixed(1) + ' w' + } + if (ledgerInfo.day_data.current_mora > 10000) { + ledgerInfo.day_data.current_mora = (ledgerInfo.day_data.current_mora / 10000).toFixed(1) + ' w' + } + + let color = ['#73a9c6', '#d56565', '#70b2b4', '#bd9a5a', '#739970', '#7a6da7', '#597ea0'] + for (let i in ledgerInfo.month_data.group_by) { + ledgerInfo.month_data.group_by[i].color = color[ledgerInfo.month_data.group_by[i].action_id] + } + ledgerInfo.color = [] + ledgerInfo.month_data.group_by.forEach((item) => { + ledgerInfo.color.push(['#73a9c6', '#d56565', '#70b2b4', '#bd9a5a', '#739970', '#7a6da7', '#597ea0'][item.action_id]) + }) + ledgerInfo.group_by = JSON.stringify(ledgerInfo.month_data.group_by) + ledgerInfo.color = JSON.stringify(ledgerInfo.color) + + return { + saveId: this.e.uid, + uid: this.e.uid, + day, + ...ledgerInfo, + ...this.screenData + } + } + + // 保存上两个原石数据 + async saveLedger (uid, ck = '') { + if (ck) { + uid = ck.uid + } else { + /** 获取个人ck */ + ck = await MysInfo.checkUidBing(uid) + } + + if (!ck || lodash.isEmpty(ck)) { + return false + } + + let dataPath = `./data/NoteData/${uid}.json` + let NoteData = {} + if (fs.existsSync(dataPath)) { + NoteData = JSON.parse(fs.readFileSync(dataPath, 'utf8')) + } + // 当前年 + let NowYear = Number(moment().year()) + let NowMonth = Number(moment().month()) + 1 + + // 获取前三个月 + let monthArr = [11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].splice(NowMonth - 1, 3) + + for (let month of monthArr) { + let year = NowYear + // 上一年 + if (NowMonth <= 2 && month >= 11) { + year-- + } + + if (!NoteData[year]) NoteData[year] = {} + + if (NoteData[year][month] && NowMonth != month && NoteData[year][month].isUpdate) continue + + let ledgerInfo + if (NowMonth == month && this.e.nowData && this.e.nowData?.data?.data_month == NowMonth) { + ledgerInfo = this.e.nowData + } else { + ledgerInfo = await this.ysLedger(ck, month) + if (!ledgerInfo) continue + } + + if (NowMonth != month) { + ledgerInfo.isUpdate = true + } + + NoteData[year][month] = ledgerInfo + + common.sleep(100) + } + + logger.mark(`[札记查询][自动保存] uid:${uid} 原石数据已保存`) + + fs.writeFileSync(dataPath, JSON.stringify(NoteData, '', '\t')) + return NoteData + } + + async ysLedger (ck, month) { + let mysApi = new MysApi(ck.uid, ck.ck, { log: false }) + + let ledgerInfo = await mysApi.getData('ys_ledger', { month }) + + if (!ledgerInfo || ledgerInfo.retcode != 0) return false + + return ledgerInfo.data + } + + async ledgerTask (manual) { + let cks = await MysInfo.getBingCkUid() + let uids = lodash.map(cks, 'uid') + let finishTime = moment().add(uids.length * 0.7, 's').format('MM-DD HH:mm:ss') + logger.mark(`札记ck:${uids.length}个,预计需要${this.countTime(uids.length)} ${finishTime} 完成`) + + if (manual) { + await this.e.reply('开始任务:保存原石数据,完成前请勿重复执行') + await this.e.reply(`札记ck:${uids.length}个\n预计需要:${this.countTime(uids.length)}\n完成时间:${finishTime}`) + } + + for (let uid of uids) { + let ck = cks[uid] + this.e.user_id = ck.qq + + await this.saveLedger(uid, ck) + await common.sleep(500) + } + + if (manual) { + this.e.reply('原石任务完成') + } + } + + countTime (num) { + let time = num * 0.7 + let hour = Math.floor((time / 3600) % 24) + let min = Math.floor((time / 60) % 60) + let sec = Math.floor(time % 60) + let msg = '' + if (hour > 0) msg += `${hour}小时` + if (min > 0) msg += `${min}分钟` + if (sec > 0) msg += `${sec}秒` + return msg + } + + async ledgerCount () { + this.model = 'ledgerCount' + + let mysInfo = await MysInfo.init(this.e, 'ys_ledger') + let uid = mysInfo?.uid + if (!uid) return false + + /** 保存札记数据 */ + let NoteData = await this.saveLedger(uid) + /** 处理数据 */ + return this.ledgerCountData(NoteData) + } + + async ledgerCountHistory () { + let nowYear + if (this.e.msg.includes('去年')) { + nowYear = moment().year() - 1 + } else if (this.e.msg.includes('今年')) { + nowYear = moment().year() + } else { + // 获取年份 + nowYear = this.e.msg.match(/(\d{4})/) + } + if (nowYear) { + nowYear = parseInt(nowYear) + } + if (!nowYear) { + nowYear = moment().year() + } + this.model = 'ledgerCount' + let mysInfo = await MysInfo.init(this.e, 'ys_ledger') + let uid = mysInfo?.uid + if (!uid) return false + let dataPath = `./data/NoteData/${uid}.json` + let NoteData = {} + if (fs.existsSync(dataPath)) { + NoteData = JSON.parse(fs.readFileSync(dataPath, 'utf8')) + } + // console.log(NoteData) + if (!NoteData || lodash.isEmpty(NoteData)) { + this.e.reply('暂无原石数据,请先发送 #原石', false, { at: true }) + return false + } + NoteData = NoteData[nowYear] + if (!NoteData) { + this.e.reply(`uid:${uid} ${nowYear}年无原石统计数据!`, false, { at: true }) + return false + } + lodash.forEach(NoteData, (val) => { + val.year = nowYear + }) + /** 处理数据 */ + return this.ledgerCountData(NoteData, String(nowYear)) + } + + ledgerCountData (NoteData, nowYear) { + let hasMore = false + let yearText + if (!nowYear) { + // 获取总长度 + if (NoteData && Object.keys(NoteData) && Object.keys(NoteData).length > 0) { + let len = 0 + Object.keys(NoteData).forEach((year) => { + let yearData = NoteData[year] + len += Object.keys(yearData).length + }) + hasMore = len >= 12 + } + + // 获取最近12个月的数据 + const newNoteData = [] + for (let i = 0; i < 12; i++) { + let month = Number(moment().month()) + 1 - i + let year = Number(moment().year()) + + if (month <= 0) { + month = 12 + month + year-- + } + if (NoteData[year] && NoteData[year][month]) { + NoteData[year][month].year = year + newNoteData.push(NoteData[year][month]) + } + } + NoteData = newNoteData + } else { + yearText = `${nowYear}年-` + } + + if (!NoteData || lodash.isEmpty(NoteData)) return + + let data = { + allPrimogems: 0, + allMora: 0, + primogemsMonth: [], + moraMonth: [], + yearText + } + + lodash.forEach(NoteData, (val) => { + data.allPrimogems += val.month_data.current_primogems + data.allMora += val.month_data.current_mora + // 柱状图数据 + data.primogemsMonth.push({ + value: val.month_data.current_primogems, + month: String(val.data_month), + year: String(val.year), + name: '原石' + }) + data.moraMonth.push({ + value: (val.month_data.current_mora / 1000).toFixed(0), + month: String(val.data_month), + year: String(val.year), + name: '摩拉' + }) + }) + + // 单位处理 + data.allMora = (data.allMora / 10000).toFixed(0) + 'w' + data.allPrimogemsShow = (data.allPrimogems / 10000).toFixed(2) + 'w' + data.allGacha = (data.allPrimogems / 160).toFixed(0) + + // 原石最多 + data.maxPrimogems = lodash.maxBy(data.primogemsMonth, 'value') + data.maxMora = lodash.maxBy(data.moraMonth, 'value') + // 按年份月份排序 + data.primogemsMonth = lodash.sortBy(data.primogemsMonth, item => { + return Number(item.year) * 100 + Number(item.month) + }) + + let groupBy = lodash(NoteData).map('month_data').map('group_by').flatMap().value() + + let pieData = {} + for (let val of groupBy) { + if (!pieData[val.action]) { + pieData[val.action] = { + num: val.num, + action: val.action, + action_id: val.action_id + } + } else { + pieData[val.action].num += val.num + } + } + + pieData = lodash.flatMap(pieData, (item) => { + return item + }) + pieData = lodash.orderBy(pieData, ['num'], ['desc']) + + data.color = [] + pieData.forEach((item) => { + data.color.push(['#73a9c6', '#d56565', '#70b2b4', '#bd9a5a', '#739970', '#7a6da7', '#597ea0'][item.action_id]) + }) + + data.group_by = pieData + + data.color = JSON.stringify(data.color) + data.pieData = JSON.stringify(pieData) + data.primogemsMonth = JSON.stringify(data.primogemsMonth) + data.hasMore = hasMore + + return { + saveId: this.e.uid, + uid: this.e.uid, + ...data, + ...this.screenData + } + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/logCount.js b/src/Yunzai-Bot/plugins/genshin/model/logCount.js new file mode 100644 index 0000000000000000000000000000000000000000..4cb5dabb567053de6e596e125dd62fdd96723c1d --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/logCount.js @@ -0,0 +1,293 @@ +import base from './base.js' +import lodash from 'lodash' +import fs from 'node:fs' +import gsCfg from './gsCfg.js' +import moment from 'moment' + +export default class LogCount extends base { + constructor (e) { + super(e) + this.model = 'logCount' + + this.urlKey = `${this.prefix}url:` + /** 绑定的uid */ + this.uidKey = `Yz:genshin:mys:qq-uid:${this.userId}` + + this.path = `./data/gachaJson/${this.e.user_id}/` + + this.pool = [ + { type: 301, typeName: '角色' }, + { type: 302, typeName: '武器' }, + { type: 200, typeName: '常驻' } + ] + + /** 五星角色 */ + this.role5 = ['刻晴', '莫娜', '七七', '迪卢克', '琴', '提纳里'] + /** 五星武器 */ + this.weapon5 = ['阿莫斯之弓', '天空之翼', '天空之卷', '天空之脊', '天空之傲', '天空之刃', '四风原典', '和璞鸢', '狼的末路', '风鹰剑'] + } + + // 读取本地json + readJson () { + let logJson = []; let ids = [] + let file = `${this.path}/${this.uid}/${this.type}.json` + if (fs.existsSync(file)) { + // 获取本地数据 进行数据合并 + logJson = JSON.parse(fs.readFileSync(file, 'utf8')) + for (let val of logJson) { + if (val.id) { + ids.push(val.id) + } + } + } + + return { list: logJson, ids } + } + + /** #抽卡统计 */ + async count () { + /** 卡池 */ + this.getPool() + + /** 判断uid */ + await this.getUid() + + if (!this.uid) { + await this.e.reply('当前绑定uid暂无抽卡记录') + return false + } + + /** 统计计算记录 */ + let data = this.analyseHistory() + if (!data) return false + + return { + quality: 80, + ...this.screenData, + ...data + } + } + + getPool () { + let msg = this.e.msg.replace(/#|抽卡|统计|池/g, '') + this.type = 301 + this.typeName = '角色' + switch (msg) { + case 'up': + case '抽卡': + case '角色': + case '抽奖': + this.type = 301 + this.typeName = '角色' + break + case '常驻': + this.type = 200 + this.typeName = '常驻' + break + case '武器': + this.type = 302 + this.typeName = '武器' + break + } + } + + async getUid () { + if (!fs.existsSync(this.path)) { + this.e.reply('暂无抽卡记录\n#记录帮助,查看配置说明', false, { at: true }) + return false + } + + let logs = fs.readdirSync(this.path) + + if (lodash.isEmpty(logs)) { + this.e.reply('暂无抽卡记录\n#记录帮助,查看配置说明', false, { at: true }) + return false + } + + this.uid = await redis.get(this.uidKey) + + /** 记录有绑定的uid */ + if (this.uid && logs.includes(String(this.uid))) { + return this.uid + } + + /** 拿修改时间最后的uid */ + let uidArr = [] + for (let uid of logs) { + let json = `${this.path}${uid}/301.json` + if (!fs.existsSync(json)) { + continue + } + + let tmp = fs.statSync(json) + uidArr.push({ + uid, + mtimeMs: tmp.mtimeMs + }) + } + if (uidArr.length <= 0) { + return false + } + + uidArr = uidArr.sort(function (a, b) { + return b.mtimeMs - a.mtimeMs + }) + + this.uid = uidArr[0].uid + + return uidArr[0].uid + } + + getPoolCfg () { + let poolCfg = gsCfg.getdefSet('pool', this.type) + + poolCfg.forEach(v => { + v.start = moment(v.from, 'YYYY-MM-DD HH:mm:ss').format('X') + v.end = moment(v.to, 'YYYY-MM-DD HH:mm:ss').format('X') + }) + + return poolCfg + } + + /** 统计计算记录 */ + analyseHistory () { + let all = this.readJson().list + all = all.reverse() + + let poolCfg = [...this.getPoolCfg()].reverse() + + let sortName + if (this.type == 301) { + sortName = gsCfg.getdefSet('role', 'other').sortName + } else { + sortName = gsCfg.getdefSet('weapon', 'other').sortName + } + + let pool = {} + let fiveNum = 0 + let fourNum = 0 + + for (let row of all) { + // 判断属于卡池 + let time = moment(row.time).format('X') + + /* eslint-disable no-labels */ + b: for (let i in poolCfg) { + if (time >= poolCfg[i].start && time <= poolCfg[i].end) { + if (!pool[poolCfg[i].start]) { + pool[poolCfg[i].start] = { + count: 1, + list: [], + name: poolCfg[i].name, + five: poolCfg[i].five, + start: moment(poolCfg[i].from, 'YYYY-MM-DD HH:mm:ss').format('YYYY-MM-DD'), + end: moment(poolCfg[i].to, 'YYYY-MM-DD HH:mm:ss').format('YYYY-MM-DD') + } + } else { + pool[poolCfg[i].start].count++ + } + if (row.rank_type == 5) { + if (row.name != '未知') { + pool[poolCfg[i].start].list.push({ + name: row.name, + rank_type: row.rank_type, + item_type: row.item_type, + time, + num: fiveNum + 1 + }) + } + fiveNum = 0 + fourNum++ + } else if (row.rank_type == 4) { + pool[poolCfg[i].start].list.push({ + name: row.name, + rank_type: row.rank_type, + item_type: row.item_type, + time, + num: fourNum + 1 + }) + fourNum = 0 + fiveNum++ + } else { + fiveNum++ + fourNum++ + } + break b + } else { + delete poolCfg[i] + } + } + } + + let tmp = [] + for (let i in pool) { + tmp.push(pool[i]) + } + pool = tmp.reverse() + + if (pool.length <= 0) { + return false + } + + let line = 0 + let res = [] + for (let i in pool) { + line++ + pool[i].role = {} + + pool[i].five = pool[i].five + .map((v) => sortName[v] ?? v) + .join('、') + for (let val of pool[i].list) { + if (!pool[i].role[val.name]) { + pool[i].role[val.name] = { + name: val.name, + rank_type: val.rank_type, + item_type: val.item_type, + count: 1 + } + } else { + pool[i].role[val.name].count++ + } + } + delete pool[i].list + + // 排序 + for (let j in pool[i].role) { + let sort = (pool[i].role[j].rank_type - 3) * 1000 + pool[i].role[j].count + if (this.role5.includes(pool[i].role[j].name)) { + sort-- + } + if (this.weapon5.includes(pool[i].role[j].name)) { + sort-- + } + if (pool[i].role[j].item_type == '角色' && pool[i].role[j].rank_type == 5) { + sort += 1000 + } + pool[i].role[j].sort = sort + } + + pool[i].roleNum = Object.keys(pool[i].role).length + pool[i].role = lodash.orderBy(pool[i].role, ['sort'], ['desc']) + + res.push(pool[i]) + line += Math.ceil(pool[i].roleNum / 6) + + if (this.e.isGroup && line >= 12) { + break + } + } + + // if (line - pool.length <= 0) { + // return false; + // } + + return { + saveId: this.uid, + uid: this.uid, + pool: res, + typeName: this.typeName, + isGroup: this.e.isGroup + } + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/mys/BaseModel.js b/src/Yunzai-Bot/plugins/genshin/model/mys/BaseModel.js new file mode 100644 index 0000000000000000000000000000000000000000..23ae5157484de2c8448589e5b96e0eccaefb4621 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/mys/BaseModel.js @@ -0,0 +1,47 @@ +/** + * 基础类,提供实例缓存等一些基础方法 + */ +let cacheMap = {} +let reFn = {} + +export default class BaseModel { + constructor () { + return this + } + + // 获取缓存 + _getThis (model, id = '', time = 10 * 60) { + const uuid = `${model}:${id}` + if (uuid && cacheMap[uuid]) { + return cacheMap[uuid]._expire(time) + } + this._uuid = uuid + } + + // 设置缓存 + _cacheThis (time = 10 * 60) { + let id = this._uuid + if (id) { + this._expire(time) + cacheMap[id] = this + return cacheMap[id] + } + return this + } + + // 设置超时时间 + _expire (time = 10 * 60) { + let id = this._uuid + reFn[id] && clearTimeout(reFn[id]) + if (time > 0) { + if (id) { + reFn[id] = setTimeout(() => { + reFn[id] && clearTimeout(reFn[id]) + delete reFn[id] + delete cacheMap[id] + }, time * 1000) + } + return cacheMap[id] + } + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/mys/DailyCache.js b/src/Yunzai-Bot/plugins/genshin/model/mys/DailyCache.js new file mode 100644 index 0000000000000000000000000000000000000000..b4b2d5fd5ce7da32d0d420b2fb660f6f32c636e2 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/mys/DailyCache.js @@ -0,0 +1,330 @@ +import moment from 'moment' +import BaseModel from './BaseModel.js' + +const servs = ['mys', 'hoyolab'] +// 超时时间不必精确,直接定24小时即可 +const EX = 3600 * 24 +const redisKeyRoot = 'Yz:genshin:mys:' + +export default class DailyCache extends BaseModel { + constructor (uid) { + super() + const storeKey = DailyCache.getStoreKey(uid) + // 检查实例缓存 + let self = this._getThis('store', storeKey) + if (self) { + return self + } + this.keyPre = `${redisKeyRoot}${storeKey}` + return this._cacheThis() + } + + /** + * 传入UID或server标示,返回当日存储对象 + * @param uid + * * 为空则返回与serv无关的dailyCache + * * 传入UID,会返回UID对应serv的cache对象 + * * 传入servKey (mys/hoyolab),会返回指定的servCache + * @returns {DailyCache} + */ + static create (uid) { + return new DailyCache(uid) + } + + /** ---- 基础方法 ---- **/ + // 内部方法:获取redis表key键值 + getTableKey (key, sub = '') { + if (sub) { + return `${this.keyPre}:${key}-${sub}` + } else { + return `${this.keyPre}:${key}` + } + } + + // 内部方法:获取server key + static getServKey (uid) { + // 不传入uid为默认cache + if (!uid || uid === 'cache') { + return 'cache' + } + // 传入uid或sever key,判断是mys还是hoyolab + return /^[6-9]|^hoyo|^os/i.test(uid) ? servs[1] : servs[0] + } + + // 内部方法:获取redis表前缀 + static getStoreKey (uid) { + const serv = DailyCache.getServKey(uid) + const date = moment().format('MM-DD') + return `${serv}-${date}` + } + + /** + * 遍历所有servCache + * @param fn + * @returns {Promise} + */ + static async eachCache (fn) { + for (const serv of servs) { + let cache = DailyCache.create(serv) + if (cache) { + await fn(cache) + } + } + } + + /** + * 删除过期的DailyCache + */ + static async clearOutdatedData () { + let keys = await redis.keys(`${redisKeyRoot}*`) + const date = moment().format('MM-DD') + const testReg = new RegExp(`^${redisKeyRoot}(mys|hoyo|hoyolab|cache)-\\d{2}-\\d{2}`) + const todayReg = new RegExp(`^${redisKeyRoot}(mys|hoyo|hoyolab|cache)-${date}`) + for (let key of keys) { + if (testReg.test(key) && !todayReg.test(key)) { + await redis.del(key) + } + } + } + + /** + * 设置指定表的过期时间 + * @param table 表 + * @param hasCount 是否具有count表(KeyList) + * @returns {Promise} + */ + async exTable (table, hasCount = false) { + await redis.expire(this.getTableKey(table), EX) + if (hasCount) { + await redis.expire(this.getTableKey(table, 'count'), EX) + } + } + + /** + * 清空删除指定表 + * @param table + * @returns {Promise} + */ + async empty (table) { + await redis.del(this.getTableKey(table)) + await redis.del(this.getTableKey(table, 'count')) + } + + /** + * 【基础数据结构】:Key-Value + * + * 每个key对应一个Value + * 使用redis kv存储,所有操作需要指定表名 + * + * **/ + + /** + * 获取表指定key内容 + * @param table 表名 + * @param key 数据存储key + * @param decode 是否对内容进行decode + * @returns {Promise} + */ + async kGet (table, key, decode = false) { + let value = await redis.hGet(this.getTableKey(table), '' + key) + return DailyCache.decodeValue(value, decode) + } + + /** + * 设置表指定key内容 + * @param table 表名 + * @param key 数据存储key + * @param value 数据,若传入对象或数组会自动encode + * @returns {Promise} + */ + async kSet (table, key, value) { + value = DailyCache.encodeValue(value) + await redis.hSet(this.getTableKey(table), '' + key, value) + await this.exTable(this.getTableKey(table)) + } + + /** + * 删除表中指定key内容 + * @param table 表名 + * @param key 数据存储key + * @returns {Promise} + */ + async kDel (table, key) { + return await redis.hDel(this.getTableKey(table), '' + key) + } + + /** + * 获取指定表内容 + * @param table 表名 + * @param decode 是否对内容进行decode + * @returns {Promise} + */ + async get (table, decode = false) { + const tableKey = this.getTableKey(table) + let value = await redis.get(tableKey) + return DailyCache.decodeValue(value, decode) + } + + /** + * 设置指定表内容 + * @param table 表名 + * @param value 数据,若传入对象或数组会自动encode + * @returns {Promise} + */ + async set (table, value) { + value = DailyCache.encodeValue(value) + return await redis.set(this.getTableKey(table), value, { EX }) + } + + // 内部方法,用于decode value + static decodeValue (value, decode = false) { + if (value && decode) { + try { + return JSON.parse(value) + } catch (e) { + return false + } + } + return value + } + + // 内部方法,用于encode value + static encodeValue (value) { + if (typeof (value) === 'object') { + return JSON.stringify(value) || '' + } + if (typeof (value) === 'undefined') { + return '' + } + return '' + value + } + + /** + * 【基础数据结构】:Key-List + * + * 每个key对应一个list,key必须为数字,list间的item不重复 + * 若重复item被添加,则会将item移至指定key对应List中 + * + * 会自动统计每个list长度并排序 + * 使用redis sorted map存储,所有操作需要指定表名 + * + * **/ + + /** + * 为KeyList添加 item + * @param table 表名 + * @param key 添加item对应 key键值 + * @param item 添加的item + * @returns {Promise} + */ + async zAdd (table, key, item) { + const tableKey = this.getTableKey(table) + await redis.zAdd(tableKey, { score: key, value: item + '' }) + + // 同时更新数量,用于数量统计 + let count = await this.zCount(table, key) || 0 + const countKey = this.getTableKey(table, 'count') + await redis.zAdd(countKey, { score: count, value: key + '' }) + await this.exTable(this.getTableKey(table), true) + } + + // 根据key获取list + /** + * 根据Key获取List + * @param table 表名 + * @param key key键值 + * @returns {Promise>>} + */ + async zList (table, key) { + return await redis.zRangeByScore(this.getTableKey(table), key, key) + } + + /** + * 获取指定item所在List对应的key键值 + * @param table 表名 + * @param item item + * @returns {Promise} + */ + async zKey (table, item) { + return await redis.zScore(this.getTableKey(table), item + '') + } + + /** + * 获取指定key对应List的长度 + * @param table 表名 + * @param key 需要获取长度的key + * @returns {Promise} 长度值 + */ + async zCount (table, key) { + return await redis.zCount(this.getTableKey(table), key, key) + } + + /** + * 获取当前KeyList中,List长度最小的一个key + * 由于内部场景使用,简单规定List长度有效范围为0-60 + * @param table + * @returns {Promise} + */ + async zMinKey (table) { + let keys = await redis.zRangeByScore(this.getTableKey(table, 'count'), 0, 60) + return keys[0] + } + + /** + * 在当前KeyList中禁用指定的key + * 会保留所有已有item记录,但不再被zMinKey识别并返回 + * 主要用于标记CK查询次数超限场景(已经查询的记录仍然有效) + * @param table + * @param key + * @param delCount 是否同时删除count记录,删除后不会被zGetDisableKey获取 + * @returns {Promise} + */ + async zDisableKey (table, key, delCount = false) { + // 将count标记为99次,记录并防止被后续分配 + const countKey = this.getTableKey(table, 'count') + if (delCount) { + await redis.zRem(countKey, key) + } else { + await redis.zAdd(countKey, { score: 99, value: key }) + } + } + + /** + * 获取已禁用的key列表,用于主动清除数据使用 + * @param table + * @returns {Promise>>} + */ + async zGetDisableKey (table) { + return await redis.zRangeByScore(this.getTableKey(table, 'count'), 99, 99) + } + + // 删除某个key + // 清空所有查询关联,同时不再被zMinKey识别并返回 + /** + * 删除指定key记录 + * 清空所有查询关联,同时不再被zMinKey识别并返回 + * 与zDisableKey的区别在于会删除detail中已存在的记录 + * 主要用于CK失效场景(已经查询的记录也同时失效) + * @param table + * @param key + * @param delCount 是否同时删除count记录,删除后不会被zGetDisableKey获取 + * @returns {Promise} + */ + async zDel (table, key, delCount = false) { + // 删除key对应list所有记录 + let check = redis.zScore(this.getTableKey(table, 'count'), key) + await redis.zRemRangeByScore(this.getTableKey(table), key, key) + await this.zDisableKey(table, key, delCount) + return !!check + } + + /** + * 获取指定表格的key:List count 统计数据 + * @param table + * @returns {Promise<{key:count}>} + */ + async zStat (table) { + const countKey = this.getTableKey(table, 'count') + return await redis.zRangeByScoreWithScores(countKey, 0, 100) + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/mys/MysUser.js b/src/Yunzai-Bot/plugins/genshin/model/mys/MysUser.js new file mode 100644 index 0000000000000000000000000000000000000000..3fd08f2568f92d417bbf0866b31fb1d9ba727301 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/mys/MysUser.js @@ -0,0 +1,528 @@ +/** + * MysUser 米游社用户类 + * 主键ltuid + * + * 一个MysUser对应一个有效CK + * 一个MysUser可能有多个MysUid关联记录 + */ +import DailyCache from './DailyCache.js' +import BaseModel from './BaseModel.js' +import NoteUser from './NoteUser.js' +import MysApi from './mysApi.js' +import lodash from 'lodash' +import fetch from 'node-fetch' + +const tables = { + // ltuid-uid 查询表 + // 表结构:Key-List (key:ltuid,list-item: uid) + detail: 'query-detail', + + // ltuid-uid 关系表,用于存储ltuid对应uid列表,一个uid仅属于一个ltuid + // 表结构:Key-List (key:ltuid, value:uid/qq) + uid: 'ltuid-uid', + + // ltuid-ck 关系表,用于存储ltuid对应ck信息 + // 表结构:Key-Value (key:ltuid, value:ck) + ck: 'ltuid-ck', + + // ltuid-qq 关系表,用于存储ltuid对应qq,一个ltuid可被多个qq绑定 + // 表结构:Key-Value (key:ltuid, value:[qq]) + // 因为一个qq可以绑定多个ltuid,所以不适宜用Key-List + qq: 'ltuid-qq', + + // ltuid 已删除的uid查询,供解绑ltuid后重新绑回的查询记录恢复 + // 表结构:Key-Value (key:ltuid,value:序列化uid数组) + del: 'del-detail' +} + +export default class MysUser extends BaseModel { + constructor (data) { + super() + let ltuid = data.ltuid + if (!ltuid) { + return false + } + // 检查实例缓存 + let self = this._getThis('mys', ltuid) + if (!self) { + self = this + } + // 单日有效缓存,不区分服务器 + self.cache = self.cache || DailyCache.create() + self.uids = self.uids || [] + self.ltuid = data.ltuid + self.ck = self.ck || data.ck + self.qq = self.qq || data.qq || 'pub' + if (data.uid || data.uids) { + self.addUid(data.uid || data.uids) + } + if (data.ck && data.ltuid) { + self.ckData = data + } + // 单日有效缓存,使用uid区分不同服务器 + self.servCache = self.servCache || DailyCache.create(self.uids[0] || 'mys') + return self._cacheThis() + } + + // 可传入ltuid、cookie、ck对象来创建MysUser实例 + // 在仅传入ltuid时,必须是之前传入过的才能被识别 + static async create (data) { + if (!data) { + return false + } + if (lodash.isPlainObject(data)) { + return new MysUser(data) + } + // 传入cookie + let testRet = /ltuid=(\d{4,9})/g.exec(data) + if (testRet && testRet[1]) { + let ltuid = testRet[1] + // 尝试使用ltuid创建 + let ckUser = await MysUser.create(ltuid) + if (ckUser) { + return ckUser + } + let uids = await MysUser.getCkUid(data) + if (uids) { + return new MysUser({ + ltuid, + ck: data, + type: 'ck', + uids + }) + } + } + // 传入ltuid + if (/^\d{4,9}$/.test(data)) { + // 查找ck记录 + let cache = DailyCache.create() + let ckData = await cache.kGet(tables.ck, data, true) + if (ckData && ckData.ltuid) { + return new MysUser(ckData) + } + } + return false + } + + // 根据uid获取查询MysUser + static async getByQueryUid (uid, onlySelfCk = false) { + let servCache = DailyCache.create(uid) + // 查找已经查询过的ltuid || 分配最少查询的ltuid + + // 根据ltuid获取mysUser 封装 + const create = async function (ltuid) { + if (!ltuid) return false + + let ckUser = await MysUser.create(ltuid) + if (!ckUser) { + await servCache.zDel(tables.detail, ltuid) + return false + } + + // 若声明只获取自己ck,则判断uid是否为本人所有 + if (onlySelfCk && !await ckUser.ownUid(uid)) { + return false + } + + return ckUser + } + + // 根据uid检索已查询记录。包括公共CK/自己CK/已查询过 + let ret = await create(await servCache.zKey(tables.detail, uid)) + if (ret) { + logger.mark(`[米游社查询][uid:${uid}]${logger.green(`[使用已查询ck:${ret.ltuid}]`)}`) + return ret + } + + // 若只获取自身ck,则无需走到分配逻辑 + if (onlySelfCk) return false + + // 使用CK池内容,分配次数最少的一个ltuid + ret = await create(await servCache.zMinKey(tables.detail)) + if (ret) { + logger.mark(`[米游社查询][uid:${uid}]${logger.green(`[分配查询ck:${ret.ltuid}]`)}`) + return ret + } + + return false + } + + // 为当前MysUser绑定uid + addUid (uid) { + if (lodash.isArray(uid)) { + for (let u of uid) { + this.addUid(u) + } + return true + } + uid = '' + uid + if (/\d{9}/.test(uid) || uid === 'pub') { + if (!this.uids.includes(uid)) { + this.uids.push(uid) + } + } + return true + } + + // 初始化当前MysUser缓存记录 + async initCache (user) { + if (!this.ltuid || !this.servCache || !this.ck) { + return + } + + // 为当前MysUser添加uid查询记录 + if (!lodash.isEmpty(this.uids)) { + for (let uid of this.uids) { + if (uid !== 'pub') { + await this.addQueryUid(uid) + // 添加ltuid-uid记录,用于判定ltuid绑定个数及自ltuid查询 + await this.cache.zAdd(tables.uid, this.ltuid, uid) + } + } + } else { + console.log(`ltuid:${this.ltuid}暂无uid信息,请检查...`) + // 公共ck暂无uid信息不添加 + if (user?.qq === 'pub') { + return false + } + } + // 缓存ckData,供后续缓存使用 + // ltuid关系存储到与server无关的cache中,方便后续检索 + if (this.ckData && this.ckData.ck) { + await this.cache.kSet(tables.ck, this.ltuid, this.ckData) + } + + // 缓存qq,用于删除ltuid时查找 + if (user && user.qq) { + let qq = user.qq === 'pub' ? 'pub' : user.qq * 1 + let qqArr = await this.cache.kGet(tables.qq, this.ltuid, true) + if (!lodash.isArray(qqArr)) { + qqArr = [] + } + if (!qqArr.includes(qq)) { + qqArr.push(qq) + await this.cache.kSet(tables.qq, this.ltuid, qqArr) + } + } + + // 从删除记录中查找并恢复查询记录 + let cacheSearchList = await this.servCache.get(tables.del, this.ltuid, true) + // 这里不直接插入,只插入当前查询记录中没有的值 + if (cacheSearchList && cacheSearchList.length > 0) { + for (let searchedUid of cacheSearchList) { + // 检查对应uid是否有新的查询记录 + if (!await this.getQueryLtuid(searchedUid)) { + await this.addQueryUid(searchedUid) + } + } + } + return true + } + + static async eachServ (fn) { + let servs = ['mys', 'hoyolab'] + for (let serv of servs) { + let servCache = DailyCache.create(serv) + await fn(servCache, serv) + } + } + + // 清除当日缓存 + static async clearCache () { + await MysUser.eachServ(async function (servCache) { + await servCache.empty(tables.detail) + }) + let cache = DailyCache.create() + await cache.empty(tables.uid) + await cache.empty(tables.ck) + await cache.empty(tables.qq) + } + + async disable () { + await this.servCache.zDel(tables.detail, this.ltuid) + logger.mark(`[标记无效ck][ltuid:${this.ltuid}]`) + } + + // + // + /** + * 删除缓存, 供User解绑CK时调用 + * @param user + * @returns {Promise} + */ + async del (user) { + if (user && user.qq) { + let qqList = await this.cache.kGet(tables.qq, this.ltuid, true) + let newList = lodash.pull(qqList, user.qq * 1) + await this.cache.kSet(tables.qq, this.ltuid, newList) + if (newList.length > 0) { + // 如果数组还有其他元素,说明该ltuid还有其他绑定,不进行缓存删除 + return false + } + } + // 将查询过的uid缓存起来,以备后续重新绑定时恢复 + let uids = await this.getQueryUids() + await this.servCache.set(tables.del, uids) + + // 标记ltuid为失效 + await this.servCache.zDel(tables.detail, this.ltuid) + await this.cache.zDel(tables.uid, this.ltuid) + await this.cache.kDel(tables.ck, this.ltuid) + await this.cache.kDel(tables.qq, this.ltuid) + logger.mark(`[删除失效ck][ltuid:${this.ltuid}]`) + } + + // 删除MysUser用户记录,会反向删除User中的记录及绑定关系 + async delWithUser () { + // 查找用户 + let qqArr = await this.cache.kGet(tables.qq, this.ltuid, true) + if (qqArr && qqArr.length > 0) { + for (let qq of qqArr) { + let user = await NoteUser.create(qq) + if (user) { + // 调用user删除ck + await user.delCk(this.ltuid, false) + } + } + } + await this.del() + } + + // 为当前用户添加uid查询记录 + async addQueryUid (uid) { + if (uid) { + await this.servCache.zAdd(tables.detail, this.ltuid, uid) + } + } + + // 获取当前用户已查询uid列表 + async getQueryUids () { + return await this.servCache.zList(tables.detail, this.ltuid) + } + + // 根据uid获取查询ltuid + async getQueryLtuid (uid) { + return await this.servCache.zKey(tables.detail, uid) + } + + // 检查指定uid是否为当前MysUser所有 + async ownUid (uid) { + if (!uid) { + return false + } + let uidArr = await this.cache.zList(tables.uid, this.ltuid) || [] + return uid && uidArr.join(',').split(',').includes(uid + '') + } + + // 获取用户统计数据 + static async getStatData () { + let totalCount = {} + let ret = { servs: {} } + await MysUser.eachServ(async function (servCache, serv) { + let data = await servCache.zStat(tables.detail) + let count = {} + let list = [] + let query = 0 + const stat = (type, num) => { + count[type] = num + totalCount[type] = (totalCount[type] || 0) + num + } + lodash.forEach(data, (ds) => { + list.push({ + ltuid: ds.value, + num: ds.score + }) + if (ds.score < 30) { + query += ds.score + } + }) + stat('total', list.length) + stat('normal', lodash.filter(list, ds => ds.num < 29).length) + stat('disable', lodash.filter(list, ds => ds.num > 30).length) + stat('query', query) + stat('last', count.normal * 30 - count.query) + list = lodash.sortBy(list, ['num', 'ltuid']).reverse() + ret.servs[serv] = { + list, count + } + }) + ret.count = totalCount + return ret + } + + /** + * 删除失效用户 + * @returns {Promise} 删除用户的个数 + */ + static async delDisable () { + let count = 0 + await MysUser.eachServ(async function (servCache) { + let cks = await servCache.zGetDisableKey(tables.detail) + console.log('cks', cks) + for (let ck of cks) { + if (await servCache.zDel(tables.detail, ck, true)) { + count++ + } + let ckUser = await MysUser.create(ck) + console.log('ckUser', ck, ckUser) + if (ckUser) { + await ckUser.delWithUser() + } + } + }) + return count + } + + static async getGameRole (ck, serv = 'mys') { + let url = { + mys: 'https://api-takumi.mihoyo.com/binding/api/getUserGameRolesByCookie?game_biz=hk4e_cn', + hoyolab: 'https://api-os-takumi.mihoyo.com/binding/api/getUserGameRolesByCookie?game_biz=hk4e_global' + } + + let res = await fetch(url[serv], { method: 'get', headers: { Cookie: ck } }) + if (!res.ok) return false + res = await res.json() + + return res + } + + // 获取米游社通行证id + static async getUserFullInfo (ck, serv = 'mys') { + let url = { + mys: 'https://bbs-api.mihoyo.com/user/wapi/getUserFullInfo?gids=2', + hoyolab: '' + } + let res = await fetch(url[serv], { + method: 'get', + headers: { + Cookie: ck, + Accept: 'application/json, text/plain, */*', + Connection: 'keep-alive', + Host: 'bbs-api.mihoyo.com', + Origin: 'https://m.bbs.mihoyo.com', + Referer: ' https://m.bbs.mihoyo.com/' + } + }) + if (!res.ok) return res + res = await res.json() + + return res + } + + /** + * 获取ck对应uid列表 + * @param ck 需要获取的ck + * @param withMsg false:uids / true: {uids, msg} + * @param force 忽略缓存,强制更新 + * @returns {Promise<{msg: *, uids}>} + */ + static async getCkUid (ck, withMsg = false, force = false) { + let ltuid = '' + let testRet = /ltuid=(\w{0,9})/g.exec(ck) + if (testRet && testRet[1]) { + ltuid = testRet[1] + } + let uids = [] + let ret = (msg, retUid) => { + retUid = lodash.map(retUid, (a) => a + '') + return withMsg ? { msg, uids: retUid } : retUid + } + if (!ltuid) { + return ret('无ltuid', false) + } + + if (!force) { + // 此处不使用DailyCache,做长期存储 + uids = await redis.get(`Yz:genshin:mys:ltuid-uids:${ltuid}`) + if (uids) { + uids = DailyCache.decodeValue(uids, true) + if (uids && uids.length > 0) { + return ret('', uids) + } + } + } + + uids = [] + let res = null + let msg = 'error' + for (let serv of ['mys', 'hoyolab']) { + let roleRes = await MysUser.getGameRole(ck, serv) + if (roleRes?.retcode === 0) { + res = roleRes + break + } + if (roleRes.retcode * 1 === -100) { + msg = '该ck已失效,请重新登录获取' + } + msg = roleRes.message || 'error' + } + if (!res) return ret(msg, false) + if (!res.data.list || res.data.list.length <= 0) { + return ret('该账号尚未绑定原神角色', false) + } + + for (let val of res.data.list) { + if (/\d{9}/.test(val.game_uid)) { + uids.push(val.game_uid + '') + } + } + if (uids.length > 0) { + await redis.set(`Yz:genshin:mys:ltuid-uids:${ltuid}`, JSON.stringify(uids), { EX: 3600 * 24 * 90 }) + return ret('', uids) + } + return ret(msg, false) + } + + /** + * 检查CK状态 + * @param ck 需要检查的CK + * @returns {Promise} + */ + static async checkCkStatus (ck) { + let uids = [] + let err = (msg, status = 2) => { + msg = msg + '\n请退出米游社并重新登录后,再次获取CK' + return { + status, + msg, + uids + } + } + if (!ck) { + return false + } + + // 检查绑定UID + uids = await MysUser.getCkUid(ck, true, true) + if (!uids.uids || uids.uids.length === 0) { + return err(uids.msg || 'CK失效') + } + uids = uids.uids + let uid = uids[0] + let mys = new MysApi(uid + '', ck, { log: false }) + // 体力查询 + let noteRet = await mys.getData('dailyNote') + if (noteRet.retcode !== 0 || lodash.isEmpty(noteRet.data)) { + let msg = noteRet.message !== 'OK' ? noteRet.message : 'CK失效' + return err(`${msg || 'CK失效或验证码'},无法查询体力及角色信息`, 3) + } + + // 角色查询 + let roleRet = await mys.getData('character') + if (roleRet.retcode !== 0 || lodash.isEmpty(roleRet.data)) { + let msg = noteRet.message !== 'OK' ? noteRet.message : 'CK失效' + return err(`${msg || 'CK失效'},当前CK仍可查询体力,无法查询角色信息`, 2) + } + + let detailRet = await mys.getData('detail', { avatar_id: 10000021 }) + if (detailRet.retcode !== 0 || lodash.isEmpty(detailRet.data)) { + let msg = noteRet.message !== 'OK' ? noteRet.message : 'CK失效' + return err(`${msg || 'CK失效'},当前CK仍可查询体力及角色,但无法查询角色详情数据`, 1) + } + return { + uids, + status: 0, + msg: 'CK状态正常' + } + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/mys/NoteUser.js b/src/Yunzai-Bot/plugins/genshin/model/mys/NoteUser.js new file mode 100644 index 0000000000000000000000000000000000000000..8143386a6a5e04f423a9d056974005341f71603e --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/mys/NoteUser.js @@ -0,0 +1,306 @@ +/** + * Bot实际User用户类 + * 主键QQ + * + * User可以注册UID,通过 getRegUid / setRegUid + * 一个User可以绑定多个MysUser CK,绑定MysUser + */ +import BaseModel from './BaseModel.js' +import lodash from 'lodash' +import MysUser from './MysUser.js' +import gsCfg from '../gsCfg.js' + +export default class NoteUser extends BaseModel { + constructor (qq, data = null) { + super() + // 检查实例缓存 + let cacheObj = this._getThis('user', qq) + if (cacheObj) { + return cacheObj + } + this.qq = qq + if (data) { + this.ckData = this.ckData || {} + for (let uid in data) { + let ck = data[uid] + if (uid && ck.uid) { + this.ckData[uid] = ck + } + } + } else if (!this.ckData) { + this._getCkData() + } + // 缓存实例 + return this._cacheThis() + } + + // 初始化 user + /** + * 创建NoteUser实例 + * @param qq NoterUser对应id(qq) + * * 若传入e对象则会识别e.user_id,并将user对象添加至e.user + * @param data 用户对应MysCookie数据,为空则自动读取 + * @returns {Promise} + */ + static async create (qq, data = null) { + // 兼容处理传入e + if (qq && qq.user_id) { + let e = qq + let user = await NoteUser.create(e.user_id) + e.user = user + return user + } + let user = new NoteUser(qq, data) + // 检查绑定uid (regUid) + await user.getRegUid() + // 传入data则使用,否则读取 + return user + } + + static async forEach (fn) { + // 初始化用户缓存 + let res = await gsCfg.getBingCk() + for (let qq in res.noteCk) { + let cks = res.noteCk[qq] + if (!lodash.isEmpty(cks)) { + let user = await NoteUser.create(qq, cks) + if (user && fn) { + if (await fn(user) === false) { + break + } + } + } + } + } + + /** + * 获取当前用户uid + * 如果为绑定用户,优先获取ck对应uid,否则获取绑定uid + */ + get uid () { + // 如果绑定有CK,则 + if (this.hasCk) { + return this.mainCk?.uid + } + return this._regUid || '' + } + + /** + * 当前用户是否具备CK + */ + get hasCk () { + return this.ckData && !lodash.isEmpty(this.ckData) + } + + /** + * 获取绑定CK的UID列表,如未绑定CK则返回空数组 + */ + get ckUids () { + if (!this.hasCk) { + return [] + } + return lodash.map(this.ckData, 'uid') + } + + /** + * 获取当前生效CK + * + * 返回isMain的uid,没有的话返回首位 + */ + get mainCk () { + if (this.hasCk) { + return lodash.filter(this.ckData, (ck) => ck.isMain)[0] || lodash.values(this.ckData)[0] + } + return false + } + + /** + * 获取当前用户的所有ck + * @returns { {ltuid:{ckData, ck, uids}} } + */ + get cks () { + let cks = {} + if (!this.hasCk) { + return cks + } + for (let uid in this.ckData) { + let ck = this.ckData[uid] + if (ck && ck.ltuid && ck.uid) { + cks[ck.ltuid] = cks[ck.ltuid] || { + ckData: ck, + ck: ck.ck, + uids: [] + } + cks[ck.ltuid].uids.push(ck.uid) + } + } + return cks + } + + /** + * 获取当前用户的绑定UID + * 主要供内部调用,建议使用 user.uid 获取用户uid + * @returns {Promise<*>} + */ + async getRegUid () { + let redisKey = `Yz:genshin:mys:qq-uid:${this.qq}` + let uid = await redis.get(redisKey) + if (uid) { + await redis.setEx(redisKey, 3600 * 24 * 30, uid) + } + this._regUid = uid + return this._regUid + } + + /** + * 设置当前用户的绑定uid + * @param uid 要绑定的uid + * @param force 若已存在绑定uid关系是否强制更新 + */ + async setRegUid (uid = '', force = false) { + let redisKey = `Yz:genshin:mys:qq-uid:${this.qq}` + if (uid && /[1|2|5-9][0-9]{8}/.test(uid)) { + uid = String(uid) + const oldUid = await this.getRegUid() + // force true、不存在绑定UID,UID一致时存储并更新有效期 + if (force || !oldUid || oldUid === uid) { + await redis.setEx(redisKey, 3600 * 24 * 30, uid) + } + this._regUid = uid + return String(this._regUid) || '' + } + return '' + } + + /** + * 切换绑定CK生效的UID + * @param uid 要切换的UID + */ + async setMainUid (uid = '') { + // 兼容传入index + if (uid * 1 <= this.ckUids.length) uid = this.ckUids[uid] + // 非法值,以及未传入时使用当前或首个有效uid + uid = (uid || this.uid) * 1 + // 设置主uid + lodash.forEach(this.ckData, (ck) => { + ck.isMain = ck.uid * 1 === uid * 1 + }) + // 保存CK数据 + this._saveCkData() + await this.setRegUid(uid, true) + } + + /** + * 初始化或重置 当前用户缓存 + */ + async initCache () { + // 刷新绑定CK的缓存 + let count = 0 + let cks = this.cks + for (let ltuid in cks) { + let { ckData, uids } = cks[ltuid] + let mysUser = await MysUser.create(ckData) + for (let uid of uids) { + mysUser.addUid(uid) + } + if (mysUser && await mysUser.initCache(this)) { + count++ + } + } + return count + } + + /** + * 为当前用户增加CK + * @param cks 绑定的ck + */ + async addCk (cks) { + let ckData = this.ckData + lodash.forEach(cks, (ck, uid) => { + ckData[uid] = ck + }) + this._saveCkData() + await this.initCache() + } + + /** + * 删除当前用户绑定CK + * @param ltuid 根据ltuid删除,未传入则删除当前生效uid对应ltuid + * @param needRefreshCache 是否需要刷新cache,默认刷新 + */ + async delCk (ltuid = '', needRefreshCache = true) { + if (!ltuid) { + ltuid = this.mainCk.ltuid + } + let ret = [] + ltuid = ltuid * 1 + let ckData = this.ckData + for (let uid in ckData) { + let ck = ckData[uid] + if (ltuid && ck.ltuid * 1 === ltuid) { + ret.push(uid) + delete ckData[uid] + } + } + // 刷新主ck并保存ckData + await this.setMainUid() + + // 刷新MysUser缓存 + if (needRefreshCache) { + let ckUser = await MysUser.create(ltuid) + if (ckUser) { + await ckUser.del(this) + } + } + return ret + } + + /** + * 检查当前用户绑定的CK状态 + */ + async checkCk () { + // TODO:待完善文案 + let cks = this.cks + let ret = [] + for (let ltuid in cks) { + let ck = cks[ltuid].ck + if (!ltuid || !ck) { + continue + } + let checkRet = await MysUser.checkCkStatus(ck) + // TODO: 若checkRet中返回了不同的uid,进行CK保存更新 + // 失效 + let mysUser = await MysUser.create(ck) + if (mysUser) { + let status = checkRet.status + if (status === 0 || status === 1) { + // status为1时无法查询天赋,但仍可查询角色,保留CK + await mysUser.initCache() + } else if (status === 2) { + // status为2时无法查询角色,删除ck cache + // 因仍能查询体力,故保留ck记录不直接删除 + await mysUser.del() + } else if (status === 3) { + // status为3时CK完全失效,用户删除此CK + await this.delCk(ltuid) + } + } + ret.push({ + ltuid, + ...checkRet + }) + } + return ret + } + + // 内部方法:读取CK数据 + _getCkData () { + this.ckData = gsCfg.getBingCkSingle(this.qq) + return this.ckData + } + + // 内部方法:写入CK数据 + _saveCkData () { + gsCfg.saveBingCk(this.qq, this.ckData) + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/mys/mysApi.js b/src/Yunzai-Bot/plugins/genshin/model/mys/mysApi.js new file mode 100644 index 0000000000000000000000000000000000000000..101c37b5c384d81c82dc26d3820b4e3d4a2fa2ea --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/mys/mysApi.js @@ -0,0 +1,366 @@ +import md5 from 'md5' +import lodash from 'lodash' +import fetch from 'node-fetch' +import cfg from '../../../../lib/config/config.js' + +let HttpsProxyAgent = '' + +export default class MysApi { + /** + * @param uid 游戏uid + * @param cookie 米游社cookie + * @param option 其他参数 + * @param option.log 是否显示日志 + */ + constructor (uid, cookie, option = {}) { + this.uid = uid + this.cookie = cookie + this.server = this.getServer() + + /** 5分钟缓存 */ + this.cacheCd = 300 + + this.option = { + log: true, + ...option + } + } + + getUrl (type, data = {}) { + let host, hostRecord + if (['cn_gf01', 'cn_qd01'].includes(this.server)) { + host = 'https://api-takumi.mihoyo.com/' + hostRecord = 'https://api-takumi-record.mihoyo.com/' + } else if (['os_usa', 'os_euro', 'os_asia', 'os_cht'].includes(this.server)) { + host = 'https://api-os-takumi.mihoyo.com/' + hostRecord = 'https://bbs-api-os.mihoyo.com/' + } + + let urlMap = { + /** 首页宝箱 */ + index: { + url: `${hostRecord}game_record/app/genshin/api/index`, + query: `role_id=${this.uid}&server=${this.server}` + }, + /** 深渊 */ + spiralAbyss: { + url: `${hostRecord}game_record/app/genshin/api/spiralAbyss`, + query: `role_id=${this.uid}&schedule_type=${data.schedule_type || 1}&server=${this.server}` + }, + /** 角色详情 */ + character: { + url: `${hostRecord}game_record/app/genshin/api/character`, + body: { role_id: this.uid, server: this.server } + }, + /** 树脂 */ + dailyNote: { + url: `${hostRecord}game_record/app/genshin/api/dailyNote`, + query: `role_id=${this.uid}&server=${this.server}` + }, + /** 签到信息 */ + bbs_sign_info: { + url: `${host}event/bbs_sign_reward/info`, + query: `act_id=e202009291139501®ion=${this.server}&uid=${this.uid}`, + sign: true + }, + /** 签到奖励 */ + bbs_sign_home: { + url: `${host}event/bbs_sign_reward/home`, + query: `act_id=e202009291139501®ion=${this.server}&uid=${this.uid}`, + sign: true + }, + /** 签到 */ + bbs_sign: { + url: `${host}event/bbs_sign_reward/sign`, + body: { act_id: 'e202009291139501', region: this.server, uid: this.uid }, + sign: true + }, + /** 详情 */ + detail: { + url: `${host}event/e20200928calculate/v1/sync/avatar/detail`, + query: `uid=${this.uid}®ion=${this.server}&avatar_id=${data.avatar_id}` + }, + /** 札记 */ + ys_ledger: { + url: 'https://hk4e-api.mihoyo.com/event/ys_ledger/monthInfo', + query: `month=${data.month}&bind_uid=${this.uid}&bind_region=${this.server}` + }, + /** 养成计算器 */ + compute: { + url: `${host}event/e20200928calculate/v2/compute`, + body: data + }, + blueprintCompute: { + url: `${host}event/e20200928calculate/v1/furniture/compute`, + body: data + }, + /** 养成计算器 */ + blueprint: { + url: `${host}event/e20200928calculate/v1/furniture/blueprint`, + query: `share_code=${data.share_code}®ion=${this.server}` + }, + /** 角色技能 */ + avatarSkill: { + url: `${host}event/e20200928calculate/v1/avatarSkill/list`, + query: `avatar_id=${data.avatar_id}` + }, + createVerification: { + url: `${hostRecord}game_record/app/card/wapi/createVerification`, + query: 'is_high=true' + }, + verifyVerification: { + url: `${hostRecord}game_record/app/card/wapi/verifyVerification`, + body: data + }, + /** 七圣召唤数据 */ + basicInfo: { + url: `${hostRecord}game_record/app/genshin/api/gcg/basicInfo`, + query: `role_id=${this.uid}&server=${this.server}` + }, + /**使用兑换码 目前仅限国际服,来自于国服的uid请求已在myinfo.js的init方法提前拦截 */ + useCdk: { + url:'PLACE_HOLDER', + query: null + } + } + if (this.server.startsWith('os')) { + urlMap.bbs_sign_info.url = 'https://hk4e-api-os.hoyoverse.com/event/sol/info' + urlMap.bbs_sign_info.query = `act_id=e202102251931481®ion=${this.server}&uid=${this.uid}` + + urlMap.bbs_sign_home.url = 'https://hk4e-api-os.hoyoverse.com/event/sol/home' + urlMap.bbs_sign_home.query = `act_id=e202102251931481®ion=${this.server}&uid=${this.uid}` + + urlMap.bbs_sign.url = 'https://hk4e-api-os.hoyoverse.com/event/sol/sign' + urlMap.bbs_sign.body = { act_id: 'e202102251931481', region: this.server, uid: this.uid } + + urlMap.detail.url = 'https://sg-public-api.hoyolab.com/event/calculateos/sync/avatar/detail'// 角色天赋详情 + urlMap.detail.query = `lang=zh-cn&uid=${this.uid}®ion=${this.server}&avatar_id=${data.avatar_id}` + + urlMap.avatarSkill.url = 'https://sg-public-api.hoyolab.com/event/calculateos/avatar/skill_list'// 查询未持有的角色天赋 + urlMap.avatarSkill.query = `lang=zh-cn&avatar_id=${data.avatar_id}` + + urlMap.compute.url = 'https://sg-public-api.hoyolab.com/event/calculateos/compute'// 已支持养成计算 + + urlMap.blueprint.url = 'https://sg-public-api.hoyolab.com/event/calculateos/furniture/blueprint' + urlMap.blueprint.query = `share_code=${data.share_code}®ion=${this.server}&lang=zh-cn` + + urlMap.blueprintCompute.url = 'https://sg-public-api.hoyolab.com/event/calculateos/furniture/compute' + urlMap.blueprintCompute.body = { lang: 'zh-cn', ...data } + + urlMap.ys_ledger.url = 'https://hk4e-api-os.mihoyo.com/event/ysledgeros/month_info'// 支持了国际服札记 + urlMap.ys_ledger.query = `lang=zh-cn&month=${data.month}&uid=${this.uid}®ion=${this.server}` + + urlMap.useCdk.url = 'https://sg-hk4e-api.hoyoverse.com/common/apicdkey/api/webExchangeCdkey' + urlMap.useCdk.query = `uid=${this.uid}®ion=${this.server}&lang=zh-cn&cdkey=${data.cdk}&game_biz=hk4e_global` + } + + if (!urlMap[type]) return false + + let { url, query = '', body = '', sign = '' } = urlMap[type] + + if (query) url += `?${query}` + if (body) body = JSON.stringify(body) + + let headers = this.getHeaders(query, body, sign) + + return { url, headers, body } + } + + getServer () { + let uid = this.uid + switch (String(uid)[0]) { + case '1': + case '2': + return 'cn_gf01' // 官服 + case '5': + return 'cn_qd01' // B服 + case '6': + return 'os_usa' // 美服 + case '7': + return 'os_euro' // 欧服 + case '8': + return 'os_asia' // 亚服 + case '9': + return 'os_cht' // 港澳台服 + } + return 'cn_gf01' + } + + async getData (type, data = {}, cached = false) { + let { url, headers, body } = this.getUrl(type, data) + + if (!url) return false + + let cacheKey = this.cacheKey(type, data) + let cahce = await redis.get(cacheKey) + if (cahce) return JSON.parse(cahce) + + headers.Cookie = this.cookie + + if (data.headers) { + headers = { ...headers, ...data.headers } + delete data.headers + } + + let param = { + headers, + agent: await this.getAgent(), + timeout: 10000 + } + + if (body) { + param.method = 'post' + param.body = body + } else { + param.method = 'get' + } + let response = {} + let start = Date.now() + try { + response = await fetch(url, param) + } catch (error) { + logger.error(error.toString()) + return false + } + + if (!response.ok) { + logger.error(`[米游社接口][${type}][${this.uid}] ${response.status} ${response.statusText}`) + return false + } + if (this.option.log) { + logger.mark(`[米游社接口][${type}][${this.uid}] ${Date.now() - start}ms`) + } + const res = await response.json() + + if (!res) { + logger.mark('mys接口没有返回') + return false + } + + if (res.retcode !== 0 && this.option.log) { + logger.debug(`[米游社接口][请求参数] ${url} ${JSON.stringify(param)}`) + } + + res.api = type + + if (cached) this.cache(res, cacheKey) + + return res + } + + getHeaders (query = '', body = '', sign = false) { + const cn = { + app_version: '2.37.1', + User_Agent: `Mozilla/5.0 (Linux; Android 12; ${this.device}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.73 Mobile Safari/537.36 miHoYoBBS/2.37.1`, + client_type: 5, + Origin: 'https://webstatic.mihoyo.com', + X_Requested_With: 'com.mihoyo.hyperion', + Referer: 'https://webstatic.mihoyo.com' + } + const os = { + app_version: '2.9.0', + User_Agent: `Mozilla/5.0 (Linux; Android 12; ${this.device}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.73 Mobile Safari/537.36 miHoYoBBSOversea/2.9.0`, + client_type: '2', + Origin: 'https://webstatic-sea.hoyolab.com', + X_Requested_With: 'com.mihoyo.hoyolab', + Referer: 'https://webstatic-sea.hoyolab.com' + } + let client + if (this.server.startsWith('os')) { + client = os + } else { + client = cn + } + if (sign) { + return { + 'x-rpc-app_version': client.app_version, + 'x-rpc-client_type': client.client_type, + 'x-rpc-device_id': this.option.device_id || this.getGuid(), + 'User-Agent': client.User_Agent, + 'X-Requested-With': client.X_Requested_With, + 'x-rpc-platform': 'android', + 'x-rpc-device_model': this.device, + 'x-rpc-device_name': this.device, + 'x-rpc-channel': 'miyousheluodi', + 'x-rpc-sys_version': '6.0.1', + Referer: client.Referer, + DS: this.getDsSign() + } + } + return { + 'x-rpc-app_version': client.app_version, + 'x-rpc-client_type': client.client_type, + 'User-Agent': client.User_Agent, + Referer: client.Referer, + DS: this.getDs(query, body) + } + } + + getDs (q = '', b = '') { + let n = '' + if (['cn_gf01', 'cn_qd01'].includes(this.server)) { + n = 'xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs' + } else if (['os_usa', 'os_euro', 'os_asia', 'os_cht'].includes(this.server)) { + n = 'okr4obncj8bw5a65hbnn5oo6ixjc3l9w' + } + let t = Math.round(new Date().getTime() / 1000) + let r = Math.floor(Math.random() * 900000 + 100000) + let DS = md5(`salt=${n}&t=${t}&r=${r}&b=${b}&q=${q}`) + return `${t},${r},${DS}` + } + + /** 签到ds */ + getDsSign () { + /** @Womsxd */ + const n = 'Qqx8cyv7kuyD8fTw11SmvXSFHp7iZD29' + const t = Math.round(new Date().getTime() / 1000) + const r = lodash.sampleSize('abcdefghijklmnopqrstuvwxyz0123456789', 6).join('') + const DS = md5(`salt=${n}&t=${t}&r=${r}`) + return `${t},${r},${DS}` + } + + getGuid () { + function S4 () { + return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1) + } + + return (S4() + S4() + '-' + S4() + '-' + S4() + '-' + S4() + '-' + S4() + S4() + S4()) + } + + cacheKey (type, data) { + return 'Yz:genshin:mys:cache:' + md5(this.uid + type + JSON.stringify(data)) + } + + async cache (res, cacheKey) { + if (!res || res.retcode !== 0) return + redis.setEx(cacheKey, this.cacheCd, JSON.stringify(res)) + } + + /* eslint-disable quotes */ + get device () { + if (!this._device) this._device = `Yz-${md5(this.uid).substring(0, 5)}` + return this._device + } + + async getAgent () { + let proxyAddress = cfg.bot.proxyAddress + if (!proxyAddress) return null + if (proxyAddress === 'http://0.0.0.0:0') return null + + if (!this.server.startsWith('os')) return null + + if (HttpsProxyAgent === '') { + HttpsProxyAgent = await import('https-proxy-agent').catch((err) => { + logger.error(err) + }) + + HttpsProxyAgent = HttpsProxyAgent ? HttpsProxyAgent.default : undefined + } + + if (HttpsProxyAgent) { + return new HttpsProxyAgent(proxyAddress) + } + + return null + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/mys/mysInfo.js b/src/Yunzai-Bot/plugins/genshin/model/mys/mysInfo.js new file mode 100644 index 0000000000000000000000000000000000000000..bda61cab2acc1d3da40db98ec1e67429e1f3d4c7 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/mys/mysInfo.js @@ -0,0 +1,428 @@ +import MysApi from './mysApi.js' +import GsCfg from '../gsCfg.js' +import lodash from 'lodash' +import NoteUser from './NoteUser.js' +import MysUser from './MysUser.js' +import DailyCache from './DailyCache.js' + +export default class MysInfo { + static tips = '请先#绑定cookie\n发送【体力帮助】查看配置教程' + + constructor (e) { + if (e) { + this.e = e + this.userId = String(e.user_id) + } + /** 当前查询原神uid */ + this.uid = '' + /** 当前ck信息 */ + this.ckInfo = { + ck: '', + uid: '', + qq: '', + ltuid: '', + type: '' + } + // ck对应MysUser对象 + this.ckUser = null + this.auth = ['dailyNote', 'bbs_sign_info', 'bbs_sign_home', 'bbs_sign', 'ys_ledger', 'compute', 'avatarSkill', 'detail', 'blueprint'] + } + + static async init (e, api) { + await MysInfo.initCache() + + let mysInfo = new MysInfo(e) + + let onlySelfCk = false + + if (mysInfo.checkAuth(api)) { + /** 获取ck绑定uid */ + mysInfo.uid = await MysInfo.getSelfUid(e) + // 标记需要自身ck + onlySelfCk = true + } else { + /** 获取uid */ + mysInfo.uid = await MysInfo.getUid(e) + } + + if (!mysInfo.uid) { + e.noTips = true + return false + } + + if (!['1', '2', '5', '6', '7', '8', '9'].includes(String(mysInfo.uid)[0])) { + // e.reply('只支持查询国服uid') + return false + } + if (!['6', '7', '8', '9'].includes(String(mysInfo.uid)[0]) && api === 'useCdk') { + e.reply('兑换码使用只支持国际服uid') + return false + } + + mysInfo.e.uid = mysInfo.uid + + /** 获取ck */ + await mysInfo.getCookie(onlySelfCk) + + /** 判断回复 */ + await mysInfo.checkReply() + + return mysInfo + } + + static async getNoteUser (e) { + await MysInfo.initCache() + let user = await NoteUser.create(e) + if (user) { + // 强制读取一次ck,防止一些问题 + user._getCkData() + return user + } + return false + } + + /** + * 获取UID + * @param e + * @param matchMsgUid 用于判断消息是否为uid数据 + * @returns {Promise} + */ + static async getUid (e, matchMsgUid = true) { + let user = await NoteUser.create(e) + if (e.uid && matchMsgUid) { + /** 没有绑定的自动绑定 */ + return await user.setRegUid(e.uid, false) + } + + let { msg = '', at = '' } = e + if (!msg) return false + + let uid + /** at用户 */ + if (at) { + let atUser = await NoteUser.create(at) + uid = atUser.uid + if (uid) return String(uid) + if (e.noTips !== true) e.reply('尚未绑定uid', false, { at }) + return false + } + + let matchUid = (msg = '') => { + let ret = /[125-9][0-9]{8}/g.exec(msg) + if (!ret) return false + return ret[0] + } + + // 消息携带UID、当前用户UID、群名片携带UID 依次获取 + uid = matchUid(msg) || user.uid || matchUid(e.sender.card) + if (!matchMsgUid) uid = user.uid + if (uid) { + /** 没有绑定的自动绑定 */ + return await user.setRegUid(uid, false) + } + + if (e.noTips !== true) e.reply('请先#绑定uid', false, { at }) + + return false + } + + /** + * 获取ck绑定uid + * @param e + * @returns {Promise} + */ + static async getSelfUid (e) { + let { msg = '', at = '' } = e + if (!msg) return false + + let user = await NoteUser.create(e) + let selfUser = at ? await NoteUser.create(at) : user + + if (!selfUser.hasCk) { + if (e.noTips !== true) e.reply('尚未绑定cookie', false, { at: selfUser.qq }) + return false + } + + return selfUser.uid + } + + /** 判断绑定ck才能查询 */ + checkAuth (api) { + if (api === 'cookie') { + return true + } + if (lodash.isObject(api)) { + for (let i in api) { + if (this.auth.includes(i)) { + return true + } + } + } else if (this.auth.includes(api)) { + return true + } + return false + } + + /** + * @param e + * @param e.apiSync 多个请求时是否同步请求 + * @param e.noTips 是否回复提示,用于第一次调用才提示,后续不再提示 + * @param api + * * `index` 米游社原神首页宝箱等数据 + * * `spiralAbyss` 原神深渊 + * * `character` 原神角色详情 + * * `dailyNote` 原神树脂 + * * `bbs_sign` 米游社原神签到 + * * `detail` 详情 + * * `ys_ledger` 札记 + * * `compute` 养成计算器 + * * `avatarSkill` 角色技能 + * @param data 查询数据data + * @param option 配置 + * @param option.log 是否显示请求日志 + */ + static async get (e, api, data = {}, option = {}) { + let mysInfo = await MysInfo.init(e, api) + + if (!mysInfo.uid || !mysInfo.ckInfo.ck) return false + e.uid = mysInfo.uid + + let mysApi = new MysApi(mysInfo.uid, mysInfo.ckInfo.ck, option) + + let res + if (lodash.isObject(api)) { + let all = [] + /** 同步请求 */ + if (e.apiSync) { + res = [] + for (let i in api) { + res.push(await mysApi.getData(i, api[i])) + } + } else { + lodash.forEach(api, (v, i) => { + all.push(mysApi.getData(i, v)) + }) + res = await Promise.all(all) + } + + for (let i in res) { + res[i] = await mysInfo.checkCode(res[i], res[i].api) + + if (res[i]?.retcode === 0) continue + + break + } + } else { + res = await mysApi.getData(api, data) + res = await mysInfo.checkCode(res, api) + } + + return res + } + + async checkReply () { + if (this.e.noTips === true) return + + if (!this.uid) { + this.e.reply('请先#绑定uid') + } + + if (!this.ckInfo.ck) { + this.e.reply('暂无可用CK,请绑定更多用户或设置公共ck..') + } + + this.e.noTips = true + } + + /* 获取请求所需ck */ + /** + * 获取请求所需CK + * @param onlySelfCk 是否只获取uid自己对应的ck。为true则只获取uid对应ck,若无则返回为空 + * @returns {Promise} 查询ck,获取失败则返回空 + */ + async getCookie (onlySelfCk = false) { + if (this.ckInfo.ck) return this.ckInfo.ck + + let mysUser = await MysUser.getByQueryUid(this.uid, onlySelfCk) + if (mysUser) { + if (mysUser.ckData?.ck) { + this.ckInfo = mysUser.ckData + this.ckUser = mysUser + // 暂时直接记录请求uid,后期优化分析MysApi请求结果分状态记录结果 + await mysUser.addQueryUid(this.uid) + } else { + // 重新分配 + await mysUser.disable() + return onlySelfCk ? '' : await this.getCookie() + } + } + return this.ckInfo.ck + } + + /** + * 初始化公共CK + * @returns {Promise} + */ + static async initPubCk () { + // 初始化公共CK + let pubCount = 0 + let pubCks = GsCfg.getConfig('mys', 'pubCk') || [] + for (let ck of pubCks) { + let pubUser = await MysUser.create(ck) + if (pubUser) { + let ret = await pubUser.initCache({ qq: 'pub' }) + if (ret) { + pubCount++ + } + if (pubCount >= 20) { + break + } + } + } + logger.mark(`加载公共ck:${pubCount}个`) + } + + /** + * 初始化用户CK + * 默认会将用户CK加入查询池 + * @returns {Promise} + */ + static async initUserCk () { + // 初始化用户缓存 + let userCount = 0 + await NoteUser.forEach(async function (user) { + userCount += await user.initCache(true) + }) + logger.mark(`加载用户UID:${userCount}个,加入查询池`) + } + + /** + * 初始化缓存 + * @param force 若已经初始化是否强制初始化 + * @param clearData 强制初始化时是否清除已有数据 (刷新/重置) + * @returns {Promise} + */ + static async initCache (force = false, clearData = false) { + // 检查缓存标记 + let cache = DailyCache.create() + if (!force && await cache.get('cache-ready')) { + return true + } + await DailyCache.clearOutdatedData() + + if (clearData) { + await MysUser.clearCache() + } + + // 先初始化用户CK,减少一些公共CK中ltuid无法识别的情况 + await MysInfo.initUserCk() + + await cache.set('cache-ready', new Date() * 1) + + // 初始化公共ck + await MysInfo.initPubCk() + + return true + } + + async checkCode (res, type) { + if (!res) { + this.e.reply('米游社接口请求失败,暂时无法查询') + return false + } + + res.retcode = Number(res.retcode) + if (type === 'bbs_sign') { + if ([-5003].includes(res.retcode)) { + res.retcode = 0 + } + } + switch (res.retcode) { + case 0: + break + case -1: + case -100: + case 1001: + case 10001: + case 10103: + if (/(登录|login)/i.test(res.message)) { + if (this.ckInfo.uid) { + logger.mark(`[ck失效][uid:${this.uid}][qq:${this.userId}]`) + this.e.reply(`UID:${this.ckInfo.uid},米游社cookie已失效`) + } else { + logger.mark(`[公共ck失效][ltuid:${this.ckInfo.ltuid}]`) + this.e.reply('米游社查询失败,请稍后再试') + } + await this.delCk() + } else { + this.e.reply(`米游社接口报错,暂时无法查询:${res.message}`) + } + break + case 1008: + this.e.reply('\n请先去米游社绑定角色', false, { at: this.userId }) + break + case 10101: + await this.disableToday() + this.e.reply('查询已达今日上限') + break + case 10102: + if (res.message === 'Data is not public for the user') { + this.e.reply(`\nUID:${this.uid},米游社数据未公开`, false, { at: this.userId }) + } else { + this.e.reply(`uid:${this.uid},请先去米游社绑定角色`) + } + break + // 伙伴不存在~ + case -1002: + if (res.api === 'detail') res.retcode = 0 + break + case 1034: + logger.mark(`[米游社查询失败][uid:${this.uid}][qq:${this.userId}] 遇到验证码`) + this.e.reply('米游社查询遇到验证码,请稍后再试') + break + default: + this.e.reply(`米游社接口报错,暂时无法查询:${res.message || 'error'}`) + break + } + if (res.retcode !== 0) { + logger.mark(`[mys接口报错]${JSON.stringify(res)},uid:${this.uid}`) + } + // 添加请求记录 + await this.ckUser.addQueryUid(this.uid) + return res + } + + /** 删除失效ck */ + async delCk () { + if (!this.ckUser) { + return false + } + let ckUser = this.ckUser + // 删除记录,并清除对应user ck记录 + await ckUser.delWithUser() + } + + /** 查询次数满,今日内标记失效 */ + async disableToday () { + /** 统计次数设为超限 */ + await this.ckUser.disable() + } + + static async getBingCkUid () { + let res = await GsCfg.getBingCk() + return { ...res.ck } + } + + // 获取uid绑定的ck信息 + static async checkUidBing (uid) { + let ckUser = await MysUser.getByQueryUid(uid, true) + if (ckUser && ckUser.ckData) { + return ckUser.ckData + } + return false + } + + static async delDisable () { + return await MysUser.delDisable() + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/mysNews.js b/src/Yunzai-Bot/plugins/genshin/model/mysNews.js new file mode 100644 index 0000000000000000000000000000000000000000..3a5ed88ca0b19296293cee659760b23b05032df1 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/mysNews.js @@ -0,0 +1,425 @@ +import base from './base.js' +import fetch from 'node-fetch' +import lodash from 'lodash' +import puppeteer from '../../../lib/puppeteer/puppeteer.js' +import common from '../../../lib/common/common.js' +import { segment } from 'oicq' +import gsCfg from '../model/gsCfg.js' + +const _path = process.cwd() +let emoticon + +export default class MysNews extends base { + constructor (e) { + super(e) + this.model = 'mysNews' + } + + async getNews () { + let type = 1 + let typeName = '公告' + if (this.e.msg.includes('资讯')) { + type = '3' + typeName = '资讯' + } + if (this.e.msg.includes('活动')) { + type = '2' + typeName = '活动' + } + + const res = await this.postData('getNewsList', { gids: 2, page_size: 20, type }) + if (!res) return + + const data = res.data.list + if (data.length == 0) { + return true + } + + const page = this.e.msg.replace(/#|#|官方|原神|公告|资讯|活动/g, '').trim() || 1 + if (page > data.length) { + await this.e.reply('目前只查前20条最新的公告,请输入1-20之间的整数。') + return true + } + + const postId = data[page - 1].post.post_id + + const param = await this.newsDetail(postId) + + const img = await this.rander(param) + + return await this.replyMsg(img, `原神${typeName}:${param.data.post.subject}`) + } + + async rander (param) { + const pageHeight = 7000 + + await puppeteer.browserInit() + + if (!puppeteer.browser) return false + + const savePath = puppeteer.dealTpl('mysNews', param) + if (!savePath) return false + + const page = await puppeteer.browser.newPage() + try { + await page.goto(`file://${_path}${lodash.trim(savePath, '.')}`, { timeout: 120000 }) + const body = await page.$('#container') || await page.$('body') + const boundingBox = await body.boundingBox() + + const num = Math.round(boundingBox.height / pageHeight) || 1 + + if (num > 1) { + await page.setViewport({ + width: boundingBox.width, + height: pageHeight + 100 + }) + } + + const img = [] + for (let i = 1; i <= num; i++) { + const randData = { + type: 'jpeg', + quality: 90 + } + + if (i != 1 && i == num) { + await page.setViewport({ + width: boundingBox.width, + height: parseInt(boundingBox.height) - pageHeight * (num - 1) + }) + } + + if (i != 1 && i <= num) { + await page.evaluate(() => window.scrollBy(0, 7000)) + } + + let buff + if (num == 1) { + buff = await body.screenshot(randData) + } else { + buff = await page.screenshot(randData) + } + + if (num > 2) await common.sleep(200) + + puppeteer.renderNum++ + /** 计算图片大小 */ + const kb = (buff.length / 1024).toFixed(2) + 'kb' + + logger.mark(`[图片生成][${this.model}][${puppeteer.renderNum}次] ${kb}`) + + img.push(segment.image(buff)) + } + + await page.close().catch((err) => logger.error(err)) + + if (num > 1) { + logger.mark(`[图片生成][${this.model}] 处理完成`) + } + return img + } catch (error) { + logger.error(`图片生成失败:${this.model}:${error}`) + /** 关闭浏览器 */ + if (puppeteer.browser) { + await puppeteer.browser.close().catch((err) => logger.error(err)) + } + puppeteer.browser = false + } + } + + async newsDetail (postId) { + const res = await this.postData('getPostFull', { gids: 2, read: 1, post_id: postId }) + if (!res) return + + const data = await this.detalData(res.data.post) + + return { + ...this.screenData, + saveId: postId, + dataConent: data.post.content, + data + } + } + + postApi (type, data) { + let host = 'https://bbs-api-static.mihoyo.com/' + let param = [] + lodash.forEach(data, (v, i) => param.push(`${i}=${v}`)) + param = param.join('&') + switch (type) { + // 搜索 + case 'searchPosts': + host = 'https://bbs-api.mihoyo.com/post/wapi/searchPosts?' + break + // 帖子详情 + case 'getPostFull': + host += 'post/wapi/getPostFull?' + break + // 公告列表 + case 'getNewsList': + host += 'post/wapi/getNewsList?' + break + case 'emoticon': + host += 'misc/api/emoticon_set?' + break + } + return host + param + } + + async postData (type, data) { + const url = this.postApi(type, data) + const headers = { + Referer: 'https://bbs.mihoyo.com/', + 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36' + } + let response + try { + response = await fetch(url, { method: 'get', headers }) + } catch (error) { + logger.error(error.toString()) + return false + } + + if (!response.ok) { + logger.error(`[米游社接口错误][${type}] ${response.status} ${response.statusText}`) + return false + } + const res = await response.json() + return res + } + + async detalData (data) { + let json + try { + json = JSON.parse(data.post.content) + } catch (error) { + + } + + if (typeof json == 'object') { + if (json.imgs && json.imgs.length > 0) { + for (const val of json.imgs) { + data.post.content = `
` + } + } + } else { + for (const img of data.post.images) { + data.post.content = data.post.content.replace(img, img + '?x-oss-process=image//resize,s_600/quality,q_80/auto-orient,0/interlace,1/format,jpg') + } + + if (!emoticon) { + emoticon = await this.mysEmoticon() + } + + data.post.content = data.post.content.replace(/_\([^)]*\)/g, function (t, e) { + t = t.replace(/_\(|\)/g, '') + if (emoticon.has(t)) { + return `` + } else { + return '' + } + }) + + const arrEntities = { lt: '<', gt: '>', nbsp: ' ', amp: '&', quot: '"' } + data.post.content = data.post.content.replace(/&(lt|gt|nbsp|amp|quot);/ig, function (all, t) { + return arrEntities[t] + }) + } + + data.post.created_time = new Date(data.post.created_at * 1000).toLocaleString() + + for (const i in data.stat) { + data.stat[i] = data.stat[i] > 10000 ? (data.stat[i] / 10000).toFixed(2) + '万' : data.stat[i] + } + + return data + } + + async mysEmoticon () { + const emp = new Map() + + const res = await this.postData('emoticon', { gids: 2 }) + + if (res.retcode != 0) { + return emp + } + + for (const val of res.data.list) { + if (!val.icon) continue + for (const list of val.list) { + if (!list.icon) continue + emp.set(list.name, list.icon) + } + } + + return emp + } + + async mysSearch () { + let msg = this.e.msg + msg = msg.replace(/#|米游社|mys/g, '') + + if (!msg) { + await this.e.reply('请输入关键字,如#米游社七七') + return false + } + + let page = msg.match(/.*(\d){1}$/) || 0 + if (page && page[1]) { + page = page[1] + } + + msg = lodash.trim(msg, page) + + let res = await this.postData('searchPosts', { gids: 2, size: 20, keyword: msg }) + if (!res) return + + if (res?.data?.posts.length <= 0) { + await this.e.reply('搜索不到您要的结果,换个关键词试试呗~') + return false + } + + let postId = res.data.posts[page].post.post_id + + const param = await this.newsDetail(postId) + + const img = await this.rander(param) + + return await this.replyMsg(img, `${param.data.post.subject}`) + } + + async mysUrl () { + let msg = this.e.msg + let postId = /[0-9]+/g.exec(msg)[0] + + if (!postId) return false + + const param = await this.newsDetail(postId) + + const img = await this.rander(param) + + return await this.replyMsg(img, `${param.data.post.subject}`) + } + + async ysEstimate () { + let msg = '版本原石盘点' + let res = await this.postData('searchPosts', { gids: 2, size: 20, keyword: msg }) + if (res?.data?.posts.length <= 0) { + await this.e.reply('暂无数据') + return false + } + let postId = '' + for (let post of res.data.posts) { + if (post.user.uid == '218945821') { + postId = post.post.post_id + break + } + } + + if (!postId) { + await this.e.reply('暂无数据') + return false + } + + const param = await this.newsDetail(postId) + + const img = await this.rander(param) + + if (img.length > 1) { + img.push(segment.image(param.data.post.images[0] + '?x-oss-process=image//resize,s_600/quality,q_80/auto-orient,0/interlace,1/format,jpg')) + } + + return await this.replyMsg(img, `${param.data.post.subject}`) + } + + async replyMsg (img, titile) { + if (!img || img.length <= 0) return false + if (img.length == 1) { + return img[0] + } else { + let msg = [titile, ...img] + return await common.makeForwardMsg(this.e, msg, titile).catch((err) => { + logger.error(err) + }) + } + } + + async mysNewsTask (type = 1) { + let cfg = gsCfg.getConfig('mys', 'pushNews') + + // 推送2小时内的公告资讯 + let interval = 7200 + // 最多同时推送两条 + this.maxNum = cfg.maxNum + // 包含关键字不推送 + let banWord = /冒险助力礼包|纪行|预下载|脚本外挂|集中反馈|已开奖|云·原神|魔神任务|传说任务说明/g + + let anno = await this.postData('getNewsList', { gids: 2, page_size: 10, type: 1 }) + let info = await this.postData('getNewsList', { gids: 2, page_size: 10, type: 3 }) + + let news = [] + if (anno) anno.data.list.forEach(v => { news.push({ ...v, typeName: '公告', post_id: v.post.post_id }) }) + if (info) info.data.list.forEach(v => { news.push({ ...v, typeName: '资讯', post_id: v.post.post_id }) }) + if (news.length <= 0) return + + news = lodash.orderBy(news, ['post_id'], ['asc']) + + let now = Date.now() / 1000 + + this.key = 'Yz:genshin:mys:newPush:' + this.e.isGroup = true + this.pushGroup = [] + for (let val of news) { + if (Number(now - val.post.created_at) > interval) { + continue + } + if (new RegExp(banWord).test(val.post.subject)) { + continue + } + if (val.typeName == '公告') { + for (let groupId of cfg.announceGroup) { + await this.sendNews(groupId, val.typeName, val.post.post_id) + } + } + if (val.typeName == '资讯') { + for (let groupId of cfg.infoGroup) { + await this.sendNews(groupId, val.typeName, val.post.post_id) + } + } + } + } + + async sendNews (groupId, typeName, postId) { + if (!this.pushGroup[groupId]) this.pushGroup[groupId] = 0 + if (this.pushGroup[groupId] >= this.maxNum) return + + let sended = await redis.get(`${this.key}${groupId}:${postId}`) + if (sended) return + + if (!this[postId]) { + const param = await this.newsDetail(postId) + + logger.mark(`[米游社${typeName}推送] ${param.data.post.subject}`) + + this[postId] = { + img: await this.rander(param), + title: param.data.post.subject + } + } + + this.pushGroup[groupId]++ + this.e.group = Bot.pickGroup(Number(groupId)) + this.e.group_id = Number(groupId) + let tmp = await this.replyMsg(this[postId].img, `原神${typeName}推送:${this[postId].title}`) + + await common.sleep(1000) + if (!tmp) return + + if (tmp?.type != 'xml') { + tmp = [`原神${typeName}推送\n`, tmp] + } + + redis.set(`${this.key}${groupId}:${postId}`, '1', { EX: 3600 * 10 }) + await this.e.group.sendMsg(tmp) + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/mysSign.js b/src/Yunzai-Bot/plugins/genshin/model/mysSign.js new file mode 100644 index 0000000000000000000000000000000000000000..cce840b35b94e5d7b8b8e421d51c8bbbc94b6769 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/mysSign.js @@ -0,0 +1,395 @@ +import moment from 'moment' +import lodash from 'lodash' +import base from './base.js' +import MysApi from './mys/mysApi.js' +import gsCfg from './gsCfg.js' +import User from './user.js' +import common from '../../../lib/common/common.js' +import cfg from '../../../lib/config/config.js' + +let signing = false +export default class MysSign extends base { + constructor (e) { + super(e) + this.model = 'sign' + this.isTask = false + this.force = false + + this.cfg = gsCfg.getConfig('mys', 'set') + } + + static async sign (e) { + let mysSign = new MysSign(e) + + if (e.msg.includes('force')) mysSign.force = true + + /** 获取个人ck */ + let ck = gsCfg.getBingCkSingle(e.user_id) + + if (lodash.isEmpty(ck)) { + e.reply('无法签到,请先#绑定cookie\n发送【cookie帮助】查看配置教程', false, { at: true }) + return false + } + + if (signing) { + e.reply('原神自动签到进行中,暂不能手动签到...') + return false + } + + let uids = lodash.map(ck, 'uid') + + if (uids.length > 1) { + await e.reply('多账号签到中...') + } + + let msg = [] + + for (let i in uids) { + mysSign.ckNum = Number(i) + 1 + if (i >= 1) await common.sleep(5000) + let uid = uids[i] + let res = await mysSign.doSign(ck[uid]) + if (res) msg.push(res.msg) + } + + msg = msg.join('\n\n') + + await e.reply(msg) + } + + async doSign (ck, isLog = true) { + ck = this.setCk(ck) + this.mysApi = new MysApi(ck.uid, ck.ck, { log: isLog, device_id: ck.device_id }) + this.key = `${this.prefix}isSign:${this.mysApi.uid}` + this.log = `[uid:${ck.uid}][qq:${lodash.padEnd(this.e.user_id, 10, ' ')}]` + + let isSigned = await redis.get(this.key) + if (isSigned && this.isTask && !this.force) { + let reward = await this.getReward(isSigned) + return { + retcode: 0, + msg: `uid:${ck.uid},今天已签到\n第${isSigned}天奖励:${reward}`, + is_sign: true + } + } + + /** 判断是否已经签到 */ + let signInfo = await this.mysApi.getData('bbs_sign_info') + await common.sleep(100) + + if (!signInfo) return false + + if (signInfo.retcode == -100 && signInfo.message == '尚未登录') { + logger.error(`[原神签到失败]${this.log} 绑定cookie已失效`) + let userAdmin = new User(this.e) + if (userAdmin) { + await userAdmin.delCk(ck.uid) + } + return { + retcode: -100, + msg: `签到失败,uid:${ck.uid},绑定cookie已失效`, + is_invalid: true + } + } + + if (signInfo.retcode !== 0) { + return { + retcode: signInfo.retcode, + msg: `签到失败:${signInfo.message || '未知错误'}` + } + } + + if (signInfo.first_bind) { + return { + retcode: 100, + msg: '签到失败:首次请先手动签到' + } + } + + this.signInfo = signInfo.data + + if (this.signInfo.is_sign && !this.force) { + // logger.mark(`[原神已签到][uid:${this.mysApi.uid}][qq:${lodash.padEnd(this.e.user_id,11,' ')}]`) + let reward = await this.getReward(this.signInfo.total_sign_day) + this.setCache(this.signInfo.total_sign_day) + return { + retcode: 0, + msg: `uid:${ck.uid},今天已签到\n第${this.signInfo.total_sign_day}天奖励:${reward}`, + is_sign: true + } + } + + /** 签到 */ + let res = await this.bbsSign() + + if (res) { + let totalSignDay = this.signInfo.total_sign_day + if (!this.signInfo.is_sign) { + totalSignDay++ + } + + let tips = '签到成功' + + if (this.signed) { + tips = '今天已签到' + } + + let reward = await this.getReward(totalSignDay) + + this.setCache(totalSignDay) + + return { + retcode: 0, + msg: `uid:${ck.uid},${tips}\n第${totalSignDay}天奖励:${reward}` + } + } + + return { + retcode: -1000, + msg: `uid:${ck.uid},签到失败:${this.signMsg}` + } + } + + setCk (ck) { + ck.ck = lodash.trim(ck.ck, ';') + `; _MHYUUID=${ck.device_id}; ` + return ck + } + + // 缓存签到奖励 + async getReward (signDay) { + let key = `${this.prefix}reward` + let reward = await redis.get(key) + + if (reward) { + reward = JSON.parse(reward) + } else { + let res = await this.mysApi.getData('bbs_sign_home') + if (!res || Number(res.retcode) !== 0) return false + + let data = res.data + if (data && data.awards && data.awards.length > 0) { + reward = data.awards + + let monthEnd = Number(moment().endOf('month').format('X')) - Number(moment().format('X')) + redis.setEx(key, monthEnd, JSON.stringify(reward)) + } + } + if (reward && reward.length > 0) { + reward = reward[signDay - 1] || '' + if (reward.name && reward.cnt) { + reward = `${reward.name}*${reward.cnt}` + } + } else { + reward = '' + } + + return reward + } + + async bbsSign () { + this.signApi = true + this.is_verify = false + let sign = await this.mysApi.getData('bbs_sign') + this.signMsg = sign?.message ?? 'Too Many Requests' + + if (!sign) { + logger.mark(`[原神签到失败]${this.log}:${sign.message || this.signMsg}`) + return false + } + + /** 签到成功 */ + if (sign.retcode === -5003) { + this.signed = true + logger.mark(`[原神已经签到]${this.log} 第${this.ckNum}个`) + return true + } + + if (sign.data && sign.data.risk_code === 375) { + this.signMsg = '验证码失败' + sign.message = '验证码失败' + this.is_verify = true + + logger.mark(`[原神签到失败]${this.log}:${sign.message} 第${this.ckNum}个`) + return false + } + + if (sign.retcode === 0 && (sign?.data.success === 0 || sign?.message === 'OK')) { + logger.mark(`[原神签到成功]${this.log} 第${this.ckNum}个`) + return true + } + + logger.mark(`[原神签到失败]${this.log}:${sign.message} 第${this.ckNum}个`) + return false + } + + async signTask (manual) { + if (this.cfg.isAutoSign != 1 && !manual) return + + if (signing && manual) { + await this.e.reply('原神签到任务进行中,完成前请勿重复执行') + return false + } + + this.isTask = true + + let cks = (await gsCfg.getBingCk()).ck + let uids = lodash.filter(cks, (o) => { + return o.autoSign !== false + }) + uids = lodash.map(uids, 'uid') + + if (uids.length <= 0) { + if (manual) await this.e.reply('暂无ck需要签到') + return + } + + signing = true + + let tips = ['开始原神签到任务'] + + let { noSignNum } = await this.getsignNum(uids) + let time = noSignNum * 6.1 + noSignNum * 0.2 + uids.length * 0.02 + 5 + let finishTime = moment().add(time, 's').format('MM-DD HH:mm:ss') + + tips.push(`\n签到ck:${uids.length}个`) + if (uids.length != noSignNum) tips.push(`\n未签ck:${noSignNum}个`) + tips.push(`\n预计需要:${this.countTime(time)}`) + + if (time > 120) { + tips.push(`\n完成时间:${finishTime}`) + } + + logger.mark(`签到ck:${uids.length}个,预计需要${this.countTime(time)} ${finishTime} 完成`) + + if (manual) { + await this.e.reply(tips) + if (this.e.msg.includes('force')) this.force = true + } else { + await common.relpyPrivate(cfg.masterQQ[0], tips) + await common.sleep(lodash.random(1, 20) * 1000) + } + + let sucNum = 0 + let finshNum = 0 + let failNum = 0 + let invalidNum = 0 + let verifyNum = 0 + let contiNum = 0 + + for (let i in uids) { + this.ckNum = Number(i) + 1 + let uid = uids[i] + let ck = cks[uid] + if (!ck || !ck.qq) continue + if (ck.autoSign === false) continue + + this.e.user_id = ck.qq + + let ret = await this.doSign(ck, false) + if (ret.retcode === 0) { + if (ret.is_sign) { + finshNum++ + } else { + sucNum++ + } + } else { + if (this.is_verify) { + verifyNum++ + contiNum++ + } else { + contiNum = 0 + } + if (ret.is_invalid) { + invalidNum++ + } else { + failNum++ + } + } + if (contiNum >= 5) { + break + } + if (this.signApi) { + await common.sleep(6.1 * 1000) + this.signApi = false + } + } + + let msg = `原神签到任务完成:${uids.length}个\n已签:${finshNum}个\n成功:${sucNum}个\n失败:${failNum}个` + if (invalidNum > 0) { + msg += `\n失效:${invalidNum}个` + } + if (contiNum >= 5) { + msg += '\n\n验证码失败次数过多,已停止任务' + } + + if (manual) { + this.e.reply(msg) + } else { + common.relpyPrivate(cfg.masterQQ[0], msg) + } + + signing = false + } + + async setCache (day) { + let end = Number(moment().endOf('day').format('X')) - Number(moment().format('X')) + redis.setEx(this.key, end, String(day)) + } + + async getsignNum (uids) { + let signNum = (await redis.KEYS(`${this.prefix}isSign*`)).length + + let noSignNum = uids.length - signNum + + noSignNum = noSignNum > 0 ? noSignNum : 0 + + return { noSignNum, signNum } + } + + countTime (time) { + let hour = Math.floor((time / 3600) % 24) + let min = Math.floor((time / 60) % 60) + let sec = Math.floor(time % 60) + let msg = '' + if (hour > 0) msg += `${hour}小时` + if (min > 0) msg += `${min}分钟` + if (sec > 0) msg += `${sec}秒` + return msg + } + + async signClose () { + let model = '开启' + if (/关闭|取消/.test(this.e.msg)) { + model = '关闭' + } + + /** 获取个人ck */ + let ck = gsCfg.getBingCkSingle(this.e.user_id) + + if (lodash.isEmpty(ck)) { + await this.e.reply(`${model}签到失败,请先#绑定cookie\n发送【cookie帮助】查看配置教程`, false, { at: true }) + return false + } + + let autoCk = {} + for (let i in ck) { + if (!ck[i].isMain) continue + autoCk = ck[i] + if (model == '开启') { + ck[i].autoSign = true + } else { + ck[i].autoSign = false + } + } + + if (lodash.isEmpty(autoCk)) return + + gsCfg.saveBingCk(this.e.user_id, ck) + + let msg = `uid:${autoCk.uid},原神自动签到已${model}` + if (model == '开启') { + msg += '\n每天将为你自动签到~' + } + await this.e.reply(msg) + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/note.js b/src/Yunzai-Bot/plugins/genshin/model/note.js new file mode 100644 index 0000000000000000000000000000000000000000..bd5d0c2fc87743bceafa1cca0bfe191679e22218 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/note.js @@ -0,0 +1,120 @@ +import moment from 'moment' +import lodash from 'lodash' +import base from './base.js' +import MysInfo from './mys/mysInfo.js' + +export default class Note extends base { + constructor (e) { + super(e) + this.model = 'dailyNote' + } + + /** 生成体力图片 */ + static async get (e) { + let note = new Note(e) + return await note.getData() + } + + async getData () { + let res = await MysInfo.get(this.e, 'dailyNote') + + if (!res || res.retcode !== 0) return false + /** 截图数据 */ + return { + name: this.e.sender.card, + quality: 80, + ...this.screenData, + ...this.noteData(res) + } + } + + noteData (res) { + let { data } = res + + let nowDay = moment().date() + let nowUnix = Number(moment().format('X')) + + /** 树脂 */ + let resinMaxTime + if (data.resin_recovery_time > 0) { + resinMaxTime = nowUnix + Number(data.resin_recovery_time) + + let maxDate = moment.unix(resinMaxTime) + resinMaxTime = maxDate.format('HH:mm') + + if (maxDate.date() != nowDay) { + resinMaxTime = `明天 ${resinMaxTime}` + } else { + resinMaxTime = ` ${resinMaxTime}` + } + } + + /** 派遣 */ + let remainedTime = '' + if (data.expeditions && data.expeditions.length >= 1) { + remainedTime = lodash.map(data.expeditions, 'remained_time') + remainedTime = lodash.min(remainedTime) + + if (remainedTime > 0) { + remainedTime = nowUnix + Number(remainedTime) + let remainedDate = moment.unix(remainedTime) + remainedTime = remainedDate.format('HH:mm') + + if (remainedDate.date() != nowDay) { + remainedTime = `明天 ${remainedTime}` + } else { + remainedTime = ` ${remainedTime}` + } + } + } + + /** 宝钱 */ + let coinTime = '' + if (data.home_coin_recovery_time > 0) { + let coinDay = Math.floor(data.home_coin_recovery_time / 3600 / 24) + let coinHour = Math.floor((data.home_coin_recovery_time / 3600) % 24) + let coinMin = Math.floor((data.home_coin_recovery_time / 60) % 60) + if (coinDay > 0) { + coinTime = `${coinDay}天${coinHour}小时${coinMin}分钟` + } else { + let coinDate = moment.unix(nowUnix + Number(data.home_coin_recovery_time)) + + if (coinDate.date() != nowDay) { + coinTime = `明天 ${coinDate.format('HH:mm')}` + } else { + coinTime = coinDate.format('HH:mm') + } + } + } + + let week = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'] + let day = `${moment().format('MM-DD HH:mm')} ${week[moment().day()]}` + + /** 参量质变仪 */ + if (data?.transformer?.obtained) { + data.transformer.reached = data.transformer.recovery_time.reached + let recoveryTime = '' + + if (data.transformer.recovery_time.Day > 0) { + recoveryTime += `${data.transformer.recovery_time.Day}天` + } + if (data.transformer.recovery_time.Hour > 0) { + recoveryTime += `${data.transformer.recovery_time.Hour}小时` + } + if (data.transformer.recovery_time.Minute > 0) { + recoveryTime += `${data.transformer.recovery_time.Minute}分钟` + } + data.transformer.recovery_time = recoveryTime + } + + return { + uid: this.e.uid, + saveId: this.e.uid, + resinMaxTime, + remainedTime, + coinTime, + day, + ...data + } + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/payLogData.js b/src/Yunzai-Bot/plugins/genshin/model/payLogData.js new file mode 100644 index 0000000000000000000000000000000000000000..5e394cc5373eb6cb9d2a3d426c3f1bd5391e3e11 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/payLogData.js @@ -0,0 +1,271 @@ +import puppeteer from '../../../lib/puppeteer/puppeteer.js' +import fetch from 'node-fetch' +import moment from 'moment' +import lodash from 'lodash' +import fs from 'fs' +import base from './base.js' + +if (!fs.existsSync('./data/payLog/')) { + fs.mkdirSync('./data/payLog/') +} + +export class PayData { + constructor (authKey = '') { + this.#authkey = encodeURIComponent(authKey) + } + + #genShinId = '' + #oringinData = [] + #authkey = '' + + /** 获取原始支付数据 */ + async getOringinalData (id = '') { + let res = await fetch(this.getUrl() + id, this.headers) + let ret = await res.json() + // 加一个authkey不同情况 + if (ret?.retcode === -101 || ret?.retcode === -100) { + return ret.retcode === -101 ? { errorMsg: '您的链接过期,请重新获取' } : { errorMsg: '链接不正确,请重新获取' } + } + let list = ret.data.list + if (list.length === 20) { + this.#oringinData.push(...list) + await this.getOringinalData(list[19].id) + return true + } else { + this.#oringinData.push(...list) + return true + } + } + + /** 获取大月卡数据 */ + async getPrimogemLog (id = '') { + let res = await fetch(this.getUrl('getPrimogemLog') + id, this.headers) + let ret = await res.json() + let list = ret.data.list + if (list.length === 20) { + list.forEach(v => { + if (v.add_num === '680') this.#oringinData.push(v) + }) + await this.getPrimogemLog(list[19].id) + return true + } else { + list.forEach(v => { + if (v.add_num === '680') this.#oringinData.push(v) + }) + return true + } + } + + /** 对原始数据进行筛选,组合 */ + async filtrateData () { + // 获取数据 + let isSucceed = await this.getOringinalData() + // 判断数据是否获取成功 + if (isSucceed?.errorMsg) return isSucceed + await this.getPrimogemLog() + // 获取uid,并判断零氪党的情况 + if (this.#oringinData[0]?.uid) { + this.#genShinId = this.#oringinData[0].uid + } else { + return { errorMsg: '未获取到您的任何充值数据' } + } + // 将原始数据按id排序 + this.#oringinData = this.#oringinData.sort((a, b) => { + let val1 = Number(a.id) + let val2 = Number(b.id) + if (val2 > val1) { + return -1 + } else { + return 1 + } + }) + // 单双倍结晶数 + const price = [680, 300, 8080, 3880, 2240, 1090, 330, 60] + const doublePrice = [0, 0, 12960, 6560, 3960, 1960, 600, 120] + let month = 0 + let sum = 0 + let i = -1 + let listIndex = 0 + let list = [] + for (let index = 0; index < this.#oringinData.length; index++) { + // 如果小于零则返回 + let num = Number(this.#oringinData[index].add_num) + if (num < 0) continue + // 获取月份 + let thisMonth = ++moment(this.#oringinData[index].time).toArray()[1] + if (thisMonth !== month) { + i++ + month = thisMonth + list[listIndex++] = { + month: thisMonth + '月', + payNum: [0, 0, 0, 0, 0, 0, 0, 0] + } + } else if (!i) { + list[i] = { + month: thisMonth + '月', + payNum: [0, 0, 0, 0, 0, 0, 0, 0] + } + } + for (let index = 0; index < 8; index++) { + if (num === price[index] || num === doublePrice[index]) { + list[i].payNum[index]++ + if (num !== 680) sum += num + break + } + } + } + return { + uid: this.#genShinId, + crystal: sum, + monthData: list + } + } + + headers = { + headers: { + accept: 'application/json, text/plain, */*', + 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-site' + }, + referrer: 'https://webstatic.mihoyo.com/', + referrerPolicy: 'strict-origin-when-cross-origin', + method: 'GET', + mode: 'cors', + credentials: 'include' + } + + // 两个api //原石 getPrimogemLog //结晶 getCrystalLog + getUrl (api = 'getCrystalLog') { + let type = api === 'getCrystalLog' ? 3 : 1 + return `https://hk4e-api.mihoyo.com/ysulog/api/${api}?selfquery_type=${type}&lang=zh-cn&sign_type=2&auth_appid=csc&authkey_ver=1&authkey=${this.#authkey}&game_biz=hk4e_cn&app_client=bbs&type=${type}&size=20&end_id=` + } +} + +export class HtmlData extends base { + /** + * @param data 数据 + * @param data.monthData 月份数据 + * @param data.crystal 总结晶数 + */ + constructor (data = {}) { + super() + this.monthData = data.monthData + this.crystal = data.crystal + this.uid = data.uid + this.model = 'payLog' + } + + crystal = 0 + uid = '' + monthData = [] + + // 价格 + price = [68, 30, 648, 328, 198, 98, 30, 6] + + /** 柱形图数据 */ + getBarData () { + return this.monthData.map(v => { + return { + type: v.month, + sales: v.payNum.reduce((sum, val, index) => sum + val * this.price[index], 0) + } + }) + } + + /** 顶部数据 */ + getTopData (crystal = 0) { + const maxMonth = this.maxcConsumption() + const sum = this.sumConsumption() + return [ + { + title: '总消费', + value: '¥' + this.getBarData().reduce((sum, val) => sum + val.sales, 0) + }, + { + title: '总结晶', + value: this.crystal + }, + { + title: '消费最多', + value: maxMonth.type + }, + { + title: maxMonth.type + '消费', + value: '¥' + maxMonth.sales + }, + ...sum + ] + } + + /** 饼图数据 */ + getPieData () { + const data = this.sumConsumption() + let pieData = [] + data.forEach((val, index) => { + let value = val.value * this.price[index] + if (value) { + pieData.push({ + value, + name: val.title + }) + } + }) + return pieData + } + + /** 消费最多月 */ + maxcConsumption () { + return this.getBarData().sort((a, b) => { + if (a.sales < b.sales) { + return 1 + } else { + return -1 + } + })[0] + } + + /** 每种消费的总数 */ + sumConsumption () { + let sum = { + 小月卡: 0, + 大月卡: 0, + 648: 0, + 328: 0, + 198: 0, + 98: 0, + 30: 0, + 6: 0 + } + // 循环sum,按照月份统计各个充值的类别总数 + let k = Object.keys(sum).reverse() + this.monthData.forEach(val => { + val.payNum.forEach((v, i) => { + sum[k[i]] += v + }) + }) + // 返回title,value对象'648':123456 + let value = Object.values(sum).reverse() + return k.map((val, index) => { + return { + title: val, + value: value[index] + } + }) + } +} + +export async function renderImg (data) { + const htmlData = new HtmlData(data) + const imgDatas = { + ...htmlData.screenData, + topData: htmlData.getTopData(), + barData: JSON.stringify(htmlData.getBarData()), + pieData: JSON.stringify(htmlData.getPieData()), + saveId: htmlData.uid, + uid: htmlData.uid + } + let img = await puppeteer.screenshot('payLog', imgDatas) + return img +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/roleBag.js b/src/Yunzai-Bot/plugins/genshin/model/roleBag.js new file mode 100644 index 0000000000000000000000000000000000000000..7fdfa713e4cea5c578469fedb588a5bad16b3c9e --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/roleBag.js @@ -0,0 +1,105 @@ +import base from './base.js' +import MysInfo from './mys/mysInfo.js' +import gsCfg from './gsCfg.js' +import lodash from 'lodash' + +export default class RoleBag extends base { + constructor (e) { + super(e) + this.model = 'roleBag' + } + + static async get (e) { + let roleBag = new RoleBag(e) + return await roleBag.getData() + } + + /** #武器 */ + async getData (e) { + let res = await MysInfo.get(this.e, 'character') + + if (!res || res.retcode !== 0) return false + + let avatars = res.data.avatars + + if (avatars.length <= 0) { + return true + } + + /** 截图数据 */ + let data = { + ...this.screenData, + saveId: this.e.uid, + uid: this.e.uid, + ...this.dealData(avatars) + } + + return data + } + + dealData (avatars) { + let type = 'all' + if (avatars.length > 8) { + if (/(.*)(四星|4星)(.*)/.test(this.e.msg)) { + type = 4 + } + if (/(.*)(五星|5星)(.*)/.test(this.e.msg)) { + type = 5 + } + } + + let costumes = gsCfg.getdefSet('role', 'other').costumes + let sortName = gsCfg.getdefSet('role', 'other').sortName + + let list = [] + + for (let val of avatars) { + let rarity = val.rarity + if (val.rarity > 5) { + rarity = 5 + } + + if (type != 'all' && rarity != type) { + continue + } + + val.sort = rarity * 100000 + val.actived_constellation_num * 10000 + val.level * 100 + (val.id - 10000000) + + // 增加神里排序 + if (val.id == 10000002) { + val.sort += 50 + } + + if (val.rarity > 5) { + val.sort = val.sort - (val.id - 10000000) + } + val.sortLevel = val.level + + val.weapon.showName = sortName[val.weapon.name] ?? val.weapon.name + + val.name = gsCfg.roleIdToName(val.id) + + if (val.id == 10000005 || val.id == 10000007) { + val.sort = 0 + } + + val.costumesLogo = '' + if (val.costumes && val.costumes.length >= 1) { + for (let v of val.costumes) { + if (costumes.includes(v.name)) { + val.costumesLogo = 2 + break + } + } + } + + list.push(val) + } + + list = lodash.chain(list).orderBy(['sortLevel'], ['desc']).orderBy(['sort'], ['desc']).value() + + let num = list.length + + return { list, num } + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/roleDetail.js b/src/Yunzai-Bot/plugins/genshin/model/roleDetail.js new file mode 100644 index 0000000000000000000000000000000000000000..01eefdd141ee8b3232ad541dcafa906ae02fd279 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/roleDetail.js @@ -0,0 +1,257 @@ +import base from './base.js' +import MysInfo from './mys/mysInfo.js' +import gsCfg from './gsCfg.js' +import lodash from 'lodash' +import { segment } from 'oicq' +import fs from 'node:fs' +import fetch from 'node-fetch' +import common from '../../../lib/common/common.js' + +export default class RoleDetail extends base { + constructor (e) { + super(e) + this.model = 'roleDetail' + + this.path = './data/roleDetail/' + } + + static async get (e) { + if (!e.roleName) return false + let roleDetail = new RoleDetail(e) + return await roleDetail.getDetail() + } + + async getDetail () { + let character = await MysInfo.get(this.e, 'character') + let detail = await MysInfo.get(this.e, 'detail', { avatar_id: this.e.roleId }) + + if (!character || character.retcode !== 0) return false + + let avatar = await this.getAvatar(character.data) + if (!avatar) return false + + /** 获取技能等级 */ + let skill = {} + if (detail && detail.data) { + skill = this.getSkill(detail.data, avatar) + } + + if (!await this.checkImg(avatar.name)) return false + + /** 截图数据 */ + let data = { + quality: 80, + ...this.screenData, + uid: this.e.uid, + saveId: this.e.uid, + ...avatar, + skill + } + + this.e.msg += ` ${avatar.name}` + return data + } + + async getAvatar (data) { + let avatars = lodash.keyBy(data.avatars, 'id') + + /** 旅行者特殊处理 */ + if (this.e.roleId == '20000000') { + if (avatars['10000007']) this.e.roleId = '10000007' + if (avatars['10000005']) this.e.roleId = '10000005' + } + + if (!avatars[this.e.roleId]) { + await this.noAvatar() + return false + } + + /** 角色数据 */ + avatars = avatars[this.e.roleId] + let list = [] + let set = {} + let setArr = [] + let text1 = '' + let text2 = '' + let bg = 2 + + list[0] = { + type: 'weapon', + name: avatars.weapon.name, + showName: gsCfg.shortName(avatars.weapon.name, true), + level: avatars.weapon.level, + affix_level: avatars.weapon.affix_level + } + + for (let val of avatars.reliquaries) { + if (set[val.set.name]) { + set[val.set.name]++ + + if (set[val.set.name] == 2) { + if (text1) { + text2 = '2件套:' + val.set.affixes[0].effect + } else { + text1 = '2件套:' + val.set.affixes[0].effect + } + } + + if (set[val.set.name] == 4) { + text2 = '4件套:' + val.set.name + } + } else { + set[val.set.name] = 1 + } + + list.push({ + type: 'reliquaries', + name: val.name, + level: val.level + }) + } + + for (let val of Object.keys(set)) { + setArr.push({ + name: val, + num: set[val], + showName: gsCfg.shortName(val, true) + }) + } + + if (avatars.reliquaries.length >= 2 && !text1) { + text1 = '无套装效果' + } + + if (avatars.id == '10000005') avatars.name = '空' + if (avatars.id == '10000007') avatars.name = '荧' + + // 皮肤图片 + if (['魈', '甘雨'].includes(avatars.name)) { + if (lodash.random(0, 100) > 50) { + bg = 3 + } + } else if (['芭芭拉', '凝光', '刻晴', '琴'].includes(avatars.name)) { + if (avatars.costumes && avatars.costumes.length >= 1) { + bg = 3 + } + } + + return { + name: avatars.name, + showName: gsCfg.shortName(avatars.name), + level: avatars.level, + fetter: avatars.fetter, + actived_constellation_num: avatars.actived_constellation_num, + list, + text1, + text2, + bg, + set: setArr, + constellations: avatars.constellations + } + } + + async noAvatar () { + let msg = '' + if (this.isBing) { + let randFace = lodash.sample([26, 111, 110, 173, 177, 36, 37, 5, 9, 267, 264, 262, 265]) + msg = [`\n尚未拥有${this.e.roleName}`, segment.face(randFace)] + } else { + msg = '\n请先在米游社展示该角色' + } + await this.e.reply(msg, false, { at: true }) + } + + getSkill (data = {}, avatar) { + // if (!this.isBing) return {} + + let skill = { + id: avatar.id + } + + let type = 'id' + if ([10000021].includes(Number(avatar.id))) { + type = 'group_id' + } + let skillList = lodash.orderBy(data.skill_list, [type], ['asc']) + + for (let val of skillList) { + val.level_original = val.level_current + if (val.name.includes('普通攻击') || val.name.includes('Normal Attack')) { + skill.a = val + continue + } + if (val.max_level >= 10 && !skill.e) { + skill.e = val + continue + } + if (val.max_level >= 10 && !skill.q) { + skill.q = val + continue + } + } + if (avatar.actived_constellation_num >= 3) { + if (avatar.constellations[2].effect.includes(skill.e.name)) { + skill.e.level_current += 3 + } else if (avatar.constellations[2].effect.includes(skill.q.name)) { + skill.q.level_current += 3 + } + } + if (avatar.actived_constellation_num >= 5) { + if (avatar.constellations[4].effect.includes(skill.e.name)) { + skill.e.level_current += 3 + } else if (avatar.constellations[4].effect.includes(skill.q.name)) { + skill.q.level_current += 3 + } + } + + return skill + } + + async checkImg (name) { + if (fs.existsSync(`${this.path}${name}1.png`)) return true + + let ret = await this.getData() + if (!ret) return false + if (ret.retcode != 0) return false + + let img = {} + for (let post of ret.data.posts) { + img[post.post.subject] = post.post.images + } + if (!img[name]) { + this.e.reply(`暂无${name}素材`) + return false + } + + await this.downImg(name, img[name]) + + return true + } + + async getData () { + let url = 'https://bbs-api.mihoyo.com/post/wapi/getPostFullInCollection?&gids=2&collection_id=1057503' + + try { + let ret = await fetch(url, { method: 'get' }) + if (!ret.ok) { + return false + } + return await ret.json() + } catch (error) { + return false + } + } + + async downImg (name, arr) { + let ret = [] + arr.forEach((v, k) => ret.push(common.downFile(v, `${this.path}${name}${++k}.png`))) + + try { + ret = await Promise.all(ret) + return true + } catch (error) { + logger.error(`${this.e.logFnc} ${error}}`) + return false + } + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/roleIndex.js b/src/Yunzai-Bot/plugins/genshin/model/roleIndex.js new file mode 100644 index 0000000000000000000000000000000000000000..df07b4a61610ea457a71b5701f53d2d912e7c9b5 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/roleIndex.js @@ -0,0 +1,515 @@ +import base from './base.js' +import MysInfo from './mys/mysInfo.js' +import gsCfg from './gsCfg.js' +import lodash from 'lodash' +import moment from 'moment' +import fs from 'node:fs' + +let imgFile = {} + +export default class RoleIndex extends base { + constructor (e) { + super(e) + this.model = 'roleIndex' + this.other = gsCfg.getdefSet('role', 'other') + this.wother = gsCfg.getdefSet('weapon', 'other') + + this.area = { + 蒙德: 1, + 璃月: 2, + 雪山: 3, + 稻妻: 4, + 渊下宫: 5, + 层岩巨渊: 6, + 层岩地下: 7, + 须弥: 8 + } + + this.areaName = lodash.invert(this.area) + + this.headIndexStyle = `` + } + + static async get (e) { + let roleIndex = new RoleIndex(e) + return await roleIndex.getIndex() + } + + async getIndex () { + let ApiData = { + index: '', + spiralAbyss: { schedule_type: 1 }, + character: '', + basicInfo: '' + } + let res = await MysInfo.get(this.e, ApiData) + + if (!res || res[0].retcode !== 0 || res[2].retcode !== 0) return false + + let ret = [] + res.forEach(v => ret.push(v.data)) + + /** 截图数据 */ + let data = { + quality: 80, + ...this.screenData, + ...this.dealData(ret) + } + // console.log(...this.dealData(ret)) + return data + } + + dealData (data) { + let [resIndex, resAbyss, resDetail, basicInfo] = data + + let avatars = resDetail.avatars || [] + let roleArr = avatars + + for (let i in avatars) { + let rarity = avatars[i].rarity + let liveNum = avatars[i].actived_constellation_num + let level = avatars[i].level + let id = avatars[i].id - 10000000 + + if (rarity >= 5) { + rarity = 5 + } + // 埃洛伊排到最后 + if (rarity > 5) { + id = 0 + } + // 增加神里排序 + if (avatars[i].id == 10000002) { + id = 50 + } + + if (avatars[i].id == 10000005) { + avatars[i].name = '空' + liveNum = 0 + level = 0 + } else if (avatars[i].id == 10000007) { + avatars[i].name = '荧' + liveNum = 0 + level = 0 + } + avatars[i].sortLevel = level + // id倒序,最新出的角色拍前面 + avatars[i].sort = rarity * 100000 + liveNum * 10000 + level * 100 + id + + avatars[i].weapon.showName = this.wother.sortName[avatars[i].weapon.name] ?? avatars[i].weapon.name + + avatars[i].costumesLogo = '' + if (avatars[i].costumes && avatars[i].costumes.length >= 1) { + for (let val of avatars[i].costumes) { + if (this.other.costumes.includes(val.name)) { + avatars[i].costumesLogo = 2 + break + } + } + } + } + + let stats = resIndex.stats || {} + let line = [ + [ + { lable: '成就', num: stats.achievement_number }, + { lable: '角色数', num: stats.avatar_number }, + { lable: '等级', num: resIndex?.role?.level ?? 0 }, + { + lable: '总宝箱', + num: + stats.precious_chest_number + + stats.luxurious_chest_number + + stats.exquisite_chest_number + + stats.common_chest_number + + stats.magic_chest_number + } + ], + [ + { lable: '华丽宝箱', num: stats.luxurious_chest_number }, + { lable: '珍贵宝箱', num: stats.precious_chest_number }, + { lable: '精致宝箱', num: stats.exquisite_chest_number }, + { lable: '普通宝箱', num: stats.common_chest_number } + ] + ] + + // 尘歌壶 + let homesLevel = 0 + // let homesItem = 0 + if (resIndex.homes && resIndex.homes.length > 0) { + homesLevel = resIndex.homes[0].level + // homesItem = resIndex.homes[0].item_num + } + + let worldExplorations = lodash.keyBy(resIndex.world_explorations, 'id') + + let explor = [] + let explor2 = [] + + let expArr = ['须弥', '层岩巨渊', '渊下宫', '稻妻'] + let expArr2 = ['雪山', '璃月', '蒙德'] + + for (let val of expArr) { + let tmp = { lable: val, num: `${(worldExplorations[this.area[val]]?.exploration_percentage ?? 0) / 10}%` } + explor.push(tmp) + } + + for (let val of expArr2) { + let tmp = { lable: val, num: `${(worldExplorations[this.area[val]]?.exploration_percentage ?? 0) / 10}%` } + explor2.push(tmp) + } + + explor2.push({ lable: '家园等级', num: homesLevel }) + + line.push(explor) + line.push(explor2) + + if (avatars.length > 0) { + // 重新排序 + avatars = lodash.chain(avatars).orderBy(['sortLevel'], ['desc']) + if (this.e.msg.includes('角色')) { + avatars = avatars.slice(0, 12) + } + avatars = avatars.orderBy(['sort'], ['desc']).value() + } + + // 深渊 + let abyss = this.abyssAll(roleArr, resAbyss) + + return { + uid: this.e.uid, + saveId: this.e.uid, + activeDay: this.dayCount(stats.active_day_number), + line, + basicInfo, + avatars, + abyss, + headIndexStyle: this.headIndexStyle + } + } + + // 处理深渊数据 + abyssAll (roleArr, resAbyss) { + let abyss = {} + + if (roleArr.length <= 0) { + return abyss + } + if (resAbyss?.total_battle_times <= 0) { + return abyss + } + if (resAbyss?.reveal_rank.length <= 0) { + return abyss + } + // 打了三层才放出来 + if (resAbyss?.floors.length <= 2) { + return abyss + } + + let startTime = moment(resAbyss.startTime) + let time = Number(startTime.month()) + 1 + if (startTime.day() >= 15) { + time = time + '月下' + } else { + time = time + '月上' + } + + let totalStar = 0 + let star = [] + for (let val of resAbyss.floors) { + if (val.index < 9) { + continue + } + totalStar += val.star + star.push(val.star) + } + totalStar = totalStar + '(' + star.join('-') + ')' + + let dataName = ['damage', 'take_damage', 'defeat', 'normal_skill', 'energy_skill'] + let data = [] + let tmpRole = [] + for (let val of dataName) { + if (resAbyss[`${val}_rank`].length <= 0) { + resAbyss[`${val}_rank`] = [ + { + value: 0, + avatar_id: 10000007 + } + ] + } + data[val] = { + num: resAbyss[`${val}_rank`][0].value, + name: gsCfg.roleIdToName(resAbyss[`${val}_rank`][0].avatar_id) + } + + if (data[val].num > 1000) { + data[val].num = (data[val].num / 10000).toFixed(1) + data[val].num += ' w' + } + + if (tmpRole.length < 4 && !tmpRole.includes(resAbyss[`${val}_rank`][0].avatar_id)) { + tmpRole.push(resAbyss[`${val}_rank`][0].avatar_id) + } + } + + let list = [] + + let avatar = lodash.keyBy(roleArr, 'id') + + for (let val of resAbyss.reveal_rank) { + if (avatar[val.avatar_id]) { + val.life = avatar[val.avatar_id].actived_constellation_num + } else { + val.life = 0 + } + val.name = gsCfg.roleIdToName(val.avatar_id) + list.push(val) + } + + return { + time, + max_floor: resAbyss.max_floor, + totalStar, + list, + total_battle_times: resAbyss.total_battle_times, + ...data + } + } + + dayCount (num) { + let year = Math.floor(num / 365) + let month = Math.floor((num % 365) / 30.41) + let day = Math.floor((num % 365) % 30.41) + let msg = '' + if (year > 0) { + msg += year + '年' + } + if (month > 0) { + msg += month + '个月' + } + if (day > 0) { + msg += day + '天' + } + return msg + } + + async roleCard () { + this.model = 'roleCard' + let res = await MysInfo.get(this.e, 'index') + + if (!res || res.retcode !== 0) return false + + return this.roleCardData(res.data) + } + + roleCardData (res) { + this.initFile() + + let stats = res.stats + let line = [ + [ + { lable: '活跃天数', num: stats.active_day_number }, + { lable: '成就', num: stats.achievement_number }, + { lable: '角色数', num: stats.avatar_number }, + { lable: '等级', num: res?.role?.level ?? 0 }, + { + lable: '总宝箱', + num: + stats.precious_chest_number + + stats.luxurious_chest_number + + stats.exquisite_chest_number + + stats.common_chest_number + + stats.magic_chest_number + } + ], + [ + { lable: '华丽宝箱', num: stats.luxurious_chest_number }, + { lable: '珍贵宝箱', num: stats.precious_chest_number }, + { lable: '精致宝箱', num: stats.exquisite_chest_number }, + { lable: '普通宝箱', num: stats.common_chest_number }, + { lable: '奇馈宝箱', num: stats.magic_chest_number } + ] + ] + + let explor1 = [] + let explor2 = [] + + res.world_explorations = lodash.orderBy(res.world_explorations, ['id'], ['desc']) + + for (let val of res.world_explorations) { + val.name = this.areaName[val.id] ? this.areaName[val.id] : lodash.truncate(val.name, { length: 6 }) + + let tmp = { lable: val.name, num: `${val.exploration_percentage / 10}%` } + + if (explor1.length < 5) { + explor1.push(tmp) + } else { + explor2.push(tmp) + } + } + + explor2 = explor2.concat([ + { lable: '雷神瞳', num: stats.electroculus_number }, + { lable: '岩神瞳', num: stats.geoculus_number }, + { lable: '风神瞳', num: stats.anemoculus_number } + ]) + + line.push(explor1) + line.push(explor2.slice(0, 5)) + + let avatars = res.avatars + avatars = avatars.slice(0, 8) + + let element = gsCfg.getdefSet('element', 'role') + for (let i in avatars) { + if (avatars[i].id == 10000005) { + avatars[i].name = '空' + } + if (avatars[i].id == 10000007) { + avatars[i].name = '荧' + } + avatars[i].element = element[avatars[i].name] + avatars[i].img = imgFile[avatars[i].name] || `${avatars[i].name}.png` + } + + return { + saveId: this.e.uid, + uid: this.e.uid, + name: this.e.sender.card.replace(this.e.uid, '').trim(), + user_id: this.e.user_id, + line, + avatars, + bg: lodash.random(1, 3), + ...this.screenData + } + } + + async roleExplore () { + this.model = 'roleExplore' + let res = await MysInfo.get(this.e, 'index') + + if (!res || res.retcode !== 0) return false + + return this.roleExploreData(res.data) + } + + roleExploreData (res) { + let stats = res.stats + let line = [ + [ + { lable: '成就', num: stats.achievement_number }, + { lable: '角色数', num: stats.avatar_number }, + { lable: '等级', num: res?.role?.level ?? 0 }, + { + lable: '总宝箱', + num: + stats.precious_chest_number + + stats.luxurious_chest_number + + stats.exquisite_chest_number + + stats.common_chest_number + + stats.magic_chest_number + } + ], + [ + { lable: '华丽宝箱', num: stats.luxurious_chest_number }, + { lable: '珍贵宝箱', num: stats.precious_chest_number }, + { lable: '精致宝箱', num: stats.exquisite_chest_number }, + { lable: '普通宝箱', num: stats.common_chest_number } + ], + [ + { lable: '草神瞳', num: stats.dendroculus_number }, + { lable: '雷神瞳', num: stats.electroculus_number }, + { lable: '岩神瞳', num: stats.geoculus_number }, + { lable: '风神瞳', num: stats.anemoculus_number } + ] + ] + // 尘歌壶 + if (res.homes && res.homes.length > 0) { + line.push([ + { lable: '家园等级', num: res.homes[0].level }, + { lable: '最高仙力', num: res.homes[0].comfort_num }, + { lable: '获得摆设', num: res.homes[0].item_num }, + { lable: '历史访客', num: res.homes[0].visit_num } + ]) + } + + res.world_explorations = lodash.orderBy(res.world_explorations, ['id'], ['desc']) + + let explor = [] + for (let val of res.world_explorations) { + if (val.id == 7) continue + + val.name = this.areaName[val.id] ? this.areaName[val.id] : lodash.truncate(val.name, { length: 6 }) + + let tmp = { + name: val.name, + line: [ + { + name: val.name, + text: `${val.exploration_percentage / 10}%` + } + ] + } + + if (['蒙德', '璃月', '稻妻', '须弥'].includes(val.name)) { + tmp.line.push({ + name: '声望', + text: `${val.level}级` + }) + } + + if (val.id == 6) { + let underground = lodash.find(res.world_explorations, function (o) { + return o.id == 7 + }) + if (underground) { + tmp.line.push({ + name: this.areaName[underground.id], + text: `${underground.exploration_percentage / 10}%` + }) + } + } + + if (['雪山', '稻妻', '层岩巨渊', '须弥'].includes(val.name)) { + if (val.offerings[0].name.includes('流明石')) { + val.offerings[0].name = '流明石' + } + if (val.offerings[0].name == '恒那兰那的梦之树') { + val.offerings[0].name = '梦之树' + } + + tmp.line.push({ + name: val.offerings[0].name, + text: `${val.offerings[0].level}级` + }) + } + + explor.push(tmp) + } + + return { + saveId: this.e.uid, + uid: this.e.uid, + activeDay: this.dayCount(stats.active_day_number), + line, + explor, + headIndexStyle: this.headIndexStyle, + ...this.screenData + } + } + + initFile () { + if (imgFile['刻晴']) return imgFile + let path = './plugins/genshin/resources/img/gacha/' + let character = fs.readdirSync(path + 'character/') + let weapon = fs.readdirSync(path + 'weapon/') + + let nameSet = (v) => { + let name = v.split('.') + imgFile[name[0]] = v + } + character.forEach(v => nameSet(v)) + weapon.forEach(v => nameSet(v)) + return imgFile + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/roleList.js b/src/Yunzai-Bot/plugins/genshin/model/roleList.js new file mode 100644 index 0000000000000000000000000000000000000000..c61b3a6f4da5c0fc62d3e6e918ffb935b0b66308 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/roleList.js @@ -0,0 +1,222 @@ +import base from './base.js' +import MysInfo from './mys/mysInfo.js' +import MysApi from './mys/mysApi.js' +import gsCfg from './gsCfg.js' +import lodash from 'lodash' +import common from '../../../lib/common/common.js' + +export default class RoleList extends base { + constructor (e) { + super(e) + this.model = 'roleList' + + /** 缓存时间,单位分钟 */ + this.cacheCd = 30 + } + + static async get (e) { + let roleList = new RoleList(e) + return await roleList.getData() + } + + async getData () { + let res = await MysInfo.get(this.e, 'character') + if (!res || res.retcode !== 0) return false + + let uid = this.e.uid + let avatars = res.data.avatars + if (avatars.length <= 0) return false + + /** 判断是否绑定了ck */ + this.ck = await MysInfo.checkUidBing(uid) + + let skill = [] + if (this.ck) { + await this.e.reply('正在获取角色信息,请稍候...') + this.mysApi = new MysApi(uid, this.ck.ck, { log: false }) + this.mysApi.cacheCd = 1800 + skill = await this.getAllSkill(avatars) + } + + /** 截图数据 */ + let data = { + ...this.screenData, + saveId: this.e.uid, + uid: this.e.uid, + ...this.dealData(avatars, skill) + } + + return data + } + + async getAllSkill (avatars) { + let skillRet = []; let skill = [] + // 批量获取技能数据,分组10个id一次,延迟100ms + let num = 10; let ms = 100 + let avatarArr = lodash.chunk(avatars, num) + + let start = Date.now() + + for (let val of avatarArr) { + for (let avatar of val) { + skillRet.push(this.getSkill(avatar)) + } + skillRet = await Promise.all(skillRet) + + // 过滤没有获取成功的 + skillRet.filter(item => item.a) + skillRet = skillRet.filter(item => item.a) + + await common.sleep(ms) + } + skill = lodash.keyBy(skillRet, 'id') + logger.mark(`[米游社接口][detail][${this.ck.uid}] ${Date.now() - start}ms`) + return skill + } + + async getSkill (avatar) { + let force = !this.e.msg.includes('force') + let res = await this.mysApi.getData('detail', { avatar_id: avatar.id }, force) + if (!res || res.retcode !== 0 || !res.data.skill_list) return false + + let skill = { + id: avatar.id + } + + let type = 'id' + if ([10000021].includes(Number(avatar.id))) { + type = 'group_id' + } + + let skillList = lodash.orderBy(res.data.skill_list, [type], ['asc']) + + for (let val of skillList) { + val.level_original = val.level_current + if (val.name.includes('普通攻击') || val.name.includes('Normal Attack')) { + skill.a = val + continue + } + if (val.max_level >= 10 && !skill.e) { + skill.e = val + continue + } + if (val.max_level >= 10 && !skill.q) { + skill.q = val + continue + } + } + if (avatar.actived_constellation_num >= 3) { + if (avatar.constellations[2].effect.includes(skill.e.name)) { + skill.e.level_current += 3 + } else if (avatar.constellations[2].effect.includes(skill.q.name)) { + skill.q.level_current += 3 + } + } + if (avatar.actived_constellation_num >= 5) { + if (avatar.constellations[4].effect.includes(skill.e.name)) { + skill.e.level_current += 3 + } else if (avatar.constellations[4].effect.includes(skill.q.name)) { + skill.q.level_current += 3 + } + } + + return skill + } + + dealData (avatars, skill) { + let daily = gsCfg.getdefSet('daily', 'daily') + + const displayMode = /(角色|武器|练度)/.test(this.e.msg) ? 'weapon' : 'talent' + + // 四星五星 + let star = 0 + let msg = this.e.msg.replace(this.e.uid, '') + if (/(四|4)/.test(msg)) star = 4 + if (/(五|5)/.test(msg)) star = 5 + + // 天赋等级背景 + const talentLvMap = '0,1,1,1,2,2,3,3,3,4,5'.split(',') + + // 根据每日素材构建 角色->素材的映射关系 + let charTalentMap = {} + daily.forEach((weekCfg, week) => { + lodash.forIn(weekCfg[0], (talentCfg, talentName) => { + talentCfg[1].forEach((charName) => { + charTalentMap[charName] = { name: talentName, week: [3, 1, 2][week] } + }) + }) + }) + + let avatarRet = [] + for (let idx in avatars) { + let curr = avatars[idx] + let avatar = lodash.pick(curr, 'id,name,rarity,level,rarity,fetter'.split(',')) + avatar.rarity = avatar.rarity > 5 ? 5 : avatar.rarity + // let weapon = curr.weapon || {} + 'name,level,rarity,affix_level'.split(',').forEach((idx) => { + avatar[`weapon_${idx}`] = curr.weapon[idx] + }) + avatar.cons = curr.actived_constellation_num + if (avatar.id == 10000007) { + avatar.name = '荧' + avatar.fetter = 10 + } else if (avatar.id == 10000005) { + avatar.name = '空' + avatar.fetter = 10 + } else { + let talent = charTalentMap[avatar.name] || {} + avatar.talent = talent.name + avatar.talentWeek = talent.week // `${talent.week}${talent.week + 3}`; + } + + let skillRet = skill[avatar.id] || {} + const talentConsCfg = { a: 0, e: 3, q: 5 } + + lodash.forIn(talentConsCfg, (consLevel, key) => { + let talent = skillRet[key] || {} + // 天赋等级 + avatar[key] = talent.level_current || '-' + // 是否有命座加成 + avatar[`${key}_plus`] = talent.level_current > talent.level_original + // 天赋书星级 + avatar[`${key}_lvl`] = talentLvMap[talent.level_original * 1] + avatar[`${key}_original`] = talent.level_original * 1 + }) + avatar.aeq = avatar.a * 1 + avatar.e + avatar.q + avatarRet.push(avatar) + } + + // 超过八个角色才分类四星五星 + if (star >= 4 && avatarRet.length > 8) { + avatarRet = avatarRet.filter(item => item.rarity == star) + } + + let sortKey = ({ + talent: 'aeq,rarity,level,star,fetter,talentWeek', + weapon: 'level,rarity,aeq,cons,weapon_level,weapon_rarity,weapon_affix_level,fetter' + })[displayMode].split(',') + + avatarRet = lodash.orderBy(avatarRet, sortKey, lodash.repeat('desc,', sortKey.length).split(',')) + + let noTalent = avatarRet.length == 0 || /^-+$/.test(avatarRet.map((d) => d.a).join('')) + + let talentNotice = `*技能数据会缓存${this.cacheCd}分钟` + if (noTalent) { + talentNotice = '该uid未绑定Cookie,无法获取技能数据。回复【#体力帮助】查看教程' + } + + let week = new Date().getDay() + if (new Date().getHours() < 4) { + week-- + } + + return { + avatars: avatarRet, + bgType: Math.ceil(Math.random() * 3), + abbr: { ...gsCfg.getdefSet('role', 'other').sortName, ...gsCfg.getdefSet('weapon', 'other').sortName }, + displayMode, + week: [3, 1, 2][week % 3], + talentNotice + } + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/today.js b/src/Yunzai-Bot/plugins/genshin/model/today.js new file mode 100644 index 0000000000000000000000000000000000000000..80e5c394f3e0b8915476d240ba112f84fac10cc5 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/today.js @@ -0,0 +1,248 @@ +import moment from 'moment' +import lodash from 'lodash' +import base from './base.js' +import MysInfo from './mys/mysInfo.js' +import MysApi from './mys/mysApi.js' +import gsCfg from './gsCfg.js' +import common from '../../../lib/common/common.js' + +export default class Today extends base { + constructor (e) { + super(e) + this.model = 'todayMaterial' + } + + async getData () { + if (moment().day() == 0 && moment().hour() > 4) { + this.e.reply('今天周日,全部素材都可以刷哦~') + return false + } + + let res = await MysInfo.get(this.e, 'character') + if (!res || res.retcode !== 0) return false + + let avatars = res.data.avatars + + return await this.todayData(avatars) + } + + async todayData (avatars) { + let daily = gsCfg.getdefSet('daily', 'daily') + let other = gsCfg.getdefSet('weapon', 'other') + // 除周日日期余三 + let week = Number(moment().day()) || 7 + + // 4点后再展示第二日 + if (moment().hour() < 4) { + week-- + } + + // 今天素材 + let nowElement = daily[week % 3] + + let mainList = [] + let count = 0 + let role = [] + /* eslint-disable no-labels */ + a: + for (let i in nowElement) { + lodash.forEach(nowElement[i], (ele, name) => { + let temp = { + name, + area: ele[0], + // 区分武器和天赋类型 + isTalent: i == 0, + list: [] + } + + // 获取角色数组 + let element = ele[1] + + b: + for (let val of avatars) { + // 进行天赋的数据处理 + if ((temp.isTalent) && (element.indexOf(val.name) != -1)) { + role.push(val) + let rarity = val.rarity + if (val.rarity > 5) { + rarity = 5 + } + + val.sort = rarity * 100000 + val.actived_constellation_num * 10000 + val.level * 100 + (val.id - 10000000) + + // 增加神里排序 + if (val.id == 10000002) { + val.sort += 50 + } + + if (val.rarity > 5) { + val.sort = val.sort - (val.id - 10000000) + } + val.sortLevel = val.level + + if (val.id == 10000005) { + val.name = '空' + val.sort = 0 + } + if (val.id == 10000007) { + val.name = '荧' + val.sort = 0 + } + + temp.list.push(val) + } else if ((!temp.isTalent) && (element.indexOf(val.weapon.name) != -1)) { + if (val.weapon.level >= 90) continue b + // 进行武器的数据处理 + let firstSort = 0 + firstSort += val.weapon.level + firstSort += (val.weapon.rarity - 4) * 20 + if (val.weapon.level >= 20) { + firstSort += val.level + } + if (!other.actWeapon.includes(val.weapon.name)) { + firstSort += val.weapon.affix_level * 5 + } + + if (val.id == 10000005) { + val.name = '空' + } + if (val.id == 10000007) { + val.name = '荧' + } + + let sort = 0 + sort += val.weapon.rarity * 1000000 + sort += val.weapon.affix_level * 100000 + sort += val.weapon.level * 1000 + sort += val.rarity * 100 + sort += val.level + + temp.list.push({ + role_name: val.name, + role_level: val.level, + role_rarity: val.rarity, + name: val.weapon.name, + // showName: genshin.abbr[val.weapon.name] ? genshin.abbr[val.weapon.name] : val.weapon.name, + rarity: val.weapon.rarity, + level: val.weapon.level, + affix_level: val.weapon.affix_level, + firstSort, + sort + }) + } + } + + // 重新排序 + if (temp.isTalent == 1) { + temp.list = lodash.chain(temp.list).orderBy(['sortLevel'], ['desc']).orderBy(['sort'], ['desc']).value() + } else { + temp.list = lodash.chain(temp.list).orderBy(['firstSort'], ['desc']).orderBy(['sort'], ['desc']).value() + } + + count++ + mainList.push(temp) + }) + } + + /** 判断是否绑定了ck */ + this.ck = await MysInfo.checkUidBing(this.e.uid) + + let skill = {} + if (this.ck) { + this.mysApi = new MysApi(this.e.uid, this.ck.ck, { log: false }) + this.mysApi.cacheCd = 1800 + skill = await this.getAllSkill(role) + } + + let day = moment().format('MM-DD hh:mm') + let weekData = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'] + day += ' ' + weekData[moment().day()] + + // let num = mainList.length; + let num = count + + return { + saveId: this.e.uid, + uid: this.e.uid, + day, + num, + mainList, + skill, + ...this.screenData + } + } + + async getAllSkill (avatars) { + let skillRet = []; let skill = [] + // 批量获取技能数据,分组10个id一次,延迟100ms + let num = 10; let ms = 100 + let avatarArr = lodash.chunk(avatars, num) + + let start = Date.now() + + for (let val of avatarArr) { + for (let avatar of val) { + skillRet.push(this.getSkill(avatar)) + } + skillRet = await Promise.all(skillRet) + + // 过滤没有获取成功的 + skillRet.filter(item => item.a) + skillRet = skillRet.filter(item => item.a) + + await common.sleep(ms) + } + skill = lodash.keyBy(skillRet, 'id') + logger.mark(`[米游社接口][detail][${this.ck.uid}] ${Date.now() - start}ms`) + return skill + } + + async getSkill (avatar) { + let force = !this.e.msg.includes('force') + let res = await this.mysApi.getData('detail', { avatar_id: avatar.id }, force) + if (!res || res.retcode !== 0 || !res.data.skill_list) return false + + let skill = { + id: avatar.id + } + + let type = 'id' + if ([10000021].includes(Number(avatar.id))) { + type = 'group_id' + } + + let skillList = lodash.orderBy(res.data.skill_list, [type], ['asc']) + + for (let val of skillList) { + val.level_original = val.level_current + if (val.name.includes('普通攻击')) { + skill.a = val + continue + } + if (val.max_level >= 10 && !skill.e) { + skill.e = val + continue + } + if (val.max_level >= 10 && !skill.q) { + skill.q = val + continue + } + } + if (avatar.actived_constellation_num >= 3) { + if (avatar.constellations[2].effect.includes(skill.e.name)) { + skill.e.level_current += 3 + } else if (avatar.constellations[2].effect.includes(skill.q.name)) { + skill.q.level_current += 3 + } + } + if (avatar.actived_constellation_num >= 5) { + if (avatar.constellations[4].effect.includes(skill.e.name)) { + skill.e.level_current += 3 + } else if (avatar.constellations[4].effect.includes(skill.q.name)) { + skill.q.level_current += 3 + } + } + + return skill + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/user.js b/src/Yunzai-Bot/plugins/genshin/model/user.js new file mode 100644 index 0000000000000000000000000000000000000000..5b1938c7b15175c76edb189720d8f0d79a35feff --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/user.js @@ -0,0 +1,378 @@ +import base from './base.js' +import gsCfg from './gsCfg.js' +import lodash from 'lodash' +import fs from 'node:fs' +import common from '../../../lib/common/common.js' +import MysUser from './mys/MysUser.js' +import MysInfo from './mys/mysInfo.js' + +export default class User extends base { + constructor (e) { + super(e) + this.model = 'bingCk' + /** 绑定的uid */ + this.uidKey = `Yz:genshin:mys:qq-uid:${this.userId}` + + /** 多角色uid */ + this.allUid = [] + } + + // 获取当前user实例 + async user () { + return await MysInfo.getNoteUser(this.e) + } + + async resetCk () { + let user = await this.user() + await user.initCache() + } + + /** 绑定ck */ + async bing () { + let user = await this.user() + let set = gsCfg.getConfig('mys', 'set') + + if (!this.e.ck) { + await this.e.reply(`请【私聊】发送米游社cookie,获取教程:\n${set.cookieDoc}`) + return + } + + let ck = this.e.ck.replace(/#|'|"/g, '') + let param = {} + ck.split(';').forEach((v) => { + // 处理分割特殊cookie_token + let tmp = lodash.trim(v).replace('=', '~').split('~') + param[tmp[0]] = tmp[1] + }) + + if (!param.cookie_token && !param.cookie_token_v2) { + await this.e.reply('发送cookie不完整\n请退出米游社【重新登录】,刷新完整cookie') + return + } + + this.ck = `ltoken=${param.ltoken};ltuid=${param.ltuid || param.login_uid};cookie_token=${param.cookie_token || param.cookie_token_v2}; account_id=${param.ltuid || param.login_uid};` + let flagV2 = false + if (param.cookie_token_v2 && (param.account_mid_v2 || param.ltmid_v2)) { // + // account_mid_v2 为版本必须带的字段,不带的话会一直提示绑定cookie失败 请重新登录 + flagV2 = true + this.ck = `account_mid_v2=${param.account_mid_v2};cookie_token_v2=${param.cookie_token_v2};ltoken_v2=${param.ltoken_v2};ltmid_v2=${param.ltmid_v2};` + } + /** 拼接ck */ + this.ltuid = param.ltuid || param.ltmid_v2 + + /** 米游币签到字段 */ + this.login_ticket = param.login_ticket ?? '' + + /** 检查ck是否失效 */ + if (!await this.checkCk(param)) { + logger.mark(`绑定cookie错误:${this.checkMsg || 'cookie错误'}`) + await this.e.reply(`绑定cookie失败:${this.checkMsg || 'cookie错误'}`) + return + } + + if (flagV2) { + // 获取米游社通行证id + let userFullInfo = await this.getUserInfo() + if (userFullInfo?.data?.user_info) { + let userInfo = userFullInfo?.data?.user_info + this.ltuid = userInfo.uid + this.ck = `${this.ck}ltuid=${this.ltuid};` + } else { + logger.mark(`绑定cookie错误:${userFullInfo.message || 'cookie错误'}`) + await this.e.reply(`绑定cookie失败:${userFullInfo.message || 'cookie错误'}`) + return + } + } + + logger.mark(`${this.e.logFnc} 检查cookie正常 [uid:${this.uid}]`) + + await user.addCk(this.getCk()) + + logger.mark(`${this.e.logFnc} 保存cookie成功 [uid:${this.uid}] [ltuid:${this.ltuid}]`) + + let uidMsg = [`绑定cookie成功\n${this.region_name}:${this.uid}`] + if (!lodash.isEmpty(this.allUid)) { + this.allUid.forEach(v => { + uidMsg.push(`${v.region_name}:${v.uid}`) + }) + } + await this.e.reply(uidMsg.join('\n')) + + let msg = '【#体力】查询当前树脂' + msg += '\n【#签到】米游社原神自动签到' + msg += '\n【#关闭签到】开启或关闭原神自动签到' + msg += '\n【#原石】查看原石札记' + msg += '\n【#原石统计】原石统计数据' + msg += '\n【#练度统计】技能统计列表' + msg += '\n【#uid】当前绑定ck uid列表' + msg += '\n【#ck】检查当前用户ck是否有效' + msg += '\n【#我的ck】查看当前绑定ck' + msg += '\n【#删除ck】删除当前绑定ck' + msg += '\n 支持绑定多个ck' + + msg = await common.makeForwardMsg(this.e, ['使用命令说明', msg], '绑定成功:使用命令说明') + + await this.e.reply(msg) + } + + /** 检查ck是否可用 */ + async checkCk (param) { + let res + for (let type of ['mys', 'hoyolab']) { + let roleRes = await this.getGameRoles(type) + if (roleRes?.retcode === 0) { + res = roleRes + /** 国际服的标记 */ + if (type == 'hoyolab' && typeof (param.mi18nLang) === 'string') { + this.ck += ` mi18nLang=${param.mi18nLang};` + } + break + } + if (roleRes.retcode == -100) { + this.checkMsg = '该ck已失效,请重新登录获取' + } + this.checkMsg = roleRes.message || 'error' + } + + if (!res) return false + + if (!res.data.list || res.data.list.length <= 0) { + this.checkMsg = '该账号尚未绑定原神角色!' + return false + } + + /** 米游社默认展示的角色 */ + for (let val of res.data.list) { + if (val.is_chosen) { + this.uid = val.game_uid + this.region_name = val.region_name + } else { + this.allUid.push({ + uid: val.game_uid, + region_name: val.region_name + }) + } + } + + if (!this.uid && res.data?.list?.length > 0) { + this.uid = res.data.list[0].game_uid + this.region_name = res.data.list[0].region_name + if (this.allUid[0].uid == this.uid) delete this.allUid[0] + } + + return this.uid + } + + async getGameRoles (server = 'mys') { + return await MysUser.getGameRole(this.ck, server) + } + + // 获取米游社通行证id + async getUserInfo (server = 'mys') { + return await MysUser.getUserFullInfo(this.ck, server) + } + + /** 保存ck */ + getCk () { + let ck = gsCfg.getBingCkSingle(this.e.user_id) + + lodash.map(ck, o => { + o.isMain = false + return o + }) + + ck[this.uid] = { + uid: this.uid, + qq: this.e.user_id, + ck: this.ck, + ltuid: this.ltuid, + login_ticket: this.login_ticket, + device_id: this.getGuid(), + isMain: true + } + + this.allUid.forEach((v) => { + if (!v.uid) return + ck[v.uid] = { + uid: v.uid, + qq: this.e.user_id, + ck: this.ck, + ltuid: this.ltuid, + device_id: this.getGuid(), + isMain: false + } + }) + return ck + } + + /** 删除绑定ck */ + async delCk (uid = '') { + let user = await this.user() + let uids = await user.delCk() + return `绑定cookie已删除,uid:${uids.join(',')}` + } + + /** 绑定uid,若有ck的话优先使用ck-uid */ + async bingUid () { + let uid = this.e.msg.match(/[1|2|5-9][0-9]{8}/g) + if (!uid) return + uid = uid[0] + let user = await this.user() + await user.setRegUid(uid, true) + return await this.e.reply(`绑定成功uid:${uid}`, false, { at: true }) + } + + /** #uid */ + async showUid () { + let user = await this.user() + + if (!user.hasCk) { + await this.e.reply(`当前绑定uid:${user.uid || '无'}`, false, { at: true }) + return + } + let uids = user.ckUids + let uid = user.uid * 1 + let msg = [`当前uid:${uid}`, '当前绑定cookie Uid列表', '通过【#uid+序号】来切换uid'] + for (let i in uids) { + let tmp = `${Number(i) + 1}: ${uids[i]}` + if (uids[i] * 1 === uid) { + tmp += ' ☑' + } + msg.push(tmp) + } + await this.e.reply(msg.join('\n')) + } + + /** 切换uid */ + async toggleUid (index) { + let user = await this.user() + let uidList = user.ckUids + if (index > uidList.length) { + return await this.e.reply('uid序号输入错误') + } + index = Number(index) - 1 + await user.setMainUid(index) + return await this.e.reply(`切换成功,当前uid:${user.uid}`) + } + + /** 加载旧ck */ + async loadOldData () { + let file = [ + './data/MysCookie/NoteCookie.json', + './data/NoteCookie/NoteCookie.json', + './data/NoteCookie.json' + ] + let json = file.find(v => fs.existsSync(v)) + if (!json) return + + let list = JSON.parse(fs.readFileSync(json, 'utf8')) + let arr = {} + + logger.mark(logger.green('加载用户ck...')) + + lodash.forEach(list, (ck, qq) => { + if (ck.qq) qq = ck.qq + + let isMain = false + if (!arr[qq]) { + arr[qq] = {} + isMain = true + } + + let param = {} + ck.cookie.split(';').forEach((v) => { + let tmp = lodash.trim(v).split('=') + param[tmp[0]] = tmp[1] + }) + + let ltuid = param.ltuid + + if (!param.cookie_token) return + + arr[qq][String(ck.uid)] = { + uid: ck.uid, + qq, + ck: ck.cookie, + ltuid, + isMain, + device_id: this.getGuid() + } + }) + + lodash.forEach(arr, (ck, qq) => { + let saveFile = `./data/MysCookie/${qq}.yaml` + if (fs.existsSync(saveFile)) return + gsCfg.saveBingCk(qq, ck) + }) + + logger.mark(logger.green(`加载用户ck完成:${lodash.size(arr)}个`)) + + fs.unlinkSync(json) + } + + /** 我的ck */ + async myCk () { + let user = await this.user() + if (!user.hasCk) { + this.e.reply('当前尚未绑定cookie') + } + let ck = user.mainCk + + if (!lodash.isEmpty(ck)) { + await this.e.reply(`当前绑定cookie\nuid:${ck.uid}`) + await this.e.reply(ck.ck) + } + } + + async checkCkStatus () { + let user = await this.user() + if (!user.hasCk) { + await this.e.reply(`\n未绑定CK,当前绑定uid:${user.uid || '无'}`, false, { at: true }) + return true + } + let uid = user.uid * 1 + let uids = user.ckUids + + let checkRet = await user.checkCk() + let cks = [] + lodash.forEach(checkRet, (ds, idx) => { + let tmp = [`\n#${idx + 1}: [CK:${ds.ltuid}] - 【${ds.status === 0 ? '正常' : '失效'}】`] + if (ds.uids && ds.uids.length > 0) { + let dsUids = [] + lodash.forEach(ds.uids, (u) => { + dsUids.push(u * 1 === uid ? `☑${u}` : u) + }) + tmp.push(`绑定UID: [ ${dsUids.join(', ')} ]`) + } + if (ds.status !== 0) { + tmp.push(ds.msg) + } + cks.push(tmp.join('\n')) + }) + if (uids.length > 1) { + cks.push(`当前生效uid:${uid}\n通过【#uid】命令可查看并切换UID`) + } + + await this.e.reply(cks.join('\n----\n'), false, { at: true }) + } + + getGuid () { + function S4 () { + return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1) + } + + return (S4() + S4() + '-' + S4() + '-' + S4() + '-' + S4() + '-' + S4() + S4() + S4()) + } + + async userAdmin () { + this.model = 'userAdmin' + await MysInfo.initCache() + let stat = await MysUser.getStatData() + return { + saveId: 'user-admin', + ...stat, + _plugin: 'genshin', + ...this.screenData + } + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/model/weapon.js b/src/Yunzai-Bot/plugins/genshin/model/weapon.js new file mode 100644 index 0000000000000000000000000000000000000000..6437728509b3e1b74e1c27c2a96ed68412ba871d --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/model/weapon.js @@ -0,0 +1,106 @@ +import base from './base.js' +import MysInfo from './mys/mysInfo.js' +import gsCfg from './gsCfg.js' +import lodash from 'lodash' + +export default class Weapon extends base { + constructor (e) { + super(e) + this.model = 'weapon' + } + + static async get (e) { + let weapon = new Weapon(e) + return await weapon.getData() + } + + /** #武器 */ + async getData (e) { + let res = await MysInfo.get(this.e, 'character') + + if (!res || res.retcode !== 0) return false + + let avatars = res.data.avatars + + if (avatars.length <= 0) { + return true + } + + /** 截图数据 */ + let data = { + ...this.screenData, + saveId: this.e.uid, + uid: this.e.uid, + ...this.dealData(avatars) + } + + return data + } + + dealData (avatars) { + let actWeapon = gsCfg.getdefSet('weapon', 'other').actWeapon + let sortName = gsCfg.getdefSet('weapon', 'other').sortName + + let weapon = [] + let count = { + five: 0, + four: 0, + 单手剑: 0, + 双手剑: 0, + 长柄武器: 0, + 弓: 0, + 法器: 0 + } + + for (let val of avatars) { + if (val.weapon.rarity <= 1) { + continue + } + val.name = gsCfg.roleIdToName(val.id) + + if (val.rarity > 5) { + val.rarity = 5 + } + + if (val.weapon.rarity == 5) count.five++ + if (val.weapon.rarity == 4) count.four++ + + count[val.weapon.type_name]++ + + let firstSort = 0 + firstSort += val.weapon.level + firstSort += (val.weapon.rarity - 4) * 20 + if (val.weapon.level >= 20) { + firstSort += val.level + } + if (!actWeapon.includes(val.weapon.name)) { + firstSort += val.weapon.affix_level * 5 + } + + let sort = 0 + sort += val.weapon.rarity * 1000000 + sort += val.weapon.affix_level * 100000 + sort += val.weapon.level * 1000 + sort += val.rarity * 100 + sort += val.level + + weapon.push({ + role_name: val.name, + role_level: val.level, + role_rarity: val.rarity, + name: val.weapon.name, + showName: sortName[val.weapon.name] ?? val.weapon.name, + rarity: val.weapon.rarity, + level: val.weapon.level, + affix_level: val.weapon.affix_level, + firstSort, + sort + }) + } + + // 重新排序 + weapon = lodash.chain(weapon).orderBy(['firstSort'], ['desc']).orderBy(['sort'], ['desc']).value() + + return { list: weapon, count } + } +} diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/abyss/abyss.css b/src/Yunzai-Bot/plugins/genshin/resources/html/abyss/abyss.css new file mode 100644 index 0000000000000000000000000000000000000000..0b20c57117497098d607d2a86eca73790d07b322 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/abyss/abyss.css @@ -0,0 +1,168 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + font-size: 14px; + color: #fff; + font-family: PingFangSC-Medium, PingFang SC, sans-serif; + width: 400px; + /*height: 265px;*/ + transform: scale(1.8); + transform-origin: 0 0; +} +.container { + width: 400px; + /*height: 265px;*/ + background-image: url(../../img/abyss/bg.png); + background-size: 100%; + background-repeat: no-repeat; + padding: 7px 0 0 0; + font-family: "tttgbnumber"; +} +.row { + width: 100%; + background: rgba(56, 74, 91, 0.59); + padding: 0px 0px 0px 40px; + display: flex; + font-size: 14px; +} +.container .row { + padding-bottom: 3px; +} +.row .item { + flex: 1; + padding-top: 4px; + position: relative; +} +.role { + margin-top: 5px; +} +.title { + padding-left: 20px; + font-weight: 500; + color: #d3bc8d; +} +.role .list { + display: flex; + justify-content: center; + margin-top: 7px; +} +.role .list .item { + overflow: hidden; + width: 58px; + height: 70px; + border-radius: 5px; + position: relative; + /*border: 2px solid #d3bc8d;*/ + /*background: #e9e5dc;*/ + box-shadow: 0 2px 6px 0 rgb(132 93 90 / 30%); + margin: 0 13px; +} +.role .list .item .role_img { + width: 100%; + overflow: hidden; + background-size: 100%; + background-repeat: no-repeat; +} +.role .list .item .desc { + font-weight: 500; + text-align: center; + line-height: 16px; + position: absolute; + bottom: 0; + background: #e9e5dc; + width: 100%; + height: 16px; + color: #1e1f20; +} +.role .list .item .fill_img { + position: absolute; + width: 14px; + right: 0; + bottom: 14px; +} +.bg5 { + background-image: url(../../img/other/bg5.png); + background-size: 100%; + background-repeat: no-repeat; +} +.bg4 { + background-image: url(../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} +.bg105 { + background-image: url(../../img/other/bg105.png); + background-size: 100%; + background-repeat: no-repeat; +} +.detail { + margin-top: 7px; + padding-bottom: 5px; +} +.detail .title { + margin-bottom: 5px; +} +.detail .row { + width: 100%; + background: rgba(56, 74, 91, 0.59); + padding: 4px 0px 4px 40px; + margin-top: 0px; + display: flex; + font-size: 14px; +} +.detail .row .item { + padding-top: 0px; +} +.detail .two { + background: none; +} +.line-icon { + width: 30px; + position: absolute; + top: -12px; + right: 36px; +} +.two_img { + right: 46px; +} +.life1 { + background-color: #62a8ea; +} +.life2 { + background-color: #62a8ea; +} +.life3 { + background-color: #45b97c; +} +.life4 { + background-color: #45b97c; +} +.life5 { + background-color: #ff5722; +} +.life6 { + background-color: #ff5722; +} +.item .life { + position: absolute; + top: 0px; + right: 0px; + z-index: 9; + font-size: 12px; + text-align: center; + color: #fff; + border-radius: 2px; + padding: 0px 3px; + border-radius: 3px; + font-family: "tttgbnumber"; +} diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/abyss/abyss.html b/src/Yunzai-Bot/plugins/genshin/resources/html/abyss/abyss.html new file mode 100644 index 0000000000000000000000000000000000000000..4d7556e71f07b56c3ba2df697dba5d1b3499c584 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/abyss/abyss.html @@ -0,0 +1,98 @@ + + + + + + + + + + + + + +
+
+
+
ID:{{uid}}
+
时间:{{time}}
+
+
+
最深抵达:{{max_floor}}
+
星数:{{total_star}}
+
+
+
+
出战角色
+
+ {{each list val}} +
+ {{ if val.life>0}} + {{val.life}}命 + {{/if}} + +
{{val.value}}次
+ +
+ {{/each}} +
+
+
+
战斗数据
+
+
战斗次数:{{total_battle_times}}次
+
+ 最多击破:{{defeat.num}} + +
+
+
+
+ 承受伤害:{{take_damage.num}} +
+
+ 元素战技:{{normal_skill.num}} +
+
+
+
+ 最强一击:{{damage.num}} +
+
+ 元素爆发:{{energy_skill.num}} +
+
+
+
+ + + diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/abyssFloor/abyssFloor.css b/src/Yunzai-Bot/plugins/genshin/resources/html/abyssFloor/abyssFloor.css new file mode 100644 index 0000000000000000000000000000000000000000..0cfd799d3dc6c2579861fce9f226789260466f81 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/abyssFloor/abyssFloor.css @@ -0,0 +1,204 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + font-size: 14px; + color: #fff; + font-family: PingFangSC-Medium, PingFang SC, sans-serif; + width: 400px; + /*height: 265px;*/ + transform: scale(2.0); + transform-origin: 0 0; +} +.container { + width: 400px; + font-family: "tttgbnumber"; + padding: 7px; +} +.page { + position: relative; + border-radius: 7px; + /* margin: 7px; */ +} +.bg12 { + background: url("../../img/abyss/floor12.png") 0% 0% / 100% no-repeat rgb(29, 42, 74); +} +.bg11 { + background: url("../../img/abyss/floor11.png") 0% 0% / 100% no-repeat rgb(7, 37, 80); +} +.bg10 { + background: url("../../img/abyss/floor10.png") 0% 0% / 100% no-repeat rgb(56, 32, 36); +} +.bg9 { + background: url("../../img/abyss/floor9.png") 0% 0% / 100% no-repeat rgb(41, 43, 89); +} +.border { + border-radius: 7px; + z-index: 1; + position: absolute; + top: 2px; + bottom: 2px; + right: 2px; + left: 2px; + margin: auto; + box-sizing: border-box; + box-shadow: inset 0 0 0 2px hsl(0deg 0% 100% / 30%); +} +.header { + padding: 5px 20px 10px 20px; + display: flex; + align-items: center; + justify-content: space-between; +} +.header .uid { + font-size: 20px; + padding-top: 10px; +} +.header .title { + font-size: 22px; + padding-top: 5px; +} +.header .star { + font-size: 20px; + display: flex; + align-items: center; +} +.header .star img { + width: 30px; + height: 30px; + margin-right: 5px; +} +.room-list { + padding: 0px 20px; +} +.floor { + border-top: 1px solid hsla(0, 0%, 100%, 0.3); + padding: 15px 0px; +} +.floor-header .date { + margin-left: 5px; +} +.floor .content { + display: flex; + justify-content: space-between; +} +.content .role-box .roles { + display: flex; + flex-wrap: wrap; + position: relative; +} +.roles { + margin-top: 10px; + position: relative; +} +.roles .item { + overflow: hidden; + width: 52px; + height: 68px; + border-radius: 5px; + position: relative; + /*border: 2px solid #d3bc8d;*/ + /*background: #e9e5dc;*/ + box-shadow: 0 2px 6px 0 rgb(132 93 90 / 30%); + margin-right: 8px; +} +.roles .split-text { + position: absolute; + right: -32px; +} +.roles .split-text-2 { + bottom: 0; +} +.roles .item .role_img { + width: 52px; + height: 53px; + overflow: hidden; + background-size: 100%; + background-repeat: no-repeat; +} +.roles .item .desc { + font-weight: 500; + text-align: center; + line-height: 16px; + position: absolute; + bottom: 0; + background: #e9e5dc; + width: 100%; + height: 16px; + color: #1e1f20; +} +.roles .item .fill_img { + position: absolute; + width: 14px; + right: 0; + bottom: 14px; +} +.bg5 { + background-image: url(../../img/other/bg5.png); + background-size: 100%; + background-repeat: no-repeat; +} +.bg4 { + background-image: url(../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} +.bg105 { + background-image: url(../../img/other/bg105.png); + background-size: 100%; + background-repeat: no-repeat; +} +.star-box { + display: flex; + align-items: center; + margin-left: 15px; +} + +.star-box img { + width: 25px; + height: 25px; + margin-right: 5px; +} +.star-box .nostar { + opacity: 0.5; +} +.life1 { + background-color: #62a8ea; +} +.life2 { + background-color: #62a8ea; +} +.life3 { + background-color: #45b97c; +} +.life4 { + background-color: #45b97c; +} +.life5 { + background-color: #ff5722; +} +.life6 { + background-color: #ff5722; +} +.item .life { + position: absolute; + top: 0px; + right: 0px; + z-index: 9; + font-size: 12px; + text-align: center; + color: #fff; + border-radius: 2px; + padding: 0px 3px; + border-radius: 3px; + font-family: "tttgbnumber"; +} diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/abyssFloor/abyssFloor.html b/src/Yunzai-Bot/plugins/genshin/resources/html/abyssFloor/abyssFloor.html new file mode 100644 index 0000000000000000000000000000000000000000..0fdd8d34776a51992fbd80d979e03327b69b51ce --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/abyssFloor/abyssFloor.html @@ -0,0 +1,75 @@ + + + + + + + + + + + + +
+
+
+
+
+
ID:{{uid}}
+
深境第{{floorIndex}}层
+
+
+ + {{floor.star}}/{{floor.max_star}} +
+
+
+ {{ each list val}} + +
+
+ 第{{val.index}}间 + {{val.time}} +
+ +
+
+ {{ each val.battles vv}} +
+ {{ each vv.avatars v}} +
+ {{ if v.life>0}} + {{v.life}}命 + {{/if}} + +
Lv.{{v.level}}
+ +
+ {{/each}} +
{{if vv.index==1 }}上{{else}}下{{/if}}半
+
+ {{ /each}} +
+
+ + + +
+
+
+ {{/each}} +
+
+
+ + + diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/blueprint/blueprint.css b/src/Yunzai-Bot/plugins/genshin/resources/html/blueprint/blueprint.css new file mode 100644 index 0000000000000000000000000000000000000000..452dd63c04c0c6b02800d360bdcd48c86b557727 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/blueprint/blueprint.css @@ -0,0 +1,445 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + transform: scale(1.48); + transform-origin: 0 0; +} +.container { + width: 650px; + padding: 10px 15px 15px 15px; + background-color: #fff; + position: relative; +} +.info_box { + position: relative; + height: 40px; + margin-top: 10px; + margin-bottom: 15px; +} +.head_box { + /* padding: 10px; */ + /* border-radius: 15px; */ + font-family: tttgbnumber; + /* box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); */ +} + +.data_box { + padding: 5px 10px 5px 10px; + margin-top: 10px; + /* box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); */ + border-radius: 5px; + font-family: tttgbnumber; + background-color: #f2eee6; + border: 1px solid #d9d3c7; +} + +.uidRight { + position: absolute; + top: 5px; + right: 0px; + font-size: 20px; + text-align: center; + color: #fff; + padding: 3px 6px; + border-radius: 7px; + font-family: "tttgbnumber"; + background-color: #a57f72; + box-shadow: 0 3px 6px 0 rgb(132 93 90 / 40%); +} +.codeCenter{ + position: absolute; + top: 5px; + right: 194px; + font-size: 20px; + text-align: center; + color: #fff; + padding: 3px 6px; + border-radius: 7px; + font-family: "tttgbnumber"; + background-color: #a57f72; + box-shadow: 0 3px 6px 0 rgb(132 93 90 / 40%); +} +.topLeft { + position: absolute; + top: 5px; + left: 0px; + z-index: 9; + font-size: 20px; + text-align: center; + color: #fff; + padding: 3px 6px; + border-radius: 7px; + font-family: "tttgbnumber"; + background-color: #a57f72; + box-shadow: 0 3px 6px 0 rgb(132 93 90 / 40%); +} + +.item { + margin: 10px 0px 10px 0px; + border-radius: 5px; + background: #e9e5dc; + display: flex; + /* box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); */ + border: 1px solid #d9d3c7; +} + +.role_box { + margin: 10px 0px 10px 10px; + height: 95px; + width: 95px; + background: #e9e5dc; + border-radius: 7px; + overflow: hidden; + position: relative; +} + +.role_img { + width: 100%; + height: 100%; +} + +.role_name { + margin-top: 20px; + margin-left: 10px; + width: 125px; + color: #91837a; + font-weight: bold; + font-size: 24px; + line-height: 30px; + letter-spacing: 1px; + white-space: nowrap; +} + +.role_LV { + margin-top: 10px; + width: 120px; + height: 40px; + line-height: 30px; + white-space: nowrap; + font-size: 16px; +} + +.weapon_box { + margin: 10px 0px 10px 20px; + height: 95px; + width: 95px; + background: #e9e5dc; + border-radius: 7px; + overflow: hidden; +} + +.weapon_img { + width: 100%; + height: 100%; +} + +.weapon_name { + margin-top: 20px; + margin-left: 10px; + width: 120px; + color: #91837a; + font-weight: bold; + font-size: 24px; + line-height: 30px; + letter-spacing: 1px; + white-space: nowrap; +} + +.weapon_LV { + margin-top: 10px; + width: 120px; + height: 40px; + font-size: 16px; + line-height: 30px; + white-space: nowrap; +} + +.weapon_bg5 { + background-image: url(../../img/other/bg5.png); + width: 100%; + height: 95px; + background-size: 100%; + background-repeat: no-repeat; +} + +.weapon_bg4 { + width: 100%; + height: 95px; + background-image: url(../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.weapon_bg3 { + width: 100%; + height: 95px; + background-image: url(../../img/other/bg3.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.weapon_bg2 { + width: 100%; + height: 95px; + background-image: url(../../img/other/bg3.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.weapon_bg1 { + width: 100%; + height: 95px; + background-image: url(../../img/other/bg3.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.bg105 { + background-image: url(../../img/other/bg105.png); + width: 100%; + height: 95px; + background-size: 100%; + background-repeat: no-repeat; +} + +.bg5 { + background-image: url(../../img/other/bg5.png); + width: 100%; + height: 95px; + /*filter: brightness(1.1);*/ + background-size: 100%; + background-repeat: no-repeat; +} + +.bg4 { + width: 100%; + height: 95px; + background-image: url(../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.skill { + margin: 5px 0px 0px 0px; + background: #f1eee5; + display: flex; + border-radius: 7px; + padding: 1px 0 1px 0; + /* box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); */ + padding-left: 20px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAq4AAACACAMAAAD9GBtbAAABaFBMVEVHcEyqqqrbkpK0lpaAgID/qqq5oqL///9VVVW2kpKqVVWZmZm/gICqmZnMzMyqqqqSkpKZZmbu59vayKzZx67k1sPbwqrYxq3s5NnZyKzZx62zmZm5oovMmZnx7eSAgIC5i4vVqqq/n5+qqqqqgIC7mZnMmZnbybDEsbGxnZ2qlZXXxa3VxK3OtaXXxq2/v7+7qqrbtpLjqqrGqqqqjo7x7OTXxazv6eHYxazq4dXg08Hq4tbXx6/o4dbf0r7n3tOvn5+llpa7qpmkkpK2pKTWw6uxiYnv6eD/gICdiYnVw6ry7ubv6uLw7OTZx63x7eXy7eXw6+Pt6ODx7OTv6+Pu6eHx6+Pu6ODu6eDv6eHv6uHw6uLt59/Xxavx7OPYxqzx7eTXxKzZxqzWw6rYxavWw6vYxKzWxavs59/w6+Lw7OPXxazv6+LXw6vWxKzYxa3XxKvVw6rXxKrWxqzt6N/WxKru6uLWxKscG7OjAAAAS3RSTlMAAwcRAgMLAQMHAwUEDwUGBwXtU+voFYLiz/IKCwXzBAsGCAkGDwruDQ0M61ofhgQPBwkJCfPy89Dj6e7u7unjEBEPDg7RDfMCDfMtJH2VAAAUGElEQVQYGe3B34sk2ZXY8e8999zIiO6uavWMZqTR7HiXxXgNZt8MRi8G/+1+EBiMwcbgXS/axaPRr9FsqzK7OyPinnuuIzKzqrKqqwWqKr3dzyfQNI/Wi3PfpNwwFsMcKWoRmGADpctgDDNEoBCZuLWhdOGr7+ev3vzu9/yse/Xuw++/6P1bAwJN82i9OPdJ5pptMIgsilpkURQmZVP5jH8NU6wcTJxsOAjTy+pfTenXfKn8mtXX/wyBpnm0F/sN903KtWiRgwAWgdLtXybmMG1qDAGq7CuLiaMNpfyb/8fgldJJ9f/wNn74PSd/9UsCiy+DhP9I0/y5Xm8mzm0yEDkpvOXgTSx+BbyWNG02sP3ij3L5vbyKu5jfcuaN82YHxmZCIE3avZIt/A/5UP+Br/85AJ+HELu/p2n+bIpzrTMInCnOkYaKgUgIhhKrS6kozIhxpp8r/dj/9DsJFTNUnczl9nsJV+Ef8QCf//j7n9M0jyNcEwJ3FAfUQMFQtFBAiVmkVBdCLNW4JZp5/eHFVcr0FOsM72Y2I4u34Y//+HXkS97/nKZ5pMC1z8bAHbWCKuILpNZYSYVUxRyowdzcuaFdrM6mvr/QzTx8uMCjlFiDpejw+sP+CxNC+DlN8ziqfJooYDgKSIdDgSlm7WJQ4R6dpwwV2O0wrlKeXMFELHHBF5+HUZBI0zyOqHNjxz3BFdMQ1QCdsRCJyiS1YM49OiuXQLrYAaXrpo4hT967YWm3ieEnr5WQaJrH6YwbYoF7OoNRFUzNBDGNpUYq0dUxzqlIzMCOoxSo5CHtpw0zFnb08a8j/+ULmuZxvHJNCNznOFAdd9wlxhxCYCGhYJxTl2wX9BMHXcK1pGCmVsTpoqb6V/9TaJpHExEOOgmBh7mqq4JidAYxRjCMc+qaYSeBgyFBBELXxYGsG8zqhiulaR7NQJ2FBR6iGCsdwVh0M9DFWYxzSo39jksqQyFSJIBHQLaXsbBPaqOUjdI0fynBWMxdZ6zU8A63Ut25Qz2NI9S6o0DhWkHYwsth/3qrNmWlaZ7uzR95QHTBEBDFwMBHRYpzz7wZWexYzF2CwOod7FnEjFcR+Y3SNH8pMx1gOIhirIyP9b7pthwMBQjck5iGn/j7qDTNUzgPiayCzaIG3Szixqf0nq84Ggpd4qRwdJmlK/Iv/Y9QmuYZ1MA5Z2WozGB0Zp2OPEzJXIQatgyUxFElboGBPYOL7HhJmRCa5imE1Q9vKnfYCsxFAXPCrDxIcQiVylBKIiw4GhgKDIIHBv/GQGiaZ/AD5yLXTB2MDjbKg4IDlUVJXQichO1QugII7/bbgf2v5AqlaZ5ADeEjzo1Z3TDvJjo1PqZFY74gbLkjvKNA3DPwfihR3ie3H09K0zyFmgv3BIwbIpiadRgfS1k9jhfsYNhDDSxky2IosL+EbVdAgxtvUZrmCYyHGAcK1pmjhvGgLCFnAovScSRbFkNhsYWhROpWjIXQNE8k3BEjJwYYHaqAmfER7QpQKwyQuDUUYAaGEtlPYspCaZonMmFRCayiY6w6c2NhHYoZD5orXAZnKIkAJVIzMHAyFNCAYSyEpnkq6TpcOTHjYEY+7wQ8uCsPU+0vqBlIBCC9gwSUPRBhKMAO50homiebgVkrd73hrbGK7soDVD2PXEjcAYGDErZD17GI+0sKKdYgypHQNE9lMnNLOereciATyVR5gL/gAuqOoXCyf8eNbQe+n8SMI6VpnszUua8zToSymUSNj11dwpaBwrUBCtAR9wMF6LNxTWia5yCdceAcGTemWDbu3Kda+1q3DKVErpVSIqs9pRBnm4wbQtM8gSonRgBixDjjyVkV7ZR7dGYkQOFAFhC5NpAivQk3NkrTPJ44ByYEVm7csSmbSSSnEnE1zumsMe04KPCOg31HgZQjkNP7JMaR8qMiNM2jSQfKSoisjPvKxlmUiXtcX5Qdi0hKKXIys8iUriSkFwMU7cX9dRKa5vGME8NYKXc4UDYpARu854xqngZWBQicdKziHCHHXIxVL9Om1ulzoWkeT7lmbyoL6VS55mnDoixiLJvNLNxSSFxyXySS2AMpghvQu+dXI8P8d0rTPAf9XmuAQnSubSisUmZRUMGMa5kdi6GwysOeo0JmleM+iBo6Vw1lAP1vQtM8iXFgoBwYNwpHiVXCuaFzz+XlBdciq2EoAyeJIGao1JcFkVL6nwpN83gzwjWzykpZfC4sItdKgT4xu3LkjNTKKiUWERhKoQARiL7vDNTpckqQEi+VpnkCMe4pKCZvuSOxGHv46nfurMRfTyXugBRYFE5SJu7pYJ9A8arCwuHdj4SmeQLjjBJYVOFhY89v5o6V6uaSFKArrGS/5w6V3kZwfVUgZ2IsP/qvQtM8E7PorJxPGMk69wrqc/m2+JYBcgXZci3DHmbzqWOh5W9ZzfOLLULTPBczYo2x8LGcM4vEC51dsW6T+xxgD+RattyKMwyw11FVK+WXkFL+8gWgNM2zMRQc42MZEvD6imSgbBgvtpzsuZEyDKUM9BnrfSjJQyV/+Y6F0DRPoZxRDESVj1xAZnEFCRdmxovAtYGDoUAGCrCfgDkDkZy/fMdKaZqnMO4pEPjI+Nkuf+CkM52vOEkE4iVbbgwleaqvvlfjYkoe4ct3HAhN8wTKOcO8Egx35673mRuubIAKDBCgbLecy2lb32KiFonAO46EpnkC5x7xyCf1PaQMPpceEaAkkHd77in9DEgGKreEpnm0rkMU5YwJf0pPBmPlzoFwbR9ZlAJ5FANFuUNomsczEe5STJRPGnuidgK8ZsfRlvviJqmy2HGH0DSPZgQF44wZsyifMF6MYAXNELhvKBxEdpixElavOFKa5gmqGfcYcwcdGIWPpakjAL7j05IJYKk3CdwSmubR3DFuKIgo4KbdPM86RVaJhUPfk0oPhfKiTzsYuo6MX3IjsSoaO1ZmhVJr9wNHQtM8gXFHJ64oKrN0zNzIObOKPqIVrsYdD8nEGeJuMgMMmzOBKh84EJrmKZQbBhYETM1w62DiJGeuRWMWLi752D7Cnhj5G1aKfDUkCjeEpnk0Ee5ygipmdGBAjECGlIARGJk6CFCBwkq4NhRmVt+JAZb41kKJQHrFSmiaRzPDuMdYmHWCiEwcpfQZMAIJg7Hn1nbLjciqGgfZJL7rZhY/fHj1CpSmeT5dYaVm4AjCjZRZJFRsM3IQC4tX8I6juGexJxhHRgrgEeIP5a8RmubZqHFgLFQ48z6zyiwmxpHFfp4hz5U7Er1wzWSMLnNBIvxnoWmeTwBcWZiJ4IkYI5lzBonIrVw52bMofTXlRM0MkBhI9iuhaZ6NA6FzQBUTB3KeIrcSoJwMw8C5PVxy6QWMEzMRex9zpTL+Vmia52UszDDrWAkr5+BrkzBvOCmFj5Q9xjmztI95ztn+k9A0z0Yqiw5QBQMmd4iZPgM943dqUDKFReFBXylnzMTT/t/OMfKd0jTPxpTFzMLFGXViw8GOg4SYkOk3zif9xgXBuGbo5v/2ez7bCk3zfJwTExYmkksBMkcvwOF1n5xFjBwEzmRQxaUXbtjoNYRhUJrm+XSFE2NlqvOmsEiZE2chDuyhY1G5sb3MxIlKTkhnOouxMoNffqs0zbNRC0BnhhoHRjdtCouUOVAcMokzA2nLUUk2dTMD+xSLOC7CwlhF/q7SNI8j0TknAQiuiAESQsVJc6osoiszwUItAmliFVm4hvJiYjWEYEpBVHXvMVF6QiifjbHjxz8WmubxnDucVSi4shABzLopRo4yEHhA5MQzoBfJkw+DVmXMOW/+UAW//CelaZ6LsgoQQgWEA6Or86ZAGkkxEwO3ZobCrUt/Ryrx638BStwP8DJHFpd1x36vNM0zUQIQ3UCj48aRAdOmcPE+7h2IhYddskhi9t1LL4Uy7IdSIoshw+V8KTTN81AC18w74UjBEKbIe0BdbGJ1ybnqrLaFFzOeA3Ge59IVKAsppXSj/kppmufhwi1TxUARFDOlK8QCiCmrHDkYCpAhsciDcBWAUugihZPMkdA0z0IkcMZwUNRYmWDkl5y75L4swq1SuE9omucgUDk3s/D5c9QAMyxyx5bVPnIm+yVHiQcITfMXoSLinf4gs7IwYRp7LviUS4j8CSn1P1Wa5lkVYjDANBRm6Yq4GmDqGd6yeHHVc2NPxyJzWWYelliFdy+FpvkLqeLiRogICxPL/AnOp4VAKK8/E5rmOTi3hJVwFIJ3ysIxnIMR50yMkXsy52qlxvKt0jTPQlw4cRTMMPUO3HA1wHtcTOEDjP3ucstRZA9DTlzrghTOZBapjr8VmuYJlGvGtYiKSHRDhXk2MFMWc6k4H9nvgT05s6ivO6wQuS8DQtM8XufcEI6iG6XYjxzBZxG064Kj4LUarjxo5ugKNDsfyyA0zTNxDgoK1d+y6gAxQ1g5b8A4SJWHBAgs4rzgHqFpnkI5UDAppbKoteJiiMAFb7SwUAPcf8AdXgMxv+ZGt+BgiwfYs+coztwSmuYpXFkZYCJeOTEQ0B9kJ9wShBtXfKwAX83pQgYO4p6ZG0LTPBcz0VqJkWvSVayq4qYsTHhQXBDjHCM930LIrCKryDWlaR5v5i7DETwWFi4WqHNnThU3VsYifoCx5/UV1/bAsIc9lGjdvFdW+4HFfuBEaZpHc+EONUO9xMKBWgUp6o5xZlIWhQt23NpzkHOErBzsWe05+NnXQtM8ngvOLQNMagFhYUAIAcG4JZ2yYVWEj73uKd98s99z0nHjO6VpnsC4R42VYoi6lEo1Mc4YvhEY+w/JLwJb7nKS/S4wsOdg5sbXQtM8J1O8xsLKjAqIcYdSMjDGhITKrYHFblMqExqHYeAepWmelyHOjJopsxgfmTFNGfiQU4qXW85cbnF0ht0gThc5sw1K0zwrA3XAwZRPSWSIEajc2EOFXV/ppsstMFA4SsCrb5SmeW5zh4o5GA8RV0jksQf3zeWWWztgDJ+/DTOLPSeDAy9+pTTNc/NZ3BHnYdaHAumn37K6uuSevrx1rd98CxcsAjVsWfzxn5SmeQphJcY5d3XE+ZRCP+bf8rDXV72Jdb+lZwf0LPoNLq++UZrmKVxYuILD599zYuCcU4wjNSMBKbPqwyWVsOXkwhkDXkqkhE1hfH1F4gr+pvxaaZonEWfhIPBWMQ7UUM4pGAcGXoDcAyP9NJJeOEeXAWeVFStdVk8fEpAudt/97N8pTfMkhnAUoHo/A2KmeGfc0FK5YWJjhhIZYex7blUjcmCAYTpz8Lbj3f9WmubR1FDMhYMaCGISqCgQEeNAsVmjcUsz8OKKWxc7FpeVlToHBsbJSI5C0zyai5qBCwulVkIIEA5w48gMdTNuRItAfsGiZzFlubgEtrsIr/mpKEeqnKgyCU3zeJ0rC3NgdudT1DFu1e4VKUGi7zmayv7igpV4+jaqcmDGiRkITfMUzkrp+BPUMc6Y/RAhZ844AlxI/iADZeYhStM8iRqfIIpxIG6AggJmQEdm8c239CPQA3EaYddHri4vZ1OMjyhN8yTGp5ToHHRmoCg3TCdl8QOM3OgpyYEKm0n4mNI0z0YtcMaNI2ehbqyiAgYp85GIQBIoanxMaZpnMwvnRI2FIq4G0s0KyOygXcg8wCXhE+TUmXGf0DTPxzlXaqegboYRmOeu1ipFFMxqBPJniUUP4ziy8mli0UdXPiI0zfPpKncUAeGglK6zWnFwBeaJxS4lViOJc5sRlPuEpnkK4a5auUvBUBbFwAsRQTGIXBtH7rnqozvKXULTPN6McYcqlXMqLIwj5XOZQ1AWXWH1gqPMOHIyjj0j9MZdStM8gTjnZkAqgRt1FuMk4Lz1jmKO2ryhQM4vcuZkhJ6DkX5M3Cc0zaN1nBi33DlTxQDloIqqzBA6DMklXQA5cV/Pos+uqpwTmubRZjEOlDsq18yNhYGUWjGZlQImYGoZYoRNShwkGFn1MI7fGBjnhKZ5NDcFRcWZuaXceOOgvSqY405R11prEAXrbEcp8DKlxCoD44rVt+qqnBOa5vHUOOg4N3MtcuCugDlQxdW14orRscq7nFPijp5FVucOoWkezwDDOz7lLcpCUQXEazVmmTVEhxGLnKQF51JioZwTmuYJVEGYZ+6qHFQzDGZMlIWJL8TcKJ2ippxkUpKUErcuAENRbghN82iqmErHfU6tLJSDTrFZFTABMVYzmPkUOcoQU0ovOBhHGDdkdce4Edn94Sc0zaO4uzqFj9SaKlQ3Fk4sEMUAqRTUxaUGZxGAKFKJLHLMnDihEJFkHP2vX+2UOtM0j6Q4wi3n2iwBF45MTV36EQx1THXWmYX386Zw7kUP/CuLnDYvdzCrcTAHFHea5nHEQYwzwjUtiLFS660rwa03A0NxmDtjMUNk2nCSYARSZpE/GxMZxVgVQaj1FzTNo4ggxjl34T5jxH4kwBtVwGGGwkKdaZqEO3JO3Eg6qyrwi1qJvB+++IdvaJpH6EyMezxWViWAc+I+1iA5V1w9UgHBwYmVz0ePUt09cuBE0VVnUDTiBr/44sMfCMDnIcTu72maP5c4J2rcUOfIuaUuIc4qZiAdbrEaK9VZgEThJHEtQ+p3xm+/LbX+AAr88GUIFmmaP1v88R84qJEb9TNndRW5VcOlpAnEryC/SU55y6q+SmTg9Y5riZMMpIsP9t+D1N8DgaZ5tA0TsGFVIMIEbCCwqEyc2QStdPl9jBNsgsyRxcQmhgiEMHEycbJh8e//z9f5t0wsAk3zNBsooCwswgQbCEBl4txmfgkpv4+RRYkcTGh58dkVhMDEmQnYsOrsQzexiDTNk2ygqAgrKYIWilKEReGcIh+yxZdfXFWZVJiKUqSQ+OmbOgGhcEYLFGVRkmZn8f8BKlZ8bJPrhHsAAAAASUVORK5CYII=) + no-repeat; + background-size: 102% 107%; + background-repeat: no-repeat; + background-attachment: fixed; /*关键*/ + background-position: center; + overflow: hidden; + border: 1px solid #d9d3c7; +} + +.skillimg { + margin: 5px; + width: 60px; + height: 60px; + background-image: url(skillbg.png); + background-size: 100%; +} + +.skillimgC { + width: 55px; + height: 55px; + margin: 2px 0px 0px 2px; +} + +.skillname { + margin: 10px; + width: 250px; + height: 20px; + line-height: 20px; + color: #91837a; + font-weight: bold; + letter-spacing: 1px; + font-size: 18px; +} + +.skillLv { + margin-top: 8px; + width: 250px; + height: 20px; + line-height: 20px; +} + +.skillRight { + margin-top: 20px; + width: 140px; + height: 40px; + line-height: 40px; + display: flex; +} + +.skillJt { + line-height: 32px; + font-weight: bold; + color: #91837a; +} + +.skillNow { + border-style: solid; + border-width: 1px; + border-color: #d9d3c7; + border-radius: 7px; + width: 50px; + height: 30px; + line-height: 30px; + text-align: center; + color: #91837a; + font-weight: bold; + font-size: 20px; + background-color: #f7f5f0; +} + +.role_top { + margin: 10px 0 20px 0; + padding: 10px; + /* box-shadow: 0 5px 10px 0 rgb(0 0 0 / 10%); */ + border-radius: 3px; + font-family: tttgbnumber; + background: linear-gradient(1turn, hsla(25, 23%, 67%, 0.4), hsla(25, 23%, 67%, 0.2)); + display: flex; + color: #8c7770; + font-weight: bold; + font-size: 20px; + letter-spacing: 1px; +} + +.role_top .role_top_name { + width: 50%; +} + +.role_top .role_top_LV { + width: 50%; + text-align: right; +} + +.role_separate_line { + text-align: center; + color: #bfa399; + height: 24px; + line-height: 24px; + font-size: 18px; + margin: 10px 0 20px 0; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAmYAAAAMCAYAAADI3HGfAAAAAXNSR0IArs4c6QAAB1RJREFUeF7tnb+TFFUQx7v7zexyHBQBBSQmmGhmAOZQxY/EIgDNKQ34mwi0zBUCMAEJLpcLzDSRxAQoAwrOY3fmvba+3e/NLooaUMXO3by5H7PvZ3d/35uez+7t3THVoypQFdioAruP7n4GB85duv7DRh2pxietQN2Hk17+GvyIFOAR+VJdqQpMUoHdB3e+NzC7euPzSQpQgx6FAnUfjmIZqhNVAapgVjdBVWCDCvz06M6HnOgXuNBq+9EnV6892aA71fREFfj5wb2zHXe/InwV+vjTSzd+m6gUNeyqwMYVqGC28SWoDkxVgce3b7d09tRDIr3gGvAOPXl+5fytW91UNalxv38F6j58/5pXi1WB/1KgglndH1WBDSjgr5Tx1ysoK07wjop+VV+x2MCiTNBk3YcTXPQa8ugVMDBTVZyZ6DumnVO8e/w4n3j2TH7fesrz+TbP/tjidjbjZvaCQzvn0LT8an8hYa/lV82fHJqGQ2hZQuCw/9rOi74XkYYlLPj1IvD2duDFUlikYxbhPiZhFuauYxE89DqaEXEvHEs72ri3dpwwppeeJar01oRv0abyQ5hi5JR8fhuC9tIhMpOk3M5MLJwic2O90C/XYXxKuWyVTIxxbiUlFZS9YM3MlOxs35UkpcTkDcM8hAmIOamaxykPRg+y6XyMKuY3Q2Yl2JQaiKl9265KKdsgZXJnmdS+uZeq4tO7j8UvQn91exYhCtaO/WDjbD5VEtTZFKosRGzTuyFWIqFkJSvjkceBM9pV3C1iSms2YMIdEK/2cW7LfcNjzG+xZB/MP7VGs2l6+UDvQ9wQa/J+cAl6Yp+XuV0f2DY98njUue9ZQ9Ycg8c/fGU/TZ/sn7etbOCnk+ev3NheXy97g7XqTVW6hvZ/yRAdM90j5m/rLwSMPoceSAffdR8+fnhnj4jwyq7iDuKXgG1+XHO4Mr0eH9Zn+EICxGWHRq/HB+rwmJGCLOlYHY7BBtII2jHUxrEoaS/ugNvP461sPvgc3scSgPmHOdTSlvsPZwR1nr7h2jCWBGULBn4hvVhGKfF5GrEMafN72RIrEhAS6xAHsrzNVfQZ/EOf7L/F52W3gQBExVzmZOeiz6Cx2xAxHf55KHVMHCMSXZ7PdIZebkBJsi3rY73ge7LQBVKXw/0SEQiS0OIS5j4+FIqqCG4X5r6Vs4zeATGJJFLrokGD9qgO6OZ11o6IQ7GN+qCNFZO3BzR6fz8F1SbhU1Pg1CT0TmqDEjo0+Zw0BLGOtCRq8DjhM6m2rY1Z1bU6nyXd24t6ZB41xbmm1Ou8aVKKUePWEbVz7DT2vR7rj2rc7vTY1jzFvtPYLbRfntBuudTlyX1dLPb0g/0z+uL06XTu5UulC8+V6Iuyh5Uf379/tA8vmqY9w6F5ZdAV9hren3ci+/scQsP7IfBxO79meQ3YEl72UUSWLBKYDbgCc+h4CQAyyIoiXQYqgyv0AYj13ImwxORgBRgCD82EdZk0NBTQNxpYMeZZQZXBVWSKDkZORZGjCO7CHDMnOUD5eOMeJ57cu8COyqraYcXAIWVYAij4vdlgZsCrdRBIgJ5yA3dwK5CGPVPADcNDIPic7WTQwWibegU0mM/r7Ib/loNbTRQIpJbnMzBQwjU0gKNBguUPBxMHPZQ984D6CpA7tyF3GaCs4MgzlI9n5C1M5yAyABSyWwHRv8GUS5PBBf5pVmQN3Cz9FrArYKXEAm+tzbWwtAdtcv8Cec6eBkPIvQWcMAx51qFpHbwGuPJYLI5Bn3XwyrE6fRpYOqtBDwdAb8o2M7gWcCvAeO7ydQDdcNgNMepN5f8BM6V7FCqYHUjqOQBOv+s+3P3xrgFUAaIBvAAeDk0GJg5IXjZeo3yjN7BZAVABNAMFY4zcXuCtgB3SV4EmuyztyZe9vuBwqEjbZrvAlF+qDoDI8A5k9qxOU7JnjCuwM3CzzPEGeDkU+fgS3wCWGfIM/pC9DTTdhsfhviGLMZ5b+rPdDK25T+7vz3sdCpH4ILLhjn1aKnN9ssYDeDptrflnVKUUga8UifStb48wLaTY8PUwnzNImV5mC5DECrIDZBXwwusamesMvHLI9ggZ/w1QLmyVIU+cDBMgEPZW0OYG3C8Gfa24zEK3hhW45UIQ1Z5Ug8GXkxzAkOzhGrwZcHl7EAG+aewpFgbxoSGDnaTWQK1xYAPg4QyAaxvMYzA3Q31sNaWoOkNV1JRmOmtCSjFpOtLrVjyiLyPOALhe09aWbi3aFLd7NXjrj2nfPdUmnujrjzIPQBKtLh4+BfzN1stviDi/v6zEqDutzr6svwRw+NZ8jBHVfTjGVak+TV2BCmZT3wE1/o0p4G+6PvlwBWe6c649eZkvXuw35lQ1PDkF6j6c3JLXgEeuQAWzkS9Qde9wK7D+Zwrqn8s43Gs95ujqPhzz6lTfpqZABbOprXiNd3QK1D/sObolmaRDdR9Octlr0CNUoILZCBelujQtBeq/wpnWeo812roPx7oy1a+pKfAXslPKlPWYHUYAAAAASUVORK5CYII=) + no-repeat; + background-position: 50%; + background-size: 100% auto; + font-weight: bold; +} + +.cailiao_box { + display: flex; + flex-direction: row; + justify-content: space-between; + flex-wrap: wrap; + color: #91837a; + font-weight: bold; + margin-bottom: 20px; + padding: 0px 10px; + width: 100%; +} +.cailiao_item { + width: 280px; + display: flex; + align-items: center; + margin-bottom: 10px; +} +.long{ + width: 100%; +} +.isTalent{ + margin-left: -10px; +} +.cailiao_img{ + width: 50px; + height: 50px; + margin-right: 10px; + background-position: 50%; + background-repeat: no-repeat; + background-size: contain; + text-align: center; + border-radius: 3px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAYAAAAehFoBAAAEXElEQVRYhc2ZO2tUQRTHz5l73WQlGhHETlDEQhALG20kxEJLW2trv4SIYCOCHyTYWSh2CmIR7CwsbK1CFNxsdufIvM887mN3bx4Lm53XPfObM/8zM3eCRAQ7r5/fQIRXALANAOeBfxABEXUBogAUJi+wMmkhQrmodL5SZbq8AqwECNtGVJVpq8sqWya0PfessiPQtAeBAIQTOZvuTg8mz+48evwN3715cVPK+WcA2IT0k8JqwyXYkPewFkAIC2fLXVpY8GAjDEzZAnTgqMGJ4N9kf2+rlnL+UsEqT8v5PGOOnA3KUF4aF4eMbm+LeML4AFlzZtQ5yKbrMyO4fPU6bFy4OB6Nz74VAPBA1bXBKoN6pBiXmhnwGDks+p5NiX4EGTiyQVl7ttyBz2eH8PvXTwO/vn67BoCNlT0a/fA892iDV5E9FT0TepgdHupfgWKt7g/LO+sCLUM0grJRIfARBue4AWTAQ+i0FdQCpaCQeDW0iXlq13Dp6W8LqAIEZF5sAuXtQ32tlg4oBtTx6rQRNHFizdfats5z0DLEMjqN+sNyPQGpP1C7hfm06DSVmZcYOQ/7bTQHLRkI/Q+h0x6g7oeMl2uzHeLAOl0woDLQMBj3hIJVu3Ht9vFBdMoHF4H302kJ1Nsk0t8a3WnpSHTK46I0/YnEsrbIeK2HReLhok47Dig56HI6zWYtihXS39od606DTtvsaw9LaYNOnVHZA+2gbBY6QRbTaWafQZPTsDtQe2snqNOyHG29lCBN0FVew8et08ZBFRwltYel2em0LE6BTtvqwa8SzMNdOiqDDqfTNkcQSSBp12H9UsmmIvdqt04jkF46XcwRClZB1wpWBd7R6LRnQDWChjbew14SS+u0axnsr9Oo/0Re5IPO3RVg26iXCSju1VUDFqwk7Drsd7pEe5kOC4aG1GnpiOtPa14SaknTV0iFhl3T3wjK2/bXabO8jIcBpNk4BNvpVtLpoueOzlljNsjudMK9cZwCnRZB7R8ZDj/JxnGCOs37YAmS9gBvrzjT6Y81PbBOi6CFAfnmbONA/xK6nE7bd8hkMD2nP662qwRI+05n72QXDpjeO+CCoOns2aReJXzQIQ+64QOKWW3VaQk0rBJOEv6dbnWdpoelHDQfXGjeAGo/5iUUnCQaAi41dsQ6LYG6MgoeRnv4aZv+49FpBJvUU7SsRReCK+q0CArMIYuB+pyJOethFC2gw+i0EzTpJ+3beNhcaE9B4KgejWCu/pfQufAH2OL0FwMqzjfpNM+yVtrDtC9ms9muKr505RrUozXmoeBJjLTs/nNk23gAHrgIoRqbYdE5JQwpOIoNQAgXdB/w+6f398bnNj+iwLGfSgrDInK/tlCSvUmUfjF3917qcKLLeZ6X6XR41qeVbVWnuyrUmavWPSC6K25tPfwy+bu/PZtOvxLJg0ZYfRx1sKoDc9cVwdntMwXVg/KwKh2AFKgftH4ug/1DQDsK9v6Tpz/+A+D9r7rzum/YAAAAAElFTkSuQmCC); +} +.cailiao_item_img { + width: 50px; + height: 50px; + /* margin-right: 10px; */ +} +.cailiao_item_title { + line-height: 30px; + font-size: 18px; + vertical-align: middle; + white-space: nowrap; +} +.biye { + text-align: center; + font-family: "tttgbnumber"; + line-height: 30px; + color: #91837a; +} + +.logo { + font-size: 14px; + font-family: "tttgbnumber"; + text-align: center; + color: #7994a7; +} +.jt { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAQCAYAAABtPJ3XAAAC4klEQVRIS9VWTWsTURS9b4oiBPozIiKI1l2hBanUNHThokip0NJUKJrRHxBoOxGSmoL/IaWxKUnrvuDGzLiTbtWI0K0TN4Uijc27R+Yj85FMmml3zSabnHfPPffccyPomn2ExfeXric7Ix3l9vij71fhr+9tJ0f4hjK+sHAl/MdiMclEylwuNxQvmkZjDUCeWQoAtTOlrY5NpltxiRvVD2sMmWfJgphriiR1MpOJjT8oba7BxQviGkRbfZbbHIgXzS+NE5Y8CmYCmJhhCoJ6d2q6Hoe0Ua2cMPMoW3j7DZgA1KnlF7Hw+1uFE0iMgiWBQQw2BUid33gbibcUhl0MTsFA4Xqng+xY+mK19WoFIZz7BgH1f0o7m868uVDtg1LBqe+QdThIJgLX2+fIZjbDaoum8RnMcNXxCVuPEMhksPpgZnagWvruDgD4jYabNiWgzqy+GojfLxVgkbUU7uMBNsGkLhbeefhIhT2V3UYYKI99PVoRmsa9NtGrO55CtiUChLuKAVRO/f4TiQ8p3LWl7J04yse3EiuaprFPuOfHXdLdrkkg9XD26WEUYYekMyW/WfZHzExCiNTMy9d9+D7ClpcDE+u+pwCpxdL7wxBhT5HwWB1PDSRsedgfZz9hyy4yBmG3aWvxAwp3RWAglQkRthPC3fSQUiAilO+nj1aEiLJE9NLZiWMXBhFQfnIJS3gku3wI5eObvZboSQl3c1sgZIctnTOZgCX8t1oClJ0eunRuSnjR6IjHzC0CZUNL98No2LHk57CXp/FibUBKxI21YEoEow2Mevuco2KtccrMCT+HYbKEem863uHQq5VTMCfCh6OjTi2vxjocB6XiKbNMBMiaDKk+3yhEH46fRmNdMudthYlqZ3/P1GHHIpgUxm5lncF5O7eJa8r55U7z/lZxHdKqLwmEmhh2mq3i3/RPSev7zsTjZpxz3Bdt29s2fmJp6Ur4vaJm4+dz2lC8/W/tOn3+A23CzD4pjl20AAAAAElFTkSuQmCC) + 50% / cover no-repeat; + width: 20px; + height: 8px; + display: inline-block; + margin: 0 5px 2px 5px; +} + +.role_box .life { + position: absolute; + top: 0px; + right: 0px; + z-index: 9; + font-size: 16px; + text-align: center; + color: #fff; + border-radius: 2px; + padding: 1px 5px; + border-radius: 3px; + font-family: "tttgbnumber"; +} +.life1 { + background-color: #62a8ea; +} +.life2 { + background-color: #62a8ea; +} +.life3 { + background-color: #45b97c; +} +.life4 { + background-color: #45b97c; +} +.life5 { + background-color: #ff5722; +} +.life6 { + background-color: #ff5722; +} \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/blueprint/blueprint.html b/src/Yunzai-Bot/plugins/genshin/resources/html/blueprint/blueprint.html new file mode 100644 index 0000000000000000000000000000000000000000..f25eb13de033cb7c05ca574430ce790a7af82fce --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/blueprint/blueprint.html @@ -0,0 +1,49 @@ + + + + + + + + + +
+
+
+ UID : {{uid}} +
+
+ 模数ID : {{share_code}} +
+
+ 尘歌壶模数养成计算 +
+
+
+
所需模具
+
+ {{each blueprint.data.list item}} +
+
+ +
+
{{item.name}} x {{item.num}}
+
+ {{/each}} +
+
所需消耗
+
+ {{each computes item}} +
+
+ +
+
{{item.name}} x {{item.num}}
+
+ {{/each}} +
+
+
+ + + diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/calculator/calculator.css b/src/Yunzai-Bot/plugins/genshin/resources/html/calculator/calculator.css new file mode 100644 index 0000000000000000000000000000000000000000..0222fc00582ed152802141fea6aada6112c960a1 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/calculator/calculator.css @@ -0,0 +1,433 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + transform: scale(1.48); + transform-origin: 0 0; +} +.container { + width: 550px; + padding: 10px 15px 15px 15px; + background-color: #fff; + position: relative; +} +.info_box { + position: relative; + height: 40px; + margin-top: 10px; + margin-bottom: 15px; +} +.head_box { + /* padding: 10px; */ + /* border-radius: 15px; */ + font-family: tttgbnumber; + /* box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); */ +} + +.data_box { + padding: 5px 10px 5px 10px; + margin-top: 10px; + /* box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); */ + border-radius: 5px; + font-family: tttgbnumber; + background-color: #f2eee6; + border: 1px solid #d9d3c7; +} + +.uidRight { + position: absolute; + top: 5px; + right: 0px; + font-size: 20px; + text-align: center; + color: #fff; + padding: 3px 6px; + border-radius: 7px; + font-family: "tttgbnumber"; + background-color: #a57f72; + box-shadow: 0 3px 6px 0 rgb(132 93 90 / 40%); +} + +.topLeft { + position: absolute; + top: 5px; + left: 0px; + z-index: 9; + font-size: 20px; + text-align: center; + color: #fff; + padding: 3px 6px; + border-radius: 7px; + font-family: "tttgbnumber"; + background-color: #a57f72; + box-shadow: 0 3px 6px 0 rgb(132 93 90 / 40%); +} + +.item { + margin: 10px 0px 10px 0px; + border-radius: 5px; + background: #e9e5dc; + display: flex; + /* box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); */ + border: 1px solid #d9d3c7; +} + +.role_box { + margin: 10px 0px 10px 10px; + height: 95px; + width: 95px; + background: #e9e5dc; + border-radius: 7px; + overflow: hidden; + position: relative; +} + +.role_img { + width: 100%; + height: 100%; +} + +.role_name { + margin-top: 20px; + margin-left: 10px; + width: 125px; + color: #91837a; + font-weight: bold; + font-size: 24px; + line-height: 30px; + letter-spacing: 1px; + white-space: nowrap; +} + +.role_LV { + margin-top: 10px; + width: 120px; + height: 40px; + line-height: 30px; + white-space: nowrap; + font-size: 16px; +} + +.weapon_box { + margin: 10px 0px 10px 20px; + height: 95px; + width: 95px; + background: #e9e5dc; + border-radius: 7px; + overflow: hidden; +} + +.weapon_img { + width: 100%; + height: 100%; +} + +.weapon_name { + margin-top: 20px; + margin-left: 10px; + width: 120px; + color: #91837a; + font-weight: bold; + font-size: 24px; + line-height: 30px; + letter-spacing: 1px; + white-space: nowrap; +} + +.weapon_LV { + margin-top: 10px; + width: 120px; + height: 40px; + font-size: 16px; + line-height: 30px; + white-space: nowrap; +} + +.weapon_bg5 { + background-image: url(../../img/other/bg5.png); + width: 100%; + height: 95px; + background-size: 100%; + background-repeat: no-repeat; +} + +.weapon_bg4 { + width: 100%; + height: 95px; + background-image: url(../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.weapon_bg3 { + width: 100%; + height: 95px; + background-image: url(../../img/other/bg3.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.weapon_bg2 { + width: 100%; + height: 95px; + background-image: url(../../img/other/bg3.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.weapon_bg1 { + width: 100%; + height: 95px; + background-image: url(../../img/other/bg3.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.bg105 { + background-image: url(../../img/other/bg105.png); + width: 100%; + height: 95px; + background-size: 100%; + background-repeat: no-repeat; +} + +.bg5 { + background-image: url(../../img/other/bg5.png); + width: 100%; + height: 95px; + /*filter: brightness(1.1);*/ + background-size: 100%; + background-repeat: no-repeat; +} + +.bg4 { + width: 100%; + height: 95px; + background-image: url(../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.skill { + margin: 5px 0px 0px 0px; + background: #f1eee5; + display: flex; + border-radius: 7px; + padding: 1px 0 1px 0; + /* box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); */ + padding-left: 20px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAq4AAACACAMAAAD9GBtbAAABaFBMVEVHcEyqqqrbkpK0lpaAgID/qqq5oqL///9VVVW2kpKqVVWZmZm/gICqmZnMzMyqqqqSkpKZZmbu59vayKzZx67k1sPbwqrYxq3s5NnZyKzZx62zmZm5oovMmZnx7eSAgIC5i4vVqqq/n5+qqqqqgIC7mZnMmZnbybDEsbGxnZ2qlZXXxa3VxK3OtaXXxq2/v7+7qqrbtpLjqqrGqqqqjo7x7OTXxazv6eHYxazq4dXg08Hq4tbXx6/o4dbf0r7n3tOvn5+llpa7qpmkkpK2pKTWw6uxiYnv6eD/gICdiYnVw6ry7ubv6uLw7OTZx63x7eXy7eXw6+Pt6ODx7OTv6+Pu6eHx6+Pu6ODu6eDv6eHv6uHw6uLt59/Xxavx7OPYxqzx7eTXxKzZxqzWw6rYxavWw6vYxKzWxavs59/w6+Lw7OPXxazv6+LXw6vWxKzYxa3XxKvVw6rXxKrWxqzt6N/WxKru6uLWxKscG7OjAAAAS3RSTlMAAwcRAgMLAQMHAwUEDwUGBwXtU+voFYLiz/IKCwXzBAsGCAkGDwruDQ0M61ofhgQPBwkJCfPy89Dj6e7u7unjEBEPDg7RDfMCDfMtJH2VAAAUGElEQVQYGe3B34sk2ZXY8e8999zIiO6uavWMZqTR7HiXxXgNZt8MRi8G/+1+EBiMwcbgXS/axaPRr9FsqzK7OyPinnuuIzKzqrKqqwWqKr3dzyfQNI/Wi3PfpNwwFsMcKWoRmGADpctgDDNEoBCZuLWhdOGr7+ev3vzu9/yse/Xuw++/6P1bAwJN82i9OPdJ5pptMIgsilpkURQmZVP5jH8NU6wcTJxsOAjTy+pfTenXfKn8mtXX/wyBpnm0F/sN903KtWiRgwAWgdLtXybmMG1qDAGq7CuLiaMNpfyb/8fgldJJ9f/wNn74PSd/9UsCiy+DhP9I0/y5Xm8mzm0yEDkpvOXgTSx+BbyWNG02sP3ij3L5vbyKu5jfcuaN82YHxmZCIE3avZIt/A/5UP+Br/85AJ+HELu/p2n+bIpzrTMInCnOkYaKgUgIhhKrS6kozIhxpp8r/dj/9DsJFTNUnczl9nsJV+Ef8QCf//j7n9M0jyNcEwJ3FAfUQMFQtFBAiVmkVBdCLNW4JZp5/eHFVcr0FOsM72Y2I4u34Y//+HXkS97/nKZ5pMC1z8bAHbWCKuILpNZYSYVUxRyowdzcuaFdrM6mvr/QzTx8uMCjlFiDpejw+sP+CxNC+DlN8ziqfJooYDgKSIdDgSlm7WJQ4R6dpwwV2O0wrlKeXMFELHHBF5+HUZBI0zyOqHNjxz3BFdMQ1QCdsRCJyiS1YM49OiuXQLrYAaXrpo4hT967YWm3ieEnr5WQaJrH6YwbYoF7OoNRFUzNBDGNpUYq0dUxzqlIzMCOoxSo5CHtpw0zFnb08a8j/+ULmuZxvHJNCNznOFAdd9wlxhxCYCGhYJxTl2wX9BMHXcK1pGCmVsTpoqb6V/9TaJpHExEOOgmBh7mqq4JidAYxRjCMc+qaYSeBgyFBBELXxYGsG8zqhiulaR7NQJ2FBR6iGCsdwVh0M9DFWYxzSo39jksqQyFSJIBHQLaXsbBPaqOUjdI0fynBWMxdZ6zU8A63Ut25Qz2NI9S6o0DhWkHYwsth/3qrNmWlaZ7uzR95QHTBEBDFwMBHRYpzz7wZWexYzF2CwOod7FnEjFcR+Y3SNH8pMx1gOIhirIyP9b7pthwMBQjck5iGn/j7qDTNUzgPiayCzaIG3Szixqf0nq84Ggpd4qRwdJmlK/Iv/Y9QmuYZ1MA5Z2WozGB0Zp2OPEzJXIQatgyUxFElboGBPYOL7HhJmRCa5imE1Q9vKnfYCsxFAXPCrDxIcQiVylBKIiw4GhgKDIIHBv/GQGiaZ/AD5yLXTB2MDjbKg4IDlUVJXQichO1QugII7/bbgf2v5AqlaZ5ADeEjzo1Z3TDvJjo1PqZFY74gbLkjvKNA3DPwfihR3ie3H09K0zyFmgv3BIwbIpiadRgfS1k9jhfsYNhDDSxky2IosL+EbVdAgxtvUZrmCYyHGAcK1pmjhvGgLCFnAovScSRbFkNhsYWhROpWjIXQNE8k3BEjJwYYHaqAmfER7QpQKwyQuDUUYAaGEtlPYspCaZonMmFRCayiY6w6c2NhHYoZD5orXAZnKIkAJVIzMHAyFNCAYSyEpnkq6TpcOTHjYEY+7wQ8uCsPU+0vqBlIBCC9gwSUPRBhKMAO50homiebgVkrd73hrbGK7soDVD2PXEjcAYGDErZD17GI+0sKKdYgypHQNE9lMnNLOereciATyVR5gL/gAuqOoXCyf8eNbQe+n8SMI6VpnszUua8zToSymUSNj11dwpaBwrUBCtAR9wMF6LNxTWia5yCdceAcGTemWDbu3Kda+1q3DKVErpVSIqs9pRBnm4wbQtM8gSonRgBixDjjyVkV7ZR7dGYkQOFAFhC5NpAivQk3NkrTPJ44ByYEVm7csSmbSSSnEnE1zumsMe04KPCOg31HgZQjkNP7JMaR8qMiNM2jSQfKSoisjPvKxlmUiXtcX5Qdi0hKKXIys8iUriSkFwMU7cX9dRKa5vGME8NYKXc4UDYpARu854xqngZWBQicdKziHCHHXIxVL9Om1ulzoWkeT7lmbyoL6VS55mnDoixiLJvNLNxSSFxyXySS2AMpghvQu+dXI8P8d0rTPAf9XmuAQnSubSisUmZRUMGMa5kdi6GwysOeo0JmleM+iBo6Vw1lAP1vQtM8iXFgoBwYNwpHiVXCuaFzz+XlBdciq2EoAyeJIGao1JcFkVL6nwpN83gzwjWzykpZfC4sItdKgT4xu3LkjNTKKiUWERhKoQARiL7vDNTpckqQEi+VpnkCMe4pKCZvuSOxGHv46nfurMRfTyXugBRYFE5SJu7pYJ9A8arCwuHdj4SmeQLjjBJYVOFhY89v5o6V6uaSFKArrGS/5w6V3kZwfVUgZ2IsP/qvQtM8E7PorJxPGMk69wrqc/m2+JYBcgXZci3DHmbzqWOh5W9ZzfOLLULTPBczYo2x8LGcM4vEC51dsW6T+xxgD+RattyKMwyw11FVK+WXkFL+8gWgNM2zMRQc42MZEvD6imSgbBgvtpzsuZEyDKUM9BnrfSjJQyV/+Y6F0DRPoZxRDESVj1xAZnEFCRdmxovAtYGDoUAGCrCfgDkDkZy/fMdKaZqnMO4pEPjI+Nkuf+CkM52vOEkE4iVbbgwleaqvvlfjYkoe4ct3HAhN8wTKOcO8Egx35673mRuubIAKDBCgbLecy2lb32KiFonAO46EpnkC5x7xyCf1PaQMPpceEaAkkHd77in9DEgGKreEpnm0rkMU5YwJf0pPBmPlzoFwbR9ZlAJ5FANFuUNomsczEe5STJRPGnuidgK8ZsfRlvviJqmy2HGH0DSPZgQF44wZsyifMF6MYAXNELhvKBxEdpixElavOFKa5gmqGfcYcwcdGIWPpakjAL7j05IJYKk3CdwSmubR3DFuKIgo4KbdPM86RVaJhUPfk0oPhfKiTzsYuo6MX3IjsSoaO1ZmhVJr9wNHQtM8gXFHJ64oKrN0zNzIObOKPqIVrsYdD8nEGeJuMgMMmzOBKh84EJrmKZQbBhYETM1w62DiJGeuRWMWLi752D7Cnhj5G1aKfDUkCjeEpnk0Ee5ygipmdGBAjECGlIARGJk6CFCBwkq4NhRmVt+JAZb41kKJQHrFSmiaRzPDuMdYmHWCiEwcpfQZMAIJg7Hn1nbLjciqGgfZJL7rZhY/fHj1CpSmeT5dYaVm4AjCjZRZJFRsM3IQC4tX8I6juGexJxhHRgrgEeIP5a8RmubZqHFgLFQ48z6zyiwmxpHFfp4hz5U7Er1wzWSMLnNBIvxnoWmeTwBcWZiJ4IkYI5lzBonIrVw52bMofTXlRM0MkBhI9iuhaZ6NA6FzQBUTB3KeIrcSoJwMw8C5PVxy6QWMEzMRex9zpTL+Vmia52UszDDrWAkr5+BrkzBvOCmFj5Q9xjmztI95ztn+k9A0z0Yqiw5QBQMmd4iZPgM943dqUDKFReFBXylnzMTT/t/OMfKd0jTPxpTFzMLFGXViw8GOg4SYkOk3zif9xgXBuGbo5v/2ez7bCk3zfJwTExYmkksBMkcvwOF1n5xFjBwEzmRQxaUXbtjoNYRhUJrm+XSFE2NlqvOmsEiZE2chDuyhY1G5sb3MxIlKTkhnOouxMoNffqs0zbNRC0BnhhoHRjdtCouUOVAcMokzA2nLUUk2dTMD+xSLOC7CwlhF/q7SNI8j0TknAQiuiAESQsVJc6osoiszwUItAmliFVm4hvJiYjWEYEpBVHXvMVF6QiifjbHjxz8WmubxnDucVSi4shABzLopRo4yEHhA5MQzoBfJkw+DVmXMOW/+UAW//CelaZ6LsgoQQgWEA6Or86ZAGkkxEwO3ZobCrUt/Ryrx638BStwP8DJHFpd1x36vNM0zUQIQ3UCj48aRAdOmcPE+7h2IhYddskhi9t1LL4Uy7IdSIoshw+V8KTTN81AC18w74UjBEKbIe0BdbGJ1ybnqrLaFFzOeA3Ge59IVKAsppXSj/kppmufhwi1TxUARFDOlK8QCiCmrHDkYCpAhsciDcBWAUugihZPMkdA0z0IkcMZwUNRYmWDkl5y75L4swq1SuE9omucgUDk3s/D5c9QAMyxyx5bVPnIm+yVHiQcITfMXoSLinf4gs7IwYRp7LviUS4j8CSn1P1Wa5lkVYjDANBRm6Yq4GmDqGd6yeHHVc2NPxyJzWWYelliFdy+FpvkLqeLiRogICxPL/AnOp4VAKK8/E5rmOTi3hJVwFIJ3ysIxnIMR50yMkXsy52qlxvKt0jTPQlw4cRTMMPUO3HA1wHtcTOEDjP3ucstRZA9DTlzrghTOZBapjr8VmuYJlGvGtYiKSHRDhXk2MFMWc6k4H9nvgT05s6ivO6wQuS8DQtM8XufcEI6iG6XYjxzBZxG064Kj4LUarjxo5ugKNDsfyyA0zTNxDgoK1d+y6gAxQ1g5b8A4SJWHBAgs4rzgHqFpnkI5UDAppbKoteJiiMAFb7SwUAPcf8AdXgMxv+ZGt+BgiwfYs+coztwSmuYpXFkZYCJeOTEQ0B9kJ9wShBtXfKwAX83pQgYO4p6ZG0LTPBcz0VqJkWvSVayq4qYsTHhQXBDjHCM930LIrCKryDWlaR5v5i7DETwWFi4WqHNnThU3VsYifoCx5/UV1/bAsIc9lGjdvFdW+4HFfuBEaZpHc+EONUO9xMKBWgUp6o5xZlIWhQt23NpzkHOErBzsWe05+NnXQtM8ngvOLQNMagFhYUAIAcG4JZ2yYVWEj73uKd98s99z0nHjO6VpnsC4R42VYoi6lEo1Mc4YvhEY+w/JLwJb7nKS/S4wsOdg5sbXQtM8J1O8xsLKjAqIcYdSMjDGhITKrYHFblMqExqHYeAepWmelyHOjJopsxgfmTFNGfiQU4qXW85cbnF0ht0gThc5sw1K0zwrA3XAwZRPSWSIEajc2EOFXV/ppsstMFA4SsCrb5SmeW5zh4o5GA8RV0jksQf3zeWWWztgDJ+/DTOLPSeDAy9+pTTNc/NZ3BHnYdaHAumn37K6uuSevrx1rd98CxcsAjVsWfzxn5SmeQphJcY5d3XE+ZRCP+bf8rDXV72Jdb+lZwf0LPoNLq++UZrmKVxYuILD599zYuCcU4wjNSMBKbPqwyWVsOXkwhkDXkqkhE1hfH1F4gr+pvxaaZonEWfhIPBWMQ7UUM4pGAcGXoDcAyP9NJJeOEeXAWeVFStdVk8fEpAudt/97N8pTfMkhnAUoHo/A2KmeGfc0FK5YWJjhhIZYex7blUjcmCAYTpz8Lbj3f9WmubR1FDMhYMaCGISqCgQEeNAsVmjcUsz8OKKWxc7FpeVlToHBsbJSI5C0zyai5qBCwulVkIIEA5w48gMdTNuRItAfsGiZzFlubgEtrsIr/mpKEeqnKgyCU3zeJ0rC3NgdudT1DFu1e4VKUGi7zmayv7igpV4+jaqcmDGiRkITfMUzkrp+BPUMc6Y/RAhZ844AlxI/iADZeYhStM8iRqfIIpxIG6AggJmQEdm8c239CPQA3EaYddHri4vZ1OMjyhN8yTGp5ToHHRmoCg3TCdl8QOM3OgpyYEKm0n4mNI0z0YtcMaNI2ehbqyiAgYp85GIQBIoanxMaZpnMwvnRI2FIq4G0s0KyOygXcg8wCXhE+TUmXGf0DTPxzlXaqegboYRmOeu1ipFFMxqBPJniUUP4ziy8mli0UdXPiI0zfPpKncUAeGglK6zWnFwBeaJxS4lViOJc5sRlPuEpnkK4a5auUvBUBbFwAsRQTGIXBtH7rnqozvKXULTPN6McYcqlXMqLIwj5XOZQ1AWXWH1gqPMOHIyjj0j9MZdStM8gTjnZkAqgRt1FuMk4Lz1jmKO2ryhQM4vcuZkhJ6DkX5M3Cc0zaN1nBi33DlTxQDloIqqzBA6DMklXQA5cV/Pos+uqpwTmubRZjEOlDsq18yNhYGUWjGZlQImYGoZYoRNShwkGFn1MI7fGBjnhKZ5NDcFRcWZuaXceOOgvSqY405R11prEAXrbEcp8DKlxCoD44rVt+qqnBOa5vHUOOg4N3MtcuCugDlQxdW14orRscq7nFPijp5FVucOoWkezwDDOz7lLcpCUQXEazVmmTVEhxGLnKQF51JioZwTmuYJVEGYZ+6qHFQzDGZMlIWJL8TcKJ2ippxkUpKUErcuAENRbghN82iqmErHfU6tLJSDTrFZFTABMVYzmPkUOcoQU0ovOBhHGDdkdce4Edn94Sc0zaO4uzqFj9SaKlQ3Fk4sEMUAqRTUxaUGZxGAKFKJLHLMnDihEJFkHP2vX+2UOtM0j6Q4wi3n2iwBF45MTV36EQx1THXWmYX386Zw7kUP/CuLnDYvdzCrcTAHFHea5nHEQYwzwjUtiLFS660rwa03A0NxmDtjMUNk2nCSYARSZpE/GxMZxVgVQaj1FzTNo4ggxjl34T5jxH4kwBtVwGGGwkKdaZqEO3JO3Eg6qyrwi1qJvB+++IdvaJpH6EyMezxWViWAc+I+1iA5V1w9UgHBwYmVz0ePUt09cuBE0VVnUDTiBr/44sMfCMDnIcTu72maP5c4J2rcUOfIuaUuIc4qZiAdbrEaK9VZgEThJHEtQ+p3xm+/LbX+AAr88GUIFmmaP1v88R84qJEb9TNndRW5VcOlpAnEryC/SU55y6q+SmTg9Y5riZMMpIsP9t+D1N8DgaZ5tA0TsGFVIMIEbCCwqEyc2QStdPl9jBNsgsyRxcQmhgiEMHEycbJh8e//z9f5t0wsAk3zNBsooCwswgQbCEBl4txmfgkpv4+RRYkcTGh58dkVhMDEmQnYsOrsQzexiDTNk2ygqAgrKYIWilKEReGcIh+yxZdfXFWZVJiKUqSQ+OmbOgGhcEYLFGVRkmZn8f8BKlZ8bJPrhHsAAAAASUVORK5CYII=) + no-repeat; + background-size: 102% 107%; + background-repeat: no-repeat; + background-attachment: fixed; /*关键*/ + background-position: center; + overflow: hidden; + border: 1px solid #d9d3c7; +} + +.skillimg { + margin: 5px; + width: 60px; + height: 60px; + background-image: url(skillbg.png); + background-size: 100%; +} + +.skillimgC { + width: 55px; + height: 55px; + margin: 2px 0px 0px 2px; +} + +.skillname { + margin: 10px; + width: 250px; + height: 20px; + line-height: 20px; + color: #91837a; + font-weight: bold; + letter-spacing: 1px; + font-size: 18px; +} + +.skillLv { + margin-top: 8px; + width: 250px; + height: 20px; + line-height: 20px; +} + +.skillRight { + margin-top: 20px; + width: 140px; + height: 40px; + line-height: 40px; + display: flex; +} + +.skillJt { + line-height: 32px; + font-weight: bold; + color: #91837a; +} + +.skillNow { + border-style: solid; + border-width: 1px; + border-color: #d9d3c7; + border-radius: 7px; + width: 50px; + height: 30px; + line-height: 30px; + text-align: center; + color: #91837a; + font-weight: bold; + font-size: 20px; + background-color: #f7f5f0; +} + +.role_top { + margin: 10px 0 20px 0; + padding: 10px; + /* box-shadow: 0 5px 10px 0 rgb(0 0 0 / 10%); */ + border-radius: 3px; + font-family: tttgbnumber; + background: linear-gradient(1turn, hsla(25, 23%, 67%, 0.4), hsla(25, 23%, 67%, 0.2)); + display: flex; + color: #8c7770; + font-weight: bold; + font-size: 20px; + letter-spacing: 1px; +} + +.role_top .role_top_name { + width: 50%; +} + +.role_top .role_top_LV { + width: 50%; + text-align: right; +} + +.role_separate_line { + text-align: center; + color: #bfa399; + height: 24px; + line-height: 24px; + font-size: 18px; + margin: 10px 0 20px 0; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAmYAAAAMCAYAAADI3HGfAAAAAXNSR0IArs4c6QAAB1RJREFUeF7tnb+TFFUQx7v7zexyHBQBBSQmmGhmAOZQxY/EIgDNKQ34mwi0zBUCMAEJLpcLzDSRxAQoAwrOY3fmvba+3e/NLooaUMXO3by5H7PvZ3d/35uez+7t3THVoypQFdioAruP7n4GB85duv7DRh2pxietQN2Hk17+GvyIFOAR+VJdqQpMUoHdB3e+NzC7euPzSQpQgx6FAnUfjmIZqhNVAapgVjdBVWCDCvz06M6HnOgXuNBq+9EnV6892aA71fREFfj5wb2zHXe/InwV+vjTSzd+m6gUNeyqwMYVqGC28SWoDkxVgce3b7d09tRDIr3gGvAOPXl+5fytW91UNalxv38F6j58/5pXi1WB/1KgglndH1WBDSjgr5Tx1ysoK07wjop+VV+x2MCiTNBk3YcTXPQa8ugVMDBTVZyZ6DumnVO8e/w4n3j2TH7fesrz+TbP/tjidjbjZvaCQzvn0LT8an8hYa/lV82fHJqGQ2hZQuCw/9rOi74XkYYlLPj1IvD2duDFUlikYxbhPiZhFuauYxE89DqaEXEvHEs72ri3dpwwppeeJar01oRv0abyQ5hi5JR8fhuC9tIhMpOk3M5MLJwic2O90C/XYXxKuWyVTIxxbiUlFZS9YM3MlOxs35UkpcTkDcM8hAmIOamaxykPRg+y6XyMKuY3Q2Yl2JQaiKl9265KKdsgZXJnmdS+uZeq4tO7j8UvQn91exYhCtaO/WDjbD5VEtTZFKosRGzTuyFWIqFkJSvjkceBM9pV3C1iSms2YMIdEK/2cW7LfcNjzG+xZB/MP7VGs2l6+UDvQ9wQa/J+cAl6Yp+XuV0f2DY98njUue9ZQ9Ycg8c/fGU/TZ/sn7etbOCnk+ev3NheXy97g7XqTVW6hvZ/yRAdM90j5m/rLwSMPoceSAffdR8+fnhnj4jwyq7iDuKXgG1+XHO4Mr0eH9Zn+EICxGWHRq/HB+rwmJGCLOlYHY7BBtII2jHUxrEoaS/ugNvP461sPvgc3scSgPmHOdTSlvsPZwR1nr7h2jCWBGULBn4hvVhGKfF5GrEMafN72RIrEhAS6xAHsrzNVfQZ/EOf7L/F52W3gQBExVzmZOeiz6Cx2xAxHf55KHVMHCMSXZ7PdIZebkBJsi3rY73ge7LQBVKXw/0SEQiS0OIS5j4+FIqqCG4X5r6Vs4zeATGJJFLrokGD9qgO6OZ11o6IQ7GN+qCNFZO3BzR6fz8F1SbhU1Pg1CT0TmqDEjo0+Zw0BLGOtCRq8DjhM6m2rY1Z1bU6nyXd24t6ZB41xbmm1Ou8aVKKUePWEbVz7DT2vR7rj2rc7vTY1jzFvtPYLbRfntBuudTlyX1dLPb0g/0z+uL06XTu5UulC8+V6Iuyh5Uf379/tA8vmqY9w6F5ZdAV9hren3ci+/scQsP7IfBxO79meQ3YEl72UUSWLBKYDbgCc+h4CQAyyIoiXQYqgyv0AYj13ImwxORgBRgCD82EdZk0NBTQNxpYMeZZQZXBVWSKDkZORZGjCO7CHDMnOUD5eOMeJ57cu8COyqraYcXAIWVYAij4vdlgZsCrdRBIgJ5yA3dwK5CGPVPADcNDIPic7WTQwWibegU0mM/r7Ib/loNbTRQIpJbnMzBQwjU0gKNBguUPBxMHPZQ984D6CpA7tyF3GaCs4MgzlI9n5C1M5yAyABSyWwHRv8GUS5PBBf5pVmQN3Cz9FrArYKXEAm+tzbWwtAdtcv8Cec6eBkPIvQWcMAx51qFpHbwGuPJYLI5Bn3XwyrE6fRpYOqtBDwdAb8o2M7gWcCvAeO7ydQDdcNgNMepN5f8BM6V7FCqYHUjqOQBOv+s+3P3xrgFUAaIBvAAeDk0GJg5IXjZeo3yjN7BZAVABNAMFY4zcXuCtgB3SV4EmuyztyZe9vuBwqEjbZrvAlF+qDoDI8A5k9qxOU7JnjCuwM3CzzPEGeDkU+fgS3wCWGfIM/pC9DTTdhsfhviGLMZ5b+rPdDK25T+7vz3sdCpH4ILLhjn1aKnN9ssYDeDptrflnVKUUga8UifStb48wLaTY8PUwnzNImV5mC5DECrIDZBXwwusamesMvHLI9ggZ/w1QLmyVIU+cDBMgEPZW0OYG3C8Gfa24zEK3hhW45UIQ1Z5Ug8GXkxzAkOzhGrwZcHl7EAG+aewpFgbxoSGDnaTWQK1xYAPg4QyAaxvMYzA3Q31sNaWoOkNV1JRmOmtCSjFpOtLrVjyiLyPOALhe09aWbi3aFLd7NXjrj2nfPdUmnujrjzIPQBKtLh4+BfzN1stviDi/v6zEqDutzr6svwRw+NZ8jBHVfTjGVak+TV2BCmZT3wE1/o0p4G+6PvlwBWe6c649eZkvXuw35lQ1PDkF6j6c3JLXgEeuQAWzkS9Qde9wK7D+Zwrqn8s43Gs95ujqPhzz6lTfpqZABbOprXiNd3QK1D/sObolmaRDdR9Octlr0CNUoILZCBelujQtBeq/wpnWeo812roPx7oy1a+pKfAXslPKlPWYHUYAAAAASUVORK5CYII=) + no-repeat; + background-position: 50%; + background-size: 100% auto; + font-weight: bold; +} + +.cailiao_box { + display: flex; + flex-direction: row; + justify-content: space-between; + flex-wrap: wrap; + color: #91837a; + font-weight: bold; + margin-bottom: 20px; + padding: 0px 10px; + width: 100%; +} +.cailiao_item { + width: 230px; + display: flex; + align-items: center; + margin-bottom: 10px; +} +.long{ + width: 100%; +} +.isTalent{ + margin-left: -10px; +} +.cailiao_img{ + width: 50px; + height: 50px; + margin-right: 10px; + background-position: 50%; + background-repeat: no-repeat; + background-size: contain; + text-align: center; + border-radius: 3px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAYAAAAehFoBAAAEXElEQVRYhc2ZO2tUQRTHz5l73WQlGhHETlDEQhALG20kxEJLW2trv4SIYCOCHyTYWSh2CmIR7CwsbK1CFNxsdufIvM887mN3bx4Lm53XPfObM/8zM3eCRAQ7r5/fQIRXALANAOeBfxABEXUBogAUJi+wMmkhQrmodL5SZbq8AqwECNtGVJVpq8sqWya0PfessiPQtAeBAIQTOZvuTg8mz+48evwN3715cVPK+WcA2IT0k8JqwyXYkPewFkAIC2fLXVpY8GAjDEzZAnTgqMGJ4N9kf2+rlnL+UsEqT8v5PGOOnA3KUF4aF4eMbm+LeML4AFlzZtQ5yKbrMyO4fPU6bFy4OB6Nz74VAPBA1bXBKoN6pBiXmhnwGDks+p5NiX4EGTiyQVl7ttyBz2eH8PvXTwO/vn67BoCNlT0a/fA892iDV5E9FT0TepgdHupfgWKt7g/LO+sCLUM0grJRIfARBue4AWTAQ+i0FdQCpaCQeDW0iXlq13Dp6W8LqAIEZF5sAuXtQ32tlg4oBtTx6rQRNHFizdfats5z0DLEMjqN+sNyPQGpP1C7hfm06DSVmZcYOQ/7bTQHLRkI/Q+h0x6g7oeMl2uzHeLAOl0woDLQMBj3hIJVu3Ht9vFBdMoHF4H302kJ1Nsk0t8a3WnpSHTK46I0/YnEsrbIeK2HReLhok47Dig56HI6zWYtihXS39od606DTtvsaw9LaYNOnVHZA+2gbBY6QRbTaWafQZPTsDtQe2snqNOyHG29lCBN0FVew8et08ZBFRwltYel2em0LE6BTtvqwa8SzMNdOiqDDqfTNkcQSSBp12H9UsmmIvdqt04jkF46XcwRClZB1wpWBd7R6LRnQDWChjbew14SS+u0axnsr9Oo/0Re5IPO3RVg26iXCSju1VUDFqwk7Drsd7pEe5kOC4aG1GnpiOtPa14SaknTV0iFhl3T3wjK2/bXabO8jIcBpNk4BNvpVtLpoueOzlljNsjudMK9cZwCnRZB7R8ZDj/JxnGCOs37YAmS9gBvrzjT6Y81PbBOi6CFAfnmbONA/xK6nE7bd8hkMD2nP662qwRI+05n72QXDpjeO+CCoOns2aReJXzQIQ+64QOKWW3VaQk0rBJOEv6dbnWdpoelHDQfXGjeAGo/5iUUnCQaAi41dsQ6LYG6MgoeRnv4aZv+49FpBJvUU7SsRReCK+q0CArMIYuB+pyJOethFC2gw+i0EzTpJ+3beNhcaE9B4KgejWCu/pfQufAH2OL0FwMqzjfpNM+yVtrDtC9ms9muKr505RrUozXmoeBJjLTs/nNk23gAHrgIoRqbYdE5JQwpOIoNQAgXdB/w+6f398bnNj+iwLGfSgrDInK/tlCSvUmUfjF3917qcKLLeZ6X6XR41qeVbVWnuyrUmavWPSC6K25tPfwy+bu/PZtOvxLJg0ZYfRx1sKoDc9cVwdntMwXVg/KwKh2AFKgftH4ug/1DQDsK9v6Tpz/+A+D9r7rzum/YAAAAAElFTkSuQmCC); +} +.cailiao_item_img { + width: 50px; + height: 50px; + /* margin-right: 10px; */ +} +.cailiao_item_title { + line-height: 30px; + font-size: 18px; + vertical-align: middle; + white-space: nowrap; +} +.biye { + text-align: center; + font-family: "tttgbnumber"; + line-height: 30px; + color: #91837a; +} + +.logo { + font-size: 14px; + font-family: "tttgbnumber"; + text-align: center; + color: #7994a7; +} +.jt { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAQCAYAAABtPJ3XAAAC4klEQVRIS9VWTWsTURS9b4oiBPozIiKI1l2hBanUNHThokip0NJUKJrRHxBoOxGSmoL/IaWxKUnrvuDGzLiTbtWI0K0TN4Uijc27R+Yj85FMmml3zSabnHfPPffccyPomn2ExfeXric7Ix3l9vij71fhr+9tJ0f4hjK+sHAl/MdiMclEylwuNxQvmkZjDUCeWQoAtTOlrY5NpltxiRvVD2sMmWfJgphriiR1MpOJjT8oba7BxQviGkRbfZbbHIgXzS+NE5Y8CmYCmJhhCoJ6d2q6Hoe0Ua2cMPMoW3j7DZgA1KnlF7Hw+1uFE0iMgiWBQQw2BUid33gbibcUhl0MTsFA4Xqng+xY+mK19WoFIZz7BgH1f0o7m868uVDtg1LBqe+QdThIJgLX2+fIZjbDaoum8RnMcNXxCVuPEMhksPpgZnagWvruDgD4jYabNiWgzqy+GojfLxVgkbUU7uMBNsGkLhbeefhIhT2V3UYYKI99PVoRmsa9NtGrO55CtiUChLuKAVRO/f4TiQ8p3LWl7J04yse3EiuaprFPuOfHXdLdrkkg9XD26WEUYYekMyW/WfZHzExCiNTMy9d9+D7ClpcDE+u+pwCpxdL7wxBhT5HwWB1PDSRsedgfZz9hyy4yBmG3aWvxAwp3RWAglQkRthPC3fSQUiAilO+nj1aEiLJE9NLZiWMXBhFQfnIJS3gku3wI5eObvZboSQl3c1sgZIctnTOZgCX8t1oClJ0eunRuSnjR6IjHzC0CZUNL98No2LHk57CXp/FibUBKxI21YEoEow2Mevuco2KtccrMCT+HYbKEem863uHQq5VTMCfCh6OjTi2vxjocB6XiKbNMBMiaDKk+3yhEH46fRmNdMudthYlqZ3/P1GHHIpgUxm5lncF5O7eJa8r55U7z/lZxHdKqLwmEmhh2mq3i3/RPSev7zsTjZpxz3Bdt29s2fmJp6Ur4vaJm4+dz2lC8/W/tOn3+A23CzD4pjl20AAAAAElFTkSuQmCC) + 50% / cover no-repeat; + width: 20px; + height: 8px; + display: inline-block; + margin: 0 5px 2px 5px; +} + +.role_box .life { + position: absolute; + top: 0px; + right: 0px; + z-index: 9; + font-size: 16px; + text-align: center; + color: #fff; + border-radius: 2px; + padding: 1px 5px; + border-radius: 3px; + font-family: "tttgbnumber"; +} +.life1 { + background-color: #62a8ea; +} +.life2 { + background-color: #62a8ea; +} +.life3 { + background-color: #45b97c; +} +.life4 { + background-color: #45b97c; +} +.life5 { + background-color: #ff5722; +} +.life6 { + background-color: #ff5722; +} \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/calculator/calculator.html b/src/Yunzai-Bot/plugins/genshin/resources/html/calculator/calculator.html new file mode 100644 index 0000000000000000000000000000000000000000..20a0f22b6c3346a1d64d0a3844f49d6bbe0edb6a --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/calculator/calculator.html @@ -0,0 +1,129 @@ + + + + + + + + +
+
+
+ UID : {{uid}} +
+
+ 角色养成计算 +
+
+
+
+
+ {{ if dataCharacter.actived_constellation_num>0}} + {{dataCharacter.actived_constellation_num}}命 + {{/if}} +
+ +
+ +
+
+ {{dataCharacter.name}} +
Lv.{{dataCharacter.level}} Lv.{{setSkill[0]}}
+
+ {{ if dataCharacter.weapon}} +
+
+ +
+ +
+
+ {{dataCharacter.weapon.name}} +
Lv.{{dataCharacter.weapon.level}} Lv.{{setSkill[1]}}
+
+ {{/if}} +
+ + {{each skillList skill i}} +
+
+ +
+
+ {{skill.name}} +
Lv.10
+
+
+
{{skill.level_current}}
+
+
{{setSkill[i+2]}}
+
+
+ {{/each}} + +
+ {{if computes.avatar_consume.length + computes.avatar_skill_consume.length + computes.weapon_consume.length > 0}} +
+ {{if computes.avatar_consume.length > 0}} +
+
{{dataCharacter.name}}
+
Lv.{{dataCharacter.level}} Lv.{{setSkill[0]}}
+
+
角色消耗
+
+ {{each computes.avatar_consume avatar_consume}} +
+
+ +
+
{{avatar_consume.name}} x {{avatar_consume.num}}
+
+ {{/each}} +
+ {{/if}} + + {{if computes.avatar_skill_consume.length > 0}} +
天赋消耗
+
+ {{each computes.avatar_skill_consume avatar_skill_consume}} +
+
+ +
+
{{avatar_skill_consume.name}} x {{avatar_skill_consume.num}}
+
+ {{/each}} +
+ {{/if}} + + {{if computes.weapon_consume.length > 0}} +
+
{{dataCharacter.weapon.name}}
+
Lv.{{dataCharacter.weapon.level}} Lv.{{setSkill[1]}}
+
+
+
+ {{each computes.weapon_consume weapon_consume}} +
+
+ +
+
{{weapon_consume.name}} x {{weapon_consume.num}}
+
+ {{/each}} +
+ {{/if}} + +
+ {{else}} +
+
毕业了,下一位 !
+
+ {{/if}} +
+ + + diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/calculator/skillbg.png b/src/Yunzai-Bot/plugins/genshin/resources/html/calculator/skillbg.png new file mode 100644 index 0000000000000000000000000000000000000000..06523c25ec4664c69ff535d2d58bc815211e6a01 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/html/calculator/skillbg.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/dailyNote.css b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/dailyNote.css new file mode 100644 index 0000000000000000000000000000000000000000..4be1fd82e264606c1b5eb464eab5fc277fb10e38 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/dailyNote.css @@ -0,0 +1,123 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + font-size: 16px; + font-family: "tttgbnumber"; + transform: scale(1.5); + transform-origin: 0 0; + color: #1e1f20; +} +.container { + width: 400px; + height: 365px; + background: #f0eae3; + padding: 8px 16px; +} +.title { + display: flex; + position: relative; + margin-bottom: 9px; + color: #504c49; +} +.title .id { + flex: 1; + line-height: 18px; + padding-left: 10px; +} +.title .id:before { + content: " "; + position: absolute; + width: 5px; + height: 24px; + border-radius: 1px; + left: 0px; + top: -3px; + background: #d3bc8d; +} +.title .day { + line-height: 18px; +} +.item { + border: 1px solid #dfd8d1; + display: flex; + height: 49px; + margin-top: 5px; +} +.item .main { + display: flex; + flex: 1; + background-color: #f5f1eb; + position: relative; + /* font-weight: bold; */ +} +.item .main .bg { + width: 100px; + height: 100%; + position: absolute; + left: 0; + background-size: 100% auto; + background-image: url(../../html/dailyNote/items/bg.png); +} +.item .main .icon { + width: 25px; + height: 25px; + margin: 11px 8px 0 8px; +} +.item .main .icon-树脂 { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAADAFBMVEVHcEymu+aUmemQpNKpvemnueamsuMjAP////+VoteqxOqpvu+rv/Cmv+SoveinveipveyFmcSqwO+muu+xyPSmuuiuxPOtw/KvxfOzyvivxPOwyPaeqd2qv+yrwu+rwvGsxve0yveuyfi1zPipxfOwyPZnjuVMd8/D1/awzPmmyvOewfR7n9qFsu+StvKoxfd3n+dgiOBhjOR/ou2uzfS0z/OxzfOuy/elxvSixPLI2Pacv/Nzr+i/1fOrx/GGq+xwmeqnuu2jwfCPqOR4nuOGqO1Ugdl9oeZzmuh0nOCUtvJPf9Rdg9qLrfF3neVykta40fXJ2vbA1vbB1/RhhtevzfefxPWvyfGix/Sxy/K70fWryfHL3PV0luF7mN1dhuO4z/JuleCOsfPD2Ph8peafu++UufF8oOl7te21zvC7z/FZkNyty/KVt+230fTG2vSkv+57n+Z5muaOt/CJr+qWue1vleVih9B6o+hciOVtlOdZf9BHacFkj+Z0luB6nOarwOpEd9NSgdhJe9v8/P77+/75+v3y9fv7/P7T3ver1PXM2/bV4fby8/xuo9/09vzu8vvB3vS12va9y/Dw9PrP3ffY4/fi6fnH2fbq7vq2yvDK2PN8pN6cxux+uux8r+dzo99wltamv+nm7fmv1fNhj9NqltjC0PG0yezG1vBah89YfcrK3PGUvehKbL73+fzd4vnt8PqDv+1/teiYvevd5/iBqOHi5vqqyfFmktXn8PpxndyozO2x0vGhxO6It+jP2vTH0/OhzPKHr+bX6PlbgdXe5vRegMi61vGjuuSlzPB4teiNv+2JuPCOrN2rzvKMseWLx/Gk0PO04f2RuerM4fnH4vdYgc9JcsmFpd52m9fT5vuww+yfuOO93fS3xe1wqOdJb8OatOnA4fZEYbXi8fvBzu+Bq+Rwjc1VdcTd6/hmiNanuOnq8fnC1u7B0++YsOWtxOqmvuLZ3/iFwu653ftjjudpjM6QwuycwOhkl9l+mNuIq9tKZbR3jtp9pOhCPAtyAAAAhHRSTlMAEAIHFA0FAQEDByQnChYSHAQfCTwZMC4zRzZCCCEqLFE3VktGPrr++ViZWf2YgGWiz6J/ktKaXXW0+m76+qeTmf3b/L+N58OI7nn97nK599zqx+xMf3rgjuPdy/dcNPLw32jd3qyljvLt4f235enqwqxdjK3QrvCO5aLP8q38/vX6/dmXUlc7AAAEIklEQVQ4y3WVZVQcZxSGmWFmdmbHd3dmHXcImjRJkxN3O3V3d0vd05ZhF11gcdey2CaBBAjuEm/SeIgTJUbdBzktlJ37+znftfe+n5PTpJCBIIuMBguCTpKBgoiBBGiIoigIgA0IKsFhCEkzuAuvcXfXqAkFRDomUYSEjGqV2/pFn/n4+Hy86p0nIIOj7KAzzPDaCJ913Vd/X3ptKPnsT0/eR2KOOBpXrf/6q27fq0Onhtoyv/go/HFOOR2UIQDuHb7pZvLQX2U3bGWfh0XoXRnYQY0YrFCFrz1ptlyruGU7u265VodTsPP0ElE5p1u1tv/m36d9fS8dXRHiTVCwgXXQCgbjbiv6L1U0llZXn/ddozICBszhaBBIs2jPnorSzovlZ86EeRKAxKxBJaN/+mTj4YsHO/MOHwlVMQaJnWAw8UxQUGlDbUttx74jy3UUIrE7FlC/eLSkIb+lfm9Sc3ewBpICxRLfPlZS0rq3ue9QYsFC6RfllPuygvLfOpKOVw53Fb6v4uQSoDPnvrK0PD/6nPX68I6eMC8FKaFFOee+rKG8NenClRvXh+2r3QgYk6iR0m0oqag6Z7Xablvt/Ws0FCJzDNJ8aG91VZ/Var3dY+3ZoDeSjp/EANeIy9VVVyqLomxlUUVfhvCQHJ16I9jYSkEY9/j0zz+6LJWVlbf6LFtWehL0JBLF5CRMOotJUAOj+uR8b3FSYmJTVcuFHdsX6nFayYLjhYIIDDEKBnAemzj/Ye/lXwcTBweLv/slJ/elYL0LBygREERBVkkr1F5vPc+REzL74NjPxcXRYuTE5/0wf6OnjmBomCRJgHPxnvdK7AIjPHoJ4shDswuycwYGclrjm/K27n/19Rf8vTWEUYGrVf5z/WJtc3B4vG8icHV2QWN8fO78nTXNNTvze7Y9NfcBD63Wc3bAmxYh9WVxXWONKTndjO3ZQfmnc3O37spr2hVfZhXs2/zumvXIY1ZBsNgW6CYEwMK49rl9ndtrcvcfiN69e+BgbZogCHYhwbLFLthj3/AgAGzivCD1vKWFhYX1HUkHfqzPPPR9ZpTJZIoUEkQu1S9AxyknBouRjGrG4lMnktuT0493pcRkZgmmSJG0x2WY0x/V4jD7r/XAuP7dxe3JJ75tN5vbsjIE02gIQlpM+sP+rpAc/M+kaEK7JOqbtKGitrqEMSpSLLMoJv3B2Tw32a9AA+QS+F7W5ri4yHHMJNiLYmNiZ3nw3FQ1YUqK0G9c0lZXlxGXkBCXkZaaYjbfe4fWlSPZKWKSYQZaweuDX3v2zpSRkc0j5pS775nppsMhJfv/OwdFM1W4aLwC5zwUEDDz/hA3FT9mVtP1LhPtGaBEf1bzvNqVMDIQLOFCTijKypUwANA0AMCkAcFQ6c9h9A/BWBbDQNmUnP8AxnRdcEv5tZoAAAAASUVORK5CYII=) no-repeat 50% / cover; +} +.item .main .icon-洞天宝钱 { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAADAFBMVEVHcExfSUY3KiGXc0UBAAAAAAAAAABJSUkAAABILiqFWkCdeEzi4uKfna3Cwco0KSkvJCSUbDFAMjI3Kyuid1GlelJCNDKheFBCNTNyTjvaw4mfn7CCgJetpqYSDAw8Li40KioAAACbck29mGMAAABMOjiOaj9OPTokHRpfSUZDNjPHsHaQakSRa0e2jl+qhFOccU+VbUWTb0W1lF+SbEa1l0+mprTFp26Fgpi4tsOKiJuRi5W1jlqXcEWyi1qFfoh8d5Omn6DY196Hcm27usSnpbbl5OmTkaM4KysxKipJOTc2KytJNzdQPzu0jF5MPDqmeVNdSEWDYjo6LS2nflagdVBDNjSScjxdSUajd1GbekaNaESgdFGjgFqcfVisgliHY0TEp3zFqH3IrX+8nmm3nGTComvdxpCffUnMs4XXvoWwjFuFgJtsZ4m7u8PT09Omo7PPztfKyNOgmaPewWitrLl9eZOBeozkxWXlx2V2dI63tcPEwsufn5/Gp26wkFXAoWqHgZzdxYSVdUOBd3uzs77Y19/TtWSYdkSGYTGhkIDTt3WUcUK9nmq3lmjb2uG4uMPo5+rExMvGxsx+eZWBfJXEv7ublZaZlqh+fJGDfplaRkPfxHlOPzy4j19RQD2wh1rAmGTPr2+2i1+8lWLOrG6sg1nStHFjS0lJOTdcSEXbv3argk3Yu3XcwHbew3ileVLLqm3mz4XkzIHmx2OsgFi5j2HEnmi1jF2ziV3dwnhMPDtFODbIpGm0h17XunPZvnagdFDQsW7CmmimeVSuhFbAlGjjy4XgxnvfxoC9nmHVuHOrflivgFq5kWChfUmpflTiyX3LoHbavH9/eoSqgUzp0oWheE6MhY/EpWOPi6N5cXrNzNToymTVtnJLOziyhVyWcUTAomShe0ymfFD123rcw3zSs3jHm3KsglKqgVFoZYKriVa5tMfb2OK6kmLJo2vIoWuad0a1lFWlg0u6mlfZu2bk0ZnfwYbWunzGpGzZwIK5sq/u2Zbx4qvPy8rgMWpBAAAA1XRSTlMA/go8RQ0GAQwDDEYR/v6jlwhWIZn6f3B6EfwJKP4qTKwLeP1EmyTdIuh4rBor9p8li0+kp44b9v7+/v7+9cP+h/30Kvj++/6Tk2JeOHnn+bXzgD7l6LRe6LmAMfC1o/Qxgmqf/Krt0aeW5ZXrNGId9Pjd/v7R/f7+/v5/0hDKt9+q+MvNL77+0hWK9VHfzvpd60lQY/j+/t7AmP////////////////////////////////////////////////////////////////////////////4hmp4pAAAC+ElEQVQYGe3BdVBTARwA4N82YDy6kbABFQFbRFSEE+zu7u7u7u7c9t56Y8TKFSBDYoBBS5ccgoTYnQ+YesDEv73z++A/nInJ3vUm8DdkALh8MShgz7r+/RFohdOVW0NvDjMbZjpww8ZNu51AJ+TohUvOV/N9gurMCk1rTH3MfLYOXevsBL9MX9q9H4kMJsfOF5rdCCgcbjo8sC4/sCb/2YBd2wYOWHPQGRDjft37uIHHivdPjvc4ecrfv61/7vdr1wsK/Np+Kcj19fXL3bw9KyvriMP+d08cZ1kCIL2HDKo9kZeXFyv9+i37dlFR0e16O3dsUZfdwx2uHbSaBA0cvLi9zgzOEeWUPwqtV11V/Sg0NLQqLT4nZzCpL30IaBl5Mz3P0dFPTDFbxcXR2eLKj5mVGU8zMp5q+hiH7QOtno6njT9XSKTp0mxJYnKyVJItTadSk6SJHzIzkw8ZR6xCoJGHI/VsYkS4UBiBE1KFOKqwHjUpXSI5kLScDForpeIYtVodFhaDC2mgfvGSGRLC4YQncxIXwU9Gi5fwmLGxPB6vuLj4/n21Ws2LZmk0cUyNWFHhvRCB33p3ZqBKNIWtEHM4TFz0QwaHo4mL48iXLYAmeslkMjrKYLNQxh2c/GFptIIlF6Mp9tAU0smLzeJyS9kMeTSLoVAw2Aw5naWabw8tePYYx1bJHshUKc9VpSwULeXKptj0BF0sSfY2M21F8aL4eJHtBJtOJEv4M6M5aXdxoqlkaN3sBFT+QKZMsHWDVhnNTaArlUp6WnlfBP6MSJxX9vb1m9TU1FePH09yIIJuRNcZ3QgCSiMBgTCx21gy6OJKoBAwGkZrhFH4AsIo0MF6PJ+CYV3c3du0sbOzc59G4wv4XYjQklUkgVJCswKtySUUAR8bAy2NjqJgwSXWoGUdhVH4NCtoqX1UZHBwcFd9ra5RJVhkZHtojqzfbqR5hw4Wei56DVz0LCzMzUe000egOTKCGBgQOxoa6uMMDTsSDQwQhAz/kh+S8VvTLVuGbQAAAABJRU5ErkJggg==) no-repeat 50% / cover; +} +.item .main .icon-委托 { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAADAFBMVEVHcEwAABsSBywSBjsAAAAAABUAAAYAAAAAAAAAAAAjFFASCikVCT4UCT0AAA8VCzrCov7Aof4VCjkVCzYVCzYZDEIUDCAWCzMVCzQXDDgEBBMVCj0YCjoAAAAUDD4VCDMWCkAWCTwTChwXCDoWCzwSDywSCDkWDEDAoPkkFk8UCTwVCj0gFEw0JGAWDy0WDTwbEEcVCTtYRYhPPH8UCTwbD0Wvkueni+J6Yq7Aofm6nfSUe8ukid5dSo++oPgWCjYTCTUgEkwVDTEYC0AVCji8nfd5Yq9dS5BjT5Z4YayliNskFUy/n/gyIVyihtkXAC4WCjl6Y7EaDUW7nPlrS61FL32SaeM3I2k+KXJxUrekePihdvZcQZyVe86eeeq8nPdMOnx3Ya1MOnqtkea6nPS6m/N4YKytkOYWCzYWCzgVCTwcDioXCzlSN42ObdJYPpWWes6hdvWqfPYQAihyWayne/eUa+aQbtSDYM+JY9hAKna9m/8pGVmrffxYP5aOaN9uVKQ5JWyJZNh2Vb2JZdiqffune/tuTrGYb+h3XbOBZcE5JW69nvQVDDWVes1bSI2jhtxiTZShhtnAof/k1/9eR4zAoP9dRotcRopdRopdR4vBov+lef+mev9eR4u/oP9fR46ne/9kSpdiSZW7mf+/nf/Bo/9nTZuxiP+8nP+VdNS5mfiFZ8Gzk/N7XreVddXBof/Co/+7m/vl2f9lSppcRYnj1v/Gqv+vh//Ot/+/n//Dpf+rff+9nv9oTZyfdPSoe/5/XMOecvJvUamYbenLsv/Ww/+jdvmqgP+mef1qTqORaN3Irv/j1f+pff/i0/+leP+ggN6ggODSvP/j1/+vif6/n/2/nv20k/V7XrSriutoTp6ri+yXd9e7m/pyUbHg0v+EYM1xVK6hdveMZteMZdashP+3lP9eRo5dRYrezv+lefythP9qTqCFYc7UwP/XxP/Ep//ayP+yiv+5mPeQaOGEZsCYdt2jfO6wiP+ziv/f0P+3l/eDZr+si+yqiuoeWrVkAAAAk3RSTlMABxthBAgFAQIDbBhjZAlU/P5MOzxoFBY5Nw5eSQZAJGRdDUJTHlpn9mpZYmt1I1FrW46BX2jh1qLz8b/Tj/MpNm8mYE/yppOSpc9o9XTMCzOnZPWoiNt7gbTy8JzB3/SAnn/g7++d3y9EVRJDj8uTwu/yGazx3s7A0YT9cPmZ16N9ybrF+vqq4q/AffI+wZLNkszIxFUGAAADuElEQVQ4y2NgwASsrAzEAA4mZWUmDnZCytg5uVVE1VXECark5BNm7ndnFuHjIGAgC5MWl7k5lxYTGzt+i/lEeCdaWnrwivBx4lHJzsGiaqI7QVDQS9dZjwW3Mzk42aSETC2spk2zsjAVkmLj5OBgx1DM7q8qz62ULclrbLZx06aNZsa8EmLcTgF6fOgqWQIUpfmV5bQ0+wQ23L27QaBP01DGRVFB0R7d96z8jlU1PMzabhqz7+y7/W+2hps2D1dovkEOmu/ZGYUMWjqa6xp6pt1YN2PmuhvTXEsiw4pCeCTQPM/B5sAc07pnRfXk1WsWzJq+YM2XyUs/nysMV5NnYUcNF1knw+7oHUsmX1+1eMbUqdMXrbo+bcmKSh2VYllOlHBmkRIx4YpbOX/yxeUzps6cNXXGvkuT5y/t0lYUBoYSOyKYGVVleLw94ydfu7jo5byZ97fMnDd90aVrk109NXllVFmhQc/OwVosLC2aZO0zefWq5dNnzTh16OH0WVNn7lu/erKPdZKotHAxK1glh5hkFo9vWrrA7LXfFs8AGvXkwP7DW6fOm7FozdrZAulpvjxZkmIghcX6zDq2k1I3bvh/c8HMqfMWHHw89+TTRdOBPlqw7taGjal+tjrM+sUMDIxy6kY2doLT7q1fDvTE1BmP9s+dO/f4wRdTp06dNf32+nvTBO1sjNTlGBEKVy2fMWvezC1HDsxZOGfhocMz5wEVLkdSCLHaL2XZZKDVWxedPjDn2dHncxYeebsVaPX/yctSYFZDPZOYDPTM31PvXs85cWbKsR0X5p7eshjkmeREXZhn2DkYQcGTAAyePz+Oz124/cGUKTvfzDn59fvqyRrWCYjgAQU4q6oMLyjAV+6Yu+z85ilTth09ceHqysmubt48iAAHRyGbVC8oCievXPIKqA6ocvvPvZOXdmobSkixIKcfdhZGJ8NGYKKYP/nyWZDCsztXzl/yK1JbRkwWNeVyyAKTWdvCFUunLTt2BWjg+43Tlq44V8/lIo6eHlldDJpqo8Lygud//HRlyofd84PLy6JKQzGzQrZheEV7BFdQoMauM+d/b9+lERjEFRGSq+DAiaZQKsvRUUGNX1ozVmD+5Z27BAo0FfnVeA2c0U1k57QXEhJxYpJQMDabvXHZbDNjBQkmeYnMDH92jMKEkZGFjRG5AJBl4WTDVlSxAwEnm56Jrhe8SGHHX0h5EC6kgCrZiCv2gAEKLEjd3ZmFWTkIFs3iKqKiRBTNwLREXGEPVAmqPjDVAQAEAVVTP3++XgAAAABJRU5ErkJggg==) no-repeat 50% / cover; +} +.item .main .icon-派遣 { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAABTISURBVHjadJhpcFNZdsf1YQBjmgYmSVUqlaSSVCqpTCWV6RkaeqFXwEDTA9NMUslkq86kMpkss2W6p2m66fGmXZYtGRuwARvwymJbu2Rt7+nt7+lJT4vlfV8A40WWZQM25p8PYkjlQ17V/XLvl9/7n3v+95yjSpjN2+IGw7ZklWlbrMq8nTZYimidtSiqte5U9NZixWTZHTNV7xPOa4rZz8p2JGvqfnvSaX9lniPfWpCYd7NJ6ejqgHJydSjxYW4gfnIlHf1gJSOfzA0qH6wOJT9c6Y+dWJS5dx8K1NtzROC1gabrfyR8pdnFfla2Xdaa9igmy17FaHlJ1Ft3UjprEWeo2aFUmbenzKavxXS6baq4Xr8taTZ9LWYyb6f1liJGay2K6azFisHyUtxcs08s173EnS0rStc3/P6k0/7KclI6ujaeOZ1NSicWRLpkSaAPL3P0G1mefX1F5N/ICtzrWYF7bYXnXs1y7MFlnn57UaCPLMpsyepQ4sPVkdR37oUDrw+1tP6JVKbfzZ2rKIoZq/cpRsvLMZ21mNbWFtF6S1G8yrw9WWXapkqaq74WNVbviOitRZzWWqTorMVKlWV3zFSzjz9XURytNO2ddNi+uTqSOrU6lDi1IFCH5+nQkVVJPLQqSq/eo4Knpmn3Dycpxy8mKNuvpjln+TTrLB2P2L6YIO3/NR3x/N0iR7+bj0b3L/P0O/NM+MhKOnpyfbL/u/Nc5K1U/eXf4c6VF0U1pr2KqWZvXG/dxWqtRRG9tShmMm9XSc/heK21KK6zFserLC/LevNe5pNfbU/XNfzuclo+lh9NnXooREoWWPJIPho9uMyz74wTth/Lnob2iN0wHHFoHjMuDTiPDoJXD8FnBOvRgXKqQdoqs4yjSkj6rtfO0b1/kxPFAzmBf2OeDh1d6ZNPrE1kTk867a+wZ8u3i6W6l5Qqy9fjessuXltbROktRSrqOZzyazitaS93tnznUEvrn+ZHUt9Z6ZNPPogEj+Yl8bVFjnm7L9BqEr21QthWDtajxgB7GeNyKyZibRiTWzEqtWAs2orxWDvGY20Yla4jFalFxFEGwqaelzz1rrGw7T/XovIrSxz1zoJIHc+Ppk89oIlD0UrjHv7Lyp1KlWWforPu4rTWIhX3Aq5mt6yr2sv+sqxopKPzG49mBs8syszxBYY4nBOFN2Yp38esq4b0d59DgqzBeLQFk/FbGJXbkBGaodCNkMJ1EMMXIIYvIErUI8lcxYB4A+OxDswotzHMXwPnrUTv3S+2FF9TwyJHH80J/MEHdLDk0VT/mXmBelcqN7xcULJmT1xvLVYpWmtx3FSzO2as3sd+Ulo00tH5jfXpgTMPOfLIEke9nxej3+zzt2p9XV9A9OkwG+/EdKoLaa4ZnN8CwqFBqLsM4Z4KkHY1SLsahL0S4Z4yhLrLEOopB+nUQgpfQL94E7OpLowKTSAc5xHu0QxOR7wfr8dirzyggofzI6lTCzL7Hn9eXSyV63crVZY9KsVg2RWrqtnHfV5R3Hfp6h+sTWROLUbp40scdXhF4F+NeRrb/LYvMUBfwmziDjL8dTA+M4jnMJRDjYhDA8qpAeXUgnZqwLh04Lwm8D4zGJceEbsahK0CYVsl+KAVQ9FWzCbuQA4Y4e/6Kjca7vlpPhrdP8+ES/IjyVOzQd8B/kt1sawz7VHFqmp2i2W63dEK09ezffLxbEo6ucAQJatR6YDkutwasH2BMaEZs+keSEQ9gt1liDi0YNz6ApBDA9qhBuPUgHXpwLl04Jwa8G495IAVcaIekr8GrMcA2qlBqKsUYXsl0sJ13E/3IBmuge/uFxgnHD/MieJrDzmyZH1q4KPBGy1/zH5WtkMVM1bvYz8tK5p2u17NjyRPP4gEjuWj8v50b4vZ130W40IzplNdBdVsFaCdWtAuHRiXFoxTDdalBe/WI9T2M/ibf4jgjR8heP1HCFz7AUI3/h3x3mqkIg2IhS9A8teAcetB2ioQ7qmATF3GvT4bUoQVntufP56J+L6/Kor7F6L0sdyA8kGipu63Vfy5yuKBa9f/eG2i7/Q8R5Tkpei3JyPOH3nvfo5B5jKmkl1geqtA2srBeQzg3DowjkqwTjUEtx68oxK+hn+A0luNuUESC5NxLE7FcW+IQl+oHqGrHyPmNiAVaUAiXA85aAXvNYFyaBDqKYccuYS5dA+ifh0iNkNqiWffXOKo99bG09+d9nn2q/jPK3fdj4QOrQ4q31liI+8tsPS7tNM0LAcMmE12QQxdANldCt6jh9RrBu/UQHBoIDgqEXWoEbn5nxjh2/D/fYPUNVDX/gV9ASvSkUYkw/WIh+og+MyFkHeXIcU14V7yLgjHecQ8je2rknRgQaBKVvpix1V9F6/8wUomdnyeCR9ZjUYPxDxXm4I9X2A2fgtJ5grC3aXgXBrIwVpIHgP4njKI9kooHgO49p8jE7D8H6AnuXlsbaz/n72U1wju5n+gn2xA+rmS8XABknJqQbp0GIl3YkS4ilB3KeZo/19nefaN/FjqtGo24DuYH0meWmTI9+ZZ4oOIQ7eUYS5iInEblEsP2l4ByV8DOWAB1/UVok4NUqE6DDDNiNnLsTrb9wLkGQDx5r9j0GcsbDzdBAAsTMiIXPknZPwWZJgmpMgGJIiLiBP14LwmELYK8KFaTCt3wLsrEXVfupMTxG8tCvT7qqWEWLIo0SX5qHRgMHi7LNzzFcblVih0I8I95eC9RsSJevAONUSHGulII4b4FgwwTcj4LdhcfQgAeJy7j2T3OaS6vkT06scY9lfj2bOtwtnKAwjtP0PSrcMA04wM3QQlXA85dAHRQC0opxaEQ4OhaBtGxSaEusrWZyO+7y0LzNuqlT752AJLlizx7Juso4aK+g0Yk1pBe02IOCoh+msQC12A6NYjRTYgwzRjkL2OocgVDAQs2Mg9ALa2sJFfxIBbjfjVjyE1/D1GIw3ArwGz8+Db/xsJp7oAyF5HgrwE1qWFFKwF768BYStk9XTyLli3GiPE3bKcKOxX5fpix5Z55p0p0v134Z7KtTGpGYNSCwibBpRLCzFYCzlcD4VsQJK6gn6mCSNCG8bEdvR5dcg/GCzEduspAGDIZ8BMtAMAsLXxCADwcFxG4MoPkAxY0C+0oo+7jhR9DZxLB9qlheC3IOLUgPWZMSq3Q/IbEPde6ciJ4rdVuf74yWWePTBFOz9h3VpMxtqQYK4ibKsE6zVBCtcVAKkrSDHNSEcakQnVY4S8DKXj55iJ3gYAbOaX8Gzzyf/ex83HeLqeLWQy2wbP5X9Emr2BfrENabYJKeYaeK8JpK0crNcExmsC6dBgQLyJAfYyOJc5vchTR1TZlHRyReRfGyHuaASfHpNKJ8RQHYieCnC9ZkTDFyETl5BgmiCH6iA51Eg4KjHg1qO/81P020uBrU1sPV7D0/Usth7n8fTxGjbXs3i2+RgAwNw5D6rnPPqlDqS5G0gyzUixzc8TpByUSwvWawThUCPFXcNkrBW0Q5ubobz/qFqKccdWo9IbfYGWS7xPj7F4B7jeGpB2NfjeasjEJSj0VUjBWtD2CshuA+SeUsRvfYL+u1+Ar/8elsf55you4ulaFpvrWWyuLQMAxqRu+Jr+Ff3ybWTENqTY60ixN5BkroP1GkE5nr/hbj0iTi1k8hKmlE7QDjVGgl0/Vi1I9LGcKB4cIjua5WAVRqItYHxViDi14P01iEUaIJOXQTu14J1a0J2fQnFpMBiwYJS4hGGfCdGrf1tQ7OkTbOYXsZlfBJ5tYetRHpFbn0GhGjEY70aab0Gau4k0dxMKdRW0SwvKWVi0SwfKqYMUrsNkvANSrwlTjPOXqgWRPpYThVdHqM5mOWDCqNwGxmcG6dBA8NdAoa5ACFhAOzWI3D0HyVaGceY65hIu5B8MAwCkxr/GsFcDANhYfYinz9XrJxpB3vwvxHqrEe2tQoK6ijR3AxmxDVLoAkh75QtI2q1HxKWDRFzERKwAOMO6zqqWZO5oPiq+2h9qvSL2GjAabQPbW42IQwMhYEU80gjOa0Kw4xdIhepxT3FieYTF1noW2HgMPN3Ao6VpMJb3sThEvkiSpfEo3MbDYNt/BrbzU4wK7RiV7yIatCIjtoJ1agqFh1sPyqUF5dIh4tS9CDHjVGOU6P6FKpsQT+Qk8eBgqNPEe/WYiHeCD9Yi4tBCCl2AHK4H49Ih1P7fSPmtWB6mgSdr2Mzew0Z2DhtLMwCAcbIeVPU7hQzeegaq7gyU7nMYYZoxFL6M+UwQ99NuJMIXwXSfB+fSgnHpQLv1oJ+HmXRokGCuYFrpAO3QPpognP+syvXHP8jy3MFJynGW8+gwpXQiTjeAsFVA8FsgBWvBODXgnRpQtz9D2lWJlTEWeLqJJ0vTeLI8h83cPAAg0fFjjASqke4qRUj/Fp49WcOz9VXk7w8DW1tYHI6gz2sC2fZzCG4dWJcWtEtfgHTrQTg06JduYlRqguAyj86z5AlVrj92Iiuwh6ZI578QtoqtqVihxwj1VID1miAErGCdGghuPYi2n0JxVmJGuInHCxPYWLmHJ8szeLw0BWxt4dHiFEjDmyCMb2F1LlMw67WVgvXkl7GRX8aDlAcxjwmhtp9B8FWBfq4i5dKB8ZkxGutEIlyNqPuiZ1ngX1WtpKPHF9jIew8Z8j3KbuzPUHUYk9sQcRvAuA3gfOZCCe/UgLeVQ3JUYpxqRH4qDjxZx+PFSWxk5/A0vwhsPkF2jMPqTAJ4uoGN5RlsZO9hc+UeNpZngadPsTzGYyBUB7rrPKiesheAEacWEnERk4nbEH16DIVu6VdF8Zuq5YRUsiBQJflo9Fup3pt1tLMCU7FOSORFkA41GJe+UEE71JC8JpCtP0HMVoaHaQ+erS0BG4+wkb2H7CiH3IT0Ikk2sgV1N5bnCnc1O4eNpWkAwNpcBpnwJfS2/BSMxwjGYwDp0CIt3MB0ohOUQ41pyv2DrMi9rrpHBF7PjyS/s8zSh+Zo//dJh/rpsHANw7F2kC7dc3/SgPp1eW+vBN9dioxHi4V+P/L3+zErtWOCbsQ0dx3zCRuWxzg8WpgANtaBjUd4mpsv/AyAx8tzmFXcUFxVCN36JfiABRGnDkxvDaZTXVDCZjB2s7AssK8vivT7qkxj0x/lBuInHjLE+6uSeFBw1YYoVynuP2+SCHslGJcOlEMNyqkB5zGA6PwE/aGLWOoPYihYi4RHjwGmGQPsTSTcOiTspXiQcuNByo2lURaPFyex/nACDwYiGGdaIHaXg7h9DlxvNWiPAYRdi0y0FZNKOwhbKcYJ209yPP/t1eHEKRX/ecVL9yOhN3MDsQ+zHPvmbKT3TLC7LJuJ1GEycQeU14SIUwvaqUPEWahwiO6vwNkrMcS2grr1OQSPDmnmGhTyEqTeakR7q5EMX0Si14y4/VcYCl9Cyl0F4dZZxH01oOwV4AJWsN4qEHY1ouQl3MvYIfRqwTkt/GpUOrjAR46s9MWOq/hzFTsHb7T+6fpk5qMHdOjoIzn+5/3BdpP3zqeYiXdgUG5D2FEwUsqpLUC69SB6yuBr+QkitjIIvWbEqUb0Ca3ISB1I8y0QAxZwPiMkvwWcUwPWoQHr1oPx6CEEa0G5dCBsleACVkz39WCQvYxwT3lujvZ/L8uzb+RHU6dng77XVDGDeS93tqJ4xuc5kB9OnF5giPezIn9IcNV5KFcp7iXvol9qQdihLSj5a+d3akG59aCdOpC2ckRsFWDdBgh+C2JkAxLMNSjMNcSoRohEPaLkZcSoK+D9NaAcGoR7ykH7qjGZ7sakfBO+rrMYCXd9sRaV/3JRZj5YHUqcTNVe/B1V3FTzsvAr7S5ZW/2bK5nYB0sKfzzLs4eWBe5dokef5H0a3EvewaDcDspjAmFXv/Atyql7YROsxwjGbQDjMUIK1yEeaYRMXoZMXkY0fBFCwArGYwRprwRhV4MP1mIi1YXJWCtIRykUT9OlFUF4dYElD69P9p8Z7uj4M/bT0m0qRW8tjlfV7OXOlu/sb2z6w7WJzOmHAlWyInBvzTPk4XC3JkO7yzCXuIXxxB3wQSsIeyVIhwaUSw/GYwTfWw0xdAFRolA7RkN1EANWcL3VYH1m0G4DIg4NCFslSKcWMaoRM302jAlN6O06C8nVcG1Njr2yyJDvro4kT92nw2/x5yqLZa1pjyqmse5UjJaXYsbqfdxnZUWjt2//+aOpgY/mOfLYisC9scjTx3hnrd3fU2jkZ5J3MSC3QgzVgXTqQdg1BVinHrTbANqlf/7wa0E8HyQRdjVojwkxqgGjyi3MJu4gQZgR6D7/LN3bos+J4oEFhnwnP5r67lJSLBFLdbvFUt0uxWx5WcXorEVxrbVYMVp2y1rTXvZs2Y7x7q6/WJ/qP7Mg0cdXRO7NZZ57PdV740Kop3yZ96oxHm3BRPwWhqNtUJgrEMMXwPktYLxVoL1G0B4jGF8V+IAVEnkRab4ZY/FbmFJuY0S8CtpZhohdr0xQzp+syfK3FhnyyOpI8vRSQjwa01f/Bv+luihutuyJGy0vqSi9pYjVWoviWuvOeJXl5aimADl669afrU8NfLSk8CcWaOL9R7H4K3O0//uso7o3bCvd4jxq9DP1mFY6MJ24g3HlFkZi7RiW2zASa8NYvBNTybuYSd3FhNyCFGkF51aDtFXOK94m6xLPHsqJwoGHPFmSH0ufWpS5w1KFYQ93rmKHUl0YrPNa605V/Plkn9Vad8a1tTsVo2WPrK3ax50tL+q7fOX3sn3yifWJvjPzbPjoSmFQ/tYM5f63TLD1Am03xSO28i3eq4UcNEEhapAgLFCeLzloBufRImKrWBKctf5h4k7ZPTrwVzlB3L/IkO+s9EVPrk/1fzTlcb4ifKXZJXylKY6bLXsTVZbdvLa2mNVbdqhSZtO2eFXV/074tdaditHycsxQ/XX2bNn2uNHyW9Me1/7VkdSHuSHlwwUucjjLs6/no9FvLXDU4dFw938MhDoM/eHWK5nQzZYhsq1jiGxvz4Ru3hgItV0cDHaenyLd318WuNfykrh/iaMPZZPiyfXJzJl5PvJ25mrTH3Jny3dIFYaX4uaavYrRspvXWotZvWWHYq7a9j8DANf3acnktyVvAAAAAElFTkSuQmCC) no-repeat 50% / cover; +} +.item .main .icon-周本 { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAABRFBMVEVHcEzf398NDQ3k5OQNDQ0AAABoaGgAAAAAAAAAAAAUFBQAAAAQEBDd3d0AAAAQEBAMDAwPDw8NDQ0ODg5TU1P9/f3m5ub8/PxUVFRcXFwREREQEBASEhJnZ2cRERHd3d0AAAAAAADi4uJra2vj4+NSUlJRUVETExNbW1teXl4QEBALCwsSEhJdXV3k5OTe3t4QEBDd3d1mZmY7OzsyMjJlZWUA//9hYWH///80NDQwMDD9/f3S0tIcmrozMzQyOUUyNTsyMjM5OTljY2NfX19HR0f+/v54eHi6urpvb29NTU1PT09OTk7T09PAwMAD8/gF7vXU1NQyNz4wRWAyNz0yNj0wRmI7OzwfiaMzMzPZ2dlVVVXKysrY2NjLy8sfjrAE7vXV1dUxRWAxRGAvRmEgiKMgiaMvRmIgjrAD8vgD8ve/v78XrME/AAAAM3RSTlMA3GDkYQOFAQIINAcw3AsxLFdiXn7+5P59gC1gOIYu2gQF4YbgfX41gYAvLzmB5dph24UUT0NSAAACF0lEQVQ4y52U13vaMBTFYyNsEdsQzMYBQnbajLaWQdhm7xUgZG/S3f7/75UNoSME9PU86eH36V7do3uWlv5XPA/dbgj5hRxci3q90bVFJA+Ft/L2tvxGmE/yTtcyG2OYmLLscvLzObDnwNgRAfNIUldkIwljNDISEVYU4Ov3eQDnMI47nWPDwQGPa3afPHSt+MJMrdvW9Xa3xoR9KzNJwu0DLhhqVHWE9GojFOTA6gyScHHWL+H7FsoQodY9lvxs/AVJuFV2YzNgNitpW5WmGdjcYP+90+oP+NfxXb2sTVSu3+F1P/i7T94peHycFLi+KalTlW6uAxLn8wi/50nmIoJwEJv1EkKoWMjnC0VyKNVNHAwDcTp5wu2wHBO6bZZVdJU7Pf/85fw0d4XUcvM2xHDKzoQk/Vm+1Rqtiqai3Mkw23/MfjzJIVWrtBo12027Tz4pAuJbt4rSmlo8G37rpVK9h+FZUdXSqNolbgIxaYEwKlu+tfUMAQufsj9SRL3s1wIBM3qbuPlBjlq2u71bDB50dETAi/xlP2Wrf5m/ICDSOyMsbXndFOAAM2MQxuXYofFzWvr7i9LcuDRMisrBe8OcPObpwX7M0/QxR7vvxCR8Hs/B4R/jeZw9nudFWThw+04qC+1lofoU9N/Mejvdx6VfBfrlol9X+gAYR4qymzAGA+KbIs4JNNqQoo89+iClj2b6sH9VvwCqq5OETG0mJgAAAABJRU5ErkJggg==) no-repeat 50% / cover; +} +.item .main .icon-参量质变仪 { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAADAFBMVEVHcEwGEwkAAAAAAwAKEggMEAkpNB8AAAAAAAAAAAATGQY7VUEjNSAdIQ8lLxpkj5QeMSO4lkFIZlccKhI3U0UkQjYrUU/NuGpoioUgPDAoSkImQDJXfXUWHQpAZmhBYlpAVEdpYDZANhVHPxtcTyQsVFU1Tj8qTkrZ4d9XgngsOiolRkhSdGVNbV1RVjcgNSE4V0hdio2Dp50+Y11plZWlztBUbWlXfndXf3p3p6YpPSs5WU5olpkwSTeoiz01UlBYSR95cUVEOhciJBKjhDyEcDVcUCRUZ1mDfU5hVCe2n1AoSUJKdXGSrJ61xL0oS0IfOimaspxpmZVZio9Wf39nkY5diYSg1dZupKZOdGdnin7C0M2qvbGYj1skQTI7Wk5Ib2clOigvRzlGb2s1OiRDaGYsRTNxYC2ZfzytjD4sLRi2oVS9p1tmVyiYgTu6rnE+ORqCcDVjVCaekluCnZCnurBigWagsa16mHwkPzssU1CBoIFwkHBWclhph290p65umZhIQRx2pqY6ZWG8qWBtWCNQdnBsWiY+ZVqMvbWJeUI7WlIyWEdejoszLBBmp6WiiD+bgTxUgH6bgj5EaV7E4N+/1dNsVyadmXaxn1icl3TIvolsnKJMdXVnmaVqpK2KucJQeXpHb3FomJ9xqbVZhIZejI5xoKddiIl/rbddjJRTfn9vnaWAsbvSvWh5qLBGa2hsoKpKfIJlmqK7mkZ2pLBzr7ttp7ItUlVhjpJ1qLJXgYJzpKrBoU4vWVw2ZWpflJpjlp1qnamNdTZTg4ZmlpqFt77MtF17q7N2pKzbx3gvXGD7/v7CqFVUh47Yw2qx8PJdkZdyoarHsWOxjz7r8/FDdnzy+fjf6eJyvbuNxMk7YWPCoETS9/Vnrq7LqEfLpT2avLjr9OzF3uFrlo+59/Vzo6/b8e9psrDH8PC4kDGafjlnk5jr//7Tv29uWyejjUTg1JbJr1c6bnOR0M+h1tmw6erI28mEp6VztMLCz82k29yBxMO89PGxnFGBaCxmv7YEAAAAnHRSTlMADQcKFBA2AQIEIFRHHF/9FP5rLGyV6P5tq9yfsCT+0jZpkYid9qXj7akq/qV2RFWA7aT75fg52MrgaMDxgO8g9Vu1P/3orkuKzdHIs8iy1IPl0f3o0Kr49oaL1eK20NjgjrL2rfRzhdD5TuL+ur3eXNfdo3qivomq6fPCxmXq/p5uwOD84fLzuMGx6Jq7b/rWsoLd4u3n/nC6Z/CbmlgZAAAEN0lEQVQYGb3BZVRbZxgA4Dc3997vu4QAwS24VKBoi0uhBnW3Uz+VU5e5r+vc3RJC3EgIJEGDU9yhSKnbaVdKZe4rcEbpetbtz/Y88P/ADPwrLM+4Zavs7eAfsOxX1mXfNRnBQ7HfsmSrFEONupV28BBobVydQqXOrmsQFEevdX180SPwICaUg8IGLdmWLmWjOvuk2lZQd7HlUQT3I0ifybmv0B5FEoPX9m0SsVhebKk7Lpq+CMMEOHL9pEk6gUK1ycojKZ3PtaJ3JGyXiHOyBXnLGJiAWdjSMl1RPKT0ZmOKnvnZF3NJgg6K8hLopLY0TICfuHCxSqHL2UQTvgeG2/X6218e8SGs3xTnquUxJEyw7vsGoa4hgaQ2NOlb9fX1TbebXOZR8QZxbldpCIJ7nr2kEqhXOLA3NA0P/3ZozpzDNXvbXQ7M22IobdRqHRCMCysV6iw7sG+T/tgcfz7DkLszatpdWucFGSReG5M8GRjDnhxdXFq8mWLtcel+kcCQEmmHWf417frPuVvdN8bIn+fAmCUCtVKsDMEHXbrfYABYr59enwJEwK36PRTD/2io9EosAyPw4iyzXD5kjwKGuzkIcOTlX298MgPsMu7Uz4QgqViRF0HBCCLYaDbk2NJ4n/6YA4Brx+WO0zc+nosP3uo+AkFypbArHMMIlrPRLM5p8GEy6vfSMGN1R8d3105fm05xZ3dnEvGKXK3SGkaxnKvMKoF6Lk4ra/WFdb8MDAx88/NqV8wcupPJSrI0qpQcGMUO1phtbXX2yG+WaT+2e/vM1asnv32BAHzobCbbu6RLJeDAKMY935xTqvbE6Z/yeNMQterMmZNHWQBk8rn9rM25SrnUGsbMr7jSKGyIJtmHe3o+5AL7g3fjUhCA77lzO/kqaY7YdgqMQk5FgxqxINeR2DeLZ9o1BRiOD6amzUw+xaNtLAK5YgUFY6yfnFoh1ZYkxr6T+jvPlLyTyyAiwFRW1hpAbJUcP169AMEYTHmUt4ml5pKY3Wk3e8pMs3a9/96pnlNls7nYrTZPW7gAxvGfqpAa8kpk3rRfag3PxDOVnT371cs0RuElmkrRQgb+hJ3K86VCWUFnoqN1WurNmuvXa171s8LAWZOllZ2fRMI4q+DmTqNQpCmQxTqm2/j7+dtYMQg7rqmWVOWd6JsB45BNeUVhoaF2eaVRlugZykUIgH5NpPFqqzx/4YIr3EN4lAsKCkSVVQWywkKZI0GxHaKEtcLOrOIQ+2l2MAH5XP8Poh9FtZJao0gU4b0t3K2oM+uu5TRCMBF65kTLT5cKC2Qa4aBEotEmbCkytpVX5jsxcD8U2t/X1x/1dVtWXrWxqro6wmZqs/vUIjcW/NWUpUuffmxxeXNzRW9vfn7vSw5uYeQSGzY8gCFJgqCsneY7BwYGOrvHY4QAEPwdhBnSis8nCQz/tT8A/1egBT0B4Q4AAAAASUVORK5CYII=) no-repeat 50% / cover; +} +.item .main .info { + padding-top: 7px; +} +.item .main .info .name { + font-size: 14px; + /* color: #5f5f5d; */ + line-height: 1; + margin-bottom: 7px; +} +.item .main .info .time { + font-size: 12px; + /* font-weight: 400; */ + color: #5f5f5d; + line-height: 1; +} +.item .right { + display: flex; + align-items: center; + justify-content: center; + width: 96px; + height: 100%; + background-color: #ece3d8; + font-size: 16px; + color: #504c49; + line-height: 55px; +} + +.item .right .red{ + color: #f24e4c; +} \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/dailyNote.html b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/dailyNote.html new file mode 100644 index 0000000000000000000000000000000000000000..30ff2e9a485a504c0f96204a2df88bec2b82fffb --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/dailyNote.html @@ -0,0 +1,124 @@ + + + + + + + + + + +
+
+
+ ID:{{uid}} +
+
+ {{day}} +
+
+
+
+
+
+
+
原粹树脂
+
+ {{if resinMaxTime}} + 将于{{resinMaxTime}} 全部恢复 + {{else}}树脂已完全恢复{{/if}} +
+
+
+
+ + {{current_resin}}/{{max_resin}} +
+
+
+
+
+
+
+
洞天宝钱
+
+ {{if coinTime}} + 预计{{coinTime}}后达到上限 + {{else}}存储已满{{/if}} +
+
+
+
+ {{current_home_coin}}/{{max_home_coin}} +
+
+
+
+
+
+
+
每日委托任务
+
今日委托奖励{{if is_extra_task_reward_received==1}}已{{else}}未{{/if}}领取
+
+
+
+ {{finished_task_num}}/{{total_task_num}} +
+
+
+
+
+
+
+
探索派遣
+
+ {{if !expeditions || expeditions.length<=0}}尚未进行派遣 + {{else if remainedTime && remainedTime!=0}}将于{{remainedTime}} 完成 + {{else}}派遣已完成{{/if}} +
+
+
+
+ {{current_expedition_num}}/{{max_expedition_num}} +
+
+
+
+
+
+
+
值得铭记的强敌
+
+ {{if remain_resin_discount_num<=0}}周本已完成 + {{else}}周本树脂减半次数已用{{/if}} +
+
+
+
+ {{3-remain_resin_discount_num}}/{{resin_discount_num_limit}} +
+
+
+
+
+
+
+
参量质变仪
+
+ {{if transformer.obtained }} + {{if transformer.reached}}已准备完成 + {{else}}{{transformer.recovery_time}}后可使用{{/if}} + {{else}} + 尚未获得 + {{/if}} +
+
+
+
+ {{if transformer.obtained }}{{if transformer.reached}}可使用{{else}}冷却中{{/if}}{{else}}尚未获得{{/if}} +
+
+
+ + + diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/bg.png b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..b123888d07a2f3c0489da1ce7d8040643a2e6478 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/bg.png differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\345\217\202\351\207\217\350\264\250\345\217\230\344\273\252.png" "b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\345\217\202\351\207\217\350\264\250\345\217\230\344\273\252.png" new file mode 100644 index 0000000000000000000000000000000000000000..9580d8f8737df81d127c4641b902e4c4818c2624 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\345\217\202\351\207\217\350\264\250\345\217\230\344\273\252.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\345\221\250\346\234\254.png" "b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\345\221\250\346\234\254.png" new file mode 100644 index 0000000000000000000000000000000000000000..225483788fdffaafcdc8217c60d5de7e89b76829 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\345\221\250\346\234\254.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\345\247\224\346\211\230.png" "b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\345\247\224\346\211\230.png" new file mode 100644 index 0000000000000000000000000000000000000000..8666c1ebc2f0a3fb73842a3826d894623d4b990e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\345\247\224\346\211\230.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\346\240\221\350\204\202.png" "b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\346\240\221\350\204\202.png" new file mode 100644 index 0000000000000000000000000000000000000000..83badce21bcaaeac4369d29991657b6fe9a4091d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\346\240\221\350\204\202.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\346\264\236\345\244\251\345\256\235\351\222\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\346\264\236\345\244\251\345\256\235\351\222\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..3bcdb89d8134f534f6a860538ba85a8f3834e28b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\346\264\236\345\244\251\345\256\235\351\222\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\346\264\276\351\201\243.png" "b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\346\264\276\351\201\243.png" new file mode 100644 index 0000000000000000000000000000000000000000..36afbc93278e1eeb8fe3f9ee316d1922bce85cc6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/html/dailyNote/items/\346\264\276\351\201\243.png" differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/gacha/gacha.css b/src/Yunzai-Bot/plugins/genshin/resources/html/gacha/gacha.css new file mode 100644 index 0000000000000000000000000000000000000000..25261d06e29c3db1143ce4ad8607bd69c73b4300 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/gacha/gacha.css @@ -0,0 +1,199 @@ +@font-face { + font-family: 'tttgbnumber'; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: "YS"; + src: url("../../../../../resources/font/HYWenHei-55W.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} + +body { + transform: scale(0.8); + transform-origin: 0 0; + position: absolute; +} + +.container { + width: 1286px; + height: 670px; + background-image: url(../../img/gacha/items/background.jpg); + background-size: 100% 100%; + overflow: hidden; +} +.info-bg{ + background-color: rgba(5, 5, 5, 0.6); + font-size: 46px; + color: rgb(255, 255, 255); + padding: 8px 10px; + border-radius: 5px; + font-family: YS, 'HYWenHei-55W', 'Noto Sans CJK SC', SimHei, sans-serif; +} +.info-name{ + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + max-width: 400px; + position: fixed; + top: 8px; + left: 65px; + z-index: 9999; +} +.info-count{ + position: fixed; + top: 85px; + left: 65px; + z-index: 9999; +} +.poor-info{ + position: fixed; + top: 8px; + right: 55px; + z-index: 9999; +} +.poor-bing{ + position: fixed; + top: 85px; + right: 55px; + z-index: 9999; +} +.list-box{ + display: flex; + padding-top: 130px; + padding-left: 85px; +} +.list-box .item{ + position: relative; +} +.list-box .item .item-bg-box{ + width: 112px; + height: 450px; +} +.list-box .item .item-bg{ + position: absolute; + width: 100%; + z-index: 100; +} +.list-box .item .item-bg-weapon{ + position: absolute; + width: 100%; + z-index: 100; + top: 40px; + height: 370px; + opacity: 0.7; +} +.list-box .item .item-shadow{ + position: absolute; + width: 225px; + height: 711px; + top: -151px; + left: -58px; + z-index: 50; +} +.list-box .item .item-shadow2{ + position: absolute; + top: 7px; + left: 7px; + height: 436px; + z-index: 110; + width: 99px; +} +.item-img-box{ + position: absolute; + top: 1px; + left: 3px; + width: 106px; + height: 448px; + clip-path: url(#wishframe); + z-index: 100; +} +.fiveHave{ + filter: brightness(0.8); +} +.item-character-img{ + height: 100%; + position: absolute; + left: -15%; + filter: drop-shadow(3px 9px 0px #333); +} +.item-weapon-box{ + position: absolute; + width: 106px; + height: 366px; + top: 45px; + left: 2px; + z-index: 101; + overflow: hidden; +} +.item-weapon-img{ + width: 110px; + filter: drop-shadow(3px 9px 0px #333); +} +.item-weapon-img-4{ + top: 48px; +} +.item-element{ + position: absolute; + width: 65px; + left: 23px; + top: 320px; + z-index: 120; +} +.item-star{ + position: absolute; + width: 82px; + left: 16px; + top: 389px; + z-index: 120; +} +.item-starGold{ + position: absolute; + width: 76px; + left: 18px; + top: 246px; + z-index: 120; + box-shadow: 0px 10px 20px #ffffffb3,0px -10px 20px #ffffffb3; + border-radius: 10px; +} +.item-starlight{ + position: absolute; + width: 76px; + left: 18px; + top: 330px; + z-index: 120; + box-shadow: 0px 10px 20px #ffffffb3; + border-radius: 10px; +} +.logo{ + position: absolute; + right: 55px; + bottom: 35px; + color: rgb(157 189 237 / 75%); + font-size: 24px; + font-family: 'tttgbnumber'; + z-index: 1000; +} +.times { + position: absolute; + z-index: 9999; + width: 109px; + text-align: center; + font-size: 26px; + left: 2px; + top: 275px; + color: rgb(255, 255, 255); + padding: 2px 0; + background-color: rgba(5, 5, 5, 0.5); + border-radius: 5px; + white-space: nowrap; + font-family: YS, 'HYWenHei-55W', 'Noto Sans CJK SC', SimHei, sans-serif; +} diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/gacha/gacha.html b/src/Yunzai-Bot/plugins/genshin/resources/html/gacha/gacha.html new file mode 100644 index 0000000000000000000000000000000000000000..eacd185584dcf68f929de2b46bd62e52a969df95 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/gacha/gacha.html @@ -0,0 +1,77 @@ + + + + + + + + + + +
+ {{if nowFive < 4}} +
{{name}}
+
{{info}}
+ {{if isWeapon}} + {{if bingWeapon}} +
定轨:{{bingWeapon}}
+
命定值:{{lifeNum}}
+ {{/if}} + {{else if poolName}} +
{{poolName}}
+ {{/if}} + {{/if}} +
+ {{each list}} +
+
+ + {{if $value.type=='weapon' && $value.star==5}} + + {{/if}} +
+ + + {{if $value.type=='weapon'}} +
+ +
+ {{else}} +
+ +
+ {{/if}} + + {{if $value.star==5 && nowFive < 4 && !$value.have }} +
「{{$value.num}}抽」
+ {{/if}} + {{if $value.have && $value.type == 'role'}} + {{if $value.star == 5}} + + + {{else}} + + + {{/if}} + {{else}} + {{if $value.element }} + + {{/if}} + {{if $value.star }} + + {{/if}} + {{/if}} +
+ {{/each}} +
+ +
+ + + + + + + diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/gachaLog/gachaLog.css b/src/Yunzai-Bot/plugins/genshin/resources/html/gachaLog/gachaLog.css new file mode 100644 index 0000000000000000000000000000000000000000..f93af9f83b835fae4bd8763de4d8070fd68c4cc9 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/gachaLog/gachaLog.css @@ -0,0 +1,351 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} + +body { + font-size: 18px; + color: #1e1f20; + font-family: PingFangSC-Medium, PingFang SC, sans-serif; + transform: scale(1.5); + transform-origin: 0 0; + width: 465px; +} + +.container { + width: 465px; + padding: 20px 15px 10px 15px; + background-color: #f5f6fb; +} + +.head_box { + border-radius: 15px; + font-family: tttgbnumber; + padding: 10px 20px; + position: relative; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); +} + +.head_box .id_text { + font-size: 24px; +} + +.head_box .day_text { + font-size: 20px; +} + +.head_box .genshin_logo { + position: absolute; + top: 1px; + right: 15px; + width: 97px; +} + +.logo { + font-size: 12px; + font-family: "tttgbnumber"; + text-align: center; + color: #7994a7; + position: relative; + padding-left: 10px; +} + + +.data_box { + border-radius: 15px; + margin-top: 20px; + margin-bottom: 20px; + padding: 20px 0px 5px 10px; + background: #fff; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); + position: relative; +} + +.tab_lable { + position: absolute; + top: -10px; + left: -8px; + background: #d4b98c; + color: #fff; + font-size: 14px; + padding: 3px 10px; + border-radius: 15px 0px 15px 15px; + z-index: 20; +} + +.data_line { + display: flex; + justify-content: space-around; + margin-bottom: 14px; + padding-right: 10px; +} + +.data_line_item { + width: 100px; + text-align: center; + /*margin: 0 20px;*/ +} + +.num { + font-family: tttgbnumber; + font-size: 24px; +} + +.num .unit { + font-size: 12px; +} + +.data_box .lable { + font-size: 14px; + color: #7f858a; + line-height: 1; + margin-top: 3px; +} + +body { + width: 510px; +} + +.container { + width: 510px; +} + +.data_box { + margin-bottom: 10px; +} + +.info_box_border{ + border-radius: 15px; + /* margin-top: 20px; */ + margin-bottom: 20px; + padding: 6px 0px 5px 10px; + background: #fff; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); + position: relative; +} + +.card_list { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} + +.card_list .item { + margin: 0px 8px 10px 0px; + border-radius: 7px; + box-shadow: 0 2px 6px 0 rgb(132 93 90 / 30%); + height: 90px; + position: relative; + overflow: hidden; + background: #e7e5d9; +} + +.card_list .item img { + width: 70px; + height: 70px; + border-radius: 7px 7px 20px 0; +} + +.card_list .item.star5 img { + background-image: url(../../img/other/bg5.png); + width: 100%; + height: 70px; + /*filter: brightness(1.1);*/ + background-size: 100%; + background-repeat: no-repeat; +} + +.card_list .item.star4 img { + width: 100%; + height: 70px; + background-image: url(../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.card_list .item .num { + position: absolute; + top: 0px; + right: 0px; + z-index: 9; + font-size: 18px; + text-align: center; + color: #fff; + border-radius: 3px; + padding: 1px 5px; + border-radius: 3px; + background: rgb(0 0 0 / 50%); + font-family: "tttgbnumber"; +} + +.card_list .item .name, +.card_list .item .num_name { + position: absolute; + top: 71px; + left: 0px; + z-index: 9; + font-size: 12px; + text-align: center; + width: 100%; + height: 16px; + line-height: 18px; +} + +.card_list .item .num_name { + font-family: "tttgbnumber"; + font-size: 16px; +} + +.base_info { + position: relative; + padding-left: 10px; + margin: 5px 10px; +} + +.uid:before { + content: " "; + position: absolute; + width: 5px; + height: 24px; + border-radius: 1px; + left: 0; + top: 0; + background: #d3bc8d; +} + +.label_301 { + background-color: rgb(235 106 75); +} + +.label_302 { + background-color: #E69449; +} + +.label_200 { + background-color: #757CC8; +} + +.label { + color: #fff; + border-radius: 10px; + font-size: 12px; + padding: 2px 7px; + vertical-align: 2px; +} + +.ritem { + display: flex; + font-size: 12px; + margin-bottom: 5px; +} + +.info_role { + display: flex; + flex-wrap: wrap; + padding: 0 0px 5px 9px; +} + +.ritem .role { + width: 20px; + height: 20px; + background-color: #ffb285; + border-radius: 100%; +} + +.ritem .weapon_box { + overflow: hidden; + width: 20px; + height: 20px; + border-radius: 100%; +} + +.ritem .weapon { + width: 20px; + height: 20px; + background-color: #ffb285; + border-radius: 100%; + transform: scale(1.5); + -webkit-transform: scale(1.5); + +} + +.ritem .role_text { + margin: 2px 3px 0 2px; + display: flex; + align-items: baseline; +} + +.ritem .role_name { + width: 24px; + white-space: nowrap; + overflow: hidden; +} + +.ritem .role_num { + width: 24px; +} + +.line_box { + height: 32px; + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + font-size: 12px; + color: #7d7d7d; + padding-bottom: 5px; +} + +.line_box .line { + height: 2px; + flex-grow: 1; + background-color: #ebebeb; + margin: 0px 10px; +} + +.red { + color: #f21000; +} + +.orange { + color: #ff8d00; +} + +.green { + color: #12d88c; +} + +.blue { + color: #4169E1; +} + +.purple { + color: #7500ff; +} +.minimum{ + position: absolute; + top: 0px; + right: 0px; + z-index: 9; + font-size: 12px; + text-align: center; + color: #fff; + border-radius: 3px; + padding: 1px 3px; + background-color: rgb(0 0 0 / 80%); + font-family: "tttgbnumber"; +} +.hasMore{ + font-size: 12px; + margin: 6px 0; + color: #7f858a; +} \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/gachaLog/gachaLog.html b/src/Yunzai-Bot/plugins/genshin/resources/html/gachaLog/gachaLog.html new file mode 100644 index 0000000000000000000000000000000000000000..248ca293e760f41291c00b55066ab66ac92c1cf1 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/gachaLog/gachaLog.html @@ -0,0 +1,79 @@ + + + + + + + + + + {{@headStyle}} + + +
+
+ +
+
+ ID: {{uid}} +
+

+ {{allNum}}抽 + {{typeName}}池 +

+ +
+ +
+
数据总览
+ {{each line val}} +
+ {{each val item}} +
+
{{item.num}}{{item.unit}}
+
{{item.lable}}
+
+ {{/each}} +
+ {{/each}} + +
+ + 五星历史 {{firstTime}} ~ {{lastTime}} + +
+ + +
+ {{each fiveLog val}} +
+ {{ if val.isUp && typeName == '角色' }} + UP + {{/if}} + + +
{{val.num}}
+
+ {{/each}} +
+ {{if hasMore }} +
*完整数据请私聊查看
+ {{/if}} +
+ +
+
+ + + \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/help/help.css b/src/Yunzai-Bot/plugins/genshin/resources/html/help/help.css new file mode 100644 index 0000000000000000000000000000000000000000..79a85c65ecbdc645dccde0bd794a89fac9ba0d08 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/help/help.css @@ -0,0 +1,135 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + font-family: sans-serif; + font-size: 16px; + width: 530px; + color: #1e1f20; + transform: scale(1.5); + transform-origin: 0 0; +} +.container { + width: 530px; + padding: 20px 15px 10px 15px; + background-color: #f5f6fb; +} +.head_box { + border-radius: 15px; + font-family: tttgbnumber; + padding: 10px 20px; + position: relative; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); +} +.head_box .id_text { + font-size: 24px; +} +.head_box .day_text { + font-size: 20px; +} +.head_box .genshin_logo { + position: absolute; + top: -1px; + right: 15px; + width: 97px; +} +.base_info { + position: relative; + padding-left: 10px; +} +.uid { + font-family: tttgbnumber; +} + +.data_box { + border-radius: 15px; + margin-top: 20px; + margin-bottom: 15px; + padding: 20px 0px 5px 0px; + background: #fff; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); + position: relative; +} +.tab_lable { + position: absolute; + top: -10px; + left: -8px; + background: #d4b98c; + color: #fff; + font-size: 14px; + padding: 3px 10px; + border-radius: 15px 0px 15px 15px; + z-index: 20; +} +.data_line { + display: flex; + justify-content: space-around; + margin-bottom: 14px; +} +.data_line_item { + width: 100px; + text-align: center; + /*margin: 0 20px;*/ +} +.num { + font-family: tttgbnumber; + font-size: 24px; +} +.data_box .lable { + font-size: 14px; + color: #7f858a; + line-height: 1; + margin-top: 3px; +} + +.list{ + display: flex; + justify-content: flex-start; + flex-wrap: wrap; +} + +.list .item { + width: 235px; + display: flex; + align-items: center; + background: #f1f1f1; + padding: 8px 6px 8px 6px; + border-radius: 8px; + margin: 0 0px 10px 10px; +} +.list .item .icon{ + width: 24px; + height: 24px; + background-repeat: no-repeat; + background-size: 100% 100%; + position: relative; + flex-shrink: 0; +} +.list .item .title{ + font-size: 16px; + margin-left: 6px; + line-height: 20px; +} +/* .list .item .title .text{ + white-space: nowrap; +} */ +.list .item .title .dec{ + font-size: 12px; + color: #999; + margin-top: 2px; +} +.logo { + font-size: 14px; + font-family: "tttgbnumber"; + text-align: center; + color: #7994a7; +} \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/help/help.html b/src/Yunzai-Bot/plugins/genshin/resources/html/help/help.html new file mode 100644 index 0000000000000000000000000000000000000000..f8324eb45306442e3449f80d0b3d9d57374950c0 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/help/help.html @@ -0,0 +1,38 @@ + + + + + + + + +{{@headStyle}} + + +
+
+
Yunzai-Bot
+

使用说明-v{{version}}

+ +
+ {{each helpData val}} +
+
{{val.group}}
+
+ {{each val.list item}} +
+ +
+
{{item.title}}
+
{{item.desc}}
+
+
+ {{/each}} +
+
+ {{/each}} + +
+ + + \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/ledger/ledger.css b/src/Yunzai-Bot/plugins/genshin/resources/html/ledger/ledger.css new file mode 100644 index 0000000000000000000000000000000000000000..2f7d939839f38ab484fea979134f5198476085f5 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/ledger/ledger.css @@ -0,0 +1,152 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} + +body { + transform: scale(1); + transform-origin: 0 0; + font-family: "tttgbnumber"; + color: #28384d; + font-size: 20px; +} + +.container { + width: 580px; + height: 610px; + background-image: url(../../img/other/bg.webp); + background-size: 100% 100%; + overflow: hidden; + padding: 20px 50px; +} + +.title-box { + display: flex; + position: relative; + margin-bottom: 20px; +} +.title-box .info { + font-size: 28px; + padding: 10px 0; +} +.title-box .genshin_logo { + position: absolute; + top: 2px; + right: 0px; + width: 97px; +} +.info .month { + font-size: 24px; + font-weight: 600; +} +.title-box:after { + content: ""; + display: block; + position: absolute; + height: 2px; + top: 84px; + left: 0; + width: 470px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcQAAAACCAMAAADxR1wwAAADAFBMVEXK1uHAzdnG0t7I1ODH09+ltMTR2+bE0NzL1+KgscHN2OKtvMq8yda3xdLJ1uGywc24xtO+ztudrr/D0NzF0t+pt8fP2eOouMawv8zD0d2ls8S9y9exv86tvMuvv82quse1w9GntcbI1OGuvcvBz9vJ1eK8y9jDz9upucevvszF0d3E0N7K1uC/y9intMS2xNCsu8mer7/O2uS6yNbE0dy0wtG7ydWls8LAzdvG0t3S3Oe3xdTAztvQ2+PF09/O2OKsusm2xdG9y9W2xtKqusmZqbzP2+WwwM2escGhs8O5yNWrucizwc6ntsexwc7J09/Bzdm6x9XG0tycrL+ruce9y9vH0+C7ydjQ3OWywcytvMnU3uier8G5x9OWqLvAzNfP2+a5yNeerr+tvc28ytbN2eOwvc2crsC3xNC9ytnCztyescKouMedrb6uvMuotsauvsqgscS4xtKot8fP2uS7ydS1w9Cdr8HV3umhs8Snt8e0wc+0ws/F0NvO2uKmtcbU3Oert8enuMalssKwvcqjs8Sjs8LN1+K0wM+7yNTH1eG9y9iSpLmsusjX4uq2x9Syv9CjscKrusultsbK1OGxvs7V4OihsMGitcSvv8/BzdiiscKltca5x9azwNC+zNi6ydinuciktsi5x9Knt8SfscKUpru8zNqtu8i4xdKbqr2gscLO2eXV4Om6x9S9ydejscGmt8ejtMK8ydm6xtKvvtDY4euTorWhr76/ydarvMmdrbyVpba9ydWhs8Gxv8ymtsjBzty1xNSltsTK1eHL1+OzwtK1w9CarL6SorWtucjK1N+/z9u6ytayws/D0dzL2OLc4+zB0d3K1d/I1N7T2uSgr7+pusqywNC8ytqiscStu8rBy9jM1uCfsMLBy9avwc6TqLupucaqvc+jtMSYq7ucqbnR2uTI0tzU4enS2ueRprm0ws6svsu1xc+mt8qYqr6HmK7L1eHDzdintsSwvsqerb6dscS+zNqgs8O4yNeouMmWqLnQ3Oesu8yqtsblPXw6AAADlUlEQVQozwGKA3X8ALy48fyb1reDkZfWXv+3bm0xbVQxEm9zKFoFczEocwmGb29vLm9M/Br8FQkVkRqRRVwFyGIuIYMaVMoFFb8aIYgpgglrS3pLf+spBUt5iIypKIwLSEhckhJTZ5IpBaYFeWylb8fDVBguhhrlLhASEii+KDfisrJZ5KgXSUldo0QfMDAjHyMPHnIwDUceDx5tHh4fD3cvrg8jjY0PFRwc7BVoHCiVewt7RCmYefAd2kQ5Izm6DR1mDUBNL2YM/sfbsZXYuS+9fCAQQalBhEEPmPm9GA0EyO0YdaFoIA2Q+30cEN9SEBBdG7E1Ne82NvgtMwyfIE9CZOBOog19QsdfNNROL68eas4HLTM0BJkiEAxjObXExNUbkM0bAWTOzRsHiRtQABMTasIHiwdYBAFXajSviz2LCixhJMsB3dMKOVAKgMtKExETLIdRZWUDAQEHB+phUTwHVlYrwVFXWxQUPDzQYGBXMn4+0j5XP7YGKgAGfnQqPwQRdAYnWyonACIkBD+tABkA2SIAAAYiBCfQBBkmKiIEFLMD0Xh4szpKAwd4s4BGAwj9OEZVJQfMrToWBwg6AsIkzAgKjgJlCCUWRggI+gIUAMnmvLu7RcmD9riwjDdFRbCXbxIJEglIBVoJEgUJU0QLVMN8YgULqm9vhAk3YpGBQMo3qgkhIWJTGoGBC4ghgvUhGjdeq0hrnGd8awsLelO/C1ySC1yFNqarhaUphZMFR5Nsk1oJEgkucHAxFW/hpFkxvh+kb3D0qxcddx0fHR0wTZxo3h/HaMerIyMNHhhJbIIPHzB/D0BArk6EoxyoLxWNqHx7q6tRKXES3BLuzktdnGTAQ25mrmb+tBx1oqGVKWMeryC5IEEQvxxZmA+adddfDRhBeolfcnKfJHVyv/MYTA1kUJ6eNjVdNmMQDQwtrjOan1J9rl8NmlDLARsBUui9Nq+ZUjMtDA3PJwz3AM9RDOeZZNM8MzPGQ4+HBydGJ0MgAMYBj08H8mE0NAGLNNSLMxkkORmdJCwkOTkBOybLCiwDChMTZQgmBwICBwdWVqyHW6zFxMTFYOkyYA4OFBQiIj6nMgY+PgbQfgY/PFcZAAAEMgT4IgAEIhEZMgAZBAAAPAYAdBEEVwYmEQC2ANBbERFVKysIWwKg0QMURq3jAxZGBwMIAzpVJQMDgDo9CD2OPT0CFgOAlmU9JSUWCAMlVQgII5AuN/bX340AAAAASUVORK5CYII=) + no-repeat 50% / cover; +} +.data-box { + display: flex; + margin-bottom: 10px; +} +.data-box .head { + margin-bottom: 6px; + font-weight: 700; + font-size: 24px; +} +.month .primogems { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASkAAABICAMAAACdmPP7AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIrUExURUdwTKe6xKqq1Ki2yae3yZuswai3yZmyzKa2y6q7zK+/z////6m3yqi3yam3yJK2tqq4xqi2yqi3yaStv6i3yZurwqGuvJuswputwZ+/v6i3yKi3yai3yKe3yaSkyJuswJuswZuswaS2yJusvqq7zKm3yKq/v6+8yK65y6qqqpuswai3yae2yK+8yae2zKi3yaq4yae3yai3yai4yoCA/5yrwai1yae3x6W6yKi3ya+9yJmqvq+7yaWyxJytwpyswpuswZyswZurwam4yKi2y5uswai3yae3yqe3yZyswKi2yae4yKe3yZuswa68yai3yai2ya+8yam3yJmtwqi2ypquwpyqv6e3yKa1x6KyxKOyxKKzxai3ya+8ya+8yZurwZurwae3yai3yaWzxKSyxKSywpuswZqswqq3y6e3yZyqwaO4zK68yam4ya+7ya+8yai3yKi3ya+9yJuswZutwa+9y665xa+8ya+8ya+9yK+7yK+8ybC9yb+/v7C8yZutwrC8yJyswq+8yKe3yqe5yrK5ybC8yK+8yKe2yKq/yq67ya+8x6+7ybDExK68ya+6yqqqxqi3yK+9yae2yqq1yq68yai4yKi3yJutwaewwZqrwa68yLK+ypuswa68yaSyw6+8ya+8ypmrw6+8ya+8ya+8yK+8ya+8yK+9ya+7ya+8xLC8yJqswJuswai3ybC8ya+8ya68yK+9ypuswaWyxK+8yZuswa+8yaSyxMY1ruAAAAC2dFJOUwAaBsjm8+QKMQ8QAYuYkQckc+Mc0E8ThXMIWK6V6Q7gzuEc7R5KDHksA5SNjO0jm0tRhIECg+ggJd6t8Y9xO5qtrOVBScLbbsZNoZqg6hPY0+B5GZ4mJGtF1Fb7q+f1xuKpVVu30uuBJ3E2GZiIpunN4tfwVzYW8MZdU8pRBKeeZ1Cfhh0hKn1UGIjcqg2bQwlnvGUwoaixoR2ilSv61Hj+cze6r6OKb5Z8+EHQ4+A942tN3XT5EQXmBgAABO1JREFUeNrtnOV/E1kUhp8kE5lapKl7m3pLHStSKFZaCsWttLi77eLuLMsCu8Ai6+4y5M/bDzdJE6jMpHzZO/N+yZ3kN/nw/GaunHPeAxNq9j9Y0qPt4fB2i4Ie7QiHd1gUxpctv21rgaru3KmqBVvb8sstIqOpvTt9UWBz27ZCh5qZqToKt7VtDixK7263yLz1NKUpSxb7AFIzHKrqyEgF8C1eoqTZLDoj8vUpV6dHL1IzHBFQANOvKn0+i5BQSoPid8ddp2aMgALcfqUhxaIENLsKoyBq9+U+HRru1LTO4aGnuftqoygLXc0WJ3f6co8YeU90HdcSdLzrhFf85lme7jY5qNCRJoEge3eFNooqdmcLoE3BkKlBeVzrBIgcpzaGnDkC5TqXx8ygAmL+6SnRxlFZT2Q+i6I69Ob/Iwzf8dOxWTfeBvXYtR4gr06bQHV5AOuVx5EZfqBS4sfHW1N9+MDHCV+Vz6gEWFWqTajSVQCVv0XON78PVEn9rqkzP7HHr3rBhwBrSjQdKlkD8DAYWQGfzJJ7Wkqd+Xnc1ep0gLXLNF1athYgfbW493bjFLlRqYMvYuOWFXlAZommU2WZQN6KFnF39QXJF7vq2FuTEvAA3lJNt0q9gCcg9vP3G2/ITarmWHTUUA9QpxlQHUB9vbj/5kdyk7L/GxlMcalAlmZIWUCxS8xQ/Y39cqN6E/lc6geK5xsjNb8Y8C8V/3Dle1OQ2l9UBeRoBpUDVBXtB+Dns6YgdTANyHYaJeXMBtLSAGgf9JmAlH3qNKBDM6zdwLSpYv964EsTkFrgAOy7jJPaZQccCwA497UJSDX5jS98I8ufvxeAU1vOy09qxh5gXjKk5gF7Zoj/uvtCelK2IsDrTIaU0wsUicTWhQ+lJ5VfAMzRktIcoCBfHI2+k57UwZVAbnKkcoGVrQCcuSc9qc9agLnJkZoLtHwKwMkPpCcV9AALkyO1EPAcAWDagPSkFBtQlhypMsB2VES7GmUntXGTDehMjpQTsG3aCNC+RXJSs8PhDZmgJSnI3BAOz44PTMhM6lnSpF7Cswipqi/M8fY5kyNVAYTE23fqtDWjj5fOAkJiRr8u/9r3nnYJJ89KT+o97TzPzLROM/pOM9V3rBOyvhPyt/LHEiYbdZkqoi7HaqxI3viRvOkiktff2C4/qclFh/c2AXDuG+QnJTIOFZPLOFy5ZAJSSWexOohlsc43hkxASmQ3J5cZfSB1HO/9ZNvFynfokilITb6C4/Zp1RykpgSKgcvGSF0GigOiKujHHzAHKeobAC4aAXURYpVm6qDkhZ5VsYBuissDuA1UL/7iBjyKqF68eUjyR6rmVWx4S1TEDusF9auoiL0l9ueHr0tOqjqujnwyVdZP7kgOSh2MO9S6g4/AWOX+o0jl/oM/JF/4Eiv3KT9q1A3iEm6Q+3f/kvyJSnSDgEcx6DCKmLHuSV1hbX/XYQQelzBV9ZTpcK1VRl1rf76R2rW25dWsUQJvlhNSt0LBqLu2Y3R3bUfEXdtrcndtvGPbntX1Vq1CZ1dWZGKzHNsAzUp8F4DnQ8NO7WXF30PPc78a6QKgWF0AAFIalL3jdZbYa3WWiMnXp7SO1a2k1epWkqBrY3fAuWbRSVRtd++7XZV6u2stMqOpPL91pFNXq9WpayJZ3d/0yuooqFuvX1sMgP8Aoj2c6YMcrDUAAAAASUVORK5CYII=) no-repeat; + background-size: auto 100%; + width: 265px; + height: 60px; + line-height: 60px; + display: flex; + align-items: center; + margin-left: -10px; +} +.primogems .icon-ys { + width: 40px; + height: 40px; + margin-left: 10px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAADAFBMVEVHcEzv7ev07+358und5+7r7e6+2+7x8vHk7fLg6/C12/G93/Pw5+nw6uvL6Pbz6uzC4vTt6+z27eny6+f26uTL5/Wl0O2jzuz06uTz5eX07OrI5vWjz+347uPN5/acx+mezu7x6Oj27uij0O3y6en78/P47ejE4vPd4fDc7fn89/bu4+f37OClzeycze3V5fPv7/L79fWXyev8+PXS6PX9/f3V6fT8+Pfe6/Xo2ubz5Nn7+PfU5fXH4/T58fDk4PDU6/jO4/PX6vX26dny39bp4u379Oj27t79+vn38/Gkyef68PDe6/X99+m23/Ggyen58fL7+vrp7fb19vng7PWj0/DZ8PnA4fS+4vXy49X9+vr89+378uPt5tD379v59/iiyerv5u/179r58+f58d7w4OH9/Pj47O7A3e+k1O+t3/P8/Pvr8fbf5vLG4PHz9fnU3uvW5/HR5/TU5/br4u3m9Pzu9Pn8/Pr179v79/Dw6drz8vP37uvR2+u3z+f89+vv7vbm5fLq4uy/5ffo+P34+Puw3PO+2/Cv3PSt3PSbzumq3fTB5vb////5+vz9/v78+vv18ff67df45eb09/vR2e7+9eT87t/q6vWewefg5PKw0Ojr5u/Xu9NTks+wweS40+rH2vDk6/XP4vQxm+X/9t3u4Ojwxbn02+Db2e5fl9Hzz8+6uuHO0Oe2w+jlvcfj0+buy9Rxotbs8PnY4vGCrtzt9vuOxek7jdW0yeGx5fmow+e82vHD1Ou01fD9+PD05NPv2MX559/wt7r06u7EzehonNPr0+HqxNbCxee/rtjyycnYzeb02NjGmryKs911yvZKuvUrkOGdzuxKp+Tq28Hz29Hy6M3m17tSjsrtvs7/9tLv1Lfossh0ntHcwd/nwcjSxN7JtdvIvODXqrnAos9IkNPAq9GkuuOCx/F5v+epzurQ7Plds+Ws2/N7vOOOzO9ZrOI7ldqLvOFuqtuastnL0uvr1ebktb7MtNvy4Nybr9phxPfE7/xot+NNnddzC8haAAAAjXRSTlMABggLBAUBAQIDCAUKEAwcCg4VEyUXDhgYNWYTJjscVBMhHR8xQU8lYf0qKiw4LTlKgD7/Svh1WyVJcMcwLZSKQFOxSldEiq/NpX39aP48b7Pa0uW6Y9ma/kLTcVrwnv5GWPXr14PzXdFLi+6/mL70/e7YfPL77+Z7wtOhzeusweHOpl2W7JCz16z57eOaz+nPAAAFD0lEQVRIx5WWd1QTWRTGmcxkMhOTkCHJmoQiJSZkiYJSFgFZQRGQYse2iufYezu6vfcy6YEQepUqvSwdwQZi99h7F7tur28CxwMcEuP9e37n+95379z37OxGKoa57Gwv8DWG4QzMdojBwBE6VbitECAgGkyzg2EIAZBNCE5nEbDzEj4M0+g4wzaCRjgIQ/3FPB5BQzAbEAwBhLvz+76RCiEPhmyRwegwz00hXtH+gZQvZNsgw2AgNLa9wnlZUsfS90R8ByDz6oZAsAPf+Z2V+R2nI6dK3Nk0uvWkAYGweG4i6fS4/DNnlwYt8hISEGKNoQgaIVRMFX8ad0F79syyac5u5gSsMBgOEZSt6avzL2gvnl4ZNFVhz6aaw7BM0Fk8d4l0SXCbNj/54u72yGmL+P3WLPnC6Cy2/Zs+4ujVydqk5N2dHStWAWsOVEMZFkbLTIx9a/q7vu3apL2dnbv3fhQkFY3MoCiYdgRi8ShiwmKVWguQ85c6SxJniX0kFAOiHhYciIpOg3nuFBFFkqo2bZLu/KXy8i7/aMAECgkahOMYOmQUgQTh4EYRwSQodXKy7mB6enoXueFDsY93oJDNgUbh2JBRhFhsoZtk7JoJwUoVqSLJtmTdleulh0mVekN0LGBcHDnMUYNkzFEJ+aKINaGzSX2aBjCquMIrpYf0SmOa3n9jgJ/35GGMOSovUUTQrA1qFakp0AAZ34Ibe6r1hjKTUqWavSnMe7JMABj8ZbpgSvgKaehsta73T52vOpEyl1Zm2pnbYjDl1GzN2bIxIF4mE3CZCIoOpEVzcBdNiErUlfT0lJdXFsaoAaOvlje3ZhtafgbVkrst3FMmcGQi2ABCh2FpVExhSU9Jb2/lwYOVhboYvYqsy25trjGZDFmpqalZzdnb5vlxuYMQQrq46+rN369WHjhQUVHx24GCRFKlVObktp5sSnn++P79x8/7Fib4cTkvEYQFfvbQuQXpN48cOXKnuzu9QkOSSkNObl9fbUbDs7y8vIc/rF0fP8gYdXx7vkQ86+u0a3du3bp+rQjYIqub7uYerXr+4tmJvFP3vvtmnZMHiAzvP/7ABHuJJq0K9jce/qP7RpGxOoesqT2a2fLiv1OnHj758fv5E8c7jX7jZcgUA8E8ihF/MVeZdrjMZDSU6bP2X/6r6eS/T5882L5+zAAxuP04BFPtn+T59hyNRmM07Pk1O6Vqf1Vtff0j+eYZgPBwBcTgBcXA+sdSApjPNeqi0tJ9mQDJKD6aJf925kiEeZTBWuXZh0QAHZXxUGlmZkpxcca5X2o2zxwzzmm0K2g8GH506G7p/8W8APMZWXTo7p6UjIxzl/etnUER1MHRocTAnjSHEOG5aUv1vqaslNu3izM/BoRHP4GOuC1wSifEL3aeMruvub6hoXbrJ2MmDo9qOAR03LzDdsyVty68d6IhdfvM5ePNGpiViwIiBIFTPMP1CxuPnXgqXwBsuXKtESAEkJtLSFjALnnj33knE+Yvp2whGGrJF9hNGEbnOsq8w8LrGo8ff7BgHRBh4rhlAjBAh0kIJk8J2PXP8WMJ88c5uXLA0a0hlLdRXEeXEL958mOPFsRTZ0fQV11jKA5xBLKQHTsbf/pSRp3dhvsVyBAClylz6sLNi8iWKxnIcNkCl6/8Yx2HrTtrtzidSxDeAYEcanGhNr0uwOAwCciOS61hBmrrIwas9dd59vS/xjDq+9d8kYGyYOp/+ZOffkcp52sAAAAASUVORK5CYII=) no-repeat 50% / cover;; +} +.primogems .icon-mola { + width: 40px; + height: 40px; + margin-left: 10px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAADAFBMVEVHcEzen2bgoWveoGrOZy7enmfdnmTOeTnakk7cnF3dn2nenmjanWbeoGvgo21rVjTGkGPgoGngom3DkWTgo23FnnpnVDPJk2TFo4KzlG7Bl3OrnoFhTC55aUazh1h6Vi/f18fHuXzRxLWrhmOBXzuNZ0Geg0yqkFZoRCGagFJqTy1wUS+5p3GIXzdsVzKqhFHDi1uojFXBs4Pbz6enjFrMs4/SlmO8qobOwqDs6eLJlmnJv6TX0Krk4L3Cfza7kUODb0a1pGugkWSvm3COcj+EZDiRbD5pSitnSSpaQyWKe1axnWOBZj3CtYW8rX+JdUefXTKcjVbOlmS5n3a2nWm6oXHIsJju7OjKn3jBh1PWx7fazsDLu47EqIrGr5ibknimnoike0nl4ImmfkugdEGth06ieEjn44vSwnOmfUPp5Y2id0H///+qg06ogkugdkWTajqwj1myl1zg2IWke0G8nl+4l1yecD5/VzCXbDzh2Yrf14K4mlPj3YiVc0Cdc0CojVa6n1mwi027mlrn447ApGKqgkW6oGeRZzqthkfu7Zvx8LLCp2iJZDfCqWrc0oHUwIOofkOrgkp3US2fe0SIYDalgU20kFzq55Pr6I+ykVPw76exilOkjVTIr2nPu3Pb0Xy2k1CyjUr39tDVxXr7+ujw7b/i36Tj23utg1ObcUJ6VS+5m2O/pmbNuXrLs3Ds6Zi/oGDk3o/ErG7An2jMr3TSwHr29eLw7Mu5p2TKtGPo4pXZy33o3a3Vz4DXxpPk24Xd03dyTCqgfUqtiFNtSSiXdkfu7KSbeETcz6a/olvp6NCBXTKNaTnOuWrIuW/Ox47RynzFu3Pq54n088O9rGna15Sqi0z8/Pj29fHHslv7/O/o5YCEWzOrelGfg07QuXexnV/CuYjMw53s65Lm47TXx4Tg04nZ2a/k38bv7a+3omCvmVXRv6bZyorc1JnErV/m4q3Msoeqk1Xz8NjBpH7FtJvz8s2liWDd2pjPtYfr5qjTt4HYx63v7ezYymSmkdCeAAAAYXRSTlMACg4WAQwIAgMGEhAfGTUmSj4lZyyWYDeapHy+Bkh3D/384VdfGcvnPfecvf72C4Ynq+b4ocFZzvD7huTv/VA/U/nU3N/l+snHhpH5p+341GD5crK0ttT6oA7q8eOt0o/LxgajdgAABPpJREFUSMfVlmVUG2kUhjMzZDITwZ0q9LRbl1OXdXd3SyZGPIG4ACEQoKG4FnenQItLqQBtoU4LbanLlhqV9e3uTvbs7jlNgNJfe/b+nPM95733u9/c9xII/6dwwOPJAARFEQSZKuWAn4eJ1gAAK0h6LEdCUACEaNaAyCBIBGCU9LiMYBCiurq7u1KpVBoFJRBgYHKGhBIhqrujo6PLal8Pb29v34Bl+NfJGJyguTq6uLh5rPKfdf3ArH3frV3jHfAZrj5xHUQIJ1Z/6r9u+HRxYXFzvCmmrXSjX8AklcNW4v2PPxkSDBU3NxWOduR0nzl2rHTjypkTpkWhOrqs/3xYIGh62HW9abR369V83VjZGU6pn9MEtwVA7i7rvxAIhmb9Et/RdHy0N6YtZ7/uZGtZ2d1vx2UQXMTdbe1pwfCtHR3HD/y4uXdbxmVu65kxyc3ushK/meOlBUBU568fFDbf+62k8MoBnEjnZQQd1HKKDNlB+k3fIPYiMIVG9VgnKL63o+T45rvNvenpGRxePTdPz2g33N/ZtmH6eE2EnL8cLXy4/VdcoLRkG89k4pjqc9v1WgZX1bLzjt8SexGI4nGHF5QVvzUm5vKJK+kcE4fB0TRqGXo970Y/99pbtjIoQCZTV9XzGhRtmjgNo/OwicNh6DlXa+Pi2rmdcbH322e/Pu3RvGCADDivYGiljelHpHJLVSgXJxgmi9QSITcP1hoMufHPO9neFwX1PZzRmHatXl+d1Vi0RZHHYZhqpDk5llqzIis5tvr8c9NtqycSfU5sa9iu0ei10gheRm6dVnueraitqzXv2cMSDoQ2bHn20dajRJj8wc/p5i2aIC3jSGrETm14eA4bU2QpGvZgQhZLsnu7ZY5t+Sj00QmTrEGj1eYdmV1TxOXW0dlyucwcyhYlJiZKetKqPG36AjtQPuzUy6qD8o5ePNxVEyGPsGBSc1WVWRZ6LjkyQVJRnuZp2xgCuvxo3AVF3tFL+8KNxiyWsDyVjrHZbHq5LDs5UF1xVjrH9iETCEtbcgfTZBf3GVl4vSLh7soKujiEyefz0y6EqMVnQ5+2f5nvvicflP50KVEkFIlSMWHK3hFmhZLPDw7mK7KjsPL5z9j/ME7vsGTZt75XCjEMo9PFu1J2SaxAYEIgq3p3IjaXSrCfG2+Ksewf2HT8PFssVqmYKlUgHgmR0cbqsITkpSQSYjs3SJ6LlT2pavx8SAhzJKlCKe6XRFuJgvwwOWueFwFF7GRmLlT38ZkYm8lUqpKiMGa4oTKkoCBfp9OFHVy0EkVhe4TguVg0kBIVO6JKSpIohZmyYEm/JPhkvi5Md+MFLwIRRuwHGrIgNmnX3r2VlSlqJROTs4IjA9WxAwZDX/L8GQQQR8aZGUtejVJLUnrCjUxmcKAoEi+8oK6Le+pUiw8RBCeYzk6vRInpfedk+/ON0dHG/HBL14OS7u5DPlSQPL6IlVn4sigzM7Tl0KGa+PjGoo7TAkHpbB8qBQIntoBpr72UminfH5GTe/t2+x9lxYLfN8ygQFZiEnN6asGLJ2+GjbW2HuRyOzf5e3hRaBA4UVb/QjOWz533xqK3V6z5yteZDE6BsL6EZc5ubm7OXjQiSKORwce431/E3/YBkK2WCSAOU7JxACCCFAoFd9gpSPxj/TAMAzCMIlNdF0j4roDixu/wRDsJiUR6wrXkv44/ATiq3UaumtduAAAAAElFTkSuQmCC) no-repeat 50% / cover; +} +.primogems .text { + margin-left: 18px; + white-space:nowrap; +} +.day { + margin-left: 10px; +} +.day .primogems { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASMAAABICAYAAAC9ZJMAAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABCVSURBVHhe7d0LkFRVegDg85/bM8wMj9mVdY1b+KhEzGpIskRgRh2VUZ7DMgtoGgZQlw0bjFAIxlSypdmYXSxra32FqAmrkSADaKvADsvwziDMygxgcC2i+zC1ylpLdANhBpxX33v+/P+9Z5q+PT287Ibp5v+qZs7jds/cv6v6r3POfam+YlVd42L6ecg2hRAXGbDlBbVqQ+MsRFXLdQA1e9bkilX+BiHERUPb8oKiRDTbVkN1IcTF47yOjNZsbfwKeJFbFejrEPGr9M8LdMSZw9u62tt2c1lYXHILl8b1lqNScQD4uULzvouqcXZV+ce8TQiRf7KajB59FPV15c23IcJ0at5BP0X000RzsfdoCHSQxkGjFcINusAZ39V6fCC/p3DQwOMm7m1RgG/T7u2k1w6j115Pm8rpp4N+dgDgq+83lb356KNg+D1CiNyXlWTEIyDtFS42CmdR80P6N6844NZHJ9z0QfCKAI2OILa5+RkqyjghcR8nIko2zdEJZYtoVESDo5Nim9+6xsNIFb1zBjWv1gpWGafr6ZpxFb8NXiGEyFUZTUZBsnAeoeo4+tP/bhyzfNa48l8FW9NLTkjc7i0RpVq1tWmo9jRN8fCb1NzqgLckNdkJIXJHRpLRuoYDX+ho73yEMslMQHiyxdX/Mq96RJvdfFrdCYnrZ5KIki2r219SGjF/hYB/TX9odVFxvyVTK4cfs5uFEDnicycjSiKTDKpllFJ+3K+o38OnSgSxWMxpVZfdgI7iReo/UUYNpXKIQVOqtR7ErzHGtGrQLVT9WGnFo6p3wVO7B6lP3o5Gox6/Jh1OiJ0dnY9RSN/QoOZRUttoNwkhcsA5JyN/RFLgPUXV0QZ1zcyqkQeCLWFL6+v7Fbf3n6JQRanJi9il/oazxwlqB+1xrL34s/ULq6o6g+6w1fX7hmswa6i6syXuPHg2IzQhxIVzTskotm3/lcZ119Hb/5O+8A+k+8KvWLt9cKcpXAjKW6CUvsR2Z4g5isp5tp/uWnrvtDFHbGeCTZT/RNWROuJUR8eOOBRsEUL0VWedjOzIYwMqfLxmYvlztjuBE4HuanuYpm0LqTkg6M2aExTCUlNY8li6hLhmU9N8UPAdGrlN7m3kJoToG84qGdlEVKdB3ZduTebF13dORqX+mf7sVbbrfDkEChfMvWv0BttO6F7TOl1CWreteTV9GjW2KUTemTqmDNZtbz7jg0OZ5XUq0L9WBjYD4AtTxpS/ZzcknHEyim3c+zWj8SfGmDkzJ924zXb7ljc0FLlH9BNUnR/0XDDPRQabh+ZUVvLJkQmrN+4ZC1qvcAxURSeNesd2h/ACuPK63umK4/3TJ5bX224hRAbw2vEQ59Kh4HiTKe0sooy4zj3qLY5Gb2q3LzmzZFRb3zQkArCLRx+pX9Rlb+y6XCPyKGl40HPBHTAAk+bdeeth2/a9uqmpChU87yJW9HZZyfrtzbfQh7Qy7rQNi1ZW0hRQCJFpsW37Swu0+xKln9L4kf5V0eiwLu4/7YWyvAZEiegnSuEPUhPRj9buulaj2UPVvpKI2HDeJ9432/YF+46Pcywck+0OmTKmbDclozcL3JLv2y4hRIZFx45omXJ72V30fWyJXHLiadt9+mRUGjHPUtE0Y2L5sqAn8GKs4Row2HgB1ofOAFzF+8b7aDt8NoYmG1NargN/S+PFe9bU7/8D2yWEyDA+sTluIt8CBdPq/mPvH3HfKZPRmk3NUyl7jWwvaltku3y1bzQMQQ3bqXpp0NMnXYpa7+B9tW1fEAuODGLrKVo56n9o+xPFhd4S2yWEyAIeIdF3bann4Vxu95qMeEEXlFpqlL4neUGYF6LaUdf1zRFRD1fyvvI+27biWDgmjs1ftE4Ditxnabo2bv32Jr5bgBAiS9BzNiiNE7jeazLyrzVTKpZ6OLy4rf+TVPSlNaLTGW73OcHGFOvs6Pr7oCdsSkXFcfqYnjEKFtsuIUQWuC3Fv1QIv8/1tMmI10toTjdDR5zv2S7fC6/t+gYVF/rw/bmYb/c9wT2C/0jF9N7WhvjIG42epq3d3jzYdgkhMsweSSvketpkBMr7LmWrp4M5XaC2tmkQfUWft80chM8HMQRmzy5v5Rj9WNOYNqbsCL2nDhTKbXCFOA96JKOVm/dfjqAm6OLPQkfP2ou6+CjTV2wz99C++zEk4Rg5Vo7ZdoXQyOhl+s03iBNCZFmPZFSovAe0gpeTT/rji15plMDXmuU4XBjEEuAYOdZCNA/arpB3GsvepOIKvmlc0COEyJZQMorFDhaip75plBe6ADbuFfCh/Wxf9Ho+DOA7Cdi6j2NFg3dz7LYrge+xjUr9uCASCa03CSEyL5SMzID2O2hu8mHNxBs/tF1BggJ1n23mPFB4f3Li8WOlmP3Y09CgttCIyr8/txAie8LTNDDT6NdrtuVrgaMTqfhS0MoLX7IxJYHXUHtpT4I0rvtTKm5uaGiIBD1CiGxIXTO6Q/vXoZ0EgHfbat5IjYljBoQxthkybfzNn1JKOnwc+/+h7RJCZEEiGfHjhVCp/tGJI39hu/yzrakv76YoHFPyWdkcM8fOn4HtCgGl93lo/sw2hRBZkEhG/KRXUIqnJAkl7QNGUJEPC9epBtjYEjh2/2m3aaDCdxXCH9umECILTiYjgK+Bwn226aMvIT/FNS+lxhbEDsNsMwzVL+nnatsSQmRBIhkh4nVGwc9t0wcIebtOkhqbHztg+vOJtPMbylahq/+FEJmVtIANVyHqxCF9RqOHr9pq3kmNzY8d/ee49dDR5X5KRe6efS5EDjg5MlLqyxDp/MQ2u+XCbULOVSi2IHZIe38mJ1Lwf1QMDFpCiGzwk9HKusao67o9vojGmLT3+8kTPZ7lFnfdy/mzsM2E9356w3EqioKWECIb9Kq6xsWg1KuAGIl3qK3Jd0bsfuR0nkocJeSYOXb+DPiz4M/EbvLxZSFUpL1vthAiM5LWjAKOo+n7eFGI2/K0MccaGjhx0UxWCJEtelZ1xdP0LZuOAG5BkRpXM+W239htLI8f12N46uXjmIuKi6r4M+DPgj8Tu8kX6SrkUVFr0BJCZIM/Mrq7uiIWiUR+5/eEHbVlHoJEMupWEIkc5s/CNhMiKtKfimNBSwiRDYlpGs1TPkW332W22e0jW+YhOGQrPjeOfM+mdAlZeRHNi/t8eF8IkSVJa0b4EYAJnWUMKSdB5pPU2PzYQf3KNsOMd4UCTJ6+CiEy7OTICOB9nXoiIGDiotl8kxqbHzvCB7YZBupaNJA+UQkhMiKRjBDxHVQw0jZ9NHpostW8kxpbEDsetM1U14PG/7J1IUQWnExGjrsLlbrZNn1txSf2U5GPR9RO2NhOMuom/gxsKwzUCHSd0PPjhBCZlUhGNeMqfgtKfRbbtC9xAenCqqpO6ttim3mDY+LYbFOt2to0lD6JNv4MbFeC/9w0hC+/u2fEe7ZLCJEFSQvYvh0G8eu27kOElbaaN1Jj0h5wzDuCVpgGxfc42mXPwhZCZEk4GaFeS7/+3LZ8pXjJJprD5NP5Rv8bxHQSoJoexN4TIlaDws22KYTIklAy0ieKdyhUV6/ZtCdxiJ8fPwuoc/hJsmGUeP7VPlLX58dKMfuxpwhuwg/VXRgJJS8hROaFkpGfeDSs1MoJPU+/wIk/Q0U+LGSfsLEkcKwcc3KC6nYs3v82Kn4RHTsidIKkECLzUteMFGWjp4zCe+zFob57p405QiOEpbaZw2BpEEuAY+RYjdMVuhYtAfAvaIq2wraEEFnUIxndPWHEYZrKbDbt/efZLl9xR+EPaDrT42hTzqB992NIwjFyrOmOosUa9v6eAlVFU7RXbJcQIot6JCOGyvkejQoW1dY2Je5nNHt2eSsAhKZvuYT3nWOwTeXHRjH6saZR4OJcSkaraYrWYruEEFmUNhnVVI34bypiziXqu0FPYO5dt66nb/Vy28wdtM/+vieJDIZ/oCJmYw2JbdtfSolofken86TtEkJkgV0OauN62mTE+hUVfp9GEzNW1+8bbrt8pqBkARU5czYyKvyZ3ecEjgkp53KMtiukANyF9MaGdIlKCJE5ka4BV9N38ddc7zUZTa0cfgwRF2llXl7e0JC4//O86hFtxWCq6cuaC1exf1wC+HXeZ9tWHAvHpBAXcoy2O8E/41rBAseoh22XECJLwPEmA6ptXO81GbGaqvLX6eX7ijtKQofDZ99Z+TGguZ2qae//00f8Doyp5H21bV8QC+wLYkvrKUS1vHp8mZ+thRDZ4S+HKFiIRv8bt0+ZjFiLq3mKU76mfu+3g57A3GjlB6ihgiZCffAGbPgR7xvvo+3w2RjKbUw9rNu69w5Q6nZXOY/bLiFEFtCsCwq0+xIqXDtt/Ej/bhn03Tu92vqmIRGAt0DhfdMnltfbbt+yN3ZdrhE3UjW0tnQBHTAAk+bdeeth2/a9uqmpChX8yEUsn11VHhotsfWNjQOxwzlA48bFU+8YtcF2CyEyjEdEnIgo/ZTGj/Sv6j7h+IySEeNFXwCzEY25d+akG/05Xjdeh3GP6CeoeqEP/T8XGWwemlNZ2WHbvtUb94wFrVcg6kkzq0amXXxft605hqBapo0pC40AhRCfXyx2sDBS2n4trxFR2lmE9JVzj3qLo9Gb2u1LzjwZMU5IGswGGiH9ZeoIib34+s7JNPp4lqpXBj3nzSHapwVz7xrdY0TTPSIyqCf3lojWbm+aD8F+C5G3po4pg3XbmykPXBBtfNSMF6t5jah7apbsrJIR605INNd7vGZi+XO2O2FZ3f4S3dX2MM0KF1IzcUlJlpygEJaawpLHko+YdVuzyU8y3zlVIhJC9A1nnYwYzfmuNK5XR9V9LXHngXSJYMXa7YPjXsEiBHO/UrrHo6Q/H3OU7yTAF70mX2vWjRPioEL3GUAYpSNOtVzoKkTfd07JiPEXvrTAe4qqo2nkUdPbyIPnii1wdKICvMcYM+ZcH5lN722l925XCC/z/YjSXWXP7MhtDVV3UqJ8MF2iFEL0PeecjLrFNjdP8lC9AArX9Svq93C6Ewm7xWIxp1VddgM66hY06k/pn19D3UNoL75IJU/p4pR2jtNI6phC9QnNMT8ArX5mjG78Ih7eH41GPf476axrOPCFzo7Ox1DBVAfUt6MTyvgInxAiR3zuZMQ4EXS0dz6iAGZS84etcWfZ2YxI+JwDSmr+iZWURBYBwBkvsvlTsgKP7zDwN/SHVhcV91tyqoQohOibMpKMusU2v3WNh84jVB1Hf/glz8EVs8aVn/J5Y92JiIoyblMeaj6ThMQ30Xc8uJde9C1qbnXAWxKdcFP6554JIfq8jCajbmu27L1CG7XQKJxFzQ/p37zigFufmiySE5EucMZzn4l7W3pLSEGyi1TRO2dQ82qtYJXRamnN+FHytFchclxWklE3XiPCQVfeapSqAYRK6uILbpto+PMeZaKDlFRGK4QbOBF1tR4fyO8pHDTwOCckBfg27d5Oeu0weu31tKmcfjoQsEFTvoPWQ7tOtYYkhMgtWU1GqYLLSlQF/dthNOQZSv+8QEecObytq71tN5eFxSW3cGlcbzm9Jk6voWkeHnRRNaa7jEMIkR/OazLqTW1dIz99Y0LQUptnV1dMtHUhxEXitFftnw8AqtZWQ3UhhDjvaut2/x3/2KYQ4qKi1P8DrLxsrQznnc4AAAAASUVORK5CYII=) no-repeat; + background-size: auto 100%; + width: 260px; + height: 60px; + line-height: 60px; + display: flex; + align-items: center; + margin-left: -15px; +} +.chart-box .chart-info { + display: flex; +} +.chart-box .head { + margin-bottom: 20px; + font-weight: 700; + font-size: 24px; +} +#chartContainer { + width: 240px; + height: 240px; + background: url(../../img/other/chart.png) no-repeat 50% / cover; + margin-left: -5px; +} +.tooltip { + margin-left: 20px; + display: flex; + flex-direction: column; + justify-content: space-between; +} +.tooltip li { + list-style: none; + display: flex; + justify-content: flex-start; + align-items: center; +} +.tooltip li i { + width: 10px; + height: 10px; + margin-right: 10px; +} +.tooltip li .action { + width: 100px; +} +.tooltip li em { + font-size: 20px; + color: #28384d; + font-style: normal; + width: 50px; +} +.tooltip li .num { + width: 10px; +} diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/ledger/ledger.html b/src/Yunzai-Bot/plugins/genshin/resources/html/ledger/ledger.html new file mode 100644 index 0000000000000000000000000000000000000000..4c639c595d8c6475803fc40955c35717796cfb24 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/ledger/ledger.html @@ -0,0 +1,111 @@ + + + + + + + + + + + + + +
+
+
+
ID:{{uid}}
+
{{day}}札记
+
+ +
+
+
+
当月获取:
+
+
+
原石:{{month_data.current_primogems}} | {{month_data.gacha}} 抽
+
+
+
+
摩拉:{{month_data.current_mora}}
+
+
+
+
上月获取:
+
+
+
原石:{{month_data.last_primogems}} | {{month_data.last_gacha}} 抽
+
+
+
+
摩拉:{{month_data.last_mora}}
+
+
+
+
+
原石收入组成:
+
+
+
    + {{each month_data.group_by val}} +
  • + + {{val.action}} {{val.percent}}%{{val.num}} +
  • + {{/each}} +
+
+
+
+ + + + + diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/ledgerCount/ledgerCount.css b/src/Yunzai-Bot/plugins/genshin/resources/html/ledgerCount/ledgerCount.css new file mode 100644 index 0000000000000000000000000000000000000000..e567a7c9d74d2185524f9918a5d0650788e9bf5f --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/ledgerCount/ledgerCount.css @@ -0,0 +1,113 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + font-size: 16px; + width: 530px; + color: #1e1f20; + transform: scale(1.3); + transform-origin: 0 0; +} +.container { + width: 530px; + padding: 20px 15px 10px 15px; + background-color: #f5f6fb; +} +.head_box { + border-radius: 15px; + font-family: tttgbnumber; + padding: 10px 20px; + position: relative; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); +} +.head_box .id_text { + font-size: 24px; +} +.head_box .day_text { + font-size: 20px; +} +.head_box .genshin_logo { + position: absolute; + top: 1px; + right: 15px; + width: 97px; +} +.base_info { + position: relative; + padding-left: 10px; +} +.uid { + font-family: tttgbnumber; +} + +.data_box { + border-radius: 15px; + margin-top: 20px; + margin-bottom: 20px; + padding: 20px 15px 5px 15px; + background: #fff; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); + position: relative; +} +.tab_lable { + position: absolute; + top: -10px; + left: -8px; + background: #d4b98c; + color:#fff; + font-size: 14px; + padding: 3px 10px; + border-radius: 15px 0px 15px 15px; + z-index: 20; +} +.data_line { + display: flex; + justify-content: space-around; + margin-bottom: 14px; +} +.data_line_item { + width: 100px; + text-align: center; + /*margin: 0 20px;*/ +} +.num { + font-family: tttgbnumber; + font-size: 24px; +} +.data_box .lable { + font-size: 14px; + color: #7f858a; + line-height: 1; + margin-top: 3px; +} +#chartContainer{ + width: 100%; + height: 300px; +} + +#chartContainer2{ + width: 100%; + height: 300px; +} + +.logo { + font-size: 14px; + font-family: "tttgbnumber"; + text-align: center; + color: #7994a7; +} +.hasMore{ + font-size: 12px; + margin: 6px 0; + color: #7f858a; +} diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/ledgerCount/ledgerCount.html b/src/Yunzai-Bot/plugins/genshin/resources/html/ledgerCount/ledgerCount.html new file mode 100644 index 0000000000000000000000000000000000000000..0d899779865a1127d5f3506165c5b340d03535a3 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/ledgerCount/ledgerCount.html @@ -0,0 +1,186 @@ + + + + + + + + + + {{@headStyle}} + + + +
+
+
ID: {{uid}}
+

{{yearText}}原石统计

+ +
+
+
数据总览
+
+
+
{{allPrimogemsShow}}
+
总原石
+
+
+
{{allGacha}}抽
+
总抽数
+
+
+
{{maxPrimogems.month}}月
+
原石最多
+
+
+
{{maxPrimogems.value}}
+
{{maxPrimogems.month}}月原石
+
+
+
+
+
{{allMora}}
+
总摩拉
+
+
+
{{maxMora.month}}月
+
摩拉最多
+
+
+ {{if group_by.length>0 }} +
{{group_by[0].num}}
+
{{group_by[0].action}}
+ {{/if}} +
+
+ {{if group_by.length>0 }} +
{{group_by[1].num}}
+
{{group_by[1].action}}
+ {{/if}} +
+
+
+
+
月份统计
+
+
+
+
详细统计
+
+
+ {{if hasMore }} +
*该数据只显示最近12个月
+ {{/if}} + +
+ + + + + diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/logCount/logCount.css b/src/Yunzai-Bot/plugins/genshin/resources/html/logCount/logCount.css new file mode 100644 index 0000000000000000000000000000000000000000..cfcbba6289636fff836a43d70fd142a68f457c8e --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/logCount/logCount.css @@ -0,0 +1,184 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: "HYWenHei-55W"; + src: url("../../../../../resources/font/HYWenHei-55W.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + font-size: 16px; + width: 530px; + color: #1e1f20; + transform: scale(1.5); + transform-origin: 0 0; +} +.container { + width: 530px; + padding: 20px 15px 10px 15px; + background-color: #f5f6fb; +} +.head_box { + + border-radius: 15px; + font-family: tttgbnumber; + padding: 10px 20px; + position: relative; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); + +} +.head_box .id_text { + font-size: 24px; +} +.head_box .day_text { + font-size: 20px; +} +.head_box .genshin_logo { + position: absolute; + top: 1px; + right: 15px; + width: 97px; +} +.base_info { + position: relative; + padding-left: 10px; +} +.uid { + font-family: tttgbnumber; +} +.pool_box { + font-family: HYWenHei-55W; + border-radius: 12px; + margin-top: 20px; + margin-bottom: 20px; + padding: 10px 5px 5px 5px; + background: #fff; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); + position: relative; +} +.title_box { + display: flex; + align-items: center; + margin-bottom: 10px; +} +.title{ + white-space: nowrap; + max-width: 210px; + overflow: hidden; +} +.name_box { + display: flex; + align-items: center; + flex: 1; +} +.title_box .date { + margin-right: 10px; +} +.list_box { + display: flex; + flex-wrap: wrap; +} +.item { + margin: 0px 0 10px 10px; + border-radius: 7px; + overflow: hidden; + box-shadow: 0 2px 6px 0 rgb(132 93 90 / 30%); + height: 70px; + width: 70px; + background: #e9e5dc; + position: relative; +} +.item .role_img { + width: 100%; + overflow: hidden; + background-size: 100%; + background-repeat: no-repeat; + position: absolute; + top: 0; + /*filter: contrast(95%);*/ +} +.item .num { + position: absolute; + top: 0px; + right: 0px; + z-index: 9; + font-size: 18px; + text-align: center; + color: #fff; + border-radius: 3px; + padding: 1px 5px; + border-radius: 3px; + background: rgb(0 0 0 / 50%); + font-family: "tttgbnumber"; +} +.label_301 { + background-color: rgb(235 106 75); +} +.label_302 { + background-color: #e69449; +} +.label_200 { + background-color: #757cc8; +} + +.label { + color: #fff; + border-radius: 10px; + font-size: 16px; + padding: 2px 7px; + vertical-align: 2px; +} +.bg5 { + background-image: url(../../img/other/bg5.png); + width: 100%; + height: 70px; + /*filter: brightness(1.1);*/ + background-size: 100%; + background-repeat: no-repeat; +} +.bg4 { + width: 100%; + height: 70px; + background-image: url(../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} +.list_box .item .life1 { + background-color: #62a8ea; +} +.list_box .item .life2 { + background-color: #62a8ea; +} +.list_box .item .life3 { + background-color: #45b97c; +} +.list_box .item .life4 { + background-color: #45b97c; +} +.list_box .item .life5 { + background-color: #ff5722; +} +.list_box .item .life6 { + background-color: #ff5722; +} +.logo { + font-size: 14px; + font-family: "tttgbnumber"; + text-align: center; + color: #7994a7; +} +.hasMore{ + font-size: 12px; + margin: -6px 0 10px 6px; + color: #7f858a; +} diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/logCount/logCount.html b/src/Yunzai-Bot/plugins/genshin/resources/html/logCount/logCount.html new file mode 100644 index 0000000000000000000000000000000000000000..90e7d197d5076d1aa487743722e8f058c6003985 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/logCount/logCount.html @@ -0,0 +1,65 @@ + + + + + + + + + + + {{@headStyle}} + + +
+
+
ID: {{uid}}
+

抽卡统计-{{typeName}}

+ +
+ {{each pool val}} + {{if val.roleNum > 0}} +
+
+
+

「{{val.five}}」

+ {{val.count}}抽 +
+ {{if typeName != "常驻"}} + {{val.start}} - {{val.end}} + {{/if}} +
+
+ {{each val.role v}} +
+
+ {{v.count}} + {{if v.item_type=='角色'}} + + {{/if}} + {{if v.item_type=='武器'}} + + {{/if}} +
+ {{/each}} +
+
+ {{/if}} + {{/each}} + {{if isGroup }} +
*完整数据请私聊查看
+ {{/if}} + +
+ + + diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/mysNews/iconfont.fb3712d.woff2 b/src/Yunzai-Bot/plugins/genshin/resources/html/mysNews/iconfont.fb3712d.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..599ef5c6522e2f97ee4dbabae31d0a79368f219d Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/html/mysNews/iconfont.fb3712d.woff2 differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/mysNews/mys.png b/src/Yunzai-Bot/plugins/genshin/resources/html/mysNews/mys.png new file mode 100644 index 0000000000000000000000000000000000000000..464c5ee5609de4be35fb858bcf8b27cad672b0c9 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/html/mysNews/mys.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/mysNews/mysNews.css b/src/Yunzai-Bot/plugins/genshin/resources/html/mysNews/mysNews.css new file mode 100644 index 0000000000000000000000000000000000000000..6a34be3971bf043006bef4237a7a150fbe06e1ad --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/mysNews/mysNews.css @@ -0,0 +1,3158 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; + /* font-family: sans-serif; */ +} +body { + transform: scale(1); + transform-origin: 0 0; +} +.container { + width: 900px; + background-color: #fff; + font-size: 22px; + letter-spacing: 1px; + /* max-height: 7000px; */ + /* overflow: hidden; */ + /* overflow-y: scroll; */ +} + +.mhy-layout { + zoom: 1; +} +.mhy-layout::after { + content: ""; + display: block; + visibility: hidden; + height: 0; + clear: both; + font-size: 0; +} +.mhy-layout { + zoom: 1; +} +.mhy-layout::after { + content: ""; + display: block; + visibility: hidden; + height: 0; + clear: both; + font-size: 0; +} +.ql-toolbar.ql-snow.ql-format-disabled button.ql-bold, +.ql-toolbar.ql-snow.ql-format-disabled button.ql-align, +.ql-toolbar.ql-snow.ql-format-disabled button.ql-italic, +.ql-toolbar.ql-snow.ql-format-disabled button.ql-header { + pointer-events: none; +} +.ql-toolbar.ql-snow.ql-format-disabled button.ql-bold .ql-stroke, +.ql-toolbar.ql-snow.ql-format-disabled button.ql-align .ql-stroke, +.ql-toolbar.ql-snow.ql-format-disabled button.ql-italic .ql-stroke, +.ql-toolbar.ql-snow.ql-format-disabled button.ql-header .ql-stroke { + stroke: #ebebeb !important; +} +.ql-toolbar.ql-snow.ql-format-disabled button.ql-bold .ql-fill, +.ql-toolbar.ql-snow.ql-format-disabled button.ql-align .ql-fill, +.ql-toolbar.ql-snow.ql-format-disabled button.ql-italic .ql-fill, +.ql-toolbar.ql-snow.ql-format-disabled button.ql-header .ql-fill { + fill: #ebebeb !important; +} +.mhy-clear-placeholder .ql-editor.ql-blank:focus::before { + content: ""; +} +.mhy-simple-editor .ql-tooltip { + display: none; +} +.mhy-simple-editor .ql-container { + border: none; + white-space: pre-wrap; +} +.mhy-simple-editor .ql-container img:not(.emoticon-image, .lottery-icon) { + display: block; +} +.mhy-simple-editor .ql-editor { + font-size: 14px; + padding: 10px; + white-space: pre-wrap; +} +.mhy-simple-editor .ql-editor[contenteditable="false"] { + background: #f0f1f5; +} +.mhy-simple-editor .ql-editor.ql-blank::before { + color: #ccc; + font-style: normal; +} +.mhy-simple-editor .ql-editor img { + height: auto; + max-width: 100%; +} +.mhy-simple-editor .quill-mention { + display: inline-block; + color: #00b2ff; + text-decoration: none !important; +} +.mhy-simple-editor .quill-lottery { + display: inline-block; + color: #00b2ff; + text-decoration: none !important; +} +.mhy-simple-editor .quill-lottery > span { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + vertical-align: middle; +} +.mhy-simple-editor .ql-blot-focused { + position: relative; +} +.mhy-simple-editor .ql-blot-focused * { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.mhy-simple-editor .ql-blot-del { + position: absolute; + cursor: pointer; + right: -15px; + top: -15px; + width: 30px; + height: 30px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAADSElEQVRIS8WXyU9UQRCHv4oiSBwxinENuEMQNYpbwMQFoxe9GHGJf4ACbhe3k3pyu7gi/gFGjRoPnjRiSBSCshgViStmjCtu4CCLYtrUm3nD+MYHb5Bgnybzquqr7qru/rXgYRhj4oHlwDJgNjABGBpy/QLUA1XAdeCaiLR3F1a6MjDGDAG2AZuB5O6Chb5/Ak4BR0Wk0c3HFWyMWQscA0aoc3UzXPwMJU3wpA0CP4MhfXGQlgC5SZA3DLIGhVEfNGkRufA3eBTYGNMPOA4UqENpE+z0Q2XA23xn++BIKixKCtufBraKSEdkhD/AIeh5YHVTB+zyw5n33oBOq40j4VAqJPW3vlwG1orIL9vOCdbaFHz6CQsfQd33nkFtr/REuJUJyXHWP0UiUhgFDtX0vM40+yHUtfwb1PbOSITyaeGZrxcRXVGsGYe69ykwfNOLni+vW6q67MUTra8fgSna7TZ4H7C3pBGWPuqdmTqj3JgKubo5Yb+I7BNjjFbgre7TOQ+gymP3xpqednvldMtL9/loBa8Art5rhln33cNdSoeZibCkDvxtf9qlJsDNDKhpgbzH7jFqZsDM4D5fqeCTQOEePxx87e7kz4KUBHjTDjm1nXCFlmXCmPjgf+Oq3WPsHgsHUq3vpxRcAczrbpknDITbmTBqQCdcI9jQdz9gQS3Ut7qDs3xQFVzuOwpu0G4efLfzGHRzdcLVTmfqBaq2g+IgMDfY3QrWo6yflHlrl0i4eniF2tFNjvWrI2ZwZE01grPmXaYvYLItix8xLXUkVGeqI7Lmzm53JqE32bfgUjd4bi4nVBtJh7PhuoI7m8vTdno2CyYNjK5pZM2ft8LkGk/bqcjzAXJ2CmT7ILcuessovCQDygOwQU98l+E8QP7PkanJGWP6/pIIgfXe6KtrMU1EvoYViDFmHXBOhcD8h/C4l4SAqpAKNyEQPlWMKQLyLelT++8qxCF9ikUk32Y5NZdKM5Wjq3pZ7F0B1kQqTTd5e0JnrtmVNsKOV94Fgl74h1NgcVBt6CgGtnQpbyO3X5SgDwQF/Y0meNYO30IqeXB/mBwPS21B7wtHiU3QO+Ca93YVCn32hHEk4Hy0jQfsxdT30ctYH22/AYdWeyx9uWZJAAAAAElFTkSuQmCC) + 50% no-repeat; + background-size: cover; + display: none; + z-index: 100; +} +.mhy-simple-editor .ql-frame { + position: relative; +} +.mhy-simple-editor .ql-frame::after { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 100; +} +.mhy-simple-editor .ql-frame.ql-blot-focused { + -webkit-box-shadow: 0 0 0 2px #00c3ff; + box-shadow: 0 0 0 2px #00c3ff; +} +.mhy-simple-editor .ql-frame.ql-blot-focused::after { + display: none; +} +.mhy-simple-editor .ql-frame.ql-blot-focused .ql-blot-del { + display: block; +} +.mhy-simple-editor .ql-link-card { + position: relative; + width: 520px; + margin: auto; + border-radius: 8px; + cursor: pointer; +} +.mhy-simple-editor .ql-link-card.ql-blot-focused { + -webkit-box-shadow: 0 0 0 2px #00c3ff; + box-shadow: 0 0 0 2px #00c3ff; +} +.mhy-simple-editor .ql-link-card.ql-blot-focused::after { + display: none; +} +.mhy-simple-editor .ql-link-card.ql-blot-focused .ql-blot-del { + display: block; +} +.mhy-simple-editor .mhy-vod { + width: 698px; + height: 392px; +} +.mhy-img-text-article.ql-snow .ql-editor h1, +.mhy-simple-editor .ql-snow .ql-editor h1 { + font-size: 20px; +} +.mhy-img-text-article.ql-snow .ql-editor h2, +.mhy-simple-editor .ql-snow .ql-editor h2 { + font-size: 18px; +} +.mhy-img-text-article.ql-snow .ql-editor h3, +.mhy-img-text-article.ql-snow .ql-editor h4, +.mhy-img-text-article.ql-snow .ql-editor h5, +.mhy-img-text-article.ql-snow .ql-editor h6, +.mhy-simple-editor .ql-snow .ql-editor h3, +.mhy-simple-editor .ql-snow .ql-editor h4, +.mhy-simple-editor .ql-snow .ql-editor h5, +.mhy-simple-editor .ql-snow .ql-editor h6 { + font-size: 16px; + font-weight: normal; +} +.ql-editor .ql-image { + display: block; + text-align: center; + font-size: 0; +} +.ql-editor .ql-image:first-child { + margin-top: 0; +} +.ql-editor .ql-image img { + display: block; + margin: 0 !important; + -webkit-box-sizing: border-box; + box-sizing: border-box; + cursor: default; +} +.ql-editor .ql-image + .ql-image { + margin-top: 0; +} +.reply-editor .ql-editor .ql-image { + text-align: left; + margin: 15px 0; +} +.reply-editor .ql-editor .ql-image .ql-image-box { + max-width: 90%; +} +.reply-editor .ql-editor .ql-image .ql-image-box img { + max-width: 100%; +} +.ql-editor .ql-image .ql-image-config { + display: none; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + font-size: 14px; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + padding: 0 14px 14px; + z-index: 10; +} +.ql-editor .ql-image .ql-image-config button { + display: inline-block; + min-width: 84px; + height: 34px; + background-color: rgba(0, 0, 0, 0.7); + border-radius: 4px; + color: #fff; + border: none; + padding: 0 14px; + text-align: center; + cursor: pointer; +} +.ql-editor .ql-image .ql-image-config button.ql-image-cover-remove { + margin-left: 10px; +} +.ql-editor .ql-image .ql-image-cover-label { + position: absolute; + top: 1px; + left: 1px; + background-color: #00c3ff; + color: #fff; + font-size: 16px; + width: 78px; + height: 34px; + line-height: 34px; + text-align: center; + z-index: 100; + display: none; +} +.ql-editor .ql-image.ql-blot-focused img { + border-color: #00c3ff; + -webkit-box-shadow: 0 0 0 1px #00c3ff; + box-shadow: 0 0 0 1px #00c3ff; +} +.ql-editor .ql-image.ql-blot-focused .ql-blot-del { + display: block; +} +.ql-editor .ql-image.ql-blot-focused .ql-image-config { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.ql-editor .ql-image.ql-blot-focused .ql-image-cover-set { + display: inline-block; +} +.ql-editor .ql-image.ql-blot-focused .ql-image-cover-update, +.ql-editor .ql-image.ql-blot-focused .ql-image-cover-remove { + display: none; +} +.ql-editor .ql-image.ql-image-cover .ql-image-cover-label { + display: block; +} +.ql-editor .ql-image.ql-image-cover .ql-image-cover-set { + display: none; +} +.ql-editor .ql-image.ql-image-cover .ql-image-cover-update, +.ql-editor .ql-image.ql-image-cover .ql-image-cover-remove { + display: inline-block; +} +.ql-editor .ql-image-box { + display: inline-block; + font-size: 0; + position: relative; + max-width: 100%; +} +.ql-editor .ql-image-box img { + border: 1px solid #f5f5f5; +} +.ql-editor img:not(.emoticon-image, .lottery-icon) { + display: block; + margin: 0 auto; + height: auto; + max-width: 100%; +} +.ql-editor img:not(.emoticon-image, .lottery-icon) + img:not(.emoticon-image) { + margin-top: 0; +} +.reply-editor .ql-editor img:not(.emoticon-image, .lottery-icon) { + margin: 15px 0; + max-width: 90%; +} +.ql-editor .ql-image + iframe, +.ql-editor iframe + .ql-image, +.ql-editor img:not(.emoticon-image) + iframe, +.ql-editor iframe + img:not(.emoticon-image), +.ql-editor .ql-image + .ql-frame, +.ql-editor .ql-frame + .ql-image, +.ql-editor img:not(.emoticon-image) + .ql-frame, +.ql-editor .ql-frame + img:not(.emoticon-image) { + margin-top: 0; +} +.ql-editor iframe, +.ql-editor .ql-frame { + display: block; + margin-bottom: 15px; +} +.ql-editor iframe:first-child, +.ql-editor .ql-frame:first-child { + margin-top: 0; +} +.ql-editor iframe + iframe, +.ql-editor iframe + .ql-frame, +.ql-editor .ql-frame + iframe, +.ql-editor .ql-frame + .ql-frame { + margin-top: 0; +} +.ql-editor .ql-frame iframe { + margin: 0; +} +.ql-editor .emoticon-image { + display: inline-block; +} +.ql-editor img.lottery-icon { + width: 20px; + height: 20px; + margin-left: 4px; + margin-right: 5px; +} +/* .mhy-vod { + display: block; + width: 600px; + height: 338px; + position: relative; + margin: 20px 0; + border: 1px solid #f5f5f5; +} */ +.mhy-vod:first-child { + margin-top: 0; +} +.mhy-vod.ql-blot-focused { + border-color: #00c3ff; + -webkit-box-shadow: 0 0 0 1px #00c3ff; + box-shadow: 0 0 0 1px #00c3ff; +} +.mhy-vod.ql-blot-focused::after { + display: none; +} +.mhy-vod.ql-blot-focused .ql-blot-del { + display: block; +} +.mhy-vod.cover-uploading .mhy-vod__cover { + background-size: contain; + background-color: #f6f6f6; +} +.mhy-vod__cover { + width: 100%; + height: 100%; + background-position: center; + background-repeat: no-repeat; + background-size: cover; +} +.mhy-vod__edit { + position: absolute; + z-index: 10; + left: 50%; + top: 50%; + cursor: pointer; + width: 110px; + height: 34px; + margin-left: -55px; + margin-top: -17px; + background-color: rgba(0, 0, 0, 0.7); + border-radius: 4px; + color: #fff; + 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; + font-size: 14px; +} +.mhy-vod__edit .mhy-icon { + font-size: 18px; + margin-right: 6px; +} +.mhy-vod__duration { + position: absolute; + z-index: 10; + right: 12px; + bottom: 12px; + height: 28px; + background-color: rgba(0, 0, 0, 0.7); + padding: 0 10px; + border-radius: 4px; + color: #fff; + 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; + font-size: 14px; +} +.mhy-vod__duration .mhy-icon { + font-size: 18px; + margin-right: 6px; +} +.mhy-vod .mhy-video-player__layer { + cursor: pointer; +} +.mhy-vod.mhy-vod-transcoding { + background-position: center; + background-repeat: no-repeat; + background-size: cover; + 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; +} +.mhy-vod.mhy-vod-transcoding::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + z-index: 5; +} +.mhy-vod.mhy-vod-transcoding::after { + position: relative; + z-index: 10; + content: "视频转码中..."; + line-height: 1; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAQAAACTbf5ZAAAK7ElEQVR42u1dfUxTVxuvYYaFjIWMZcnUGbcsS8yrLJnJDBpfs4iLMaGC4iSGMVCHimZO5mvmR16SLbJIVNRFAmRukuWVgVuQDVh0k2YbgwLtBUopq3xVPmtpCvRDaQvty73PvbSUS3tOewq3xPP8Azc953l+556P33nOc84ViZ4l9FS/tnkzFSt5YaH0SV6gYps3169dBKiy9Y++t447meSYMlDKDOeyYOpzLlNmGCjHFGi0jj/6XrZ+4d7rmv47jkmnRzJQdSuDpbFupYHy1OeY7L9TvyboYGtXaL6dsjp5k3mgdkVwdJoH+DVOWTXfBkcn9KConut2s0tdf1Nx7skTX3xeX2qzwBPdX8HQq/sLSrdZ6ku/+PzkieLc/iaXFXZzz3VJVBCGi4df2sZdarSKc6dE8ZzsSBvTwPOWRNKaWxKh5DHNjjSXxnOntAqXNbbxh18SHDply/85/UTnKl7/8NJ5l2qQpEOTE0xF3CcNWHufLndyIumQp85L5/UPXVY90f1zWracwOjYfsTi1oPG+wovhIk9VdOiusfUtYk0YJuJLld1j09nmLjwwnifyzrLQPuRgGaL+rWGZrdBSVuaF84LlpbiXPgV2Vmyfi2UWpw7n95wcWmeWes2WzT7bYF8g3WMK2bCUFkQnTifUlrSjsAvFWkkASvSoNS0I950RydWFkwYOFutY/IN/kwGkeZ+dkgw1xSv2uNNIS0RuyaZ6ar7KknA3VeZHmyN2OVL/6o9NcU2dg4x99dGYqvqYpuoVrkpxZcyEBhCtA+IDlkPYJhEs2BTilYJVnflYg9WT/V0RtPwm3vRlE0PW/eBfpAEDJRDdR/Vhjf3mobpHNPW4w1eso1QUz/koaoSxVcXAueTvkgKrvRFp4MusroQ3Yof8sBy2UYsVdOLASbFpaKrunAG8lBxpABTcVDihTPoVsSlQh5lBpaqjizIFpWAriomGfJ0nCEFuIOtwphkdCuiElgrsrBUtbLGZx5HVyWKtzB8rK+EFOC+EoZO6HBsyDwOlrcm4/Xh1dB7ZOU4yvoamam/lRRgQytTgY04NsjKYSSRrcZUppczC7DJrE/RldWXMusXCynAdmYVVl+KbkHWp1PMSl0vx1bWugeahmkIfWK6dZEkveRo5a2LGJPSENug9/ihcOAnyNwpQVVIll6i0Up36ZRAjoGf/PM0RBrZVW4p4mxMll6i00qQUnYGNmr8IJaQGmLBnTP5NP2oZ/Hv7ldUKyo9aSdJeslPKzelKCoV1e/u97Qn/ejkU3D7NMQGoFTNzoSjPa96LB8UVXzNnSS95KeV0GwVVbOfvrpntAcsVQfKArS/s/2ycrYK5a8wis/mYuToJT+tjEuFUVj5q0f1V7JLnd8D92a9/GQYCivKcVdx7hQ8/bskOPSSn1b+XQJP3T1qoviiHNbNMyx5mUDTat4OXmibSXxgbn+dGHN3DJCjl3y0MjpxYmxuvxYfADeQY7J5OyEC0MXOr7qOSDduXXIFnpZcCQa95KOVfBojE3Qd7Br4IsGNDr0UCpWW+apvUvSSj1bytSlpGetLlRLd7JGuYn1GDncXLV+PIkUv59JKvlHj0nkY2iYM0lWE3aXTVJMtekuK55jZ+QdpeslHKzv/8JwXtqRwr8EvKukr9RaAEYOUyzM914gZerk/IFq535NWzq3cMPEgu8XWWxCcLdLlo+z2BnWX80/PbWZbUuCJ6lggulTHoBRXa/LsPuFi6i5LihQEdhzmoZpvwQRAj9ff5MSlxiTHJBu6mIY+viWF/m/rh6rfSMzE3Cys+m3rh3S5042X2dkydNH/xaV+k8ONzTZTw1tB3C5V7HXYnQjJMlAWFoiesjDLAIoeh12xVxTc1JrMvWVvZjQnBEx3EnxXrc2E6cjxLzW+1nfbbvH2dlvFRKpW7O0t2y19txtfEy1Uqg6ntikzOrJAHuc/vgF/qY5R2wJrzLMbNrVNdYzVceNxPqdPmUFtqw4XPUvPUjBS3Uoqri2l/TDX3IIl7YfbUqi44EUK+aYh73Tl6upsRucCJ5tRV9eVK3tnId/pS+psY69zkZOxV51d91LQwUqiuq+4hy4tbrKbu68EIWTJ3VP8dGRW9F0nVXH78tnPdqbHJKM6U/2TiF0xyTvTz352+zJVYeh0t+HpCNkgCzen2lCVS41p6N5N97iphZUdafducnsMdBqqIrcnPbM+5ZzydOjSza/CxIsF1rU4vPmVK2TJqCEaPdQQCwEQ0ytfW01xZMJig3X5s2qKp2xs09YH5ICftVR7mwsUNg3i7RcvhGQeNw1yQcXU20SWClzYobZt3T6hwaVl3T5tGxd+GPByQrZcz7pRBuWv7BYiXFpe2T0oZ32XVIDej56voaAR9eokocKlZXWSXg2W9nwdyPvdOMUswidG3/9IyHBpef+jiVFmWLVjBiy5J30j1Nq1bKHDpeVaNtusG/2E27Kb3YCsCQW4tKhr2DD13f693wbYYN6ZHiqAd6bDBr6+wa/Zl62tX0IFLi0tv7BOYvwZuTcfHJDJH4cS4OSPYUOoNx8/4EADZCOU4NICJMSswYTb9AY0De9xrHxr1PljMEn9Dimm19n0Bhbg9sOQbW70jtABpx+FfO2HsQA/ugX+I+/LQCECDhODn+3RLbwpiTn7NdTivXAhAhbFD7UwU1MTFmA4zyIvD0XA8nI424Lj31iDFnIoTMBcCCLG2dO2DyDLJydCEfAnJyBn2weYYUqOSe9Hs4QKODoR4sowwpiGquE8p6+ihQlYFA9nXYeqkQEbe9DipPkMpEMSZkviAbK/833kAwJQjT2ouwvPQ5N48B1+3ZJ+m/699QffQZeUPI8WbLAZis3LDlXAeawroHkzWsjQSfxDWsICzB3WUp3EoJXTE3d8qAIWxQNxQqSXaLRS2ICx6CUarRQ2YAx6iUorhQ0Yg16i0kphA8agl6i0UtiAMeglKq0Ec4LNqvh/R5ReotJKIXNpDHqJRyuFDBiRXuLRSiEDRqSXeLRSyIAR6SUerRQyYER6iUcrhQ0YiV7i0UphA0agl7i0UtiAEeglLq0UNmAEeolLK4UNGIFe4tBKYXNpRHqJQytDAbAPehmIt1KYgH3Qy0C8lcIE7INeBuKtFCZgH/QyEG+lMAH7oJcQd+eft1KogFl6yR+b94S5HZKqWEqAqQq47oIXsIOJcKoqWEqAq4vgBmzeQxx8l1SEOuCyq5CD5zqi2kj8ew75YmjQtjdJ/24++d9lQMV7pMtJoEkLTaoK5m3SM4PWz0sJMPUznIXgBTzC3MaiUy0lwDoVc4BBygsYbihzTOH0EWHLun3w3YCe6/xcejt08Ls3lgrginyvV2w4l1kG4ahduHgpwA0Xw1G9aVTzXUvEXbH847WlAPjONZ/XTkmi4KZ/6/h7qaEO971UqxG+EOD1hLH6LNTKsMK/7VKhSHQidzxPfdbHzRncR0K6/xTOKVJcidjV/Sf3QRWft4o0vG4d5b7UIczDlb4no34Ze97U0PA6ygGef3MXz5iHL54LNbgXz3EfQbBbqK3IlztZZz5TopGe/0+ogM0+rZHOfPxgHOuCK3nMeJfbFRL9svKinIOZG/bzrV0WXw5mFuXIyo1uVxUZu+QxuCdLI3oL0e7OElpy2DVFsgj/jtOuH6wILdAO+2B5gN/aql2h/u+IFG72FXKyW0ak6rPELnuUPNf4r9aktoPBvmLIH1Eeak1qWid57tlFULzp/w3RmR7xyaBbAAAAAElFTkSuQmCC) + center top no-repeat; + background-size: 60px 60px; + height: 60px; + padding-top: 66px; + margin-top: 3px; + color: #fff; + font-size: 14px; +} +.ql-divider img { + max-width: 100%; +} +.ql-divider.ql-blot-focused { + -webkit-box-shadow: 0 0 0 2px #00c3ff; + box-shadow: 0 0 0 2px #00c3ff; +} +.ql-divider.ql-blot-focused .ql-blot-del { + display: block; +} +html { + font-family: "Microsoft YaHei", "微软雅黑", Helvetica, Arial, sans-serif; + font-size: 14px; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + -moz-osx-font-smoothing: grayscale; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +html, +body { + background-color: #f0f1f5; + color: #333; +} +html > a, +body > a { + display: none; +} +*, +*::before, +*::after { + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + outline: none; +} +ul, +li { + list-style: none; +} +.root { + width: 100%; +} +.root.root-iframe .root-page-container { + padding: 62px 0 0; +} +.root.root-iframe .footer { + display: none; +} +a { + text-decoration: none; + outline: none; + color: #00c3ff; +} +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #ccc; +} +input::-moz-placeholder, +textarea::-moz-placeholder { + color: #ccc; +} +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #ccc; +} +input::-ms-input-placeholder, +textarea::-ms-input-placeholder { + color: #ccc; +} +input::placeholder, +textarea::placeholder { + color: #ccc; +} +.pointer { + cursor: pointer; +} +.error-color { + color: #ff667f !important; +} +.root-page-container { + padding: 62px 0; + background: url(/_nuxt/img/background.cd0a312.png) no-repeat 0 62px; + background-size: 100%; +} +.mhy-main-page { + padding-top: 30px; +} +.main-loading { + padding: 100px 0; + height: 40px; + width: 100%; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +.main-loading::after { + content: ""; + display: block; + height: 40px; + background: no-repeat + url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IuWbvuWxgl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCiAgICAgeT0iMHB4IgogICAgIHZpZXdCb3g9Ii0zNTIgMTc2IDUwIDUwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IC0zNTIgMTc2IDUwIDUwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3QyewoJICBmaWxsOiNiZmVjZmY7CiAgICBhbmltYXRpb246IG1haW4tbG9hZGluZyAxcyBsaW5lYXIgaW5maW5pdGU7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiAtMzI3cHggMjAxcHg7Cgl9CgogIEBrZXlmcmFtZXMgbWFpbi1sb2FkaW5nIHsKICAgIDAlIHsKICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICB9CgogICAgNTAlIHsKICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsKICAgIH0KCiAgICA5OS45OSUgewogICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgfQogIH0KPC9zdHlsZT4KICA8cGF0aCBjbGFzcz0ic3QyIiBkPSJNLTMwNC4xLDIwMmMtMSwwLTEuOCwwLjctMiwxLjdjLTEuMywxMC4zLTEwLjEsMTguMy0yMC44LDE4LjNjLTExLjMsMC0yMC40LTguOS0yMS0yMGMwLTAuMywwLTAuNiwwLTEKCWMwLTExLDguNC0yMCwxOS4yLTIwLjljMS0wLjEsMS44LTAuOSwxLjgtMmwwLDBjMC0xLjItMS0yLjEtMi4yLTJjLTEyLjgsMS4xLTIyLjgsMTEuOC0yMi44LDI0LjljMCwwLjMsMCwwLjYsMCwxCgljMC41LDEzLjQsMTEuNSwyNCwyNSwyNGMxMi43LDAsMjMuMi05LjUsMjQuOC0yMS44Qy0zMDIsMjAzLTMwMi45LDIwMi0zMDQuMSwyMDJMLTMwNC4xLDIwMnoiLz4KPC9zdmc+Cg==) + center; + background-size: 40px 40px; +} +.frame-loading { + position: fixed; + 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; + left: 0; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + width: 100%; + padding: 0; + height: 100px; +} +.frame-loading__inner { + position: relative; + width: 10px; + height: 30px; + -webkit-animation: rectangle infinite 1s ease-in-out -0.2s; + animation: rectangle infinite 1s ease-in-out -0.2s; + background-color: #d9d9d9; +} +.frame-loading__inner::before, +.frame-loading__inner::after { + position: absolute; + width: 10px; + height: 30px; + content: ""; + background-color: #d9d9d9; +} +.frame-loading__inner::before { + left: -20px; + -webkit-animation: rectangle infinite 1s ease-in-out -0.4s; + animation: rectangle infinite 1s ease-in-out -0.4s; +} +.frame-loading__inner::after { + right: -20px; + -webkit-animation: rectangle infinite 1s ease-in-out; + animation: rectangle infinite 1s ease-in-out; +} +@-webkit-keyframes rectangle { + 0%, + 80%, + 100% { + height: 35px; + -webkit-box-shadow: 0 0 #d9d9d9; + box-shadow: 0 0 #d9d9d9; + } + 40% { + height: 45px; + -webkit-box-shadow: 0 -20px #d9d9d9; + box-shadow: 0 -20px #d9d9d9; + } +} +@keyframes rectangle { + 0%, + 80%, + 100% { + height: 35px; + -webkit-box-shadow: 0 0 #d9d9d9; + box-shadow: 0 0 #d9d9d9; + } + 40% { + height: 45px; + -webkit-box-shadow: 0 -20px #d9d9d9; + box-shadow: 0 -20px #d9d9d9; + } +} +.mhy-layout { + width: 1000px; + margin: 0 auto; + padding-left: 100px; + padding-right: 100px; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +.mhy-layout__main { + /* width: 700px; */ +} +.mhy-layout__subtitle { + height: 50px; + line-height: 50px; + border-bottom: 1px solid #ebebeb; + padding: 0 20px; + background-color: #fff; + font-size: 16px; + font-weight: 600; +} +.mhy-layout__sub { + float: right; + width: 280px; +} +.mhy-container { + background-color: #fff; + border-radius: 4px; +} +.mhy-container__footer { + height: 70px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border-top: 1px solid #ebebeb; +} +.mhy-forum { + padding-top: 56px; +} +.mhy-link:hover { + color: #00c3ff; +} +.mhy-title { + font-size: 16px; + font-weight: 600; + line-height: 20px; +} +.mhy-toast { + border-radius: 4px !important; + padding: 10px 20px !important; +} +.img-scale { + height: 100%; + width: 100%; + background-repeat: no-repeat; + background-size: cover; + -webkit-transition: -webkit-transform 300ms ease; + transition: -webkit-transform 300ms ease; + -o-transition: transform 300ms ease; + transition: transform 300ms ease; + transition: transform 300ms ease, -webkit-transform 300ms ease; +} +.img-scale:hover { + -webkit-transform: scale(1.2); + -ms-transform: scale(1.2); + transform: scale(1.2); +} +.ql-container { + font-family: inherit; +} +@-webkit-keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@-webkit-keyframes fade-out { + from { + opacity: 1; + } + to { + opacity: 0; + } +} +@keyframes fade-out { + from { + opacity: 1; + } + to { + opacity: 0; + } +} +/*! + * Quill Editor v1.3.7 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container { + -webkit-box-sizing: border-box; + box-sizing: border-box; + /* font-family: Helvetica, Arial, sans-serif; */ + font-size: 28px; + height: 100%; + margin: 0px; + position: relative; +} +.ql-container.ql-disabled .ql-tooltip { + visibility: hidden; +} +.ql-container.ql-disabled .ql-editor ul[data-checked] > li::before { + pointer-events: none; +} +.ql-clipboard { + left: -100000px; + height: 1px; + overflow-y: hidden; + position: absolute; + top: 50%; +} +.ql-clipboard p { + margin: 0; + padding: 0; +} +.ql-editor { + -webkit-box-sizing: border-box; + box-sizing: border-box; + line-height: 48px; + height: 100%; + outline: none; + overflow-y: auto; + padding: 20px 20px 20px 20px; + -o-tab-size: 4; + tab-size: 4; + -moz-tab-size: 4; + text-align: left; + white-space: pre-wrap; + word-wrap: break-word; +} +.ql-editor > * { + cursor: text; +} +.ql-editor p, +.ql-editor ol, +.ql-editor ul, +.ql-editor pre, +.ql-editor blockquote, +.ql-editor h1, +.ql-editor h2, +.ql-editor h3, +.ql-editor h4, +.ql-editor h5, +.ql-editor h6 { + margin: 0; + padding: 0; + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol, +.ql-editor ul { + padding-left: 1.5em; +} +.ql-editor ol > li, +.ql-editor ul > li { + list-style-type: none; +} +.ql-editor ul > li::before { + content: "•"; +} +.ql-editor ul[data-checked="true"], +.ql-editor ul[data-checked="false"] { + pointer-events: none; +} +.ql-editor ul[data-checked="true"] > li *, +.ql-editor ul[data-checked="false"] > li * { + pointer-events: all; +} +.ql-editor ul[data-checked="true"] > li::before, +.ql-editor ul[data-checked="false"] > li::before { + color: #777; + cursor: pointer; + pointer-events: all; +} +.ql-editor ul[data-checked="true"] > li::before { + content: "☑"; +} +.ql-editor ul[data-checked="false"] > li::before { + content: "☐"; +} +.ql-editor li::before { + display: inline-block; + white-space: nowrap; + width: 1.2em; +} +.ql-editor li:not(.ql-direction-rtl)::before { + margin-left: -1.5em; + margin-right: 0.3em; + text-align: right; +} +.ql-editor li.ql-direction-rtl::before { + margin-left: 0.3em; + margin-right: -1.5em; +} +.ql-editor ol li:not(.ql-direction-rtl), +.ql-editor ul li:not(.ql-direction-rtl) { + padding-left: 1.5em; +} +.ql-editor ol li.ql-direction-rtl, +.ql-editor ul li.ql-direction-rtl { + padding-right: 1.5em; +} +.ql-editor ol li { + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + counter-increment: list-0; +} +.ql-editor ol li:before { + content: counter(list-0, decimal) ". "; +} +.ql-editor ol li.ql-indent-1 { + counter-increment: list-1; +} +.ql-editor ol li.ql-indent-1:before { + content: counter(list-1, lower-alpha) ". "; +} +.ql-editor ol li.ql-indent-1 { + counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-2 { + counter-increment: list-2; +} +.ql-editor ol li.ql-indent-2:before { + content: counter(list-2, lower-roman) ". "; +} +.ql-editor ol li.ql-indent-2 { + counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-3 { + counter-increment: list-3; +} +.ql-editor ol li.ql-indent-3:before { + content: counter(list-3, decimal) ". "; +} +.ql-editor ol li.ql-indent-3 { + counter-reset: list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-4 { + counter-increment: list-4; +} +.ql-editor ol li.ql-indent-4:before { + content: counter(list-4, lower-alpha) ". "; +} +.ql-editor ol li.ql-indent-4 { + counter-reset: list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-5 { + counter-increment: list-5; +} +.ql-editor ol li.ql-indent-5:before { + content: counter(list-5, lower-roman) ". "; +} +.ql-editor ol li.ql-indent-5 { + counter-reset: list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-6 { + counter-increment: list-6; +} +.ql-editor ol li.ql-indent-6:before { + content: counter(list-6, decimal) ". "; +} +.ql-editor ol li.ql-indent-6 { + counter-reset: list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-7 { + counter-increment: list-7; +} +.ql-editor ol li.ql-indent-7:before { + content: counter(list-7, lower-alpha) ". "; +} +.ql-editor ol li.ql-indent-7 { + counter-reset: list-8 list-9; +} +.ql-editor ol li.ql-indent-8 { + counter-increment: list-8; +} +.ql-editor ol li.ql-indent-8:before { + content: counter(list-8, lower-roman) ". "; +} +.ql-editor ol li.ql-indent-8 { + counter-reset: list-9; +} +.ql-editor ol li.ql-indent-9 { + counter-increment: list-9; +} +.ql-editor ol li.ql-indent-9:before { + content: counter(list-9, decimal) ". "; +} +.ql-editor .ql-indent-1:not(.ql-direction-rtl) { + padding-left: 3em; +} +.ql-editor li.ql-indent-1:not(.ql-direction-rtl) { + padding-left: 4.5em; +} +.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 3em; +} +.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 4.5em; +} +.ql-editor .ql-indent-2:not(.ql-direction-rtl) { + padding-left: 6em; +} +.ql-editor li.ql-indent-2:not(.ql-direction-rtl) { + padding-left: 7.5em; +} +.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 6em; +} +.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 7.5em; +} +.ql-editor .ql-indent-3:not(.ql-direction-rtl) { + padding-left: 9em; +} +.ql-editor li.ql-indent-3:not(.ql-direction-rtl) { + padding-left: 10.5em; +} +.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 9em; +} +.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 10.5em; +} +.ql-editor .ql-indent-4:not(.ql-direction-rtl) { + padding-left: 12em; +} +.ql-editor li.ql-indent-4:not(.ql-direction-rtl) { + padding-left: 13.5em; +} +.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 12em; +} +.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 13.5em; +} +.ql-editor .ql-indent-5:not(.ql-direction-rtl) { + padding-left: 15em; +} +.ql-editor li.ql-indent-5:not(.ql-direction-rtl) { + padding-left: 16.5em; +} +.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 15em; +} +.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 16.5em; +} +.ql-editor .ql-indent-6:not(.ql-direction-rtl) { + padding-left: 18em; +} +.ql-editor li.ql-indent-6:not(.ql-direction-rtl) { + padding-left: 19.5em; +} +.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 18em; +} +.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 19.5em; +} +.ql-editor .ql-indent-7:not(.ql-direction-rtl) { + padding-left: 21em; +} +.ql-editor li.ql-indent-7:not(.ql-direction-rtl) { + padding-left: 22.5em; +} +.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 21em; +} +.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 22.5em; +} +.ql-editor .ql-indent-8:not(.ql-direction-rtl) { + padding-left: 24em; +} +.ql-editor li.ql-indent-8:not(.ql-direction-rtl) { + padding-left: 25.5em; +} +.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 24em; +} +.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 25.5em; +} +.ql-editor .ql-indent-9:not(.ql-direction-rtl) { + padding-left: 27em; +} +.ql-editor li.ql-indent-9:not(.ql-direction-rtl) { + padding-left: 28.5em; +} +.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 27em; +} +.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 28.5em; +} +.ql-editor .ql-video { + display: block; + max-width: 100%; +} +.ql-editor .ql-video.ql-align-center { + margin: 0 auto; +} +.ql-editor .ql-video.ql-align-right { + margin: 0 0 0 auto; +} +.ql-editor .ql-bg-black { + background-color: #000; +} +.ql-editor .ql-bg-red { + background-color: #e60000; +} +.ql-editor .ql-bg-orange { + background-color: #f90; +} +.ql-editor .ql-bg-yellow { + background-color: #ff0; +} +.ql-editor .ql-bg-green { + background-color: #008a00; +} +.ql-editor .ql-bg-blue { + background-color: #06c; +} +.ql-editor .ql-bg-purple { + background-color: #93f; +} +.ql-editor .ql-color-white { + color: #fff; +} +.ql-editor .ql-color-red { + color: #e60000; +} +.ql-editor .ql-color-orange { + color: #f90; +} +.ql-editor .ql-color-yellow { + color: #ff0; +} +.ql-editor .ql-color-green { + color: #008a00; +} +.ql-editor .ql-color-blue { + color: #06c; +} +.ql-editor .ql-color-purple { + color: #93f; +} +.ql-editor .ql-font-serif { + font-family: Georgia, Times New Roman, serif; +} +.ql-editor .ql-font-monospace { + font-family: Monaco, Courier New, monospace; +} +.ql-editor .ql-size-small { + font-size: 0.75em; +} +.ql-editor .ql-size-large { + font-size: 1.5em; +} +.ql-editor .ql-size-huge { + font-size: 2.5em; +} +.ql-editor .ql-direction-rtl { + direction: rtl; + text-align: inherit; +} +.ql-editor .ql-align-center { + text-align: center; +} +.ql-editor .ql-align-justify { + text-align: justify; +} +.ql-editor .ql-align-right { + text-align: right; +} +.ql-editor.ql-blank::before { + color: rgba(0, 0, 0, 0.6); + content: attr(data-placeholder); + font-style: italic; + left: 15px; + pointer-events: none; + position: absolute; + right: 15px; +} +.ql-snow.ql-toolbar:after, +.ql-snow .ql-toolbar:after { + clear: both; + content: ""; + display: table; +} +.ql-snow.ql-toolbar button, +.ql-snow .ql-toolbar button { + background: none; + border: none; + cursor: pointer; + display: inline-block; + float: left; + height: 24px; + padding: 3px 5px; + width: 28px; +} +.ql-snow.ql-toolbar button svg, +.ql-snow .ql-toolbar button svg { + float: left; + height: 100%; +} +.ql-snow.ql-toolbar button:active:hover, +.ql-snow .ql-toolbar button:active:hover { + outline: none; +} +.ql-snow.ql-toolbar input.ql-image[type="file"], +.ql-snow .ql-toolbar input.ql-image[type="file"] { + display: none; +} +.ql-snow.ql-toolbar button:hover, +.ql-snow .ql-toolbar button:hover, +.ql-snow.ql-toolbar button:focus, +.ql-snow .ql-toolbar button:focus, +.ql-snow.ql-toolbar button.ql-active, +.ql-snow .ql-toolbar button.ql-active, +.ql-snow.ql-toolbar .ql-picker-label:hover, +.ql-snow .ql-toolbar .ql-picker-label:hover, +.ql-snow.ql-toolbar .ql-picker-label.ql-active, +.ql-snow .ql-toolbar .ql-picker-label.ql-active, +.ql-snow.ql-toolbar .ql-picker-item:hover, +.ql-snow .ql-toolbar .ql-picker-item:hover, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected { + color: #06c; +} +.ql-snow.ql-toolbar button:hover .ql-fill, +.ql-snow .ql-toolbar button:hover .ql-fill, +.ql-snow.ql-toolbar button:focus .ql-fill, +.ql-snow .ql-toolbar button:focus .ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { + fill: #06c; +} +.ql-snow.ql-toolbar button:hover .ql-stroke, +.ql-snow .ql-toolbar button:hover .ql-stroke, +.ql-snow.ql-toolbar button:focus .ql-stroke, +.ql-snow .ql-toolbar button:focus .ql-stroke, +.ql-snow.ql-toolbar button.ql-active .ql-stroke, +.ql-snow .ql-toolbar button.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow.ql-toolbar button:hover .ql-stroke-miter, +.ql-snow .ql-toolbar button:hover .ql-stroke-miter, +.ql-snow.ql-toolbar button:focus .ql-stroke-miter, +.ql-snow .ql-toolbar button:focus .ql-stroke-miter, +.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { + stroke: #06c; +} +@media (pointer: coarse) { + .ql-snow.ql-toolbar button:hover:not(.ql-active), + .ql-snow .ql-toolbar button:hover:not(.ql-active) { + color: #444; + } + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { + fill: #444; + } + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { + stroke: #444; + } +} +.ql-snow { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.ql-snow * { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.ql-snow .ql-hidden { + display: none; +} +.ql-snow .ql-out-bottom, +.ql-snow .ql-out-top { + visibility: hidden; +} +.ql-snow .ql-tooltip { + position: absolute; + -webkit-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); +} +.ql-snow .ql-tooltip a { + cursor: pointer; + text-decoration: none; +} +.ql-snow .ql-tooltip.ql-flip { + -webkit-transform: translateY(-10px); + -ms-transform: translateY(-10px); + transform: translateY(-10px); +} +.ql-snow .ql-formats { + display: inline-block; + vertical-align: middle; +} +.ql-snow .ql-formats:after { + clear: both; + content: ""; + display: table; +} +.ql-snow .ql-stroke { + fill: none; + stroke: #444; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2; +} +.ql-snow .ql-stroke-miter { + fill: none; + stroke: #444; + stroke-miterlimit: 10; + stroke-width: 2; +} +.ql-snow .ql-fill, +.ql-snow .ql-stroke.ql-fill { + fill: #444; +} +.ql-snow .ql-empty { + fill: none; +} +.ql-snow .ql-even { + fill-rule: evenodd; +} +.ql-snow .ql-thin, +.ql-snow .ql-stroke.ql-thin { + stroke-width: 1; +} +.ql-snow .ql-transparent { + opacity: 0.4; +} +.ql-snow .ql-direction svg:last-child { + display: none; +} +.ql-snow .ql-direction.ql-active svg:last-child { + display: inline; +} +.ql-snow .ql-direction.ql-active svg:first-child { + display: none; +} +.ql-snow .ql-editor h1 { + font-size: 2em; +} +.ql-snow .ql-editor h2 { + font-size: 1.5em; +} +.ql-snow .ql-editor h3 { + font-size: 1.17em; +} +.ql-snow .ql-editor h4 { + font-size: 1em; +} +.ql-snow .ql-editor h5 { + font-size: 0.83em; +} +.ql-snow .ql-editor h6 { + font-size: 0.67em; +} +.ql-snow .ql-editor a { + text-decoration: underline; +} +.ql-snow .ql-editor blockquote { + border-left: 4px solid #ccc; + margin-bottom: 5px; + margin-top: 5px; + padding-left: 16px; +} +.ql-snow .ql-editor code, +.ql-snow .ql-editor pre { + background-color: #f0f0f0; + border-radius: 3px; +} +.ql-snow .ql-editor pre { + white-space: pre-wrap; + margin-bottom: 5px; + margin-top: 5px; + padding: 5px 10px; +} +.ql-snow .ql-editor code { + font-size: 85%; + padding: 2px 4px; +} +.ql-snow .ql-editor pre.ql-syntax { + background-color: #23241f; + color: #f8f8f2; + overflow: visible; +} +.ql-snow .ql-editor img { + max-width: 100%; +} +.ql-snow .ql-picker { + color: #444; + display: inline-block; + float: left; + font-size: 14px; + font-weight: 500; + height: 24px; + position: relative; + vertical-align: middle; +} +.ql-snow .ql-picker-label { + cursor: pointer; + display: inline-block; + height: 100%; + padding-left: 8px; + padding-right: 2px; + position: relative; + width: 100%; +} +.ql-snow .ql-picker-label::before { + display: inline-block; + line-height: 22px; +} +.ql-snow .ql-picker-options { + background-color: #fff; + display: none; + min-width: 100%; + padding: 4px 8px; + position: absolute; + white-space: nowrap; +} +.ql-snow .ql-picker-options .ql-picker-item { + cursor: pointer; + display: block; + padding-bottom: 5px; + padding-top: 5px; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label { + color: #ccc; + z-index: 2; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill { + fill: #ccc; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke { + stroke: #ccc; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-options { + display: block; + margin-top: -1px; + top: 100%; + z-index: 1; +} +.ql-snow .ql-color-picker, +.ql-snow .ql-icon-picker { + width: 28px; +} +.ql-snow .ql-color-picker .ql-picker-label, +.ql-snow .ql-icon-picker .ql-picker-label { + padding: 2px 4px; +} +.ql-snow .ql-color-picker .ql-picker-label svg, +.ql-snow .ql-icon-picker .ql-picker-label svg { + right: 4px; +} +.ql-snow .ql-icon-picker .ql-picker-options { + padding: 4px 0px; +} +.ql-snow .ql-icon-picker .ql-picker-item { + height: 24px; + width: 24px; + padding: 2px 4px; +} +.ql-snow .ql-color-picker .ql-picker-options { + padding: 3px 5px; + width: 152px; +} +.ql-snow .ql-color-picker .ql-picker-item { + border: 1px solid transparent; + float: left; + height: 16px; + margin: 2px; + padding: 0px; + width: 16px; +} +.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { + position: absolute; + margin-top: -9px; + right: 0; + top: 50%; + width: 18px; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=""])::before, +.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=""])::before, +.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=""])::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=""])::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=""])::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=""])::before { + content: attr(data-label); +} +.ql-snow .ql-picker.ql-header { + width: 98px; +} +.ql-snow .ql-picker.ql-header .ql-picker-label::before, +.ql-snow .ql-picker.ql-header .ql-picker-item::before { + content: "Normal"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + content: "Heading 1"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + content: "Heading 2"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + content: "Heading 3"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + content: "Heading 4"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + content: "Heading 5"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + content: "Heading 6"; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + font-size: 2em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + font-size: 1.5em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + font-size: 1.17em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + font-size: 1em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + font-size: 0.83em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + font-size: 0.67em; +} +.ql-snow .ql-picker.ql-font { + width: 108px; +} +.ql-snow .ql-picker.ql-font .ql-picker-label::before, +.ql-snow .ql-picker.ql-font .ql-picker-item::before { + content: "Sans Serif"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before { + content: "Serif"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before { + content: "Monospace"; +} +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before { + font-family: Georgia, Times New Roman, serif; +} +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before { + font-family: Monaco, Courier New, monospace; +} +.ql-snow .ql-picker.ql-size { + width: 98px; +} +.ql-snow .ql-picker.ql-size .ql-picker-label::before, +.ql-snow .ql-picker.ql-size .ql-picker-item::before { + content: "Normal"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before { + content: "Small"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before { + content: "Large"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before { + content: "Huge"; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before { + font-size: 10px; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before { + font-size: 18px; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before { + font-size: 32px; +} +.ql-snow .ql-color-picker.ql-background .ql-picker-item { + background-color: #fff; +} +.ql-snow .ql-color-picker.ql-color .ql-picker-item { + background-color: #000; +} +.ql-toolbar.ql-snow { + border: 1px solid #ccc; + -webkit-box-sizing: border-box; + box-sizing: border-box; + /* font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif; */ + padding: 8px; +} +.ql-toolbar.ql-snow .ql-formats { + margin-right: 15px; +} +.ql-toolbar.ql-snow .ql-picker-label { + border: 1px solid transparent; +} +.ql-toolbar.ql-snow .ql-picker-options { + border: 1px solid transparent; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 2px 8px; + box-shadow: rgba(0, 0, 0, 0.2) 0 2px 8px; +} +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label { + border-color: #ccc; +} +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options { + border-color: #ccc; +} +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected, +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover { + border-color: #000; +} +.ql-toolbar.ql-snow + .ql-container.ql-snow { + border-top: 0px; +} +.ql-snow .ql-tooltip { + background-color: #fff; + border: 1px solid #ccc; + -webkit-box-shadow: 0px 0px 5px #ddd; + box-shadow: 0px 0px 5px #ddd; + color: #444; + padding: 5px 12px; + white-space: nowrap; +} +.ql-snow .ql-tooltip::before { + content: "Visit URL:"; + line-height: 26px; + margin-right: 8px; +} +.ql-snow .ql-tooltip input[type="text"] { + display: none; + border: 1px solid #ccc; + font-size: 13px; + height: 26px; + margin: 0px; + padding: 3px 5px; + width: 170px; +} +.ql-snow .ql-tooltip a.ql-preview { + display: inline-block; + max-width: 200px; + overflow-x: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + vertical-align: top; +} +.ql-snow .ql-tooltip a.ql-action::after { + border-right: 1px solid #ccc; + content: "Edit"; + margin-left: 16px; + padding-right: 8px; +} +.ql-snow .ql-tooltip a.ql-remove::before { + content: "Remove"; + margin-left: 8px; +} +.ql-snow .ql-tooltip a { + line-height: 26px; +} +.ql-snow .ql-tooltip.ql-editing a.ql-preview, +.ql-snow .ql-tooltip.ql-editing a.ql-remove { + display: none; +} +.ql-snow .ql-tooltip.ql-editing input[type="text"] { + display: inline-block; +} +.ql-snow .ql-tooltip.ql-editing a.ql-action::after { + border-right: 0px; + content: "Save"; + padding-right: 0px; +} +.ql-snow .ql-tooltip[data-mode="link"]::before { + content: "Enter link:"; +} +.ql-snow .ql-tooltip[data-mode="formula"]::before { + content: "Enter formula:"; +} +.ql-snow .ql-tooltip[data-mode="video"]::before { + content: "Enter video:"; +} +.ql-snow a { + color: #06c; +} +.ql-container.ql-snow { + /* border: 1px solid #ccc; */ +} +.ql-editor p, +.ql-editor ol, +.ql-editor ul, +.ql-editor pre, +.ql-editor blockquote, +.ql-editor h1, +.ql-editor h2, +.ql-editor .ql-image, +.ql-editor .ql-divider { + margin-bottom: 15px; +} +.mhy-article-page { + zoom: 1; +} +.mhy-article-page::after { + content: ""; + display: block; + visibility: hidden; + height: 0; + clear: both; + font-size: 0; +} +.mhy-article-page { + position: relative; +} +.mhy-article-page__main { + padding: 40px 30px 40px 30px; +} +.mhy-article-page__title { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.mhy-article-page__title h1 { + font-size: 44px; + line-height: 60px; + margin: 0; + word-break: break-word; + word-wrap: break-word; + font-weight: normal; +} +.mhy-article-page__title .mhy-article-type__origin, +.mhy-article-page__title .mhy-article-type__copy { + font-size: 14px; + color: #fff; + font-weight: normal; + height: 24px; + line-height: 24px; + padding: 0 6px; + margin-right: 10px; +} +.mhy-article-page__title .mhy-article-type__origin { + background-color: #4cd7e8; +} +.mhy-article-page__title .mhy-article-type__copy { + background-color: #ff9452; +} +.mhy-article-page__content { + /* margin-top: 24px; */ +} +.mhy-article-page__footer { + margin-top: 20px; +} +.mhy-article-page__auth { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin-top: 30px; +} +.mhy-article-page__auth .auth-type { + color: #999; + -webkit-box-flex: initial; + -ms-flex-positive: initial; + flex-grow: initial; +} +.mhy-article-page__auth .auth-type .auth-type__icons { + width: auto; +} +.mhy-article-page__auth .auth-type .mhy-icon { + cursor: pointer; +} +.mhy-article-page_rank { + margin-top: 14px; +} +.mhy-article-page-info { + height: 50px; + padding: 0 15px; + background-color: #efefef; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin-top: 25px; + font-size: 22px; +} +.mhy-article-page-info__from { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + color: #999; +} +.mhy-article-page-info__from-name { + color: #fa0; +} +.mhy-article-page-info__count { + -ms-flex-negative: 0; + flex-shrink: 0; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; +} +.mhy-article-page-info__count-item { + display: flex; + align-items: center; +} +.mhy-article-page-info__count-item + .mhy-article-page-info__count-item { + margin-left: 30px; +} +.mhy-article-page-info__count-item.mhy-clickable { + cursor: pointer; +} +.mhy-article-page-info__count-item .mhy-icon { + color: #b3b3b3; +} +.mhy-article-page-info__count-item span { + color: #999; + margin-left: 5px; +} +.mhy-article-page-updatetime { + text-align: center; + color: #999; + margin-top: 28px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + font-size: 22px; + margin-bottom: 28px; +} +.mhy-article-page-updatetime span { + padding: 0 6px; + line-height: 18px; +} +.mhy-article-page-updatetime span + span { + border-left: 1px solid #ccc; +} +.mhy-article-page-collection-info { + text-align: center; + margin-top: 6px; + line-height: 18px; +} +.mhy-article-page-collection-info span { + color: #ccc; +} +.mhy-layout__sub.mhy-article-float-info { + padding-top: 180px; +} +.mhy-layout__sub.mhy-article-float-info .mhy-article-page-author { + position: fixed; + top: 62px; + width: 280px; + z-index: 500; + -webkit-animation: fade-in 0.3s both; + animation: fade-in 0.3s both; +} +.mhy-article-page-author { + padding: 0 20px 0 30px; + height: 160px; + background-color: #fff; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + margin-bottom: 20px; + border-radius: 4px; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.mhy-article-page-author .mhy-user-card__info { + margin-left: 15px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +.mhy-article-page-author .mhy-account-title__name { + line-height: 22px; + font-weight: 600; + font-size: 16px; + margin-right: 6px; + white-space: normal; + display: inline; +} +.mhy-article-page-author .mhy-account-title__level { + margin-left: 0; +} +.mhy-article-page-author .mhy-user-card__certification { + line-height: 16px; + margin: 2px 0; + white-space: normal; +} +.mhy-article-page-author .mhy-follow-button { + margin-top: 12px; +} +.mhy-article-page-bottom { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.mhy-article-page-bottom .mhy-topic-label-selector { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} +.mhy-article-page-bottom .mhy-article-page__report { + color: #ccc; +} +.mhy-article-page-user-data { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + border-top: 1px solid #f0f0f0; + margin-top: 20px; + padding-top: 20px; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.mhy-article-page-user-data__item { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + height: 30px; + cursor: pointer; +} +.mhy-article-page-user-data__item + .mhy-article-page-user-data__item { + margin-left: 108px; +} +.mhy-article-page-user-data__item .mhy-symbol-icon, +.mhy-article-page-user-data__item .mhy-icon, +.mhy-article-page-user-data__item .mhy-img-icon { + font-size: 28px; + cursor: pointer; +} +.mhy-article-page-user-data__item span { + margin-left: 20px; + color: #999; +} +.mhy-article-page-reply-action { + margin-top: 20px; + background-color: #fff; + padding: 30px 50px; + border-radius: 4px; +} +.mhy-article-page-reply-action .mhy-reply-box__body { + min-height: 100px; +} +.mhy-article-page-reply-action__tip { + color: #ccc; + margin-bottom: 15px; +} +.mhy-article-page-reply-list { + margin-top: 20px; +} +.mhy-article-page-reply-list__header { + padding: 0 50px; + height: 50px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.mhy-article-page-reply-list__loadmore { + border-top: 1px solid #ebebeb; + height: 70px; + 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; +} +.mhy-article-page-reply-list__notice { + text-align: center; + background-color: #f7f8fc; + color: #ccc; + line-height: 32px; + padding: 9px; +} +.mhy-reply-filter__tab { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} +.mhy-reply-filter__sort .mhy-select__label { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.mhy-reply-filter__sort .mhy-reply-filter__selected { + color: #333; +} +.mhy-article-actions { + position: fixed; + top: 92px; + left: 50%; + width: 90px; + background-color: #fff; + border-radius: 4px; + margin-left: -596px; + padding: 0 10px; +} +@media (max-width: 1192px) { + .mhy-article-actions { + margin-left: 0; + left: 0; + } +} +.mhy-article-actions__item { + cursor: pointer; + padding: 15px 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +.mhy-article-actions__item + .mhy-article-actions__item { + border-top: 1px solid #f0f0f0; +} +.mhy-article-actions__item .mhy-icon { + font-size: 30px; + color: #b3b3b3; +} +.mhy-article-actions__item .mhy-symbol-icon { + font-size: 30px; +} +.mhy-article-actions__item span { + color: #999; + margin-top: 10px; + line-height: 1; + white-space: nowrap; +} +.mhy-article-actions__item--active span { + color: #00c3ff; +} +.top-good-options { + padding: 15px 30px; +} +.top-good-options__item { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.top-good-options__name { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + line-height: 50px; +} +.top-good-options__btn { + -ms-flex-negative: 0; + flex-shrink: 0; + height: 24px; + width: 80px; +} +.topic-remove-options { + padding: 15px 30px; +} +.topic-remove-options__item { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.topic-remove-options__item .mhy-checkbox { + line-height: 50px; + height: 50px; +} +.mhy-article-page-hot .mhy-hot-card + .mhy-hot-card { + margin-top: 20px; +} +.mhy-authtype-frame .mhy-account-action-sheet__content { + width: 300px; + padding: 20px 25px; +} +.auth-type-intro { + line-height: 20px; +} +.auth-type-intro + .auth-type-intro { + margin-top: 20px; +} +.auth-type-intro__content { + color: #999; + font-size: 12px; + margin-top: 4px; +} +.mhy-post-move-manage { + padding: 30px 30px 10px 30px; +} +.mhy-post-move-manage__label { + line-height: 1; +} +.mhy-post-move-manage__forum { + margin-bottom: 30px; +} +.mhy-post-move-manage .mhy-radio { + margin-top: 20px; + margin-right: 40px; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.mhy-post-move-manage .mhy-radio:last-child { + margin-right: 0; +} +.mhy-post-move-manage .mhy-topic-selector .mhy-post-move-manage__label { + line-height: 30px; + margin-right: 8px; + -ms-flex-negative: 0; + flex-shrink: 0; +} +.mhy-post-move-manage .mhy-autocomplete { + width: 420px; +} +.mhy-post-move-manage .mhy-autocomplete__list { + max-height: 226px; + overflow: auto; +} +.mhy-article-page-announcement { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 12px 15px; + background-color: #fff4eb; + border: 1px solid #ffcf83; + border-radius: 4px; + color: #ff983b; + margin-top: 20px; +} +.mhy-article-page-announcement--link { + cursor: pointer; +} +.mhy-article-page-announcement .mhy-icon { + font-size: 20px; + margin-right: 15px; + -ms-flex-item-align: start; + align-self: flex-start; +} +.mhy-article-page-announcement p { + line-height: 24px; +} +.mhy-icon { + font-size: inherit; +} +.mhy-img-icon { + height: 1em; + fill: currentColor; + overflow: hidden; +} +.mhy-symbol-icon { + width: 1em; + height: 1em; + fill: currentColor; + overflow: hidden; +} + +@font-face { + font-family: "iconfont"; + src: url("./iconfont.fb3712d.woff2"); +} +.iconfont { + font-family: "iconfont" !important; + font-size: 20px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.icon-flag:before { + content: ""; +} +.icon-a-lottery:before { + content: ""; +} +.icon-a-xibian:before { + content: ""; +} +.icon-a-:before { + content: ""; +} +.icon-mark:before { + content: ""; +} +.icon-dismark:before { + content: ""; +} +.icon-cocy:before { + content: ""; +} +.icon-swiper_left:before { + content: ""; +} +.icon-swiper_right:before { + content: ""; +} +.icon-a-zhudong:before { + content: ""; +} +.icon-xiaoxishezhi:before { + content: ""; +} +.icon-share:before { + content: ""; +} +.icon-A:before { + content: ""; +} +.icon-wenzijiaobiao:before { + content: ""; +} +.icon-zhankai:before { + content: ""; +} +.icon-shouqi1:before { + content: ""; +} +.icon-filter:before { + content: ""; +} +.icon-ic_Charts_Hat:before { + content: ""; +} +.icon-m_divider:before { + content: ""; +} +.icon-divider:before { + content: ""; +} +.icon-ic_btn_light_edit:before { + content: ""; +} +.icon-gift:before { + content: ""; +} +.icon-shanchu:before { + content: ""; +} +.icon-ic_sign_hourglass:before { + content: ""; +} +.icon-ic_close:before { + content: ""; +} +.icon-ic_video_actionbar_voice_off:before { + content: ""; +} +.icon-ic_video_actionbar_voice_on:before { + content: ""; +} +.icon-ic_upload_re:before { + content: ""; +} +.icon-ic_video_small_videoviews:before { + content: ""; +} +.icon-ic_video_actionbar_play:before { + content: ""; +} +.icon-ic_video_actionbar_pause:before { + content: ""; +} +.icon-Full:before { + content: ""; +} +.icon-Exit:before { + content: ""; +} +.icon-ic_draftbox:before { + content: ""; +} +.icon-recommend:before { + content: ""; +} +.icon-heji:before { + content: ""; +} +.icon-drag:before { + content: ""; +} +.icon-remove:before { + content: ""; +} +.icon-set:before { + content: ""; +} +.icon-notice:before { + content: ""; +} +.icon-image2:before { + content: ""; +} +.icon-introductio:before { + content: ""; +} +.icon-subscribe:before { + content: ""; +} +.icon-toupdate:before { + content: ""; +} +.icon-renzheng:before { + content: ""; +} +.icon-renzhengtubiao:before { + content: ""; +} +.icon-mi-icon:before { + content: ""; +} +.icon-triangle-right:before { + content: ""; +} +.icon-guanfang1:before { + content: ""; +} +.icon-home1:before { + content: ""; +} +.icon-info:before { + content: ""; +} +.icon-Notset:before { + content: ""; +} +.icon-radioon:before { + content: ""; +} +.icon-radiooff:before { + content: ""; +} +.icon-Noncommercial:before { + content: ""; +} +.icon-Prohibited:before { + content: ""; +} +.icon-signature:before { + content: ""; +} +.icon-open:before { + content: ""; +} +.icon-down1:before { + content: ""; +} +.icon-vote:before { + content: ""; +} +.icon-vote_web:before { + content: ""; +} +.icon-delete1:before { + content: ""; +} +.icon-add1:before { + content: ""; +} +.icon-navigation:before { + content: ""; +} +.icon-image:before { + content: ""; +} +.icon-close1:before { + content: ""; +} +.icon-pcup:before { + content: ""; +} +.icon-pcdown:before { + content: ""; +} +.icon-shipin1:before { + content: ""; +} +.icon-fabutiezi:before { + content: ""; +} +.icon-wodeshoucang:before { + content: ""; +} +.icon-shezhi1:before { + content: ""; +} +.icon-wodeguanzhu:before { + content: ""; +} +.icon-biaoqing1:before { + content: ""; +} +.icon-link:before { + content: ""; +} +.icon-dengji:before { + content: ""; +} +.icon-huodedezan:before { + content: ""; +} +.icon-xitongtongzhi:before { + content: ""; +} +.icon-huifu:before { + content: ""; +} +.icon-zhanghaoguanli:before { + content: ""; +} +.icon-tuichudenglu:before { + content: ""; +} +.icon-wodefensi:before { + content: ""; +} +.icon-yinsishezhi:before { + content: ""; +} +.icon-wodefatie:before { + content: ""; +} +.icon-wenhao:before { + content: ""; +} +.icon-smile:before { + content: ""; +} +.icon-close:before { + content: ""; +} +.icon-tupian1:before { + content: ""; +} +.icon-biaoqing:before { + content: ""; +} +.icon-shipin:before { + content: ""; +} +.icon-daodila-jia:before { + content: ""; +} +.icon-duotu:before { + content: ""; +} +.icon-jinzhi:before { + content: ""; +} +.icon-sousuokuangli:before { + content: ""; +} +.icon-shijian:before { + content: ""; +} +.icon-xiaojiantou:before { + content: ""; +} +.icon-shezhi:before { + content: ""; +} +.icon-fanhui:before { + content: ""; +} +.icon-tianjiatupian:before { + content: ""; +} +.icon-lianjie1:before { + content: ""; +} +.icon-shoucang:before { + content: ""; +} +.icon-dianzan:before { + content: ""; +} +.icon-liuyanshu:before { + content: ""; +} +.icon-liulanshu:before { + content: ""; +} +.icon-jiantou:before { + content: ""; +} +.icon-xiaoxizhongxin:before { + content: ""; +} +.icon-sousuo:before { + content: ""; +} +.icon-dots:before { + content: ""; +} +.icon-jiahao:before { + content: ""; +} +.icon-snowflake:before { + content: ""; +} +.icon-lianjie:before { + content: ""; +} +.icon-video:before { + content: ""; +} +.icon-huizhanguBadge:before { + content: ""; +} +.icon-huizhang:before { + content: ""; +} +.icon-downo:before { + content: ""; +} +.icon-upo:before { + content: ""; +} +.icon-biaoqin:before { + content: ""; +} +.icon-bianji:before { + content: ""; +} +.icon-tupian:before { + content: ""; +} +.icon-search:before { + content: ""; +} +.icon-quxiao:before { + content: ""; +} +.icon-hb:before { + content: ""; +} +.icon-wuxiao:before { + content: ""; +} +.icon-leida:before { + content: ""; +} +.icon-huidaodingbu:before { + content: ""; +} +.icon-louzhu:before { + content: ""; +} +.icon-banzhu:before { + content: ""; +} +.icon-guanfang:before { + content: ""; +} +.icon-ding:before { + content: ""; +} +.icon-jinghua:before { + content: ""; +} +.icon-check:before { + content: ""; +} +.icon-rocket:before { + content: ""; +} +.icon-reply2:before { + content: ""; +} +.icon-404:before { + content: ""; +} +.icon-jubao:before { + content: ""; +} +.icon-littlebrother:before { + content: ""; +} +.icon-ufirst:before { + content: ""; +} +.icon-bound:before { + content: ""; +} +.icon-lazy:before { + content: ""; +} +.icon-girl:before { + content: ""; +} +.icon-boy:before { + content: ""; +} +.icon-heart:before { + content: ""; +} +.icon-edit:before { + content: ""; +} +.icon-topcancel:before { + content: ""; +} +.icon-qualitycancel:before { + content: ""; +} +.icon-qualityset:before { + content: ""; +} +.icon-reply:before { + content: ""; +} +.icon-hidden:before { + content: ""; +} +.icon-up:before { + content: ""; +} +.icon-star:before { + content: ""; +} +.icon-mobile:before { + content: ""; +} +.icon-home:before { + content: ""; +} +.icon-heartbreak:before { + content: ""; +} +.icon-bell:before { + content: ""; +} +.icon-down:before { + content: ""; +} +.icon-delete:before { + content: ""; +} +.icon-move:before { + content: ""; +} +.icon-lock:before { + content: ""; +} +.icon-right:before { + content: ""; +} +.icon-topset:before { + content: ""; +} +.icon-left:before { + content: ""; +} +.icon-hand:before { + content: ""; +} +.icon-show:before { + content: ""; +} +.icon-send:before { + content: ""; +} +.icon-person:before { + content: ""; +} +.icon-write:before { + content: ""; +} +.icon-hearto:before { + content: ""; +} +.icon-accountsys:before { + content: ""; +} +.icon-exit:before { + content: ""; +} +.icon-arrowup:before { + content: ""; +} +.icon-add:before { + content: ""; +} +.mhy-topic-label { + height: 40px; + line-height: 40px; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + color: #666; + border-radius: 12px; + margin-right: 10px; + background-color: #efefef; + position: relative; + cursor: pointer; +} +.mhy-topic-label--editable .mhy-topic-label__link { + padding-right: 0; +} +.mhy-topic-label__delete { + font-size: 10px; + padding: 0 12px 0 10px; +} +.mhy-topic-label__link, +.mhy-topic-label__text { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + color: inherit; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 0 16px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.mhy-topic-label__link:hover { + color: #00b2ff; +} +.mhy-topic-label .mhy-icon { + margin-right: 5px; + font-size: 12px; + color: #999; +} +.mhy-heart-click { + position: relative; + cursor: pointer; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.account { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin-bottom: 40px; + padding-left: 5px; + position: relative; +} + +.account .mhy-account-avatar { + width: 90px; + height: 90px; + border: 1px solid #f0f4f5; + margin-right: 18px; + border-radius: 100%; + vertical-align: top; +} + +.account .mhy-authentication-mark-container { + left: 75px; + top: 75px; + font-size: 30px; + width: 30px; + height: 30px; +} + +.account .account-info { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; +} + +.account .account-info .account-label { + color: #ccc; + font-size: 22px; +} +.mhy-account-title { + display: inline-block; + vertical-align: baseline; + font-size: 30px; + color: #404040 !important; + line-height: 50px; +} + +.mhy-account-title .account-title { + font-size: 30px; + display: inline-block; + vertical-align: middle; +} +.mhy-authentication-mark-container { + position: absolute; + left: 12px; + top: 17px; + width: 14px; + height: 14px; + -webkit-box-sizing: content-box; + box-sizing: content-box; + border-radius: 100%; + border: 1px solid #fff; + background-color: #fff; + font-size: 14px; +} +.mhy-article-page .main-article .account .mhy-authentication-mark-container { + left: 22px; + font-size: 12px; + width: 12px; + height: 12px; +} +.mhy-symbol-icon { + vertical-align: top; +} +.emoticon-image { + display: inline-block; + margin: 0 10px; + width: 80px; + height: 80px; + vertical-align: text-bottom; + background-size: cover; + background-position: center; +} +.emoticon-image + .emoticon-image { + margin-right: 0; +} +.emoticon-image:first-of-type { + margin-right: 0; +} +.emoticon-image:last-of-type { + margin-right: 10px; +} +.mhy-emoticon .mhy-emoticon__item { + display: inline-block; + width: 65px; + height: 65px; + margin: 5px; + vertical-align: bottom; + background-size: cover; + background-position: center; +} +.mhy-emoticon { + width: 418px; +} +.mhy-emoticon__list { + padding: 0 12px; + overflow-y: auto; + overflow-x: hidden; + height: 248px; + padding-bottom: 8px; +} +.mhy-emoticon__item { + cursor: pointer; +} +.mhy-emoticon__bottom { + background-color: #f5f5f5; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.mhy-emoticon__setlist { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; +} +.mhy-emoticon__set { + padding: 5px 13px; + cursor: pointer; +} +.mhy-emoticon__set:hover:not(.mhy-emoticon__set--selected) { + background-color: #ebebeb; +} +.mhy-emoticon__set--selected { + background-color: #fff; +} +.mhy-emoticon__seticon { + background-size: cover; + background-position: center; + background-repeat: no-repeat; + width: 30px; + height: 30px; +} +.mhy-emoticon__pager { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.mhy-emoticon__next, +.mhy-emoticon__prev { + cursor: pointer; + margin: 0 5px; + padding: 0 5px; +} +.mhy-emoticon__next .mhy-icon, +.mhy-emoticon__prev .mhy-icon { + font-size: 18px; + color: #999; +} +.mhy-emoticon__pagerbtn--disabled { + cursor: default; +} +.mhy-emoticon__pagerbtn--disabled .mhy-icon { + color: #ccc; +} +#qrcode { + margin-right: 20px; + width: 130px; + height: 130px; +} +.mhy-logo { + width: 20px; + height: 20px; + position: absolute; + right: 75px; +} +.mhy-link-card.card-mall .card-title { + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; +} +.mhy-link-card { + background-color: #f7f8fc; + border-radius: 8px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + width: 520px; + margin: auto; + white-space: normal; + text-decoration: none !important; + color: #333 !important; + cursor: pointer; +} +.mhy-link-card.card-normal { + padding: 4px 16px 4px 4px; +} +.mhy-link-card.card-normal .card-cover { + width: 58px; + height: 58px; +} +.mhy-link-card.card-normal .card-title { + line-height: 22px; + display: -webkit-box; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} +.mhy-link-card.card-mall { + padding: 8px 16px 8px 8px; +} +.mhy-link-card.card-mall .card-cover { + width: 90px; + height: 90px; +} +.mhy-link-card.card-mall .card-title { + line-height: 20px; +} +.mhy-link-card.card-mall .mall-card-user { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + line-height: 16px; + font-size: 14px; + color: #999; + margin-top: 8px; +} +.mhy-link-card.card-mall .mall-card-user .mall-card-user-avatar { + margin-right: 6px; + width: 16px; + height: 16px; + border-radius: 100%; + overflow: hidden; +} +.mhy-link-card.card-mall .mall-card-user .mall-card-user-avatar img { + width: 100%; + height: 100%; + vertical-align: top; +} +.mhy-link-card.card-mall .mall-card-user .mall-card-user-nickname { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; +} +.mhy-link-card .card-cover { + border-radius: 6px; + margin-right: 12px; + background: no-repeat 100% 100%; + background-size: cover; +} +.mhy-link-card .card-info { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + overflow: hidden; +} +.mhy-link-card .card-title { + font-size: 16px; +} +.mhy-link-card .card-title.card-offline { + color: #999; +} +.mhy-link-card .mall-card-price { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: baseline; + -ms-flex-align: baseline; + align-items: baseline; + margin-top: 8px; +} +.mhy-link-card .mall-card-price .price { + color: #ff667f; + font-size: 20px; + line-height: 26px; + margin-right: 8px; + font-weight: bold; +} +.mhy-link-card .mall-card-price .market-price { + text-decoration: line-through; + font-size: 14px; + color: #999; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; +} +.mhy-link-card .link-button { + line-height: 24px; + color: #00c3ff; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.mhy-link-card .link-button .mhy-icon { + margin-left: 8px; + font-size: 12px; +} +.mhy-link-card .normal-link .link-button { + margin-left: 20px; +} +.mhy-img-article__link .mhy-router-link { + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; +} +.mhy-img-article { + margin-bottom: 30px; +} +.mhy-img-article__describe { + white-space: pre-wrap; + color: #333; + font-size: 16px; + word-wrap: break-word; + word-break: break-word; + margin-bottom: 15px; +} +.mhy-img-article img:not(.lottery-icon) { + max-width: 100%; + max-height: 600px; + display: block; + margin-bottom: 15px; + height: auto; +} +.mhy-img-article__link { + margin-top: 20px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + overflow: hidden; +} +.mhy-img-article__link .mhy-router-link { + text-decoration: underline; +} +.mhy-img-article__link-card-container { + margin-top: 20px; +} diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/mysNews/mysNews.html b/src/Yunzai-Bot/plugins/genshin/resources/html/mysNews/mysNews.html new file mode 100644 index 0000000000000000000000000000000000000000..b77a9ba9a34bc6104096fadcd0b66b9c93c08dfd --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/mysNews/mysNews.html @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+

{{data.post.subject}}

+
+ +
+
+ 来自版块: + {{data?.forum?.name || ""}} +
+
+
+ {{data.stat.view_num}} +
+
+ {{data.stat.like_num}} +
+
+ {{data.stat.reply_num}} +
+ +
+
+
+ 文章发表:{{data.post.created_time}} +
+
+
+
+
{{@dataConent}}
+
+
+
+
+
+ {{each data.topics val}} + + {{/each}} +
+ +
+ +
+ +
+
+
+
+ +
+ + + + diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/mysNews/qrcode.min.js b/src/Yunzai-Bot/plugins/genshin/resources/html/mysNews/qrcode.min.js new file mode 100644 index 0000000000000000000000000000000000000000..993e88f396640f881b69f98db7a4d17401ef83ca --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/mysNews/qrcode.min.js @@ -0,0 +1 @@ +var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/payLog/echarts.min.js b/src/Yunzai-Bot/plugins/genshin/resources/html/payLog/echarts.min.js new file mode 100644 index 0000000000000000000000000000000000000000..9260d807497bd68977e0900b110c3f4732c4b7fe --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/payLog/echarts.min.js @@ -0,0 +1,45 @@ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).echarts={})}(this,(function(t){"use strict"; +/*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},e(t,n)};function n(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}var i=function(){this.firefox=!1,this.ie=!1,this.edge=!1,this.newEdge=!1,this.weChat=!1},r=new function(){this.browser=new i,this.node=!1,this.wxa=!1,this.worker=!1,this.svgSupported=!1,this.touchEventsSupported=!1,this.pointerEventsSupported=!1,this.domSupported=!1,this.transformSupported=!1,this.transform3dSupported=!1,this.hasGlobalWindow="undefined"!=typeof window};"object"==typeof wx&&"function"==typeof wx.getSystemInfoSync?(r.wxa=!0,r.touchEventsSupported=!0):"undefined"==typeof document&&"undefined"!=typeof self?r.worker=!0:"undefined"==typeof navigator?(r.node=!0,r.svgSupported=!0):function(t,e){var n=e.browser,i=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),o=t.match(/Edge?\/([\d.]+)/),a=/micromessenger/i.test(t);i&&(n.firefox=!0,n.version=i[1]);r&&(n.ie=!0,n.version=r[1]);o&&(n.edge=!0,n.version=o[1],n.newEdge=+o[1].split(".")[0]>18);a&&(n.weChat=!0);e.svgSupported="undefined"!=typeof SVGRect,e.touchEventsSupported="ontouchstart"in window&&!n.ie&&!n.edge,e.pointerEventsSupported="onpointerdown"in window&&(n.edge||n.ie&&+n.version>=11),e.domSupported="undefined"!=typeof document;var s=document.documentElement.style;e.transform3dSupported=(n.ie&&"transition"in s||n.edge||"WebKitCSSMatrix"in window&&"m11"in new WebKitCSSMatrix||"MozPerspective"in s)&&!("OTransition"in s),e.transformSupported=e.transform3dSupported||n.ie&&+n.version>=9}(navigator.userAgent,r);var o="sans-serif",a="12px sans-serif";var s,l,u=function(t){var e={};if("undefined"==typeof JSON)return e;for(var n=0;n=0)o=r*t.length;else for(var c=0;c>1)%2;a.style.cssText=["position: absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","user-select: none","width:0","height:0",i[s]+":0",r[l]+":0",i[1-s]+":auto",r[1-l]+":auto",""].join("!important;"),t.appendChild(a),n.push(a)}return n}(e,a),l=function(t,e,n){for(var i=n?"invTrans":"trans",r=e[i],o=e.srcCoords,a=[],s=[],l=!0,u=0;u<4;u++){var h=t[u].getBoundingClientRect(),c=2*u,p=h.left,d=h.top;a.push(p,d),l=l&&o&&p===o[c]&&d===o[c+1],s.push(t[u].offsetLeft,t[u].offsetTop)}return l&&r?r:(e.srcCoords=a,e[i]=n?qt(s,a):qt(a,s))}(s,a,o);if(l)return l(t,n,i),!0}return!1}function Jt(t){return"CANVAS"===t.nodeName.toUpperCase()}var Qt=/([&<>"'])/g,te={"&":"&","<":"<",">":">",'"':""","'":"'"};function ee(t){return null==t?"":(t+"").replace(Qt,(function(t,e){return te[e]}))}var ne=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ie=[],re=r.browser.firefox&&+r.browser.version.split(".")[0]<39;function oe(t,e,n,i){return n=n||{},i?ae(t,e,n):re&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):ae(t,e,n),n}function ae(t,e,n){if(r.domSupported&&t.getBoundingClientRect){var i=e.clientX,o=e.clientY;if(Jt(t)){var a=t.getBoundingClientRect();return n.zrX=i-a.left,void(n.zrY=o-a.top)}if($t(ie,t,i,o))return n.zrX=ie[0],void(n.zrY=ie[1])}n.zrX=n.zrY=0}function se(t){return t||window.event}function le(t,e,n){if(null!=(e=se(e)).zrX)return e;var i=e.type;if(i&&i.indexOf("touch")>=0){var r="touchend"!==i?e.targetTouches[0]:e.changedTouches[0];r&&oe(t,r,e,n)}else{oe(t,e,e,n);var o=function(t){var e=t.wheelDelta;if(e)return e;var n=t.deltaX,i=t.deltaY;if(null==n||null==i)return e;return 3*(0!==i?Math.abs(i):Math.abs(n))*(i>0?-1:i<0?1:n>0?-1:1)}(e);e.zrDelta=o?o/120:-(e.detail||0)/3}var a=e.button;return null==e.which&&void 0!==a&&ne.test(e.type)&&(e.which=1&a?1:2&a?3:4&a?2:0),e}function ue(t,e,n,i){t.addEventListener(e,n,i)}var he=function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0};function ce(t){return 2===t.which||3===t.which}var pe=function(){function t(){this._track=[]}return t.prototype.recognize=function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},t.prototype.clear=function(){return this._track.length=0,this},t.prototype._doTrack=function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},o=0,a=i.length;o1&&r&&r.length>1){var a=de(r)/de(o);!isFinite(a)&&(a=1),e.pinchScale=a;var s=[((i=r)[0][0]+i[1][0])/2,(i[0][1]+i[1][1])/2];return e.pinchX=s[0],e.pinchY=s[1],{type:"pinch",target:t[0].target,event:e}}}}};function ge(){return[1,0,0,1,0,0]}function ye(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function ve(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function me(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],o=e[0]*n[2]+e[2]*n[3],a=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=l,t}function xe(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t}function _e(t,e,n){var i=e[0],r=e[2],o=e[4],a=e[1],s=e[3],l=e[5],u=Math.sin(n),h=Math.cos(n);return t[0]=i*h+a*u,t[1]=-i*u+a*h,t[2]=r*h+s*u,t[3]=-r*u+h*s,t[4]=h*o+u*l,t[5]=h*l-u*o,t}function be(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t}function we(t,e){var n=e[0],i=e[2],r=e[4],o=e[1],a=e[3],s=e[5],l=n*a-o*i;return l?(l=1/l,t[0]=a*l,t[1]=-o*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-a*r)*l,t[5]=(o*r-n*s)*l,t):null}function Se(t){var e=[1,0,0,1,0,0];return ve(e,t),e}var Me=Object.freeze({__proto__:null,create:ge,identity:ye,copy:ve,mul:me,translate:xe,rotate:_e,scale:be,invert:we,clone:Se}),Ie=function(){function t(t,e){this.x=t||0,this.y=e||0}return t.prototype.copy=function(t){return this.x=t.x,this.y=t.y,this},t.prototype.clone=function(){return new t(this.x,this.y)},t.prototype.set=function(t,e){return this.x=t,this.y=e,this},t.prototype.equal=function(t){return t.x===this.x&&t.y===this.y},t.prototype.add=function(t){return this.x+=t.x,this.y+=t.y,this},t.prototype.scale=function(t){this.x*=t,this.y*=t},t.prototype.scaleAndAdd=function(t,e){this.x+=t.x*e,this.y+=t.y*e},t.prototype.sub=function(t){return this.x-=t.x,this.y-=t.y,this},t.prototype.dot=function(t){return this.x*t.x+this.y*t.y},t.prototype.len=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},t.prototype.lenSquare=function(){return this.x*this.x+this.y*this.y},t.prototype.normalize=function(){var t=this.len();return this.x/=t,this.y/=t,this},t.prototype.distance=function(t){var e=this.x-t.x,n=this.y-t.y;return Math.sqrt(e*e+n*n)},t.prototype.distanceSquare=function(t){var e=this.x-t.x,n=this.y-t.y;return e*e+n*n},t.prototype.negate=function(){return this.x=-this.x,this.y=-this.y,this},t.prototype.transform=function(t){if(t){var e=this.x,n=this.y;return this.x=t[0]*e+t[2]*n+t[4],this.y=t[1]*e+t[3]*n+t[5],this}},t.prototype.toArray=function(t){return t[0]=this.x,t[1]=this.y,t},t.prototype.fromArray=function(t){this.x=t[0],this.y=t[1]},t.set=function(t,e,n){t.x=e,t.y=n},t.copy=function(t,e){t.x=e.x,t.y=e.y},t.len=function(t){return Math.sqrt(t.x*t.x+t.y*t.y)},t.lenSquare=function(t){return t.x*t.x+t.y*t.y},t.dot=function(t,e){return t.x*e.x+t.y*e.y},t.add=function(t,e,n){t.x=e.x+n.x,t.y=e.y+n.y},t.sub=function(t,e,n){t.x=e.x-n.x,t.y=e.y-n.y},t.scale=function(t,e,n){t.x=e.x*n,t.y=e.y*n},t.scaleAndAdd=function(t,e,n,i){t.x=e.x+n.x*i,t.y=e.y+n.y*i},t.lerp=function(t,e,n,i){var r=1-i;t.x=r*e.x+i*n.x,t.y=r*e.y+i*n.y},t}(),Te=Math.min,Ce=Math.max,De=new Ie,Ae=new Ie,ke=new Ie,Le=new Ie,Pe=new Ie,Oe=new Ie,Re=function(){function t(t,e,n,i){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i),this.x=t,this.y=e,this.width=n,this.height=i}return t.prototype.union=function(t){var e=Te(t.x,this.x),n=Te(t.y,this.y);isFinite(this.x)&&isFinite(this.width)?this.width=Ce(t.x+t.width,this.x+this.width)-e:this.width=t.width,isFinite(this.y)&&isFinite(this.height)?this.height=Ce(t.y+t.height,this.y+this.height)-n:this.height=t.height,this.x=e,this.y=n},t.prototype.applyTransform=function(e){t.applyTransform(this,this,e)},t.prototype.calculateTransform=function(t){var e=this,n=t.width/e.width,i=t.height/e.height,r=[1,0,0,1,0,0];return xe(r,r,[-e.x,-e.y]),be(r,r,[n,i]),xe(r,r,[t.x,t.y]),r},t.prototype.intersect=function(e,n){if(!e)return!1;e instanceof t||(e=t.create(e));var i=this,r=i.x,o=i.x+i.width,a=i.y,s=i.y+i.height,l=e.x,u=e.x+e.width,h=e.y,c=e.y+e.height,p=!(of&&(f=x,gf&&(f=_,v=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height)},t.prototype.copy=function(e){t.copy(this,e)},t.prototype.plain=function(){return{x:this.x,y:this.y,width:this.width,height:this.height}},t.prototype.isFinite=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)},t.prototype.isZero=function(){return 0===this.width||0===this.height},t.create=function(e){return new t(e.x,e.y,e.width,e.height)},t.copy=function(t,e){t.x=e.x,t.y=e.y,t.width=e.width,t.height=e.height},t.applyTransform=function(e,n,i){if(i){if(i[1]<1e-5&&i[1]>-1e-5&&i[2]<1e-5&&i[2]>-1e-5){var r=i[0],o=i[3],a=i[4],s=i[5];return e.x=n.x*r+a,e.y=n.y*o+s,e.width=n.width*r,e.height=n.height*o,e.width<0&&(e.x+=e.width,e.width=-e.width),void(e.height<0&&(e.y+=e.height,e.height=-e.height))}De.x=ke.x=n.x,De.y=Le.y=n.y,Ae.x=Le.x=n.x+n.width,Ae.y=ke.y=n.y+n.height,De.transform(i),Le.transform(i),Ae.transform(i),ke.transform(i),e.x=Te(De.x,Ae.x,ke.x,Le.x),e.y=Te(De.y,Ae.y,ke.y,Le.y);var l=Ce(De.x,Ae.x,ke.x,Le.x),u=Ce(De.y,Ae.y,ke.y,Le.y);e.width=l-e.x,e.height=u-e.y}else e!==n&&t.copy(e,n)},t}(),Ne="silent";function Ee(){he(this.event)}var ze=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.handler=null,e}return n(e,t),e.prototype.dispose=function(){},e.prototype.setCursor=function(){},e}(Xt),Ve=function(t,e){this.x=t,this.y=e},Be=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],Fe=new Re(0,0,0,0),Ge=function(t){function e(e,n,i,r,o){var a=t.call(this)||this;return a._hovered=new Ve(0,0),a.storage=e,a.painter=n,a.painterRoot=r,a._pointerSize=o,i=i||new ze,a.proxy=null,a.setHandlerProxy(i),a._draggingMgr=new Ut(a),a}return n(e,t),e.prototype.setHandlerProxy=function(t){this.proxy&&this.proxy.dispose(),t&&(E(Be,(function(e){t.on&&t.on(e,this[e],this)}),this),t.handler=this),this.proxy=t},e.prototype.mousemove=function(t){var e=t.zrX,n=t.zrY,i=Ye(this,e,n),r=this._hovered,o=r.target;o&&!o.__zr&&(o=(r=this.findHover(r.x,r.y)).target);var a=this._hovered=i?new Ve(e,n):this.findHover(e,n),s=a.target,l=this.proxy;l.setCursor&&l.setCursor(s?s.cursor:"default"),o&&s!==o&&this.dispatchToElement(r,"mouseout",t),this.dispatchToElement(a,"mousemove",t),s&&s!==o&&this.dispatchToElement(a,"mouseover",t)},e.prototype.mouseout=function(t){var e=t.zrEventControl;"only_globalout"!==e&&this.dispatchToElement(this._hovered,"mouseout",t),"no_globalout"!==e&&this.trigger("globalout",{type:"globalout",event:t})},e.prototype.resize=function(){this._hovered=new Ve(0,0)},e.prototype.dispatch=function(t,e){var n=this[t];n&&n.call(this,e)},e.prototype.dispose=function(){this.proxy.dispose(),this.storage=null,this.proxy=null,this.painter=null},e.prototype.setCursorStyle=function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},e.prototype.dispatchToElement=function(t,e,n){var i=(t=t||{}).target;if(!i||!i.silent){for(var r="on"+e,o=function(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch,which:n.which,stop:Ee}}(e,t,n);i&&(i[r]&&(o.cancelBubble=!!i[r].call(i,o)),i.trigger(e,o),i=i.__hostTarget?i.__hostTarget:i.parent,!o.cancelBubble););o.cancelBubble||(this.trigger(e,o),this.painter&&this.painter.eachOtherLayer&&this.painter.eachOtherLayer((function(t){"function"==typeof t[r]&&t[r].call(t,o),t.trigger&&t.trigger(e,o)})))}},e.prototype.findHover=function(t,e,n){var i=this.storage.getDisplayList(),r=new Ve(t,e);if(He(i,r,t,e,n),this._pointerSize&&!r.target){for(var o=[],a=this._pointerSize,s=a/2,l=new Re(t-s,e-s,a,a),u=i.length-1;u>=0;u--){var h=i[u];h===n||h.ignore||h.ignoreCoarsePointer||h.parent&&h.parent.ignoreCoarsePointer||(Fe.copy(h.getBoundingRect()),h.transform&&Fe.applyTransform(h.transform),Fe.intersect(l)&&o.push(h))}if(o.length)for(var c=Math.PI/12,p=2*Math.PI,d=0;d=0;o--){var a=t[o],s=void 0;if(a!==r&&!a.ignore&&(s=We(a,n,i))&&(!e.topTarget&&(e.topTarget=a),s!==Ne)){e.target=a;break}}}function Ye(t,e,n){var i=t.painter;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}E(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],(function(t){Ge.prototype[t]=function(e){var n,i,r=e.zrX,o=e.zrY,a=Ye(this,r,o);if("mouseup"===t&&a||(i=(n=this.findHover(r,o)).target),"mousedown"===t)this._downEl=i,this._downPoint=[e.zrX,e.zrY],this._upEl=i;else if("mouseup"===t)this._upEl=i;else if("click"===t){if(this._downEl!==this._upEl||!this._downPoint||Et(this._downPoint,[e.zrX,e.zrY])>4)return;this._downPoint=null}this.dispatchToElement(n,t,e)}}));function Ue(t,e,n,i){var r=e+1;if(r===n)return 1;if(i(t[r++],t[e])<0){for(;r=0;)r++;return r-e}function Xe(t,e,n,i,r){for(i===e&&i++;i>>1])<0?l=o:s=o+1;var u=i-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;u>0;)t[s+u]=t[s+u-1],u--}t[s]=a}}function Ze(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])>0){for(s=i-r;l0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}else{for(s=r+1;ls&&(l=s);var u=a;a=r-l,l=r-u}for(a++;a>>1);o(t,e[n+h])>0?a=h+1:l=h}return l}function je(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])<0){for(s=r+1;ls&&(l=s);var u=a;a=r-l,l=r-u}else{for(s=i-r;l=0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}for(a++;a>>1);o(t,e[n+h])<0?l=h:a=h+1}return l}function qe(t,e){var n,i,r=7,o=0;t.length;var a=[];function s(s){var l=n[s],u=i[s],h=n[s+1],c=i[s+1];i[s]=u+c,s===o-3&&(n[s+1]=n[s+2],i[s+1]=i[s+2]),o--;var p=je(t[h],t,l,u,0,e);l+=p,0!==(u-=p)&&0!==(c=Ze(t[l+u-1],t,h,c,c-1,e))&&(u<=c?function(n,i,o,s){var l=0;for(l=0;l=7||d>=7);if(f)break;g<0&&(g=0),g+=2}if((r=g)<1&&(r=1),1===i){for(l=0;l=0;l--)t[d+l]=t[p+l];return void(t[c]=a[h])}var f=r;for(;;){var g=0,y=0,v=!1;do{if(e(a[h],t[u])<0){if(t[c--]=t[u--],g++,y=0,0==--i){v=!0;break}}else if(t[c--]=a[h--],y++,g=0,1==--s){v=!0;break}}while((g|y)=0;l--)t[d+l]=t[p+l];if(0===i){v=!0;break}}if(t[c--]=a[h--],1==--s){v=!0;break}if(0!==(y=s-Ze(t[u],a,0,s,s-1,e))){for(s-=y,d=(c-=y)+1,p=(h-=y)+1,l=0;l=7||y>=7);if(v)break;f<0&&(f=0),f+=2}(r=f)<1&&(r=1);if(1===s){for(d=(c-=i)+1,p=(u-=i)+1,l=i-1;l>=0;l--)t[d+l]=t[p+l];t[c]=a[h]}else{if(0===s)throw new Error;for(p=c-(s-1),l=0;l1;){var t=o-2;if(t>=1&&i[t-1]<=i[t]+i[t+1]||t>=2&&i[t-2]<=i[t]+i[t-1])i[t-1]i[t+1])break;s(t)}},forceMergeRuns:function(){for(;o>1;){var t=o-2;t>0&&i[t-1]=32;)e|=1&t,t>>=1;return t+e}(r);do{if((o=Ue(t,n,i,e))s&&(l=s),Xe(t,n,n+l,n+o,e),o=l}a.pushRun(n,o),a.mergeRuns(),r-=o,n+=o}while(0!==r);a.forceMergeRuns()}}}var $e=!1;function Je(){$e||($e=!0,console.warn("z / z2 / zlevel of displayable is invalid, which may cause unexpected errors"))}function Qe(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var tn=function(){function t(){this._roots=[],this._displayList=[],this._displayListLen=0,this.displayableSortFunc=Qe}return t.prototype.traverse=function(t,e){for(var n=0;n0&&(u.__clipPaths=[]),isNaN(u.z)&&(Je(),u.z=0),isNaN(u.z2)&&(Je(),u.z2=0),isNaN(u.zlevel)&&(Je(),u.zlevel=0),this._displayList[this._displayListLen++]=u}var h=t.getDecalElement&&t.getDecalElement();h&&this._updateAndAddDisplayable(h,e,n);var c=t.getTextGuideLine();c&&this._updateAndAddDisplayable(c,e,n);var p=t.getTextContent();p&&this._updateAndAddDisplayable(p,e,n)}},t.prototype.addRoot=function(t){t.__zr&&t.__zr.storage===this||this._roots.push(t)},t.prototype.delRoot=function(t){if(t instanceof Array)for(var e=0,n=t.length;e=0&&this._roots.splice(i,1)}},t.prototype.delAllRoots=function(){this._roots=[],this._displayList=[],this._displayListLen=0},t.prototype.getRoots=function(){return this._roots},t.prototype.dispose=function(){this._displayList=null,this._roots=null},t}(),en=r.hasGlobalWindow&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){return setTimeout(t,16)},nn={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=i*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-nn.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*nn.bounceIn(2*t):.5*nn.bounceOut(2*t-1)+.5}},rn=Math.pow,on=Math.sqrt,an=1e-8,sn=1e-4,ln=on(3),un=1/3,hn=wt(),cn=wt(),pn=wt();function dn(t){return t>-1e-8&&tan||t<-1e-8}function gn(t,e,n,i,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*i+3*o*n)}function yn(t,e,n,i,r){var o=1-r;return 3*(((e-t)*o+2*(n-e)*r)*o+(i-n)*r*r)}function vn(t,e,n,i,r,o){var a=i+3*(e-n)-t,s=3*(n-2*e+t),l=3*(e-t),u=t-r,h=s*s-3*a*l,c=s*l-9*a*u,p=l*l-3*s*u,d=0;if(dn(h)&&dn(c)){if(dn(s))o[0]=0;else(M=-l/s)>=0&&M<=1&&(o[d++]=M)}else{var f=c*c-4*h*p;if(dn(f)){var g=c/h,y=-g/2;(M=-s/a+g)>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y)}else if(f>0){var v=on(f),m=h*s+1.5*a*(-c+v),x=h*s+1.5*a*(-c-v);(M=(-s-((m=m<0?-rn(-m,un):rn(m,un))+(x=x<0?-rn(-x,un):rn(x,un))))/(3*a))>=0&&M<=1&&(o[d++]=M)}else{var _=(2*h*s-3*a*c)/(2*on(h*h*h)),b=Math.acos(_)/3,w=on(h),S=Math.cos(b),M=(-s-2*w*S)/(3*a),I=(y=(-s+w*(S+ln*Math.sin(b)))/(3*a),(-s+w*(S-ln*Math.sin(b)))/(3*a));M>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y),I>=0&&I<=1&&(o[d++]=I)}}return d}function mn(t,e,n,i,r){var o=6*n-12*e+6*t,a=9*e+3*i-3*t-9*n,s=3*e-3*t,l=0;if(dn(a)){if(fn(o))(h=-s/o)>=0&&h<=1&&(r[l++]=h)}else{var u=o*o-4*a*s;if(dn(u))r[0]=-o/(2*a);else if(u>0){var h,c=on(u),p=(-o-c)/(2*a);(h=(-o+c)/(2*a))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}function xn(t,e,n,i,r,o){var a=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,u=(s-a)*r+a,h=(l-s)*r+s,c=(h-u)*r+u;o[0]=t,o[1]=a,o[2]=u,o[3]=c,o[4]=c,o[5]=h,o[6]=l,o[7]=i}function _n(t,e,n,i,r,o,a,s,l,u,h){var c,p,d,f,g,y=.005,v=1/0;hn[0]=l,hn[1]=u;for(var m=0;m<1;m+=.05)cn[0]=gn(t,n,r,a,m),cn[1]=gn(e,i,o,s,m),(f=Vt(hn,cn))=0&&f=0&&y=1?1:vn(0,i,o,1,t,s)&&gn(0,r,a,1,s[0])}}}var kn=function(){function t(t){this._inited=!1,this._startTime=0,this._pausedTime=0,this._paused=!1,this._life=t.life||1e3,this._delay=t.delay||0,this.loop=t.loop||!1,this.onframe=t.onframe||xt,this.ondestroy=t.ondestroy||xt,this.onrestart=t.onrestart||xt,t.easing&&this.setEasing(t.easing)}return t.prototype.step=function(t,e){if(this._inited||(this._startTime=t+this._delay,this._inited=!0),!this._paused){var n=this._life,i=t-this._startTime-this._pausedTime,r=i/n;r<0&&(r=0),r=Math.min(r,1);var o=this.easingFunc,a=o?o(r):r;if(this.onframe(a),1===r){if(!this.loop)return!0;var s=i%n;this._startTime=t-s,this._pausedTime=0,this.onrestart()}return!1}this._pausedTime+=e},t.prototype.pause=function(){this._paused=!0},t.prototype.resume=function(){this._paused=!1},t.prototype.setEasing=function(t){this.easing=t,this.easingFunc=U(t)?t:nn[t]||An(t)},t}(),Ln=function(t){this.value=t},Pn=function(){function t(){this._len=0}return t.prototype.insert=function(t){var e=new Ln(t);return this.insertEntry(e),e},t.prototype.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},t.prototype.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},t.prototype.len=function(){return this._len},t.prototype.clear=function(){this.head=this.tail=null,this._len=0},t}(),On=function(){function t(t){this._list=new Pn,this._maxSize=10,this._map={},this._maxSize=t}return t.prototype.put=function(t,e){var n=this._list,i=this._map,r=null;if(null==i[t]){var o=n.len(),a=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var s=n.head;n.remove(s),delete i[s.key],r=s.value,this._lastRemovedEntry=s}a?a.value=e:a=new Ln(e),a.key=t,n.insertEntry(a),i[t]=a}return r},t.prototype.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},t.prototype.clear=function(){this._list.clear(),this._map={}},t.prototype.len=function(){return this._list.len()},t}(),Rn={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function Nn(t){return(t=Math.round(t))<0?0:t>255?255:t}function En(t){return t<0?0:t>1?1:t}function zn(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?Nn(parseFloat(e)/100*255):Nn(parseInt(e,10))}function Vn(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?En(parseFloat(e)/100):En(parseFloat(e))}function Bn(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function Fn(t,e,n){return t+(e-t)*n}function Gn(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function Wn(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}var Hn=new On(20),Yn=null;function Un(t,e){Yn&&Wn(Yn,e),Yn=Hn.put(t,Yn||e.slice())}function Xn(t,e){if(t){e=e||[];var n=Hn.get(t);if(n)return Wn(e,n);var i=(t+="").replace(/ /g,"").toLowerCase();if(i in Rn)return Wn(e,Rn[i]),Un(t,e),e;var r,o=i.length;if("#"===i.charAt(0))return 4===o||5===o?(r=parseInt(i.slice(1,4),16))>=0&&r<=4095?(Gn(e,(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,5===o?parseInt(i.slice(4),16)/15:1),Un(t,e),e):void Gn(e,0,0,0,1):7===o||9===o?(r=parseInt(i.slice(1,7),16))>=0&&r<=16777215?(Gn(e,(16711680&r)>>16,(65280&r)>>8,255&r,9===o?parseInt(i.slice(7),16)/255:1),Un(t,e),e):void Gn(e,0,0,0,1):void 0;var a=i.indexOf("("),s=i.indexOf(")");if(-1!==a&&s+1===o){var l=i.substr(0,a),u=i.substr(a+1,s-(a+1)).split(","),h=1;switch(l){case"rgba":if(4!==u.length)return 3===u.length?Gn(e,+u[0],+u[1],+u[2],1):Gn(e,0,0,0,1);h=Vn(u.pop());case"rgb":return u.length>=3?(Gn(e,zn(u[0]),zn(u[1]),zn(u[2]),3===u.length?h:Vn(u[3])),Un(t,e),e):void Gn(e,0,0,0,1);case"hsla":return 4!==u.length?void Gn(e,0,0,0,1):(u[3]=Vn(u[3]),Zn(u,e),Un(t,e),e);case"hsl":return 3!==u.length?void Gn(e,0,0,0,1):(Zn(u,e),Un(t,e),e);default:return}}Gn(e,0,0,0,1)}}function Zn(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=Vn(t[1]),r=Vn(t[2]),o=r<=.5?r*(i+1):r+i-r*i,a=2*r-o;return Gn(e=e||[],Nn(255*Bn(a,o,n+1/3)),Nn(255*Bn(a,o,n)),Nn(255*Bn(a,o,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function jn(t,e){var n=Xn(t);if(n){for(var i=0;i<3;i++)n[i]=e<0?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0,n[i]>255?n[i]=255:n[i]<0&&(n[i]=0);return ei(n,4===n.length?"rgba":"rgb")}}function qn(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[];var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=e[r],s=e[o],l=i-r;return n[0]=Nn(Fn(a[0],s[0],l)),n[1]=Nn(Fn(a[1],s[1],l)),n[2]=Nn(Fn(a[2],s[2],l)),n[3]=En(Fn(a[3],s[3],l)),n}}var Kn=qn;function $n(t,e,n){if(e&&e.length&&t>=0&&t<=1){var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=Xn(e[r]),s=Xn(e[o]),l=i-r,u=ei([Nn(Fn(a[0],s[0],l)),Nn(Fn(a[1],s[1],l)),Nn(Fn(a[2],s[2],l)),En(Fn(a[3],s[3],l))],"rgba");return n?{color:u,leftIndex:r,rightIndex:o,value:i}:u}}var Jn=$n;function Qn(t,e,n,i){var r=Xn(t);if(t)return r=function(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(i,r,o),s=Math.max(i,r,o),l=s-a,u=(s+a)/2;if(0===l)e=0,n=0;else{n=u<.5?l/(s+a):l/(2-s-a);var h=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,p=((s-o)/6+l/2)/l;i===s?e=p-c:r===s?e=1/3+h-p:o===s&&(e=2/3+c-h),e<0&&(e+=1),e>1&&(e-=1)}var d=[360*e,n,u];return null!=t[3]&&d.push(t[3]),d}}(r),null!=e&&(r[0]=function(t){return(t=Math.round(t))<0?0:t>360?360:t}(e)),null!=n&&(r[1]=Vn(n)),null!=i&&(r[2]=Vn(i)),ei(Zn(r),"rgba")}function ti(t,e){var n=Xn(t);if(n&&null!=e)return n[3]=En(e),ei(n,"rgba")}function ei(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}function ni(t,e){var n=Xn(t);return n?(.299*n[0]+.587*n[1]+.114*n[2])*n[3]/255+(1-n[3])*e:0}var ii=Object.freeze({__proto__:null,parse:Xn,lift:jn,toHex:function(t){var e=Xn(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)},fastLerp:qn,fastMapToColor:Kn,lerp:$n,mapToColor:Jn,modifyHSL:Qn,modifyAlpha:ti,stringify:ei,lum:ni,random:function(){return ei([Math.round(255*Math.random()),Math.round(255*Math.random()),Math.round(255*Math.random())],"rgb")}}),ri=Math.round;function oi(t){var e;if(t&&"transparent"!==t){if("string"==typeof t&&t.indexOf("rgba")>-1){var n=Xn(t);n&&(t="rgb("+n[0]+","+n[1]+","+n[2]+")",e=n[3])}}else t="none";return{color:t,opacity:null==e?1:e}}var ai=1e-4;function si(t){return t-1e-4}function li(t){return ri(1e3*t)/1e3}function ui(t){return ri(1e4*t)/1e4}var hi={left:"start",right:"end",center:"middle",middle:"middle"};function ci(t){return t&&!!t.image}function pi(t){return"linear"===t.type}function di(t){return"radial"===t.type}function fi(t){return"url(#"+t+")"}function gi(t){var e=t.getGlobalScale(),n=Math.max(e[0],e[1]);return Math.max(Math.ceil(Math.log(n)/Math.log(10)),1)}function yi(t){var e=t.x||0,n=t.y||0,i=(t.rotation||0)*_t,r=rt(t.scaleX,1),o=rt(t.scaleY,1),a=t.skewX||0,s=t.skewY||0,l=[];return(e||n)&&l.push("translate("+e+"px,"+n+"px)"),i&&l.push("rotate("+i+")"),1===r&&1===o||l.push("scale("+r+","+o+")"),(a||s)&&l.push("skew("+ri(a*_t)+"deg, "+ri(s*_t)+"deg)"),l.join(" ")}var vi=r.hasGlobalWindow&&U(window.btoa)?function(t){return window.btoa(unescape(t))}:"undefined"!=typeof Buffer?function(t){return Buffer.from(t).toString("base64")}:function(t){return null},mi=Array.prototype.slice;function xi(t,e,n){return(e-t)*n+t}function _i(t,e,n,i){for(var r=e.length,o=0;oi?e:t,o=Math.min(n,i),a=r[o-1]||{color:[0,0,0,0],offset:0},s=o;sa)i.length=a;else for(var s=o;s=1},t.prototype.getAdditiveTrack=function(){return this._additiveTrack},t.prototype.addKeyframe=function(t,e,n){this._needsSort=!0;var i=this.keyframes,r=i.length,o=!1,a=6,s=e;if(N(e)){var l=function(t){return N(t&&t[0])?2:1}(e);a=l,(1===l&&!j(e[0])||2===l&&!j(e[0][0]))&&(o=!0)}else if(j(e)&&!nt(e))a=0;else if(X(e))if(isNaN(+e)){var u=Xn(e);u&&(s=u,a=3)}else a=0;else if(Q(e)){var h=A({},s);h.colorStops=z(e.colorStops,(function(t){return{offset:t.offset,color:Xn(t.color)}})),pi(e)?a=4:di(e)&&(a=5),s=h}0===r?this.valType=a:a===this.valType&&6!==a||(o=!0),this.discrete=this.discrete||o;var c={time:t,value:s,rawValue:e,percent:0};return n&&(c.easing=n,c.easingFunc=U(n)?n:nn[n]||An(n)),i.push(c),c},t.prototype.prepare=function(t,e){var n=this.keyframes;this._needsSort&&n.sort((function(t,e){return t.time-e.time}));for(var i=this.valType,r=n.length,o=n[r-1],a=this.discrete,s=Di(i),l=Ci(i),u=0;u=0&&!(l[n].percent<=e);n--);n=d(n,u-2)}else{for(n=p;ne);n++);n=d(n-1,u-2)}r=l[n+1],i=l[n]}if(i&&r){this._lastFr=n,this._lastFrP=e;var f=r.percent-i.percent,g=0===f?1:d((e-i.percent)/f,1);r.easingFunc&&(g=r.easingFunc(g));var y=o?this._additiveValue:c?Ai:t[h];if(!Di(s)&&!c||y||(y=this._additiveValue=[]),this.discrete)t[h]=g<1?i.rawValue:r.rawValue;else if(Di(s))1===s?_i(y,i[a],r[a],g):function(t,e,n,i){for(var r=e.length,o=r&&e[0].length,a=0;a0&&s.addKeyframe(0,Ii(l),i),this._trackKeys.push(a)}s.addKeyframe(t,Ii(e[a]),i)}return this._maxTime=Math.max(this._maxTime,t),this},t.prototype.pause=function(){this._clip.pause(),this._paused=!0},t.prototype.resume=function(){this._clip.resume(),this._paused=!1},t.prototype.isPaused=function(){return!!this._paused},t.prototype.duration=function(t){return this._maxTime=t,this._force=!0,this},t.prototype._doneCallback=function(){this._setTracksFinished(),this._clip=null;var t=this._doneCbs;if(t)for(var e=t.length,n=0;n0)){this._started=1;for(var e=this,n=[],i=this._maxTime||0,r=0;r1){var a=o.pop();r.addKeyframe(a.time,t[i]),r.prepare(this._maxTime,r.getAdditiveTrack())}}}},t}();function Pi(){return(new Date).getTime()}var Oi,Ri,Ni=function(t){function e(e){var n=t.call(this)||this;return n._running=!1,n._time=0,n._pausedTime=0,n._pauseStart=0,n._paused=!1,e=e||{},n.stage=e.stage||{},n}return n(e,t),e.prototype.addClip=function(t){t.animation&&this.removeClip(t),this._head?(this._tail.next=t,t.prev=this._tail,t.next=null,this._tail=t):this._head=this._tail=t,t.animation=this},e.prototype.addAnimator=function(t){t.animation=this;var e=t.getClip();e&&this.addClip(e)},e.prototype.removeClip=function(t){if(t.animation){var e=t.prev,n=t.next;e?e.next=n:this._head=n,n?n.prev=e:this._tail=e,t.next=t.prev=t.animation=null}},e.prototype.removeAnimator=function(t){var e=t.getClip();e&&this.removeClip(e),t.animation=null},e.prototype.update=function(t){for(var e=Pi()-this._pausedTime,n=e-this._time,i=this._head;i;){var r=i.next;i.step(e,n)?(i.ondestroy(),this.removeClip(i),i=r):i=r}this._time=e,t||(this.trigger("frame",n),this.stage.update&&this.stage.update())},e.prototype._startLoop=function(){var t=this;this._running=!0,en((function e(){t._running&&(en(e),!t._paused&&t.update())}))},e.prototype.start=function(){this._running||(this._time=Pi(),this._pausedTime=0,this._startLoop())},e.prototype.stop=function(){this._running=!1},e.prototype.pause=function(){this._paused||(this._pauseStart=Pi(),this._paused=!0)},e.prototype.resume=function(){this._paused&&(this._pausedTime+=Pi()-this._pauseStart,this._paused=!1)},e.prototype.clear=function(){for(var t=this._head;t;){var e=t.next;t.prev=t.next=t.animation=null,t=e}this._head=this._tail=null},e.prototype.isFinished=function(){return null==this._head},e.prototype.animate=function(t,e){e=e||{},this.start();var n=new Li(t,e.loop);return this.addAnimator(n),n},e}(Xt),Ei=r.domSupported,zi=(Ri={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},{mouse:Oi=["click","dblclick","mousewheel","wheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],touch:["touchstart","touchend","touchmove"],pointer:z(Oi,(function(t){var e=t.replace("mouse","pointer");return Ri.hasOwnProperty(e)?e:t}))}),Vi=["mousemove","mouseup"],Bi=["pointermove","pointerup"],Fi=!1;function Gi(t){var e=t.pointerType;return"pen"===e||"touch"===e}function Wi(t){t&&(t.zrByTouch=!0)}function Hi(t,e){for(var n=e,i=!1;n&&9!==n.nodeType&&!(i=n.domBelongToZr||n!==e&&n===t.painterRoot);)n=n.parentNode;return i}var Yi=function(t,e){this.stopPropagation=xt,this.stopImmediatePropagation=xt,this.preventDefault=xt,this.type=e.type,this.target=this.currentTarget=t.dom,this.pointerType=e.pointerType,this.clientX=e.clientX,this.clientY=e.clientY},Ui={mousedown:function(t){t=le(this.dom,t),this.__mayPointerCapture=[t.zrX,t.zrY],this.trigger("mousedown",t)},mousemove:function(t){t=le(this.dom,t);var e=this.__mayPointerCapture;!e||t.zrX===e[0]&&t.zrY===e[1]||this.__togglePointerCapture(!0),this.trigger("mousemove",t)},mouseup:function(t){t=le(this.dom,t),this.__togglePointerCapture(!1),this.trigger("mouseup",t)},mouseout:function(t){Hi(this,(t=le(this.dom,t)).toElement||t.relatedTarget)||(this.__pointerCapturing&&(t.zrEventControl="no_globalout"),this.trigger("mouseout",t))},wheel:function(t){Fi=!0,t=le(this.dom,t),this.trigger("mousewheel",t)},mousewheel:function(t){Fi||(t=le(this.dom,t),this.trigger("mousewheel",t))},touchstart:function(t){Wi(t=le(this.dom,t)),this.__lastTouchMoment=new Date,this.handler.processGesture(t,"start"),Ui.mousemove.call(this,t),Ui.mousedown.call(this,t)},touchmove:function(t){Wi(t=le(this.dom,t)),this.handler.processGesture(t,"change"),Ui.mousemove.call(this,t)},touchend:function(t){Wi(t=le(this.dom,t)),this.handler.processGesture(t,"end"),Ui.mouseup.call(this,t),+new Date-+this.__lastTouchMoment<300&&Ui.click.call(this,t)},pointerdown:function(t){Ui.mousedown.call(this,t)},pointermove:function(t){Gi(t)||Ui.mousemove.call(this,t)},pointerup:function(t){Ui.mouseup.call(this,t)},pointerout:function(t){Gi(t)||Ui.mouseout.call(this,t)}};E(["click","dblclick","contextmenu"],(function(t){Ui[t]=function(e){e=le(this.dom,e),this.trigger(t,e)}}));var Xi={pointermove:function(t){Gi(t)||Xi.mousemove.call(this,t)},pointerup:function(t){Xi.mouseup.call(this,t)},mousemove:function(t){this.trigger("mousemove",t)},mouseup:function(t){var e=this.__pointerCapturing;this.__togglePointerCapture(!1),this.trigger("mouseup",t),e&&(t.zrEventControl="only_globalout",this.trigger("mouseout",t))}};function Zi(t,e){var n=e.domHandlers;r.pointerEventsSupported?E(zi.pointer,(function(i){qi(e,i,(function(e){n[i].call(t,e)}))})):(r.touchEventsSupported&&E(zi.touch,(function(i){qi(e,i,(function(r){n[i].call(t,r),function(t){t.touching=!0,null!=t.touchTimer&&(clearTimeout(t.touchTimer),t.touchTimer=null),t.touchTimer=setTimeout((function(){t.touching=!1,t.touchTimer=null}),700)}(e)}))})),E(zi.mouse,(function(i){qi(e,i,(function(r){r=se(r),e.touching||n[i].call(t,r)}))})))}function ji(t,e){function n(n){qi(e,n,(function(i){i=se(i),Hi(t,i.target)||(i=function(t,e){return le(t.dom,new Yi(t,e),!0)}(t,i),e.domHandlers[n].call(t,i))}),{capture:!0})}r.pointerEventsSupported?E(Bi,n):r.touchEventsSupported||E(Vi,n)}function qi(t,e,n,i){t.mounted[e]=n,t.listenerOpts[e]=i,ue(t.domTarget,e,n,i)}function Ki(t){var e,n,i,r,o=t.mounted;for(var a in o)o.hasOwnProperty(a)&&(e=t.domTarget,n=a,i=o[a],r=t.listenerOpts[a],e.removeEventListener(n,i,r));t.mounted={}}var $i=function(t,e){this.mounted={},this.listenerOpts={},this.touching=!1,this.domTarget=t,this.domHandlers=e},Ji=function(t){function e(e,n){var i=t.call(this)||this;return i.__pointerCapturing=!1,i.dom=e,i.painterRoot=n,i._localHandlerScope=new $i(e,Ui),Ei&&(i._globalHandlerScope=new $i(document,Xi)),Zi(i,i._localHandlerScope),i}return n(e,t),e.prototype.dispose=function(){Ki(this._localHandlerScope),Ei&&Ki(this._globalHandlerScope)},e.prototype.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||"default")},e.prototype.__togglePointerCapture=function(t){if(this.__mayPointerCapture=null,Ei&&+this.__pointerCapturing^+t){this.__pointerCapturing=t;var e=this._globalHandlerScope;t?ji(this,e):Ki(e)}},e}(Xt),Qi=1;r.hasGlobalWindow&&(Qi=Math.max(window.devicePixelRatio||window.screen&&window.screen.deviceXDPI/window.screen.logicalXDPI||1,1));var tr=Qi,er="#333",nr="#ccc",ir=ye,rr=5e-5;function or(t){return t>rr||t<-5e-5}var ar=[],sr=[],lr=[1,0,0,1,0,0],ur=Math.abs,hr=function(){function t(){}return t.prototype.getLocalTransform=function(e){return t.getLocalTransform(this,e)},t.prototype.setPosition=function(t){this.x=t[0],this.y=t[1]},t.prototype.setScale=function(t){this.scaleX=t[0],this.scaleY=t[1]},t.prototype.setSkew=function(t){this.skewX=t[0],this.skewY=t[1]},t.prototype.setOrigin=function(t){this.originX=t[0],this.originY=t[1]},t.prototype.needLocalTransform=function(){return or(this.rotation)||or(this.x)||or(this.y)||or(this.scaleX-1)||or(this.scaleY-1)||or(this.skewX)||or(this.skewY)},t.prototype.updateTransform=function(){var t=this.parent&&this.parent.transform,e=this.needLocalTransform(),n=this.transform;e||t?(n=n||[1,0,0,1,0,0],e?this.getLocalTransform(n):ir(n),t&&(e?me(n,t,n):ve(n,t)),this.transform=n,this._resolveGlobalScaleRatio(n)):n&&ir(n)},t.prototype._resolveGlobalScaleRatio=function(t){var e=this.globalScaleRatio;if(null!=e&&1!==e){this.getGlobalScale(ar);var n=ar[0]<0?-1:1,i=ar[1]<0?-1:1,r=((ar[0]-n)*e+n)/ar[0]||0,o=((ar[1]-i)*e+i)/ar[1]||0;t[0]*=r,t[1]*=r,t[2]*=o,t[3]*=o}this.invTransform=this.invTransform||[1,0,0,1,0,0],we(this.invTransform,t)},t.prototype.getComputedTransform=function(){for(var t=this,e=[];t;)e.push(t),t=t.parent;for(;t=e.pop();)t.updateTransform();return this.transform},t.prototype.setLocalTransform=function(t){if(t){var e=t[0]*t[0]+t[1]*t[1],n=t[2]*t[2]+t[3]*t[3],i=Math.atan2(t[1],t[0]),r=Math.PI/2+i-Math.atan2(t[3],t[2]);n=Math.sqrt(n)*Math.cos(r),e=Math.sqrt(e),this.skewX=r,this.skewY=0,this.rotation=-i,this.x=+t[4],this.y=+t[5],this.scaleX=e,this.scaleY=n,this.originX=0,this.originY=0}},t.prototype.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(me(sr,t.invTransform,e),e=sr);var n=this.originX,i=this.originY;(n||i)&&(lr[4]=n,lr[5]=i,me(sr,e,lr),sr[4]-=n,sr[5]-=i,e=sr),this.setLocalTransform(e)}},t.prototype.getGlobalScale=function(t){var e=this.transform;return t=t||[],e?(t[0]=Math.sqrt(e[0]*e[0]+e[1]*e[1]),t[1]=Math.sqrt(e[2]*e[2]+e[3]*e[3]),e[0]<0&&(t[0]=-t[0]),e[3]<0&&(t[1]=-t[1]),t):(t[0]=1,t[1]=1,t)},t.prototype.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&Ft(n,n,i),n},t.prototype.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&Ft(n,n,i),n},t.prototype.getLineScale=function(){var t=this.transform;return t&&ur(t[0]-1)>1e-10&&ur(t[3]-1)>1e-10?Math.sqrt(ur(t[0]*t[3]-t[2]*t[1])):1},t.prototype.copyTransform=function(t){pr(this,t)},t.getLocalTransform=function(t,e){e=e||[];var n=t.originX||0,i=t.originY||0,r=t.scaleX,o=t.scaleY,a=t.anchorX,s=t.anchorY,l=t.rotation||0,u=t.x,h=t.y,c=t.skewX?Math.tan(t.skewX):0,p=t.skewY?Math.tan(-t.skewY):0;if(n||i||a||s){var d=n+a,f=i+s;e[4]=-d*r-c*f*o,e[5]=-f*o-p*d*r}else e[4]=e[5]=0;return e[0]=r,e[3]=o,e[1]=p*r,e[2]=c*o,l&&_e(e,e,l),e[4]+=n+u,e[5]+=i+h,e},t.initDefaultProps=function(){var e=t.prototype;e.scaleX=e.scaleY=e.globalScaleRatio=1,e.x=e.y=e.originX=e.originY=e.skewX=e.skewY=e.rotation=e.anchorX=e.anchorY=0}(),t}(),cr=["x","y","originX","originY","anchorX","anchorY","rotation","scaleX","scaleY","skewX","skewY"];function pr(t,e){for(var n=0;n=0?parseFloat(t)/100*e:parseFloat(t):t}function br(t,e,n){var i=e.position||"inside",r=null!=e.distance?e.distance:5,o=n.height,a=n.width,s=o/2,l=n.x,u=n.y,h="left",c="top";if(i instanceof Array)l+=_r(i[0],n.width),u+=_r(i[1],n.height),h=null,c=null;else switch(i){case"left":l-=r,u+=s,h="right",c="middle";break;case"right":l+=r+a,u+=s,c="middle";break;case"top":l+=a/2,u-=r,h="center",c="bottom";break;case"bottom":l+=a/2,u+=o+r,h="center";break;case"inside":l+=a/2,u+=s,h="center",c="middle";break;case"insideLeft":l+=r,u+=s,c="middle";break;case"insideRight":l+=a-r,u+=s,h="right",c="middle";break;case"insideTop":l+=a/2,u+=r,h="center";break;case"insideBottom":l+=a/2,u+=o-r,h="center",c="bottom";break;case"insideTopLeft":l+=r,u+=r;break;case"insideTopRight":l+=a-r,u+=r,h="right";break;case"insideBottomLeft":l+=r,u+=o-r,c="bottom";break;case"insideBottomRight":l+=a-r,u+=o-r,h="right",c="bottom"}return(t=t||{}).x=l,t.y=u,t.align=h,t.verticalAlign=c,t}var wr="__zr_normal__",Sr=cr.concat(["ignore"]),Mr=V(cr,(function(t,e){return t[e]=!0,t}),{ignore:!1}),Ir={},Tr=new Re(0,0,0,0),Cr=function(){function t(t){this.id=M(),this.animators=[],this.currentStates=[],this.states={},this._init(t)}return t.prototype._init=function(t){this.attr(t)},t.prototype.drift=function(t,e,n){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.markRedraw()},t.prototype.beforeUpdate=function(){},t.prototype.afterUpdate=function(){},t.prototype.update=function(){this.updateTransform(),this.__dirty&&this.updateInnerText()},t.prototype.updateInnerText=function(t){var e=this._textContent;if(e&&(!e.ignore||t)){this.textConfig||(this.textConfig={});var n=this.textConfig,i=n.local,r=e.innerTransformable,o=void 0,a=void 0,s=!1;r.parent=i?this:null;var l=!1;if(r.copyTransform(e),null!=n.position){var u=Tr;n.layoutRect?u.copy(n.layoutRect):u.copy(this.getBoundingRect()),i||u.applyTransform(this.transform),this.calculateTextPosition?this.calculateTextPosition(Ir,n,u):br(Ir,n,u),r.x=Ir.x,r.y=Ir.y,o=Ir.align,a=Ir.verticalAlign;var h=n.origin;if(h&&null!=n.rotation){var c=void 0,p=void 0;"center"===h?(c=.5*u.width,p=.5*u.height):(c=_r(h[0],u.width),p=_r(h[1],u.height)),l=!0,r.originX=-r.x+c+(i?0:u.x),r.originY=-r.y+p+(i?0:u.y)}}null!=n.rotation&&(r.rotation=n.rotation);var d=n.offset;d&&(r.x+=d[0],r.y+=d[1],l||(r.originX=-d[0],r.originY=-d[1]));var f=null==n.inside?"string"==typeof n.position&&n.position.indexOf("inside")>=0:n.inside,g=this._innerTextDefaultStyle||(this._innerTextDefaultStyle={}),y=void 0,v=void 0,m=void 0;f&&this.canBeInsideText()?(y=n.insideFill,v=n.insideStroke,null!=y&&"auto"!==y||(y=this.getInsideTextFill()),null!=v&&"auto"!==v||(v=this.getInsideTextStroke(y),m=!0)):(y=n.outsideFill,v=n.outsideStroke,null!=y&&"auto"!==y||(y=this.getOutsideFill()),null!=v&&"auto"!==v||(v=this.getOutsideStroke(y),m=!0)),(y=y||"#000")===g.fill&&v===g.stroke&&m===g.autoStroke&&o===g.align&&a===g.verticalAlign||(s=!0,g.fill=y,g.stroke=v,g.autoStroke=m,g.align=o,g.verticalAlign=a,e.setDefaultTextStyle(g)),e.__dirty|=1,s&&e.dirtyStyle(!0)}},t.prototype.canBeInsideText=function(){return!0},t.prototype.getInsideTextFill=function(){return"#fff"},t.prototype.getInsideTextStroke=function(t){return"#000"},t.prototype.getOutsideFill=function(){return this.__zr&&this.__zr.isDarkMode()?nr:er},t.prototype.getOutsideStroke=function(t){var e=this.__zr&&this.__zr.getBackgroundColor(),n="string"==typeof e&&Xn(e);n||(n=[255,255,255,1]);for(var i=n[3],r=this.__zr.isDarkMode(),o=0;o<3;o++)n[o]=n[o]*i+(r?0:255)*(1-i);return n[3]=1,ei(n,"rgba")},t.prototype.traverse=function(t,e){},t.prototype.attrKV=function(t,e){"textConfig"===t?this.setTextConfig(e):"textContent"===t?this.setTextContent(e):"clipPath"===t?this.setClipPath(e):"extra"===t?(this.extra=this.extra||{},A(this.extra,e)):this[t]=e},t.prototype.hide=function(){this.ignore=!0,this.markRedraw()},t.prototype.show=function(){this.ignore=!1,this.markRedraw()},t.prototype.attr=function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(q(t))for(var n=G(t),i=0;i0},t.prototype.getState=function(t){return this.states[t]},t.prototype.ensureState=function(t){var e=this.states;return e[t]||(e[t]={}),e[t]},t.prototype.clearStates=function(t){this.useState(wr,!1,t)},t.prototype.useState=function(t,e,n,i){var r=t===wr;if(this.hasState()||!r){var o=this.currentStates,a=this.stateTransition;if(!(P(o,t)>=0)||!e&&1!==o.length){var s;if(this.stateProxy&&!r&&(s=this.stateProxy(t)),s||(s=this.states&&this.states[t]),s||r){r||this.saveCurrentToNormalState(s);var l=!!(s&&s.hoverLayer||i);l&&this._toggleHoverLayerFlag(!0),this._applyStateObj(t,s,this._normalState,e,!n&&!this.__inHover&&a&&a.duration>0,a);var u=this._textContent,h=this._textGuide;return u&&u.useState(t,e,n,l),h&&h.useState(t,e,n,l),r?(this.currentStates=[],this._normalState={}):e?this.currentStates.push(t):this.currentStates=[t],this._updateAnimationTargets(),this.markRedraw(),!l&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2),s}I("State "+t+" not exists.")}}},t.prototype.useStates=function(t,e,n){if(t.length){var i=[],r=this.currentStates,o=t.length,a=o===r.length;if(a)for(var s=0;s0,d);var f=this._textContent,g=this._textGuide;f&&f.useStates(t,e,c),g&&g.useStates(t,e,c),this._updateAnimationTargets(),this.currentStates=t.slice(),this.markRedraw(),!c&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2)}else this.clearStates()},t.prototype._updateAnimationTargets=function(){for(var t=0;t=0){var n=this.currentStates.slice();n.splice(e,1),this.useStates(n)}},t.prototype.replaceState=function(t,e,n){var i=this.currentStates.slice(),r=P(i,t),o=P(i,e)>=0;r>=0?o?i.splice(r,1):i[r]=e:n&&!o&&i.push(e),this.useStates(i)},t.prototype.toggleState=function(t,e){e?this.useState(t,!0):this.removeState(t)},t.prototype._mergeStates=function(t){for(var e,n={},i=0;i=0&&e.splice(n,1)})),this.animators.push(t),n&&n.animation.addAnimator(t),n&&n.wakeUp()},t.prototype.updateDuringAnimation=function(t){this.markRedraw()},t.prototype.stopAnimation=function(t,e){for(var n=this.animators,i=n.length,r=[],o=0;o0&&n.during&&o[0].during((function(t,e){n.during(e)}));for(var p=0;p0||r.force&&!a.length){var w,S=void 0,M=void 0,I=void 0;if(s){M={},p&&(S={});for(_=0;_=0&&(n.splice(i,0,t),this._doAdd(t))}return this},e.prototype.replace=function(t,e){var n=P(this._children,t);return n>=0&&this.replaceAt(e,n),this},e.prototype.replaceAt=function(t,e){var n=this._children,i=n[e];if(t&&t!==this&&t.parent!==this&&t!==i){n[e]=t,i.parent=null;var r=this.__zr;r&&i.removeSelfFromZr(r),this._doAdd(t)}return this},e.prototype._doAdd=function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__zr;e&&e!==t.__zr&&t.addSelfToZr(e),e&&e.refresh()},e.prototype.remove=function(t){var e=this.__zr,n=this._children,i=P(n,t);return i<0||(n.splice(i,1),t.parent=null,e&&t.removeSelfFromZr(e),e&&e.refresh()),this},e.prototype.removeAll=function(){for(var t=this._children,e=this.__zr,n=0;n0&&(this._stillFrameAccum++,this._stillFrameAccum>this._sleepAfterStill&&this.animation.stop())},t.prototype.setSleepAfterStill=function(t){this._sleepAfterStill=t},t.prototype.wakeUp=function(){this.animation.start(),this._stillFrameAccum=0},t.prototype.refreshHover=function(){this._needsRefreshHover=!0},t.prototype.refreshHoverImmediately=function(){this._needsRefreshHover=!1,this.painter.refreshHover&&"canvas"===this.painter.getType()&&this.painter.refreshHover()},t.prototype.resize=function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},t.prototype.clearAnimation=function(){this.animation.clear()},t.prototype.getWidth=function(){return this.painter.getWidth()},t.prototype.getHeight=function(){return this.painter.getHeight()},t.prototype.setCursorStyle=function(t){this.handler.setCursorStyle(t)},t.prototype.findHover=function(t,e){return this.handler.findHover(t,e)},t.prototype.on=function(t,e,n){return this.handler.on(t,e,n),this},t.prototype.off=function(t,e){this.handler.off(t,e)},t.prototype.trigger=function(t,e){this.handler.trigger(t,e)},t.prototype.clear=function(){for(var t=this.storage.getRoots(),e=0;e0){if(t<=r)return a;if(t>=o)return s}else{if(t>=r)return a;if(t<=o)return s}else{if(t===r)return a;if(t===o)return s}return(t-r)/l*u+a}function Gr(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return X(t)?(n=t,n.replace(/^\s+|\s+$/g,"")).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t;var n}function Wr(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function Hr(t){return t.sort((function(t,e){return t-e})),t}function Yr(t){if(t=+t,isNaN(t))return 0;if(t>1e-14)for(var e=1,n=0;n<15;n++,e*=10)if(Math.round(t*e)/e===t)return n;return Ur(t)}function Ur(t){var e=t.toString().toLowerCase(),n=e.indexOf("e"),i=n>0?+e.slice(n+1):0,r=n>0?n:e.length,o=e.indexOf("."),a=o<0?0:r-1-o;return Math.max(0,a-i)}function Xr(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),o=Math.round(n(Math.abs(e[1]-e[0]))/i),a=Math.min(Math.max(-r+o,0),20);return isFinite(a)?a:20}function Zr(t,e){var n=V(t,(function(t,e){return t+(isNaN(e)?0:e)}),0);if(0===n)return[];for(var i=Math.pow(10,e),r=z(t,(function(t){return(isNaN(t)?0:t)/n*i*100})),o=100*i,a=z(r,(function(t){return Math.floor(t)})),s=V(a,(function(t,e){return t+e}),0),l=z(r,(function(t,e){return t-a[e]}));su&&(u=l[c],h=c);++a[h],l[h]=0,++s}return z(a,(function(t){return t/i}))}function jr(t,e){var n=Math.max(Yr(t),Yr(e)),i=t+e;return n>20?i:Wr(i,n)}var qr=9007199254740991;function Kr(t){var e=2*Math.PI;return(t%e+e)%e}function $r(t){return t>-1e-4&&t=10&&e++,e}function no(t,e){var n=eo(t),i=Math.pow(10,n),r=t/i;return t=(e?r<1.5?1:r<2.5?2:r<4?3:r<7?5:10:r<1?1:r<2?2:r<3?3:r<5?5:10)*i,n>=-20?+t.toFixed(n<0?-n:0):t}function io(t,e){var n=(t.length-1)*e+1,i=Math.floor(n),r=+t[i-1],o=n-i;return o?r+o*(t[i]-r):r}function ro(t){t.sort((function(t,e){return s(t,e,0)?-1:1}));for(var e=-1/0,n=1,i=0;i=0||r&&P(r,s)<0)){var l=n.getShallow(s,e);null!=l&&(o[t[a][0]]=l)}}return o}}var jo=Zo([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),qo=function(){function t(){}return t.prototype.getAreaStyle=function(t,e){return jo(this,t,e)},t}(),Ko=new On(50);function $o(t){if("string"==typeof t){var e=Ko.get(t);return e&&e.image}return t}function Jo(t,e,n,i,r){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!n)return e;var o=Ko.get(t),a={hostEl:n,cb:i,cbPayload:r};return o?!ta(e=o.image)&&o.pending.push(a):((e=h.loadImage(t,Qo,Qo)).__zrImageSrc=t,Ko.put(t,e.__cachedImgObj={image:e,pending:[a]})),e}return t}return e}function Qo(){var t=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var e=0;e=a;l++)s-=a;var u=fr(n,e);return u>s&&(n="",u=0),s=t-u,r.ellipsis=n,r.ellipsisWidth=u,r.contentWidth=s,r.containerWidth=t,r}function ra(t,e){var n=e.containerWidth,i=e.font,r=e.contentWidth;if(!n)return"";var o=fr(t,i);if(o<=n)return t;for(var a=0;;a++){if(o<=r||a>=e.maxIterations){t+=e.ellipsis;break}var s=0===a?oa(t,r,e.ascCharWidth,e.cnCharWidth):o>0?Math.floor(t.length*r/o):0;o=fr(t=t.substr(0,s),i)}return""===t&&(t=e.placeholder),t}function oa(t,e,n,i){for(var r=0,o=0,a=t.length;o0&&f+i.accumWidth>i.width&&(o=e.split("\n"),c=!0),i.accumWidth=f}else{var g=pa(e,h,i.width,i.breakAll,i.accumWidth);i.accumWidth=g.accumWidth+d,a=g.linesWidths,o=g.lines}}else o=e.split("\n");for(var y=0;y=33&&e<=383}(t)||!!ha[t]}function pa(t,e,n,i,r){for(var o=[],a=[],s="",l="",u=0,h=0,c=0;cn:r+h+d>n)?h?(s||l)&&(f?(s||(s=l,l="",h=u=0),o.push(s),a.push(h-u),l+=p,s="",h=u+=d):(l&&(s+=l,l="",u=0),o.push(s),a.push(h),s=p,h=d)):f?(o.push(l),a.push(u),l=p,u=d):(o.push(p),a.push(d)):(h+=d,f?(l+=p,u+=d):(l&&(s+=l,l="",u=0),s+=p))}else l&&(s+=l,h+=u),o.push(s),a.push(h),s="",l="",u=0,h=0}return o.length||s||(s=t,l="",u=0),l&&(s+=l),s&&(o.push(s),a.push(h)),1===o.length&&(h+=r),{accumWidth:h,lines:o,linesWidths:a}}var da="__zr_style_"+Math.round(10*Math.random()),fa={shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"#000",opacity:1,blend:"source-over"},ga={style:{shadowBlur:!0,shadowOffsetX:!0,shadowOffsetY:!0,shadowColor:!0,opacity:!0}};fa[da]=!0;var ya=["z","z2","invisible"],va=["invisible"],ma=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype._init=function(e){for(var n=G(e),i=0;i1e-4)return s[0]=t-n,s[1]=e-i,l[0]=t+n,void(l[1]=e+i);if(Ta[0]=Ma(r)*n+t,Ta[1]=Sa(r)*i+e,Ca[0]=Ma(o)*n+t,Ca[1]=Sa(o)*i+e,u(s,Ta,Ca),h(l,Ta,Ca),(r%=Ia)<0&&(r+=Ia),(o%=Ia)<0&&(o+=Ia),r>o&&!a?o+=Ia:rr&&(Da[0]=Ma(d)*n+t,Da[1]=Sa(d)*i+e,u(s,Da,s),h(l,Da,l))}var Ea={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},za=[],Va=[],Ba=[],Fa=[],Ga=[],Wa=[],Ha=Math.min,Ya=Math.max,Ua=Math.cos,Xa=Math.sin,Za=Math.abs,ja=Math.PI,qa=2*ja,Ka="undefined"!=typeof Float32Array,$a=[];function Ja(t){return Math.round(t/ja*1e8)/1e8%2*ja}function Qa(t,e){var n=Ja(t[0]);n<0&&(n+=qa);var i=n-t[0],r=t[1];r+=i,!e&&r-n>=qa?r=n+qa:e&&n-r>=qa?r=n-qa:!e&&n>r?r=n+(qa-Ja(n-r)):e&&n0&&(this._ux=Za(n/tr/t)||0,this._uy=Za(n/tr/e)||0)},t.prototype.setDPR=function(t){this.dpr=t},t.prototype.setContext=function(t){this._ctx=t},t.prototype.getContext=function(){return this._ctx},t.prototype.beginPath=function(){return this._ctx&&this._ctx.beginPath(),this.reset(),this},t.prototype.reset=function(){this._saveData&&(this._len=0),this._pathSegLen&&(this._pathSegLen=null,this._pathLen=0),this._version++},t.prototype.moveTo=function(t,e){return this._drawPendingPt(),this.addData(Ea.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},t.prototype.lineTo=function(t,e){var n=Za(t-this._xi),i=Za(e-this._yi),r=n>this._ux||i>this._uy;if(this.addData(Ea.L,t,e),this._ctx&&r&&this._ctx.lineTo(t,e),r)this._xi=t,this._yi=e,this._pendingPtDist=0;else{var o=n*n+i*i;o>this._pendingPtDist&&(this._pendingPtX=t,this._pendingPtY=e,this._pendingPtDist=o)}return this},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){return this._drawPendingPt(),this.addData(Ea.C,t,e,n,i,r,o),this._ctx&&this._ctx.bezierCurveTo(t,e,n,i,r,o),this._xi=r,this._yi=o,this},t.prototype.quadraticCurveTo=function(t,e,n,i){return this._drawPendingPt(),this.addData(Ea.Q,t,e,n,i),this._ctx&&this._ctx.quadraticCurveTo(t,e,n,i),this._xi=n,this._yi=i,this},t.prototype.arc=function(t,e,n,i,r,o){this._drawPendingPt(),$a[0]=i,$a[1]=r,Qa($a,o),i=$a[0];var a=(r=$a[1])-i;return this.addData(Ea.A,t,e,n,n,i,a,0,o?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,o),this._xi=Ua(r)*n+t,this._yi=Xa(r)*n+e,this},t.prototype.arcTo=function(t,e,n,i,r){return this._drawPendingPt(),this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},t.prototype.rect=function(t,e,n,i){return this._drawPendingPt(),this._ctx&&this._ctx.rect(t,e,n,i),this.addData(Ea.R,t,e,n,i),this},t.prototype.closePath=function(){this._drawPendingPt(),this.addData(Ea.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&t.closePath(),this._xi=e,this._yi=n,this},t.prototype.fill=function(t){t&&t.fill(),this.toStatic()},t.prototype.stroke=function(t){t&&t.stroke(),this.toStatic()},t.prototype.len=function(){return this._len},t.prototype.setData=function(t){var e=t.length;this.data&&this.data.length===e||!Ka||(this.data=new Float32Array(e));for(var n=0;nu.length&&(this._expandData(),u=this.data);for(var h=0;h0&&(this._ctx&&this._ctx.lineTo(this._pendingPtX,this._pendingPtY),this._pendingPtDist=0)},t.prototype._expandData=function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e11&&(this.data=new Float32Array(t)))}},t.prototype.getBoundingRect=function(){Ba[0]=Ba[1]=Ga[0]=Ga[1]=Number.MAX_VALUE,Fa[0]=Fa[1]=Wa[0]=Wa[1]=-Number.MAX_VALUE;var t,e=this.data,n=0,i=0,r=0,o=0;for(t=0;tn||Za(y)>i||c===e-1)&&(f=Math.sqrt(A*A+y*y),r=g,o=x);break;case Ea.C:var v=t[c++],m=t[c++],x=(g=t[c++],t[c++]),_=t[c++],b=t[c++];f=bn(r,o,v,m,g,x,_,b,10),r=_,o=b;break;case Ea.Q:f=Cn(r,o,v=t[c++],m=t[c++],g=t[c++],x=t[c++],10),r=g,o=x;break;case Ea.A:var w=t[c++],S=t[c++],M=t[c++],I=t[c++],T=t[c++],C=t[c++],D=C+T;c+=1;t[c++];d&&(a=Ua(T)*M+w,s=Xa(T)*I+S),f=Ya(M,I)*Ha(qa,Math.abs(C)),r=Ua(D)*M+w,o=Xa(D)*I+S;break;case Ea.R:a=r=t[c++],s=o=t[c++],f=2*t[c++]+2*t[c++];break;case Ea.Z:var A=a-r;y=s-o;f=Math.sqrt(A*A+y*y),r=a,o=s}f>=0&&(l[h++]=f,u+=f)}return this._pathLen=u,u},t.prototype.rebuildPath=function(t,e){var n,i,r,o,a,s,l,u,h,c,p=this.data,d=this._ux,f=this._uy,g=this._len,y=e<1,v=0,m=0,x=0;if(!y||(this._pathSegLen||this._calculateLength(),l=this._pathSegLen,u=e*this._pathLen))t:for(var _=0;_0&&(t.lineTo(h,c),x=0),b){case Ea.M:n=r=p[_++],i=o=p[_++],t.moveTo(r,o);break;case Ea.L:a=p[_++],s=p[_++];var S=Za(a-r),M=Za(s-o);if(S>d||M>f){if(y){if(v+(j=l[m++])>u){var I=(u-v)/j;t.lineTo(r*(1-I)+a*I,o*(1-I)+s*I);break t}v+=j}t.lineTo(a,s),r=a,o=s,x=0}else{var T=S*S+M*M;T>x&&(h=a,c=s,x=T)}break;case Ea.C:var C=p[_++],D=p[_++],A=p[_++],k=p[_++],L=p[_++],P=p[_++];if(y){if(v+(j=l[m++])>u){xn(r,C,A,L,I=(u-v)/j,za),xn(o,D,k,P,I,Va),t.bezierCurveTo(za[1],Va[1],za[2],Va[2],za[3],Va[3]);break t}v+=j}t.bezierCurveTo(C,D,A,k,L,P),r=L,o=P;break;case Ea.Q:C=p[_++],D=p[_++],A=p[_++],k=p[_++];if(y){if(v+(j=l[m++])>u){In(r,C,A,I=(u-v)/j,za),In(o,D,k,I,Va),t.quadraticCurveTo(za[1],Va[1],za[2],Va[2]);break t}v+=j}t.quadraticCurveTo(C,D,A,k),r=A,o=k;break;case Ea.A:var O=p[_++],R=p[_++],N=p[_++],E=p[_++],z=p[_++],V=p[_++],B=p[_++],F=!p[_++],G=N>E?N:E,W=Za(N-E)>.001,H=z+V,Y=!1;if(y)v+(j=l[m++])>u&&(H=z+V*(u-v)/j,Y=!0),v+=j;if(W&&t.ellipse?t.ellipse(O,R,N,E,B,z,H,F):t.arc(O,R,G,z,H,F),Y)break t;w&&(n=Ua(z)*N+O,i=Xa(z)*E+R),r=Ua(H)*N+O,o=Xa(H)*E+R;break;case Ea.R:n=r=p[_],i=o=p[_+1],a=p[_++],s=p[_++];var U=p[_++],X=p[_++];if(y){if(v+(j=l[m++])>u){var Z=u-v;t.moveTo(a,s),t.lineTo(a+Ha(Z,U),s),(Z-=U)>0&&t.lineTo(a+U,s+Ha(Z,X)),(Z-=X)>0&&t.lineTo(a+Ya(U-Z,0),s+X),(Z-=U)>0&&t.lineTo(a,s+Ya(X-Z,0));break t}v+=j}t.rect(a,s,U,X);break;case Ea.Z:if(y){var j;if(v+(j=l[m++])>u){I=(u-v)/j;t.lineTo(r*(1-I)+n*I,o*(1-I)+i*I);break t}v+=j}t.closePath(),r=n,o=i}}},t.prototype.clone=function(){var e=new t,n=this.data;return e.data=n.slice?n.slice():Array.prototype.slice.call(n),e._len=this._len,e},t.CMD=Ea,t.initDefaultProps=function(){var e=t.prototype;e._saveData=!0,e._ux=0,e._uy=0,e._pendingPtDist=0,e._version=0}(),t}();function es(t,e,n,i,r,o,a){if(0===r)return!1;var s=r,l=0;if(a>e+s&&a>i+s||at+s&&o>n+s||oe+c&&h>i+c&&h>o+c&&h>s+c||ht+c&&u>n+c&&u>r+c&&u>a+c||ue+u&&l>i+u&&l>o+u||lt+u&&s>n+u&&s>r+u||sn||h+ur&&(r+=as);var p=Math.atan2(l,s);return p<0&&(p+=as),p>=i&&p<=r||p+as>=i&&p+as<=r}function ls(t,e,n,i,r,o){if(o>e&&o>i||or?s:0}var us=ts.CMD,hs=2*Math.PI;var cs=[-1,-1,-1],ps=[-1,-1];function ds(t,e,n,i,r,o,a,s,l,u){if(u>e&&u>i&&u>o&&u>s||u1&&(h=void 0,h=ps[0],ps[0]=ps[1],ps[1]=h),f=gn(e,i,o,s,ps[0]),d>1&&(g=gn(e,i,o,s,ps[1]))),2===d?ve&&s>i&&s>o||s=0&&h<=1&&(r[l++]=h);else{var u=a*a-4*o*s;if(dn(u))(h=-a/(2*o))>=0&&h<=1&&(r[l++]=h);else if(u>0){var h,c=on(u),p=(-a-c)/(2*o);(h=(-a+c)/(2*o))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}(e,i,o,s,cs);if(0===l)return 0;var u=Mn(e,i,o);if(u>=0&&u<=1){for(var h=0,c=wn(e,i,o,u),p=0;pn||s<-n)return 0;var l=Math.sqrt(n*n-s*s);cs[0]=-l,cs[1]=l;var u=Math.abs(i-r);if(u<1e-4)return 0;if(u>=hs-1e-4){i=0,r=hs;var h=o?1:-1;return a>=cs[0]+t&&a<=cs[1]+t?h:0}if(i>r){var c=i;i=r,r=c}i<0&&(i+=hs,r+=hs);for(var p=0,d=0;d<2;d++){var f=cs[d];if(f+t>a){var g=Math.atan2(s,f);h=o?1:-1;g<0&&(g=hs+g),(g>=i&&g<=r||g+hs>=i&&g+hs<=r)&&(g>Math.PI/2&&g<1.5*Math.PI&&(h=-h),p+=h)}}return p}function ys(t,e,n,i,r){for(var o,a,s,l,u=t.data,h=t.len(),c=0,p=0,d=0,f=0,g=0,y=0;y1&&(n||(c+=ls(p,d,f,g,i,r))),m&&(f=p=u[y],g=d=u[y+1]),v){case us.M:p=f=u[y++],d=g=u[y++];break;case us.L:if(n){if(es(p,d,u[y],u[y+1],e,i,r))return!0}else c+=ls(p,d,u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case us.C:if(n){if(ns(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=ds(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case us.Q:if(n){if(is(p,d,u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=fs(p,d,u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case us.A:var x=u[y++],_=u[y++],b=u[y++],w=u[y++],S=u[y++],M=u[y++];y+=1;var I=!!(1-u[y++]);o=Math.cos(S)*b+x,a=Math.sin(S)*w+_,m?(f=o,g=a):c+=ls(p,d,o,a,i,r);var T=(i-x)*w/b+x;if(n){if(ss(x,_,w,S,S+M,I,e,T,r))return!0}else c+=gs(x,_,w,S,S+M,I,T,r);p=Math.cos(S+M)*b+x,d=Math.sin(S+M)*w+_;break;case us.R:if(f=p=u[y++],g=d=u[y++],o=f+u[y++],a=g+u[y++],n){if(es(f,g,o,g,e,i,r)||es(o,g,o,a,e,i,r)||es(o,a,f,a,e,i,r)||es(f,a,f,g,e,i,r))return!0}else c+=ls(o,g,o,a,i,r),c+=ls(f,a,f,g,i,r);break;case us.Z:if(n){if(es(p,d,f,g,e,i,r))return!0}else c+=ls(p,d,f,g,i,r);p=f,d=g}}return n||(s=d,l=g,Math.abs(s-l)<1e-4)||(c+=ls(p,d,f,g,i,r)||0),0!==c}var vs=k({fill:"#000",stroke:null,strokePercent:1,fillOpacity:1,strokeOpacity:1,lineDashOffset:0,lineWidth:1,lineCap:"butt",miterLimit:10,strokeNoScale:!1,strokeFirst:!1},fa),ms={style:k({fill:!0,stroke:!0,strokePercent:!0,fillOpacity:!0,strokeOpacity:!0,lineDashOffset:!0,lineWidth:!0,miterLimit:!0},ga.style)},xs=cr.concat(["invisible","culling","z","z2","zlevel","parent"]),_s=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype.update=function(){var n=this;t.prototype.update.call(this);var i=this.style;if(i.decal){var r=this._decalEl=this._decalEl||new e;r.buildPath===e.prototype.buildPath&&(r.buildPath=function(t){n.buildPath(t,n.shape)}),r.silent=!0;var o=r.style;for(var a in i)o[a]!==i[a]&&(o[a]=i[a]);o.fill=i.fill?i.decal:null,o.decal=null,o.shadowColor=null,i.strokeFirst&&(o.stroke=null);for(var s=0;s.5?er:e>.2?"#eee":nr}if(t)return nr}return er},e.prototype.getInsideTextStroke=function(t){var e=this.style.fill;if(X(e)){var n=this.__zr;if(!(!n||!n.isDarkMode())===ni(t,0)<.4)return e}},e.prototype.buildPath=function(t,e,n){},e.prototype.pathUpdated=function(){this.__dirty&=-5},e.prototype.getUpdatedPathProxy=function(t){return!this.path&&this.createPathProxy(),this.path.beginPath(),this.buildPath(this.path,this.shape,t),this.path},e.prototype.createPathProxy=function(){this.path=new ts(!1)},e.prototype.hasStroke=function(){var t=this.style,e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.getBoundingRect=function(){var t=this._rect,e=this.style,n=!t;if(n){var i=!1;this.path||(i=!0,this.createPathProxy());var r=this.path;(i||4&this.__dirty)&&(r.beginPath(),this.buildPath(r,this.shape,!1),this.pathUpdated()),t=r.getBoundingRect()}if(this._rect=t,this.hasStroke()&&this.path&&this.path.len()>0){var o=this._rectStroke||(this._rectStroke=t.clone());if(this.__dirty||n){o.copy(t);var a=e.strokeNoScale?this.getLineScale():1,s=e.lineWidth;if(!this.hasFill()){var l=this.strokeContainThreshold;s=Math.max(s,null==l?4:l)}a>1e-10&&(o.width+=s/a,o.height+=s/a,o.x-=s/a/2,o.y-=s/a/2)}return o}return t},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var o=this.path;if(this.hasStroke()){var a=r.lineWidth,s=r.strokeNoScale?this.getLineScale():1;if(s>1e-10&&(this.hasFill()||(a=Math.max(a,this.strokeContainThreshold)),function(t,e,n,i){return ys(t,e,!0,n,i)}(o,a/s,t,e)))return!0}if(this.hasFill())return function(t,e,n){return ys(t,0,!1,e,n)}(o,t,e)}return!1},e.prototype.dirtyShape=function(){this.__dirty|=4,this._rect&&(this._rect=null),this._decalEl&&this._decalEl.dirtyShape(),this.markRedraw()},e.prototype.dirty=function(){this.dirtyStyle(),this.dirtyShape()},e.prototype.animateShape=function(t){return this.animate("shape",t)},e.prototype.updateDuringAnimation=function(t){"style"===t?this.dirtyStyle():"shape"===t?this.dirtyShape():this.markRedraw()},e.prototype.attrKV=function(e,n){"shape"===e?this.setShape(n):t.prototype.attrKV.call(this,e,n)},e.prototype.setShape=function(t,e){var n=this.shape;return n||(n=this.shape={}),"string"==typeof t?n[t]=e:A(n,t),this.dirtyShape(),this},e.prototype.shapeChanged=function(){return!!(4&this.__dirty)},e.prototype.createStyle=function(t){return yt(vs,t)},e.prototype._innerSaveToNormal=function(e){t.prototype._innerSaveToNormal.call(this,e);var n=this._normalState;e.shape&&!n.shape&&(n.shape=A({},this.shape))},e.prototype._applyStateObj=function(e,n,i,r,o,a){t.prototype._applyStateObj.call(this,e,n,i,r,o,a);var s,l=!(n&&r);if(n&&n.shape?o?r?s=n.shape:(s=A({},i.shape),A(s,n.shape)):(s=A({},r?this.shape:i.shape),A(s,n.shape)):l&&(s=i.shape),s)if(o){this.shape=A({},this.shape);for(var u={},h=G(s),c=0;c0},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.createStyle=function(t){return yt(bs,t)},e.prototype.setBoundingRect=function(t){this._rect=t},e.prototype.getBoundingRect=function(){var t=this.style;if(!this._rect){var e=t.text;null!=e?e+="":e="";var n=yr(e,t.font,t.textAlign,t.textBaseline);if(n.x+=t.x||0,n.y+=t.y||0,this.hasStroke()){var i=t.lineWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect},e.initDefaultProps=void(e.prototype.dirtyRectTolerance=10),e}(ma);ws.prototype.type="tspan";var Ss=k({x:0,y:0},fa),Ms={style:k({x:!0,y:!0,width:!0,height:!0,sx:!0,sy:!0,sWidth:!0,sHeight:!0},ga.style)};var Is=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.createStyle=function(t){return yt(Ss,t)},e.prototype._getSize=function(t){var e=this.style,n=e[t];if(null!=n)return n;var i,r=(i=e.image)&&"string"!=typeof i&&i.width&&i.height?e.image:this.__image;if(!r)return 0;var o="width"===t?"height":"width",a=e[o];return null==a?r[t]:r[t]/r[o]*a},e.prototype.getWidth=function(){return this._getSize("width")},e.prototype.getHeight=function(){return this._getSize("height")},e.prototype.getAnimationStyleProps=function(){return Ms},e.prototype.getBoundingRect=function(){var t=this.style;return this._rect||(this._rect=new Re(t.x||0,t.y||0,this.getWidth(),this.getHeight())),this._rect},e}(ma);Is.prototype.type="image";var Ts=Math.round;function Cs(t,e,n){if(e){var i=e.x1,r=e.x2,o=e.y1,a=e.y2;t.x1=i,t.x2=r,t.y1=o,t.y2=a;var s=n&&n.lineWidth;return s?(Ts(2*i)===Ts(2*r)&&(t.x1=t.x2=As(i,s,!0)),Ts(2*o)===Ts(2*a)&&(t.y1=t.y2=As(o,s,!0)),t):t}}function Ds(t,e,n){if(e){var i=e.x,r=e.y,o=e.width,a=e.height;t.x=i,t.y=r,t.width=o,t.height=a;var s=n&&n.lineWidth;return s?(t.x=As(i,s,!0),t.y=As(r,s,!0),t.width=Math.max(As(i+o,s,!1)-t.x,0===o?0:1),t.height=Math.max(As(r+a,s,!1)-t.y,0===a?0:1),t):t}}function As(t,e,n){if(!e)return t;var i=Ts(2*t);return(i+Ts(e))%2==0?i/2:(i+(n?1:-1))/2}var ks=function(){this.x=0,this.y=0,this.width=0,this.height=0},Ls={},Ps=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new ks},e.prototype.buildPath=function(t,e){var n,i,r,o;if(this.subPixelOptimize){var a=Ds(Ls,e,this.style);n=a.x,i=a.y,r=a.width,o=a.height,a.r=e.r,e=a}else n=e.x,i=e.y,r=e.width,o=e.height;e.r?function(t,e){var n,i,r,o,a,s=e.x,l=e.y,u=e.width,h=e.height,c=e.r;u<0&&(s+=u,u=-u),h<0&&(l+=h,h=-h),"number"==typeof c?n=i=r=o=c:c instanceof Array?1===c.length?n=i=r=o=c[0]:2===c.length?(n=r=c[0],i=o=c[1]):3===c.length?(n=c[0],i=o=c[1],r=c[2]):(n=c[0],i=c[1],r=c[2],o=c[3]):n=i=r=o=0,n+i>u&&(n*=u/(a=n+i),i*=u/a),r+o>u&&(r*=u/(a=r+o),o*=u/a),i+r>h&&(i*=h/(a=i+r),r*=h/a),n+o>h&&(n*=h/(a=n+o),o*=h/a),t.moveTo(s+n,l),t.lineTo(s+u-i,l),0!==i&&t.arc(s+u-i,l+i,i,-Math.PI/2,0),t.lineTo(s+u,l+h-r),0!==r&&t.arc(s+u-r,l+h-r,r,0,Math.PI/2),t.lineTo(s+o,l+h),0!==o&&t.arc(s+o,l+h-o,o,Math.PI/2,Math.PI),t.lineTo(s,l+n),0!==n&&t.arc(s+n,l+n,n,Math.PI,1.5*Math.PI)}(t,e):t.rect(n,i,r,o)},e.prototype.isZeroArea=function(){return!this.shape.width||!this.shape.height},e}(_s);Ps.prototype.type="rect";var Os={fill:"#000"},Rs={style:k({fill:!0,stroke:!0,fillOpacity:!0,strokeOpacity:!0,lineWidth:!0,fontSize:!0,lineHeight:!0,width:!0,height:!0,textShadowColor:!0,textShadowBlur:!0,textShadowOffsetX:!0,textShadowOffsetY:!0,backgroundColor:!0,padding:!0,borderColor:!0,borderWidth:!0,borderRadius:!0},ga.style)},Ns=function(t){function e(e){var n=t.call(this)||this;return n.type="text",n._children=[],n._defaultStyle=Os,n.attr(e),n}return n(e,t),e.prototype.childrenRef=function(){return this._children},e.prototype.update=function(){t.prototype.update.call(this),this.styleChanged()&&this._updateSubTexts();for(var e=0;ed&&h){var f=Math.floor(d/l);n=n.slice(0,f)}if(t&&a&&null!=c)for(var g=ia(c,o,e.ellipsis,{minChar:e.truncateMinChar,placeholder:e.placeholder}),y=0;y0,T=null!=t.width&&("truncate"===t.overflow||"break"===t.overflow||"breakAll"===t.overflow),C=i.calculatedLineHeight,D=0;Dl&&ua(n,t.substring(l,u),e,s),ua(n,i[2],e,s,i[1]),l=ea.lastIndex}lo){b>0?(m.tokens=m.tokens.slice(0,b),y(m,_,x),n.lines=n.lines.slice(0,v+1)):n.lines=n.lines.slice(0,v);break t}var C=w.width,D=null==C||"auto"===C;if("string"==typeof C&&"%"===C.charAt(C.length-1))P.percentWidth=C,h.push(P),P.contentWidth=fr(P.text,I);else{if(D){var A=w.backgroundColor,k=A&&A.image;k&&ta(k=$o(k))&&(P.width=Math.max(P.width,k.width*T/k.height))}var L=f&&null!=r?r-_:null;null!=L&&L=0&&"right"===(C=x[T]).align;)this._placeToken(C,t,b,f,I,"right",y),w-=C.width,I-=C.width,T--;for(M+=(n-(M-d)-(g-I)-w)/2;S<=T;)C=x[S],this._placeToken(C,t,b,f,M+C.width/2,"center",y),M+=C.width,S++;f+=b}},e.prototype._placeToken=function(t,e,n,i,r,o,s){var l=e.rich[t.styleName]||{};l.text=t.text;var u=t.verticalAlign,h=i+n/2;"top"===u?h=i+t.height/2:"bottom"===u&&(h=i+n-t.height/2),!t.isLineHolder&&Zs(l)&&this._renderBackground(l,e,"right"===o?r-t.width:"center"===o?r-t.width/2:r,h-t.height/2,t.width,t.height);var c=!!l.backgroundColor,p=t.textPadding;p&&(r=Us(r,o,p),h-=t.height/2-p[0]-t.innerHeight/2);var d=this._getOrCreateChild(ws),f=d.createStyle();d.useStyle(f);var g=this._defaultStyle,y=!1,v=0,m=Ys("fill"in l?l.fill:"fill"in e?e.fill:(y=!0,g.fill)),x=Hs("stroke"in l?l.stroke:"stroke"in e?e.stroke:c||s||g.autoStroke&&!y?null:(v=2,g.stroke)),_=l.textShadowBlur>0||e.textShadowBlur>0;f.text=t.text,f.x=r,f.y=h,_&&(f.shadowBlur=l.textShadowBlur||e.textShadowBlur||0,f.shadowColor=l.textShadowColor||e.textShadowColor||"transparent",f.shadowOffsetX=l.textShadowOffsetX||e.textShadowOffsetX||0,f.shadowOffsetY=l.textShadowOffsetY||e.textShadowOffsetY||0),f.textAlign=o,f.textBaseline="middle",f.font=t.font||a,f.opacity=ot(l.opacity,e.opacity,1),Fs(f,l),x&&(f.lineWidth=ot(l.lineWidth,e.lineWidth,v),f.lineDash=rt(l.lineDash,e.lineDash),f.lineDashOffset=e.lineDashOffset||0,f.stroke=x),m&&(f.fill=m);var b=t.contentWidth,w=t.contentHeight;d.setBoundingRect(new Re(vr(f.x,b,f.textAlign),mr(f.y,w,f.textBaseline),b,w))},e.prototype._renderBackground=function(t,e,n,i,r,o){var a,s,l,u=t.backgroundColor,h=t.borderWidth,c=t.borderColor,p=u&&u.image,d=u&&!p,f=t.borderRadius,g=this;if(d||t.lineHeight||h&&c){(a=this._getOrCreateChild(Ps)).useStyle(a.createStyle()),a.style.fill=null;var y=a.shape;y.x=n,y.y=i,y.width=r,y.height=o,y.r=f,a.dirtyShape()}if(d)(l=a.style).fill=u||null,l.fillOpacity=rt(t.fillOpacity,1);else if(p){(s=this._getOrCreateChild(Is)).onload=function(){g.dirtyStyle()};var v=s.style;v.image=u.image,v.x=n,v.y=i,v.width=r,v.height=o}h&&c&&((l=a.style).lineWidth=h,l.stroke=c,l.strokeOpacity=rt(t.strokeOpacity,1),l.lineDash=t.borderDash,l.lineDashOffset=t.borderDashOffset||0,a.strokeContainThreshold=0,a.hasFill()&&a.hasStroke()&&(l.strokeFirst=!0,l.lineWidth*=2));var m=(a||s).style;m.shadowBlur=t.shadowBlur||0,m.shadowColor=t.shadowColor||"transparent",m.shadowOffsetX=t.shadowOffsetX||0,m.shadowOffsetY=t.shadowOffsetY||0,m.opacity=ot(t.opacity,e.opacity,1)},e.makeFont=function(t){var e="";return Gs(t)&&(e=[t.fontStyle,t.fontWeight,Bs(t.fontSize),t.fontFamily||"sans-serif"].join(" ")),e&&ut(e)||t.textFont||t.font},e}(ma),Es={left:!0,right:1,center:1},zs={top:1,bottom:1,middle:1},Vs=["fontStyle","fontWeight","fontSize","fontFamily"];function Bs(t){return"string"!=typeof t||-1===t.indexOf("px")&&-1===t.indexOf("rem")&&-1===t.indexOf("em")?isNaN(+t)?"12px":t+"px":t}function Fs(t,e){for(var n=0;n=0,o=!1;if(t instanceof _s){var a=Js(t),s=r&&a.selectFill||a.normalFill,l=r&&a.selectStroke||a.normalStroke;if(ll(s)||ll(l)){var u=(i=i||{}).style||{};"inherit"===u.fill?(o=!0,i=A({},i),(u=A({},u)).fill=s):!ll(u.fill)&&ll(s)?(o=!0,i=A({},i),(u=A({},u)).fill=hl(s)):!ll(u.stroke)&&ll(l)&&(o||(i=A({},i),u=A({},u)),u.stroke=hl(l)),i.style=u}}if(i&&null==i.z2){o||(i=A({},i));var h=t.z2EmphasisLift;i.z2=t.z2+(null!=h?h:nl)}return i}(this,0,e,n);if("blur"===t)return function(t,e,n){var i=P(t.currentStates,e)>=0,r=t.style.opacity,o=i?null:function(t,e,n,i){for(var r=t.style,o={},a=0;a0){var o={dataIndex:r,seriesIndex:t.seriesIndex};null!=i&&(o.dataType=i),e.push(o)}}))})),e}function Vl(t,e,n){Yl(t,!0),xl(t,wl),Fl(t,e,n)}function Bl(t,e,n,i){i?function(t){Yl(t,!1)}(t):Vl(t,e,n)}function Fl(t,e,n){var i=js(t);null!=e?(i.focus=e,i.blurScope=n):i.focus&&(i.focus=null)}var Gl=["emphasis","blur","select"],Wl={itemStyle:"getItemStyle",lineStyle:"getLineStyle",areaStyle:"getAreaStyle"};function Hl(t,e,n,i){n=n||"itemStyle";for(var r=0;r1&&(a*=Ql(f),s*=Ql(f));var g=(r===o?-1:1)*Ql((a*a*(s*s)-a*a*(d*d)-s*s*(p*p))/(a*a*(d*d)+s*s*(p*p)))||0,y=g*a*d/s,v=g*-s*p/a,m=(t+n)/2+eu(c)*y-tu(c)*v,x=(e+i)/2+tu(c)*y+eu(c)*v,_=ou([1,0],[(p-y)/a,(d-v)/s]),b=[(p-y)/a,(d-v)/s],w=[(-1*p-y)/a,(-1*d-v)/s],S=ou(b,w);if(ru(b,w)<=-1&&(S=nu),ru(b,w)>=1&&(S=0),S<0){var M=Math.round(S/nu*1e6)/1e6;S=2*nu+M%2*nu}h.addData(u,m,x,a,s,_,S,c,o)}var su=/([mlvhzcqtsa])([^mlvhzcqtsa]*)/gi,lu=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;var uu=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.applyTransform=function(t){},e}(_s);function hu(t){return null!=t.setData}function cu(t,e){var n=function(t){var e=new ts;if(!t)return e;var n,i=0,r=0,o=i,a=r,s=ts.CMD,l=t.match(su);if(!l)return e;for(var u=0;uk*k+L*L&&(M=T,I=C),{cx:M,cy:I,x0:-h,y0:-c,x1:M*(r/b-1),y1:I*(r/b-1)}}function ku(t,e){var n,i=Tu(e.r,0),r=Tu(e.r0||0,0),o=i>0;if(o||r>0){if(o||(i=r,r=0),r>i){var a=i;i=r,r=a}var s=e.startAngle,l=e.endAngle;if(!isNaN(s)&&!isNaN(l)){var u=e.cx,h=e.cy,c=!!e.clockwise,p=Mu(l-s),d=p>xu&&p%xu;if(d>Du&&(p=d),i>Du)if(p>xu-Du)t.moveTo(u+i*bu(s),h+i*_u(s)),t.arc(u,h,i,s,l,!c),r>Du&&(t.moveTo(u+r*bu(l),h+r*_u(l)),t.arc(u,h,r,l,s,c));else{var f=void 0,g=void 0,y=void 0,v=void 0,m=void 0,x=void 0,_=void 0,b=void 0,w=void 0,S=void 0,M=void 0,I=void 0,T=void 0,C=void 0,D=void 0,A=void 0,k=i*bu(s),L=i*_u(s),P=r*bu(l),O=r*_u(l),R=p>Du;if(R){var N=e.cornerRadius;N&&(n=function(t){var e;if(Y(t)){var n=t.length;if(!n)return t;e=1===n?[t[0],t[0],0,0]:2===n?[t[0],t[0],t[1],t[1]]:3===n?t.concat(t[2]):t}else e=[t,t,t,t];return e}(N),f=n[0],g=n[1],y=n[2],v=n[3]);var E=Mu(i-r)/2;if(m=Cu(E,y),x=Cu(E,v),_=Cu(E,f),b=Cu(E,g),M=w=Tu(m,x),I=S=Tu(_,b),(w>Du||S>Du)&&(T=i*bu(l),C=i*_u(l),D=r*bu(s),A=r*_u(s),pDu){var U=Cu(y,M),X=Cu(v,M),Z=Au(D,A,k,L,i,U,c),j=Au(T,C,P,O,i,X,c);t.moveTo(u+Z.cx+Z.x0,h+Z.cy+Z.y0),M0&&t.arc(u+Z.cx,h+Z.cy,U,Su(Z.y0,Z.x0),Su(Z.y1,Z.x1),!c),t.arc(u,h,i,Su(Z.cy+Z.y1,Z.cx+Z.x1),Su(j.cy+j.y1,j.cx+j.x1),!c),X>0&&t.arc(u+j.cx,h+j.cy,X,Su(j.y1,j.x1),Su(j.y0,j.x0),!c))}else t.moveTo(u+k,h+L),t.arc(u,h,i,s,l,!c);else t.moveTo(u+k,h+L);if(r>Du&&R)if(I>Du){U=Cu(f,I),Z=Au(P,O,T,C,r,-(X=Cu(g,I)),c),j=Au(k,L,D,A,r,-U,c);t.lineTo(u+Z.cx+Z.x0,h+Z.cy+Z.y0),I0&&t.arc(u+Z.cx,h+Z.cy,X,Su(Z.y0,Z.x0),Su(Z.y1,Z.x1),!c),t.arc(u,h,r,Su(Z.cy+Z.y1,Z.cx+Z.x1),Su(j.cy+j.y1,j.cx+j.x1),c),U>0&&t.arc(u+j.cx,h+j.cy,U,Su(j.y1,j.x1),Su(j.y0,j.x0),!c))}else t.lineTo(u+P,h+O),t.arc(u,h,r,l,s,c);else t.lineTo(u+P,h+O)}else t.moveTo(u,h);t.closePath()}}}var Lu=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0,this.cornerRadius=0},Pu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Lu},e.prototype.buildPath=function(t,e){ku(t,e)},e.prototype.isZeroArea=function(){return this.shape.startAngle===this.shape.endAngle||this.shape.r===this.shape.r0},e}(_s);Pu.prototype.type="sector";var Ou=function(){this.cx=0,this.cy=0,this.r=0,this.r0=0},Ru=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Ou},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)},e}(_s);function Nu(t,e,n){var i=e.smooth,r=e.points;if(r&&r.length>=2){if(i){var o=function(t,e,n,i){var r,o,a,s,l=[],u=[],h=[],c=[];if(i){a=[1/0,1/0],s=[-1/0,-1/0];for(var p=0,d=t.length;pth[1]){if(a=!1,r)return a;var u=Math.abs(th[0]-Qu[1]),h=Math.abs(Qu[0]-th[1]);Math.min(u,h)>i.len()&&(u0){var c={duration:h.duration,delay:h.delay||0,easing:h.easing,done:o,force:!!o||!!a,setToFinal:!u,scope:t,during:a};l?e.animateFrom(n,c):e.animateTo(n,c)}else e.stopAnimation(),!l&&e.attr(n),a&&a(1),o&&o()}function uh(t,e,n,i,r,o){lh("update",t,e,n,i,r,o)}function hh(t,e,n,i,r,o){lh("enter",t,e,n,i,r,o)}function ch(t){if(!t.__zr)return!0;for(var e=0;eMath.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"}function Rh(t){return!t.isGroup}function Nh(t,e,n){if(t&&e){var i,r=(i={},t.traverse((function(t){Rh(t)&&t.anid&&(i[t.anid]=t)})),i);e.traverse((function(t){if(Rh(t)&&t.anid){var e=r[t.anid];if(e){var i=o(t);t.attr(o(e)),uh(t,i,n,js(t).dataIndex)}}}))}function o(t){var e={x:t.x,y:t.y,rotation:t.rotation};return function(t){return null!=t.shape}(t)&&(e.shape=A({},t.shape)),e}}function Eh(t,e){return z(t,(function(t){var n=t[0];n=yh(n,e.x),n=vh(n,e.x+e.width);var i=t[1];return i=yh(i,e.y),[n,i=vh(i,e.y+e.height)]}))}function zh(t,e){var n=yh(t.x,e.x),i=vh(t.x+t.width,e.x+e.width),r=yh(t.y,e.y),o=vh(t.y+t.height,e.y+e.height);if(i>=n&&o>=r)return{x:n,y:r,width:i-n,height:o-r}}function Vh(t,e,n){var i=A({rectHover:!0},e),r=i.style={strokeNoScale:!0};if(n=n||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(r.image=t.slice(8),k(r,n),new Is(i)):Mh(t.replace("path://",""),i,n,"center")}function Bh(t,e,n,i,r){for(var o=0,a=r[r.length-1];o=-1e-6)return!1;var f=t-r,g=e-o,y=Gh(f,g,u,h)/d;if(y<0||y>1)return!1;var v=Gh(f,g,c,p)/d;return!(v<0||v>1)}function Gh(t,e,n,i){return t*i-n*e}function Wh(t){var e=t.itemTooltipOption,n=t.componentModel,i=t.itemName,r=X(e)?{formatter:e}:e,o=n.mainType,a=n.componentIndex,s={componentType:o,name:i,$vars:["name"]};s[o+"Index"]=a;var l=t.formatterParamsExtra;l&&E(G(l),(function(t){mt(s,t)||(s[t]=l[t],s.$vars.push(t))}));var u=js(t.el);u.componentMainType=o,u.componentIndex=a,u.tooltipConfig={name:i,option:k({content:i,formatterParams:s},r)}}function Hh(t,e){var n;t.isGroup&&(n=e(t)),n||t.traverse(e)}function Yh(t,e){if(t)if(Y(t))for(var n=0;n-1?Sc:Ic;function Ac(t,e){t=t.toUpperCase(),Cc[t]=new xc(e),Tc[t]=e}function kc(t){return Cc[t]}Ac(Mc,{time:{month:["January","February","March","April","May","June","July","August","September","October","November","December"],monthAbbr:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayOfWeek:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayOfWeekAbbr:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},legend:{selector:{all:"All",inverse:"Inv"}},toolbox:{brush:{title:{rect:"Box Select",polygon:"Lasso Select",lineX:"Horizontally Select",lineY:"Vertically Select",keep:"Keep Selections",clear:"Clear Selections"}},dataView:{title:"Data View",lang:["Data View","Close","Refresh"]},dataZoom:{title:{zoom:"Zoom",back:"Zoom Reset"}},magicType:{title:{line:"Switch to Line Chart",bar:"Switch to Bar Chart",stack:"Stack",tiled:"Tile"}},restore:{title:"Restore"},saveAsImage:{title:"Save as Image",lang:["Right Click to Save Image"]}},series:{typeNames:{pie:"Pie chart",bar:"Bar chart",line:"Line chart",scatter:"Scatter plot",effectScatter:"Ripple scatter plot",radar:"Radar chart",tree:"Tree",treemap:"Treemap",boxplot:"Boxplot",candlestick:"Candlestick",k:"K line chart",heatmap:"Heat map",map:"Map",parallel:"Parallel coordinate map",lines:"Line graph",graph:"Relationship graph",sankey:"Sankey diagram",funnel:"Funnel chart",gauge:"Gauge",pictorialBar:"Pictorial bar",themeRiver:"Theme River Map",sunburst:"Sunburst"}},aria:{general:{withTitle:'This is a chart about "{title}"',withoutTitle:"This is a chart"},series:{single:{prefix:"",withName:" with type {seriesType} named {seriesName}.",withoutName:" with type {seriesType}."},multiple:{prefix:". It consists of {seriesCount} series count.",withName:" The {seriesId} series is a {seriesType} representing {seriesName}.",withoutName:" The {seriesId} series is a {seriesType}.",separator:{middle:"",end:""}}},data:{allData:"The data is as follows: ",partialData:"The first {displayCnt} items are: ",withName:"the data for {name} is {value}",withoutName:"{value}",separator:{middle:", ",end:". "}}}}),Ac(Sc,{time:{month:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthAbbr:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayOfWeek:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayOfWeekAbbr:["日","一","二","三","四","五","六"]},legend:{selector:{all:"全选",inverse:"反选"}},toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表,"},series:{single:{prefix:"",withName:"图表类型是{seriesType},表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType},",withoutName:"第{seriesId}个系列是一个{seriesType},",separator:{middle:";",end:"。"}}},data:{allData:"其数据是——",partialData:"其中,前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:",",end:""}}}});var Lc=1e3,Pc=6e4,Oc=36e5,Rc=864e5,Nc=31536e6,Ec={year:"{yyyy}",month:"{MMM}",day:"{d}",hour:"{HH}:{mm}",minute:"{HH}:{mm}",second:"{HH}:{mm}:{ss}",millisecond:"{HH}:{mm}:{ss} {SSS}",none:"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}"},zc="{yyyy}-{MM}-{dd}",Vc={year:"{yyyy}",month:"{yyyy}-{MM}",day:zc,hour:"{yyyy}-{MM}-{dd} "+Ec.hour,minute:"{yyyy}-{MM}-{dd} "+Ec.minute,second:"{yyyy}-{MM}-{dd} "+Ec.second,millisecond:Ec.none},Bc=["year","month","day","hour","minute","second","millisecond"],Fc=["year","half-year","quarter","month","week","half-week","day","half-day","quarter-day","hour","minute","second","millisecond"];function Gc(t,e){return"0000".substr(0,e-(t+="").length)+t}function Wc(t){switch(t){case"half-year":case"quarter":return"month";case"week":case"half-week":return"day";case"half-day":case"quarter-day":return"hour";default:return t}}function Hc(t){return t===Wc(t)}function Yc(t,e,n,i){var r=Qr(t),o=r[Zc(n)](),a=r[jc(n)]()+1,s=Math.floor((a-1)/3)+1,l=r[qc(n)](),u=r["get"+(n?"UTC":"")+"Day"](),h=r[Kc(n)](),c=(h-1)%12+1,p=r[$c(n)](),d=r[Jc(n)](),f=r[Qc(n)](),g=(i instanceof xc?i:kc(i||Dc)||Cc.EN).getModel("time"),y=g.get("month"),v=g.get("monthAbbr"),m=g.get("dayOfWeek"),x=g.get("dayOfWeekAbbr");return(e||"").replace(/{yyyy}/g,o+"").replace(/{yy}/g,o%100+"").replace(/{Q}/g,s+"").replace(/{MMMM}/g,y[a-1]).replace(/{MMM}/g,v[a-1]).replace(/{MM}/g,Gc(a,2)).replace(/{M}/g,a+"").replace(/{dd}/g,Gc(l,2)).replace(/{d}/g,l+"").replace(/{eeee}/g,m[u]).replace(/{ee}/g,x[u]).replace(/{e}/g,u+"").replace(/{HH}/g,Gc(h,2)).replace(/{H}/g,h+"").replace(/{hh}/g,Gc(c+"",2)).replace(/{h}/g,c+"").replace(/{mm}/g,Gc(p,2)).replace(/{m}/g,p+"").replace(/{ss}/g,Gc(d,2)).replace(/{s}/g,d+"").replace(/{SSS}/g,Gc(f,3)).replace(/{S}/g,f+"")}function Uc(t,e){var n=Qr(t),i=n[jc(e)]()+1,r=n[qc(e)](),o=n[Kc(e)](),a=n[$c(e)](),s=n[Jc(e)](),l=0===n[Qc(e)](),u=l&&0===s,h=u&&0===a,c=h&&0===o,p=c&&1===r;return p&&1===i?"year":p?"month":c?"day":h?"hour":u?"minute":l?"second":"millisecond"}function Xc(t,e,n){var i=j(t)?Qr(t):t;switch(e=e||Uc(t,n)){case"year":return i[Zc(n)]();case"half-year":return i[jc(n)]()>=6?1:0;case"quarter":return Math.floor((i[jc(n)]()+1)/4);case"month":return i[jc(n)]();case"day":return i[qc(n)]();case"half-day":return i[Kc(n)]()/24;case"hour":return i[Kc(n)]();case"minute":return i[$c(n)]();case"second":return i[Jc(n)]();case"millisecond":return i[Qc(n)]()}}function Zc(t){return t?"getUTCFullYear":"getFullYear"}function jc(t){return t?"getUTCMonth":"getMonth"}function qc(t){return t?"getUTCDate":"getDate"}function Kc(t){return t?"getUTCHours":"getHours"}function $c(t){return t?"getUTCMinutes":"getMinutes"}function Jc(t){return t?"getUTCSeconds":"getSeconds"}function Qc(t){return t?"getUTCMilliseconds":"getMilliseconds"}function tp(t){return t?"setUTCFullYear":"setFullYear"}function ep(t){return t?"setUTCMonth":"setMonth"}function np(t){return t?"setUTCDate":"setDate"}function ip(t){return t?"setUTCHours":"setHours"}function rp(t){return t?"setUTCMinutes":"setMinutes"}function op(t){return t?"setUTCSeconds":"setSeconds"}function ap(t){return t?"setUTCMilliseconds":"setMilliseconds"}function sp(t){if(!ao(t))return X(t)?t:"-";var e=(t+"").split(".");return e[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(e.length>1?"."+e[1]:"")}function lp(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,(function(t,e){return e.toUpperCase()})),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}var up=st;function hp(t,e,n){function i(t){return t&&ut(t)?t:"-"}function r(t){return!(null==t||isNaN(t)||!isFinite(t))}var o="time"===e,a=t instanceof Date;if(o||a){var s=o?Qr(t):t;if(!isNaN(+s))return Yc(s,"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}",n);if(a)return"-"}if("ordinal"===e)return Z(t)?i(t):j(t)&&r(t)?t+"":"-";var l=oo(t);return r(l)?sp(l):Z(t)?i(t):"boolean"==typeof t?t+"":"-"}var cp=["a","b","c","d","e","f","g"],pp=function(t,e){return"{"+t+(null==e?"":e)+"}"};function dp(t,e,n){Y(e)||(e=[e]);var i=e.length;if(!i)return"";for(var r=e[0].$vars||[],o=0;o':'':{renderMode:o,content:"{"+(n.markerId||"markerX")+"|} ",style:"subItem"===r?{width:4,height:4,borderRadius:2,backgroundColor:i}:{width:10,height:10,borderRadius:5,backgroundColor:i}}:""}function gp(t,e){return e=e||"transparent",X(t)?t:q(t)&&t.colorStops&&(t.colorStops[0]||{}).color||e}function yp(t,e){if("_blank"===e||"blank"===e){var n=window.open();n.opener=null,n.location.href=t}else window.open(t,e)}var vp=E,mp=["left","right","top","bottom","width","height"],xp=[["width","left","right"],["height","top","bottom"]];function _p(t,e,n,i,r){var o=0,a=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild((function(l,u){var h,c,p=l.getBoundingRect(),d=e.childAt(u+1),f=d&&d.getBoundingRect();if("horizontal"===t){var g=p.width+(f?-f.x+p.x:0);(h=o+g)>i||l.newline?(o=0,h=g,a+=s+n,s=p.height):s=Math.max(s,p.height)}else{var y=p.height+(f?-f.y+p.y:0);(c=a+y)>r||l.newline?(o+=s+n,a=0,c=y,s=p.width):s=Math.max(s,p.width)}l.newline||(l.x=o,l.y=a,l.markRedraw(),"horizontal"===t?o=h+n:a=c+n)}))}var bp=_p;H(_p,"vertical"),H(_p,"horizontal");function wp(t,e,n){n=up(n||0);var i=e.width,r=e.height,o=Gr(t.left,i),a=Gr(t.top,r),s=Gr(t.right,i),l=Gr(t.bottom,r),u=Gr(t.width,i),h=Gr(t.height,r),c=n[2]+n[0],p=n[1]+n[3],d=t.aspect;switch(isNaN(u)&&(u=i-s-p-o),isNaN(h)&&(h=r-l-c-a),null!=d&&(isNaN(u)&&isNaN(h)&&(d>i/r?u=.8*i:h=.8*r),isNaN(u)&&(u=d*h),isNaN(h)&&(h=u/d)),isNaN(o)&&(o=i-s-u-p),isNaN(a)&&(a=r-l-h-c),t.left||t.right){case"center":o=i/2-u/2-n[3];break;case"right":o=i-u-p}switch(t.top||t.bottom){case"middle":case"center":a=r/2-h/2-n[0];break;case"bottom":a=r-h-c}o=o||0,a=a||0,isNaN(u)&&(u=i-p-o-(s||0)),isNaN(h)&&(h=r-c-a-(l||0));var f=new Re(o+n[3],a+n[0],u,h);return f.margin=n,f}function Sp(t,e,n,i,r,o){var a,s=!r||!r.hv||r.hv[0],l=!r||!r.hv||r.hv[1],u=r&&r.boundingMode||"all";if((o=o||t).x=t.x,o.y=t.y,!s&&!l)return!1;if("raw"===u)a="group"===t.type?new Re(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(a=t.getBoundingRect(),t.needLocalTransform()){var h=t.getLocalTransform();(a=a.clone()).applyTransform(h)}var c=wp(k({width:a.width,height:a.height},e),n,i),p=s?c.x-a.x:0,d=l?c.y-a.y:0;return"raw"===u?(o.x=p,o.y=d):(o.x+=p,o.y+=d),o===t&&t.markRedraw(),!0}function Mp(t){var e=t.layoutMode||t.constructor.layoutMode;return q(e)?e:e?{type:e}:null}function Ip(t,e,n){var i=n&&n.ignoreSize;!Y(i)&&(i=[i,i]);var r=a(xp[0],0),o=a(xp[1],1);function a(n,r){var o={},a=0,u={},h=0;if(vp(n,(function(e){u[e]=t[e]})),vp(n,(function(t){s(e,t)&&(o[t]=u[t]=e[t]),l(o,t)&&a++,l(u,t)&&h++})),i[r])return l(e,n[1])?u[n[2]]=null:l(e,n[2])&&(u[n[1]]=null),u;if(2!==h&&a){if(a>=2)return o;for(var c=0;c=0;a--)o=C(o,n[a],!0);e.defaultOption=o}return e.defaultOption},e.prototype.getReferringComponents=function(t,e){var n=t+"Index",i=t+"Id";return Ro(this.ecModel,t,{index:this.get(n,!0),id:this.get(i,!0)},e)},e.prototype.getBoxLayoutParams=function(){var t=this;return{left:t.get("left"),top:t.get("top"),right:t.get("right"),bottom:t.get("bottom"),width:t.get("width"),height:t.get("height")}},e.prototype.getZLevelKey=function(){return""},e.prototype.setZLevel=function(t){this.option.zlevel=t},e.protoInitialize=function(){var t=e.prototype;t.type="component",t.id="",t.name="",t.mainType="",t.subType="",t.componentIndex=0}(),e}(xc);Wo(Ap,xc),Xo(Ap),function(t){var e={};t.registerSubTypeDefaulter=function(t,n){var i=Fo(t);e[i.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var o=Fo(n).main;t.hasSubTypes(n)&&e[o]&&(r=e[o](i))}return r}}(Ap),function(t,e){function n(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}t.topologicalTravel=function(t,i,r,o){if(t.length){var a=function(t){var i={},r=[];return E(t,(function(o){var a=n(i,o),s=function(t,e){var n=[];return E(t,(function(t){P(e,t)>=0&&n.push(t)})),n}(a.originalDeps=e(o),t);a.entryCount=s.length,0===a.entryCount&&r.push(o),E(s,(function(t){P(a.predecessor,t)<0&&a.predecessor.push(t);var e=n(i,t);P(e.successor,t)<0&&e.successor.push(o)}))})),{graph:i,noEntryList:r}}(i),s=a.graph,l=a.noEntryList,u={};for(E(t,(function(t){u[t]=!0}));l.length;){var h=l.pop(),c=s[h],p=!!u[h];p&&(r.call(o,h,c.originalDeps.slice()),delete u[h]),E(c.successor,p?f:d)}E(u,(function(){var t="";throw new Error(t)}))}function d(t){s[t].entryCount--,0===s[t].entryCount&&l.push(t)}function f(t){u[t]=!0,d(t)}}}(Ap,(function(t){var e=[];E(Ap.getClassesByMainType(t),(function(t){e=e.concat(t.dependencies||t.prototype.dependencies||[])})),e=z(e,(function(t){return Fo(t).main})),"dataset"!==t&&P(e,"dataset")<=0&&e.unshift("dataset");return e}));var kp="";"undefined"!=typeof navigator&&(kp=navigator.platform||"");var Lp="rgba(0, 0, 0, 0.2)",Pp={darkMode:"auto",colorBy:"series",color:["#5470c6","#91cc75","#fac858","#ee6666","#73c0de","#3ba272","#fc8452","#9a60b4","#ea7ccc"],gradientColor:["#f6efa6","#d88273","#bf444c"],aria:{decal:{decals:[{color:Lp,dashArrayX:[1,0],dashArrayY:[2,5],symbolSize:1,rotation:Math.PI/6},{color:Lp,symbol:"circle",dashArrayX:[[8,8],[0,8,8,0]],dashArrayY:[6,0],symbolSize:.8},{color:Lp,dashArrayX:[1,0],dashArrayY:[4,3],rotation:-Math.PI/4},{color:Lp,dashArrayX:[[6,6],[0,6,6,0]],dashArrayY:[6,0]},{color:Lp,dashArrayX:[[1,0],[1,6]],dashArrayY:[1,0,6,0],rotation:Math.PI/4},{color:Lp,symbol:"triangle",dashArrayX:[[9,9],[0,9,9,0]],dashArrayY:[7,2],symbolSize:.75}]}},textStyle:{fontFamily:kp.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,stateAnimation:{duration:300,easing:"cubicOut"},animation:"auto",animationDuration:1e3,animationDurationUpdate:500,animationEasing:"cubicInOut",animationEasingUpdate:"cubicInOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},Op=ft(["tooltip","label","itemName","itemId","itemGroupId","seriesName"]),Rp="original",Np="arrayRows",Ep="objectRows",zp="keyedColumns",Vp="typedArray",Bp="unknown",Fp="column",Gp="row",Wp=1,Hp=2,Yp=3,Up=Do();function Xp(t,e,n){var i={},r=jp(e);if(!r||!t)return i;var o,a,s=[],l=[],u=e.ecModel,h=Up(u).datasetMap,c=r.uid+"_"+n.seriesLayoutBy;E(t=t.slice(),(function(e,n){var r=q(e)?e:t[n]={name:e};"ordinal"===r.type&&null==o&&(o=n,a=f(r)),i[r.name]=[]}));var p=h.get(c)||h.set(c,{categoryWayDim:a,valueWayDim:0});function d(t,e,n){for(var i=0;ie)return t[i];return t[n-1]}(i,a):n;if((h=h||n)&&h.length){var c=h[l];return r&&(u[r]=c),s.paletteIdx=(l+1)%h.length,c}}var ad=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(t,e,n,i,r,o){i=i||{},this.option=null,this._theme=new xc(i),this._locale=new xc(r),this._optionManager=o},e.prototype.setOption=function(t,e,n){var i=ud(e);this._optionManager.setOption(t,n,i),this._resetOption(null,i)},e.prototype.resetOption=function(t,e){return this._resetOption(t,ud(e))},e.prototype._resetOption=function(t,e){var n=!1,i=this._optionManager;if(!t||"recreate"===t){var r=i.mountOption("recreate"===t);0,this.option&&"recreate"!==t?(this.restoreData(),this._mergeOption(r,e)):td(this,r),n=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var o=i.getTimelineOption(this);o&&(n=!0,this._mergeOption(o,e))}if(!t||"recreate"===t||"media"===t){var a=i.getMediaOption(this);a.length&&E(a,(function(t){n=!0,this._mergeOption(t,e)}),this)}return n},e.prototype.mergeOption=function(t){this._mergeOption(t,null)},e.prototype._mergeOption=function(t,e){var n=this.option,i=this._componentsMap,r=this._componentsCount,o=[],a=ft(),s=e&&e.replaceMergeMainTypeMap;Up(this).datasetMap=ft(),E(t,(function(t,e){null!=t&&(Ap.hasClass(e)?e&&(o.push(e),a.set(e,!0)):n[e]=null==n[e]?T(t):C(n[e],t,!0))})),s&&s.each((function(t,e){Ap.hasClass(e)&&!a.get(e)&&(o.push(e),a.set(e,!0))})),Ap.topologicalTravel(o,Ap.getAllClassMainTypes(),(function(e){var o=function(t,e,n){var i=$p.get(e);if(!i)return n;var r=i(t);return r?n.concat(r):n}(this,e,yo(t[e])),a=i.get(e),l=a?s&&s.get(e)?"replaceMerge":"normalMerge":"replaceAll",u=bo(a,o,l);(function(t,e,n){E(t,(function(t){var i=t.newOption;q(i)&&(t.keyInfo.mainType=e,t.keyInfo.subType=function(t,e,n,i){return e.type?e.type:n?n.subType:i.determineSubType(t,e)}(e,i,t.existing,n))}))})(u,e,Ap),n[e]=null,i.set(e,null),r.set(e,0);var h,c=[],p=[],d=0;E(u,(function(t,n){var i=t.existing,r=t.newOption;if(r){var o="series"===e,a=Ap.getClass(e,t.keyInfo.subType,!o);if(!a)return;if("tooltip"===e){if(h)return void 0;h=!0}if(i&&i.constructor===a)i.name=t.keyInfo.name,i.mergeOption(r,this),i.optionUpdated(r,!1);else{var s=A({componentIndex:n},t.keyInfo);A(i=new a(r,this,this,s),s),t.brandNew&&(i.__requireNewView=!0),i.init(r,this,this),i.optionUpdated(null,!0)}}else i&&(i.mergeOption({},this),i.optionUpdated({},!1));i?(c.push(i.option),p.push(i),d++):(c.push(void 0),p.push(void 0))}),this),n[e]=c,i.set(e,p),r.set(e,d),"series"===e&&Jp(this)}),this),this._seriesIndices||Jp(this)},e.prototype.getOption=function(){var t=T(this.option);return E(t,(function(e,n){if(Ap.hasClass(n)){for(var i=yo(e),r=i.length,o=!1,a=r-1;a>=0;a--)i[a]&&!To(i[a])?o=!0:(i[a]=null,!o&&r--);i.length=r,t[n]=i}})),delete t["\0_ec_inner"],t},e.prototype.getTheme=function(){return this._theme},e.prototype.getLocaleModel=function(){return this._locale},e.prototype.setUpdatePayload=function(t){this._payload=t},e.prototype.getUpdatePayload=function(){return this._payload},e.prototype.getComponent=function(t,e){var n=this._componentsMap.get(t);if(n){var i=n[e||0];if(i)return i;if(null==e)for(var r=0;r=e:"max"===n?t<=e:t===e})(i[a],t,o)||(r=!1)}})),r}var vd=E,md=q,xd=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];function _d(t){var e=t&&t.itemStyle;if(e)for(var n=0,i=xd.length;n=0;g--){var y=t[g];if(s||(p=y.data.rawIndexOf(y.stackedByDimension,c)),p>=0){var v=y.data.getByRawIndex(y.stackResultDimension,p);if("all"===l||"positive"===l&&v>0||"negative"===l&&v<0||"samesign"===l&&d>=0&&v>0||"samesign"===l&&d<=0&&v<0){d=jr(d,v),f=v;break}}}return i[0]=d,i[1]=f,i}))}))}var Vd,Bd,Fd,Gd,Wd,Hd=function(t){this.data=t.data||(t.sourceFormat===zp?{}:[]),this.sourceFormat=t.sourceFormat||Bp,this.seriesLayoutBy=t.seriesLayoutBy||Fp,this.startIndex=t.startIndex||0,this.dimensionsDetectedCount=t.dimensionsDetectedCount,this.metaRawOption=t.metaRawOption;var e=this.dimensionsDefine=t.dimensionsDefine;if(e)for(var n=0;nu&&(u=d)}s[0]=l,s[1]=u}},i=function(){return this._data?this._data.length/this._dimSize:0};function r(t){for(var e=0;e=0&&(s=o.interpolatedValue[l])}return null!=s?s+"":""})):void 0},t.prototype.getRawValue=function(t,e){return uf(this.getData(e),t)},t.prototype.formatTooltip=function(t,e,n){},t}();function pf(t){var e,n;return q(t)?t.type&&(n=t):e=t,{text:e,frag:n}}function df(t){return new ff(t)}var ff=function(){function t(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0}return t.prototype.perform=function(t){var e,n=this._upstream,i=t&&t.skip;if(this._dirty&&n){var r=this.context;r.data=r.outputData=n.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this),this._plan&&!i&&(e=this._plan(this.context));var o,a=h(this._modBy),s=this._modDataCount||0,l=h(t&&t.modBy),u=t&&t.modDataCount||0;function h(t){return!(t>=1)&&(t=1),t}a===l&&s===u||(e="reset"),(this._dirty||"reset"===e)&&(this._dirty=!1,o=this._doReset(i)),this._modBy=l,this._modDataCount=u;var c=t&&t.step;if(this._dueEnd=n?n._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var p=this._dueIndex,d=Math.min(null!=c?this._dueIndex+c:1/0,this._dueEnd);if(!i&&(o||p1&&i>0?s:a}};return o;function a(){return e=t?null:oe},gte:function(t,e){return t>=e}},_f=function(){function t(t,e){if(!j(e)){var n="";0,co(n)}this._opFn=xf[t],this._rvalFloat=oo(e)}return t.prototype.evaluate=function(t){return j(t)?this._opFn(t,this._rvalFloat):this._opFn(oo(t),this._rvalFloat)},t}(),bf=function(){function t(t,e){var n="desc"===t;this._resultLT=n?1:-1,null==e&&(e=n?"min":"max"),this._incomparable="min"===e?-1/0:1/0}return t.prototype.evaluate=function(t,e){var n=j(t)?t:oo(t),i=j(e)?e:oo(e),r=isNaN(n),o=isNaN(i);if(r&&(n=this._incomparable),o&&(i=this._incomparable),r&&o){var a=X(t),s=X(e);a&&(n=s?t:0),s&&(i=a?e:0)}return ni?-this._resultLT:0},t}(),wf=function(){function t(t,e){this._rval=e,this._isEQ=t,this._rvalTypeof=typeof e,this._rvalFloat=oo(e)}return t.prototype.evaluate=function(t){var e=t===this._rval;if(!e){var n=typeof t;n===this._rvalTypeof||"number"!==n&&"number"!==this._rvalTypeof||(e=oo(t)===this._rvalFloat)}return this._isEQ?e:!e},t}();function Sf(t,e){return"eq"===t||"ne"===t?new wf("eq"===t,e):mt(xf,t)?new _f(t,e):null}var Mf=function(){function t(){}return t.prototype.getRawData=function(){throw new Error("not supported")},t.prototype.getRawDataItem=function(t){throw new Error("not supported")},t.prototype.cloneRawData=function(){},t.prototype.getDimensionInfo=function(t){},t.prototype.cloneAllDimensionInfo=function(){},t.prototype.count=function(){},t.prototype.retrieveValue=function(t,e){},t.prototype.retrieveValueFromItem=function(t,e){},t.prototype.convertValue=function(t,e){return yf(t,e)},t}();function If(t){var e=t.sourceFormat;if(!Lf(e)){var n="";0,co(n)}return t.data}function Tf(t){var e=t.sourceFormat,n=t.data;if(!Lf(e)){var i="";0,co(i)}if(e===Np){for(var r=[],o=0,a=n.length;o65535?Rf:Nf}function Ff(t,e,n,i,r){var o=Vf[n||"float"];if(r){var a=t[e],s=a&&a.length;if(s!==i){for(var l=new o(i),u=0;ug[1]&&(g[1]=f)}return this._rawCount=this._count=s,{start:a,end:s}},t.prototype._initDataFromProvider=function(t,e,n){for(var i=this._provider,r=this._chunks,o=this._dimensions,a=o.length,s=this._rawExtent,l=z(o,(function(t){return t.property})),u=0;uy[1]&&(y[1]=g)}}!i.persistent&&i.clean&&i.clean(),this._rawCount=this._count=e,this._extent=[]},t.prototype.count=function(){return this._count},t.prototype.get=function(t,e){if(!(e>=0&&e=0&&e=this._rawCount||t<0)return-1;if(!this._indices)return t;var e=this._indices,n=e[t];if(null!=n&&nt))return o;r=o-1}}return-1},t.prototype.indicesOfNearest=function(t,e,n){var i=this._chunks[t],r=[];if(!i)return r;null==n&&(n=1/0);for(var o=1/0,a=-1,s=0,l=0,u=this.count();l=0&&a<0)&&(o=c,a=h,s=0),h===a&&(r[s++]=l))}return r.length=s,r},t.prototype.getIndices=function(){var t,e=this._indices;if(e){var n=e.constructor,i=this._count;if(n===Array){t=new n(i);for(var r=0;r=u&&x<=h||isNaN(x))&&(a[s++]=d),d++}p=!0}else if(2===r){f=c[i[0]];var y=c[i[1]],v=t[i[1]][0],m=t[i[1]][1];for(g=0;g=u&&x<=h||isNaN(x))&&(_>=v&&_<=m||isNaN(_))&&(a[s++]=d),d++}p=!0}}if(!p)if(1===r)for(g=0;g=u&&x<=h||isNaN(x))&&(a[s++]=b)}else for(g=0;gt[M][1])&&(w=!1)}w&&(a[s++]=e.getRawIndex(g))}return sy[1]&&(y[1]=g)}}}},t.prototype.lttbDownSample=function(t,e){var n,i,r,o=this.clone([t],!0),a=o._chunks[t],s=this.count(),l=0,u=Math.floor(1/e),h=this.getRawIndex(0),c=new(Bf(this._rawCount))(Math.min(2*(Math.ceil(s/u)+2),s));c[l++]=h;for(var p=1;pn&&(n=i,r=I)}M>0&&M<_-x&&(c[l++]=Math.min(S,r),r=Math.max(S,r)),c[l++]=r,h=r}return c[l++]=this.getRawIndex(s-1),o._count=l,o._indices=c,o.getRawIndex=this._getRawIdx,o},t.prototype.downSample=function(t,e,n,i){for(var r=this.clone([t],!0),o=r._chunks,a=[],s=Math.floor(1/e),l=o[t],u=this.count(),h=r._rawExtent[t]=[1/0,-1/0],c=new(Bf(this._rawCount))(Math.ceil(u/s)),p=0,d=0;du-d&&(s=u-d,a.length=s);for(var f=0;fh[1]&&(h[1]=y),c[p++]=v}return r._count=p,r._indices=c,r._updateGetRawIdx(),r},t.prototype.each=function(t,e){if(this._count)for(var n=t.length,i=this._chunks,r=0,o=this.count();ra&&(a=l)}return i=[o,a],this._extent[t]=i,i},t.prototype.getRawDataItem=function(t){var e=this.getRawIndex(t);if(this._provider.persistent)return this._provider.getItem(e);for(var n=[],i=this._chunks,r=0;r=0?this._indices[t]:-1},t.prototype._updateGetRawIdx=function(){this.getRawIndex=this._indices?this._getRawIdx:this._getRawIdxIdentity},t.internalField=function(){function t(t,e,n,i){return yf(t[i],this._dimensions[i])}Pf={arrayRows:t,objectRows:function(t,e,n,i){return yf(t[e],this._dimensions[i])},keyedColumns:t,original:function(t,e,n,i){var r=t&&(null==t.value?t:t.value);return yf(r instanceof Array?r[i]:r,this._dimensions[i])},typedArray:function(t,e,n,i){return t[i]}}}(),t}(),Wf=function(){function t(t){this._sourceList=[],this._storeList=[],this._upstreamSignList=[],this._versionSignBase=0,this._dirty=!0,this._sourceHost=t}return t.prototype.dirty=function(){this._setLocalSource([],[]),this._storeList=[],this._dirty=!0},t.prototype._setLocalSource=function(t,e){this._sourceList=t,this._upstreamSignList=e,this._versionSignBase++,this._versionSignBase>9e10&&(this._versionSignBase=0)},t.prototype._getVersionSign=function(){return this._sourceHost.uid+"_"+this._versionSignBase},t.prototype.prepareSource=function(){this._isDirty()&&(this._createSource(),this._dirty=!1)},t.prototype._createSource=function(){this._setLocalSource([],[]);var t,e,n=this._sourceHost,i=this._getUpstreamSourceManagers(),r=!!i.length;if(Yf(n)){var o=n,a=void 0,s=void 0,l=void 0;if(r){var u=i[0];u.prepareSource(),a=(l=u.getSource()).data,s=l.sourceFormat,e=[u._getVersionSign()]}else s=$(a=o.get("data",!0))?Vp:Rp,e=[];var h=this._getSourceMetaRawOption()||{},c=l&&l.metaRawOption||{},p=rt(h.seriesLayoutBy,c.seriesLayoutBy)||null,d=rt(h.sourceHeader,c.sourceHeader),f=rt(h.dimensions,c.dimensions);t=p!==c.seriesLayoutBy||!!d!=!!c.sourceHeader||f?[Ud(a,{seriesLayoutBy:p,sourceHeader:d,dimensions:f},s)]:[]}else{var g=n;if(r){var y=this._applyTransform(i);t=y.sourceList,e=y.upstreamSignList}else{t=[Ud(g.get("source",!0),this._getSourceMetaRawOption(),null)],e=[]}}this._setLocalSource(t,e)},t.prototype._applyTransform=function(t){var e,n=this._sourceHost,i=n.get("transform",!0),r=n.get("fromTransformResult",!0);if(null!=r){var o="";1!==t.length&&Uf(o)}var a,s=[],l=[];return E(t,(function(t){t.prepareSource();var e=t.getSource(r||0),n="";null==r||e||Uf(n),s.push(e),l.push(t._getVersionSign())})),i?e=function(t,e,n){var i=yo(t),r=i.length,o="";r||co(o);for(var a=0,s=r;a1||n>0&&!t.noHeader;return E(t.blocks,(function(t){var n=Jf(t);n>=e&&(e=n+ +(i&&(!n||Kf(t)&&!t.noHeader)))})),e}return 0}function Qf(t,e,n,i){var r,o=e.noHeader,a=(r=Jf(e),{html:Zf[r],richText:jf[r]}),s=[],l=e.blocks||[];lt(!l||Y(l)),l=l||[];var u=t.orderMode;if(e.sortBlocks&&u){l=l.slice();var h={valueAsc:"asc",valueDesc:"desc"};if(mt(h,u)){var c=new bf(h[u],null);l.sort((function(t,e){return c.evaluate(t.sortParam,e.sortParam)}))}else"seriesDesc"===u&&l.reverse()}E(l,(function(n,r){var o=e.valueFormatter,l=$f(n)(o?A(A({},t),{valueFormatter:o}):t,n,r>0?a.html:0,i);null!=l&&s.push(l)}));var p="richText"===t.renderMode?s.join(a.richText):ng(s.join(""),o?n:a.html);if(o)return p;var d=hp(e.header,"ordinal",t.useUTC),f=Xf(i,t.renderMode).nameStyle;return"richText"===t.renderMode?ig(t,d,f)+a.richText+p:ng('
'+ee(d)+"
"+p,n)}function tg(t,e,n,i){var r=t.renderMode,o=e.noName,a=e.noValue,s=!e.markerType,l=e.name,u=t.useUTC,h=e.valueFormatter||t.valueFormatter||function(t){return z(t=Y(t)?t:[t],(function(t,e){return hp(t,Y(d)?d[e]:d,u)}))};if(!o||!a){var c=s?"":t.markupStyleCreator.makeTooltipMarker(e.markerType,e.markerColor||"#333",r),p=o?"":hp(l,"ordinal",u),d=e.valueType,f=a?[]:h(e.value),g=!s||!o,y=!s&&o,v=Xf(i,r),m=v.nameStyle,x=v.valueStyle;return"richText"===r?(s?"":c)+(o?"":ig(t,p,m))+(a?"":function(t,e,n,i,r){var o=[r],a=i?10:20;return n&&o.push({padding:[0,0,0,a],align:"right"}),t.markupStyleCreator.wrapRichTextStyle(Y(e)?e.join(" "):e,o)}(t,f,g,y,x)):ng((s?"":c)+(o?"":function(t,e,n){return''+ee(t)+""}(p,!s,m))+(a?"":function(t,e,n,i){var r=n?"10px":"20px",o=e?"float:right;margin-left:"+r:"";return t=Y(t)?t:[t],''+z(t,(function(t){return ee(t)})).join("  ")+""}(f,g,y,x)),n)}}function eg(t,e,n,i,r,o){if(t)return $f(t)({useUTC:r,renderMode:n,orderMode:i,markupStyleCreator:e,valueFormatter:t.valueFormatter},t,0,o)}function ng(t,e){return'
'+t+'
'}function ig(t,e,n){return t.markupStyleCreator.wrapRichTextStyle(e,n)}function rg(t,e){return gp(t.getData().getItemVisual(e,"style")[t.visualDrawType])}function og(t,e){var n=t.get("padding");return null!=n?n:"richText"===e?[8,10]:10}var ag=function(){function t(){this.richTextStyles={},this._nextStyleNameId=so()}return t.prototype._generateStyleName=function(){return"__EC_aUTo_"+this._nextStyleNameId++},t.prototype.makeTooltipMarker=function(t,e,n){var i="richText"===n?this._generateStyleName():null,r=fp({color:e,type:t,renderMode:n,markerId:i});return X(r)?r:(this.richTextStyles[i]=r.style,r.content)},t.prototype.wrapRichTextStyle=function(t,e){var n={};Y(e)?E(e,(function(t){return A(n,t)})):A(n,e);var i=this._generateStyleName();return this.richTextStyles[i]=n,"{"+i+"|"+t+"}"},t}();function sg(t){var e,n,i,r,o=t.series,a=t.dataIndex,s=t.multipleSeries,l=o.getData(),u=l.mapDimensionsAll("defaultedTooltip"),h=u.length,c=o.getRawValue(a),p=Y(c),d=rg(o,a);if(h>1||p&&!h){var f=function(t,e,n,i,r){var o=e.getData(),a=V(t,(function(t,e,n){var i=o.getDimensionInfo(n);return t||i&&!1!==i.tooltip&&null!=i.displayName}),!1),s=[],l=[],u=[];function h(t,e){var n=o.getDimensionInfo(e);n&&!1!==n.otherDims.tooltip&&(a?u.push(qf("nameValue",{markerType:"subItem",markerColor:r,name:n.displayName,value:t,valueType:n.type})):(s.push(t),l.push(n.type)))}return i.length?E(i,(function(t){h(uf(o,n,t),t)})):E(t,h),{inlineValues:s,inlineValueTypes:l,blocks:u}}(c,o,a,u,d);e=f.inlineValues,n=f.inlineValueTypes,i=f.blocks,r=f.inlineValues[0]}else if(h){var g=l.getDimensionInfo(u[0]);r=e=uf(l,a,u[0]),n=g.type}else r=e=p?c[0]:c;var y=Io(o),v=y&&o.name||"",m=l.getName(a),x=s?v:m;return qf("section",{header:v,noHeader:s||!y,sortParam:r,blocks:[qf("nameValue",{markerType:"item",markerColor:d,name:x,noName:!ut(x),value:e,valueType:n})].concat(i||[])})}var lg=Do();function ug(t,e){return t.getName(e)||t.getId(e)}var hg=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._selectedDataIndicesMap={},e}return n(e,t),e.prototype.init=function(t,e,n){this.seriesIndex=this.componentIndex,this.dataTask=df({count:pg,reset:dg}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,n),(lg(this).sourceManager=new Wf(this)).prepareSource();var i=this.getInitialData(t,n);gg(i,this),this.dataTask.context.data=i,lg(this).dataBeforeProcessed=i,cg(this),this._initSelectedMapFromData(i)},e.prototype.mergeDefaultAndTheme=function(t,e){var n=Mp(this),i=n?Tp(t):{},r=this.subType;Ap.hasClass(r)&&(r+="Series"),C(t,e.getTheme().get(this.subType)),C(t,this.getDefaultOption()),vo(t,"label",["show"]),this.fillDataTextStyle(t.data),n&&Ip(t,i,n)},e.prototype.mergeOption=function(t,e){t=C(this.option,t,!0),this.fillDataTextStyle(t.data);var n=Mp(this);n&&Ip(this.option,t,n);var i=lg(this).sourceManager;i.dirty(),i.prepareSource();var r=this.getInitialData(t,e);gg(r,this),this.dataTask.dirty(),this.dataTask.context.data=r,lg(this).dataBeforeProcessed=r,cg(this),this._initSelectedMapFromData(r)},e.prototype.fillDataTextStyle=function(t){if(t&&!$(t))for(var e=["show"],n=0;nthis.getShallow("animationThreshold")&&(e=!1),!!e},e.prototype.restoreData=function(){this.dataTask.dirty()},e.prototype.getColorFromPalette=function(t,e,n){var i=this.ecModel,r=id.prototype.getColorFromPalette.call(this,t,e,n);return r||(r=i.getColorFromPalette(t,e,n)),r},e.prototype.coordDimToDataDim=function(t){return this.getRawData().mapDimensionsAll(t)},e.prototype.getProgressive=function(){return this.get("progressive")},e.prototype.getProgressiveThreshold=function(){return this.get("progressiveThreshold")},e.prototype.select=function(t,e){this._innerSelect(this.getData(e),t)},e.prototype.unselect=function(t,e){var n=this.option.selectedMap;if(n){var i=this.option.selectedMode,r=this.getData(e);if("series"===i||"all"===n)return this.option.selectedMap={},void(this._selectedDataIndicesMap={});for(var o=0;o=0&&n.push(r)}return n},e.prototype.isSelected=function(t,e){var n=this.option.selectedMap;if(!n)return!1;var i=this.getData(e);return("all"===n||n[ug(i,t)])&&!i.getItemModel(t).get(["select","disabled"])},e.prototype.isUniversalTransitionEnabled=function(){if(this.__universalTransitionEnabled)return!0;var t=this.option.universalTransition;return!!t&&(!0===t||t&&t.enabled)},e.prototype._innerSelect=function(t,e){var n,i,r=this.option,o=r.selectedMode,a=e.length;if(o&&a)if("series"===o)r.selectedMap="all";else if("multiple"===o){q(r.selectedMap)||(r.selectedMap={});for(var s=r.selectedMap,l=0;l0&&this._innerSelect(t,e)}},e.registerClass=function(t){return Ap.registerClass(t)},e.protoInitialize=function(){var t=e.prototype;t.type="series.__base__",t.seriesIndex=0,t.ignoreStyleOnData=!1,t.hasSymbolVisual=!1,t.defaultSymbol="circle",t.visualStyleAccessPath="itemStyle",t.visualDrawType="fill"}(),e}(Ap);function cg(t){var e=t.name;Io(t)||(t.name=function(t){var e=t.getRawData(),n=e.mapDimensionsAll("seriesName"),i=[];return E(n,(function(t){var n=e.getDimensionInfo(t);n.displayName&&i.push(n.displayName)})),i.join(" ")}(t)||e)}function pg(t){return t.model.getRawData().count()}function dg(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),fg}function fg(t,e){e.outputData&&t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function gg(t,e){E(gt(t.CHANGABLE_METHODS,t.DOWNSAMPLE_METHODS),(function(n){t.wrapMethod(n,H(yg,e))}))}function yg(t,e){var n=vg(t);return n&&n.setOutputEnd((e||this).count()),e}function vg(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){var i=n.currentTask;if(i){var r=i.agentStubMap;r&&(i=r.get(t.uid))}return i}}R(hg,cf),R(hg,id),Wo(hg,Ap);var mg=function(){function t(){this.group=new Pr,this.uid=bc("viewComponent")}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){},t.prototype.updateLayout=function(t,e,n,i){},t.prototype.updateVisual=function(t,e,n,i){},t.prototype.toggleBlurSeries=function(t,e,n){},t.prototype.eachRendered=function(t){var e=this.group;e&&e.traverse(t)},t}();function xg(){var t=Do();return function(e){var n=t(e),i=e.pipelineContext,r=!!n.large,o=!!n.progressiveRender,a=n.large=!(!i||!i.large),s=n.progressiveRender=!(!i||!i.progressiveRender);return!(r===a&&o===s)&&"reset"}}Go(mg),Xo(mg);var _g=Do(),bg=xg(),wg=function(){function t(){this.group=new Pr,this.uid=bc("viewChart"),this.renderTask=df({plan:Ig,reset:Tg}),this.renderTask.context={view:this}}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){0},t.prototype.highlight=function(t,e,n,i){var r=t.getData(i&&i.dataType);r&&Mg(r,i,"emphasis")},t.prototype.downplay=function(t,e,n,i){var r=t.getData(i&&i.dataType);r&&Mg(r,i,"normal")},t.prototype.remove=function(t,e){this.group.removeAll()},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateLayout=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.eachRendered=function(t){Yh(this.group,t)},t.markUpdateMethod=function(t,e){_g(t).updateMethod=e},t.protoInitialize=void(t.prototype.type="chart"),t}();function Sg(t,e,n){t&&Ul(t)&&("emphasis"===e?Il:Tl)(t,n)}function Mg(t,e,n){var i=Co(t,e),r=e&&null!=e.highlightKey?function(t){var e=$s[t];return null==e&&Ks<=32&&(e=$s[t]=Ks++),e}(e.highlightKey):null;null!=i?E(yo(i),(function(e){Sg(t.getItemGraphicEl(e),n,r)})):t.eachItemGraphicEl((function(t){Sg(t,n,r)}))}function Ig(t){return bg(t.model)}function Tg(t){var e=t.model,n=t.ecModel,i=t.api,r=t.payload,o=e.pipelineContext.progressiveRender,a=t.view,s=r&&_g(r).updateMethod,l=o?"incrementalPrepareRender":s&&a[s]?s:"render";return"render"!==l&&a[l](e,n,i,r),Cg[l]}Go(wg),Xo(wg);var Cg={incrementalPrepareRender:{progress:function(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}},render:{forceFirstProgress:!0,progress:function(t,e){e.view.render(e.model,e.ecModel,e.api,e.payload)}}},Dg="\0__throttleOriginMethod",Ag="\0__throttleRate",kg="\0__throttleType";function Lg(t,e,n){var i,r,o,a,s,l=0,u=0,h=null;function c(){u=(new Date).getTime(),h=null,t.apply(o,a||[])}e=e||0;var p=function(){for(var t=[],p=0;p=0?c():h=setTimeout(c,-r),l=i};return p.clear=function(){h&&(clearTimeout(h),h=null)},p.debounceNextCall=function(t){s=t},p}function Pg(t,e,n,i){var r=t[e];if(r){var o=r[Dg]||r,a=r[kg];if(r[Ag]!==n||a!==i){if(null==n||!i)return t[e]=o;(r=t[e]=Lg(o,n,"debounce"===i))[Dg]=o,r[kg]=i,r[Ag]=n}return r}}function Og(t,e){var n=t[e];n&&n[Dg]&&(n.clear&&n.clear(),t[e]=n[Dg])}var Rg=Do(),Ng={itemStyle:Zo(yc,!0),lineStyle:Zo(dc,!0)},Eg={lineStyle:"stroke",itemStyle:"fill"};function zg(t,e){var n=t.visualStyleMapper||Ng[e];return n||(console.warn("Unkown style type '"+e+"'."),Ng.itemStyle)}function Vg(t,e){var n=t.visualDrawType||Eg[e];return n||(console.warn("Unkown style type '"+e+"'."),"fill")}var Bg={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=t.getModel(i),o=zg(t,i)(r),a=r.getShallow("decal");a&&(n.setVisual("decal",a),a.dirty=!0);var s=Vg(t,i),l=o[s],u=U(l)?l:null,h="auto"===o.fill||"auto"===o.stroke;if(!o[s]||u||h){var c=t.getColorFromPalette(t.name,null,e.getSeriesCount());o[s]||(o[s]=c,n.setVisual("colorFromPalette",!0)),o.fill="auto"===o.fill||U(o.fill)?c:o.fill,o.stroke="auto"===o.stroke||U(o.stroke)?c:o.stroke}if(n.setVisual("style",o),n.setVisual("drawType",s),!e.isSeriesFiltered(t)&&u)return n.setVisual("colorFromPalette",!1),{dataEach:function(e,n){var i=t.getDataParams(n),r=A({},o);r[s]=u(i),e.setItemVisual(n,"style",r)}}}},Fg=new xc,Gg={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){if(!t.ignoreStyleOnData&&!e.isSeriesFiltered(t)){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=zg(t,i),o=n.getVisual("drawType");return{dataEach:n.hasItemOption?function(t,e){var n=t.getRawDataItem(e);if(n&&n[i]){Fg.option=n[i];var a=r(Fg);A(t.ensureUniqueItemVisual(e,"style"),a),Fg.option.decal&&(t.setItemVisual(e,"decal",Fg.option.decal),Fg.option.decal.dirty=!0),o in a&&t.setItemVisual(e,"colorFromPalette",!1)}}:null}}}},Wg={performRawSeries:!0,overallReset:function(t){var e=ft();t.eachSeries((function(t){var n=t.getColorBy();if(!t.isColorBySeries()){var i=t.type+"-"+n,r=e.get(i);r||(r={},e.set(i,r)),Rg(t).scope=r}})),t.eachSeries((function(e){if(!e.isColorBySeries()&&!t.isSeriesFiltered(e)){var n=e.getRawData(),i={},r=e.getData(),o=Rg(e).scope,a=e.visualStyleAccessPath||"itemStyle",s=Vg(e,a);r.each((function(t){var e=r.getRawIndex(t);i[e]=t})),n.each((function(t){var a=i[t];if(r.getItemVisual(a,"colorFromPalette")){var l=r.ensureUniqueItemVisual(a,"style"),u=n.getName(t)||t+"",h=n.count();l[s]=e.getColorFromPalette(u,o,h)}}))}}))}},Hg=Math.PI;var Yg=function(){function t(t,e,n,i){this._stageTaskMap=ft(),this.ecInstance=t,this.api=e,n=this._dataProcessorHandlers=n.slice(),i=this._visualHandlers=i.slice(),this._allHandlers=n.concat(i)}return t.prototype.restoreData=function(t,e){t.restoreData(e),this._stageTaskMap.each((function(t){var e=t.overallTask;e&&e.dirty()}))},t.prototype.getPerformArgs=function(t,e){if(t.__pipeline){var n=this._pipelineMap.get(t.__pipeline.id),i=n.context,r=!e&&n.progressiveEnabled&&(!i||i.progressiveRender)&&t.__idxInPipeline>n.blockIndex?n.step:null,o=i&&i.modDataCount;return{step:r,modBy:null!=o?Math.ceil(o/r):null,modDataCount:o}}},t.prototype.getPipeline=function(t){return this._pipelineMap.get(t)},t.prototype.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,o=t.get("large")&&i>=t.get("largeThreshold"),a="mod"===t.get("progressiveChunkMode")?i:null;t.pipelineContext=n.context={progressiveRender:r,modDataCount:a,large:o}},t.prototype.restorePipelines=function(t){var e=this,n=e._pipelineMap=ft();t.eachSeries((function(t){var i=t.getProgressive(),r=t.uid;n.set(r,{id:r,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:i&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(i||700),count:0}),e._pipe(t,t.dataTask)}))},t.prototype.prepareStageTasks=function(){var t=this._stageTaskMap,e=this.api.getModel(),n=this.api;E(this._allHandlers,(function(i){var r=t.get(i.uid)||t.set(i.uid,{}),o="";lt(!(i.reset&&i.overallReset),o),i.reset&&this._createSeriesStageTask(i,r,e,n),i.overallReset&&this._createOverallStageTask(i,r,e,n)}),this)},t.prototype.prepareView=function(t,e,n,i){var r=t.renderTask,o=r.context;o.model=e,o.ecModel=n,o.api=i,r.__block=!t.incrementalPrepareRender,this._pipe(e,r)},t.prototype.performDataProcessorTasks=function(t,e){this._performStageTasks(this._dataProcessorHandlers,t,e,{block:!0})},t.prototype.performVisualTasks=function(t,e,n){this._performStageTasks(this._visualHandlers,t,e,n)},t.prototype._performStageTasks=function(t,e,n,i){i=i||{};var r=!1,o=this;function a(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}E(t,(function(t,s){if(!i.visualType||i.visualType===t.visualType){var l=o._stageTaskMap.get(t.uid),u=l.seriesTaskMap,h=l.overallTask;if(h){var c,p=h.agentStubMap;p.each((function(t){a(i,t)&&(t.dirty(),c=!0)})),c&&h.dirty(),o.updatePayload(h,n);var d=o.getPerformArgs(h,i.block);p.each((function(t){t.perform(d)})),h.perform(d)&&(r=!0)}else u&&u.each((function(s,l){a(i,s)&&s.dirty();var u=o.getPerformArgs(s,i.block);u.skip=!t.performRawSeries&&e.isSeriesFiltered(s.context.model),o.updatePayload(s,n),s.perform(u)&&(r=!0)}))}})),this.unfinished=r||this.unfinished},t.prototype.performSeriesTasks=function(t){var e;t.eachSeries((function(t){e=t.dataTask.perform()||e})),this.unfinished=e||this.unfinished},t.prototype.plan=function(){this._pipelineMap.each((function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)}))},t.prototype.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)},t.prototype._createSeriesStageTask=function(t,e,n,i){var r=this,o=e.seriesTaskMap,a=e.seriesTaskMap=ft(),s=t.seriesType,l=t.getTargetSeries;function u(e){var s=e.uid,l=a.set(s,o&&o.get(s)||df({plan:qg,reset:Kg,count:Qg}));l.context={model:e,ecModel:n,api:i,useClearVisual:t.isVisual&&!t.isLayout,plan:t.plan,reset:t.reset,scheduler:r},r._pipe(e,l)}t.createOnAllSeries?n.eachRawSeries(u):s?n.eachRawSeriesByType(s,u):l&&l(n,i).each(u)},t.prototype._createOverallStageTask=function(t,e,n,i){var r=this,o=e.overallTask=e.overallTask||df({reset:Ug});o.context={ecModel:n,api:i,overallReset:t.overallReset,scheduler:r};var a=o.agentStubMap,s=o.agentStubMap=ft(),l=t.seriesType,u=t.getTargetSeries,h=!0,c=!1,p="";function d(t){var e=t.uid,n=s.set(e,a&&a.get(e)||(c=!0,df({reset:Xg,onDirty:jg})));n.context={model:t,overallProgress:h},n.agent=o,n.__block=h,r._pipe(t,n)}lt(!t.createOnAllSeries,p),l?n.eachRawSeriesByType(l,d):u?u(n,i).each(d):(h=!1,E(n.getSeries(),d)),c&&o.dirty()},t.prototype._pipe=function(t,e){var n=t.uid,i=this._pipelineMap.get(n);!i.head&&(i.head=e),i.tail&&i.tail.pipe(e),i.tail=e,e.__idxInPipeline=i.count++,e.__pipeline=i},t.wrapStageHandler=function(t,e){return U(t)&&(t={overallReset:t,seriesType:ty(t)}),t.uid=bc("stageHandler"),e&&(t.visualType=e),t},t}();function Ug(t){t.overallReset(t.ecModel,t.api,t.payload)}function Xg(t){return t.overallProgress&&Zg}function Zg(){this.agent.dirty(),this.getDownstream().dirty()}function jg(){this.agent&&this.agent.dirty()}function qg(t){return t.plan?t.plan(t.model,t.ecModel,t.api,t.payload):null}function Kg(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=yo(t.reset(t.model,t.ecModel,t.api,t.payload));return e.length>1?z(e,(function(t,e){return Jg(e)})):$g}var $g=Jg(0);function Jg(t){return function(e,n){var i=n.data,r=n.resetDefines[t];if(r&&r.dataEach)for(var o=e.start;o0&&h===r.length-u.length){var c=r.slice(0,h);"data"!==c&&(e.mainType=c,e[u.toLowerCase()]=t,s=!0)}}a.hasOwnProperty(r)&&(n[r]=t,s=!0),s||(i[r]=t)}))}return{cptQuery:e,dataQuery:n,otherQuery:i}},t.prototype.filter=function(t,e){var n=this.eventInfo;if(!n)return!0;var i=n.targetEl,r=n.packedEvent,o=n.model,a=n.view;if(!o||!a)return!0;var s=e.cptQuery,l=e.dataQuery;return u(s,o,"mainType")&&u(s,o,"subType")&&u(s,o,"index","componentIndex")&&u(s,o,"name")&&u(s,o,"id")&&u(l,r,"name")&&u(l,r,"dataIndex")&&u(l,r,"dataType")&&(!a.filterForExposedEvent||a.filterForExposedEvent(t,e.otherQuery,i,r));function u(t,e,n,i){return null==t[n]||e[i||n]===t[n]}},t.prototype.afterTrigger=function(){this.eventInfo=null},t}(),dy=["symbol","symbolSize","symbolRotate","symbolOffset"],fy=dy.concat(["symbolKeepAspect"]),gy={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData();if(t.legendIcon&&n.setVisual("legendIcon",t.legendIcon),t.hasSymbolVisual){for(var i={},r={},o=!1,a=0;a=0&&zy(l)?l:.5,t.createRadialGradient(a,s,0,a,s,l)}(t,e,n):function(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,o=null==e.y?0:e.y,a=null==e.y2?0:e.y2;return e.global||(i=i*n.width+n.x,r=r*n.width+n.x,o=o*n.height+n.y,a=a*n.height+n.y),i=zy(i)?i:0,r=zy(r)?r:1,o=zy(o)?o:0,a=zy(a)?a:0,t.createLinearGradient(i,o,r,a)}(t,e,n),r=e.colorStops,o=0;o0&&(e=i.lineDash,n=i.lineWidth,e&&"solid"!==e&&n>0?"dashed"===e?[4*n,2*n]:"dotted"===e?[n]:j(e)?[e]:Y(e)?e:null:null),o=i.lineDashOffset;if(r){var a=i.strokeNoScale&&t.getLineScale?t.getLineScale():1;a&&1!==a&&(r=z(r,(function(t){return t/a})),o/=a)}return[r,o]}var Wy=new ts(!0);function Hy(t){var e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))}function Yy(t){return"string"==typeof t&&"none"!==t}function Uy(t){var e=t.fill;return null!=e&&"none"!==e}function Xy(t,e){if(null!=e.fillOpacity&&1!==e.fillOpacity){var n=t.globalAlpha;t.globalAlpha=e.fillOpacity*e.opacity,t.fill(),t.globalAlpha=n}else t.fill()}function Zy(t,e){if(null!=e.strokeOpacity&&1!==e.strokeOpacity){var n=t.globalAlpha;t.globalAlpha=e.strokeOpacity*e.opacity,t.stroke(),t.globalAlpha=n}else t.stroke()}function jy(t,e,n){var i=Jo(e.image,e.__image,n);if(ta(i)){var r=t.createPattern(i,e.repeat||"repeat");if("function"==typeof DOMMatrix&&r&&r.setTransform){var o=new DOMMatrix;o.translateSelf(e.x||0,e.y||0),o.rotateSelf(0,0,(e.rotation||0)*_t),o.scaleSelf(e.scaleX||1,e.scaleY||1),r.setTransform(o)}return r}}var qy=["shadowBlur","shadowOffsetX","shadowOffsetY"],Ky=[["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]];function $y(t,e,n,i,r){var o=!1;if(!i&&e===(n=n||{}))return!1;if(i||e.opacity!==n.opacity){tv(t,r),o=!0;var a=Math.max(Math.min(e.opacity,1),0);t.globalAlpha=isNaN(a)?fa.opacity:a}(i||e.blend!==n.blend)&&(o||(tv(t,r),o=!0),t.globalCompositeOperation=e.blend||fa.blend);for(var s=0;s0&&t.unfinished);t.unfinished||this._zr.flush()}}},e.prototype.getDom=function(){return this._dom},e.prototype.getId=function(){return this.id},e.prototype.getZr=function(){return this._zr},e.prototype.isSSR=function(){return this._ssr},e.prototype.setOption=function(t,e,n){if(!this.__flagInMainProcess)if(this._disposed)Xv(this.id);else{var i,r,o;if(q(e)&&(n=e.lazyUpdate,i=e.silent,r=e.replaceMerge,o=e.transition,e=e.notMerge),this.__flagInMainProcess=!0,!this._model||e){var a=new gd(this._api),s=this._theme,l=this._model=new ad;l.scheduler=this._scheduler,l.ssr=this._ssr,l.init(null,null,null,s,this._locale,a)}this._model.setOption(t,{replaceMerge:r},Kv);var u={seriesTransition:o,optionChanged:!0};if(n)this.__pendingUpdate={silent:i,updateParams:u},this.__flagInMainProcess=!1,this.getZr().wakeUp();else{try{Sv(this),Tv.update.call(this,null,u)}catch(t){throw this.__pendingUpdate=null,this.__flagInMainProcess=!1,t}this._ssr||this._zr.flush(),this.__pendingUpdate=null,this.__flagInMainProcess=!1,kv.call(this,i),Lv.call(this,i)}}},e.prototype.setTheme=function(){ho()},e.prototype.getModel=function(){return this._model},e.prototype.getOption=function(){return this._model&&this._model.getOption()},e.prototype.getWidth=function(){return this._zr.getWidth()},e.prototype.getHeight=function(){return this._zr.getHeight()},e.prototype.getDevicePixelRatio=function(){return this._zr.painter.dpr||fv&&window.devicePixelRatio||1},e.prototype.getRenderedCanvas=function(t){return this.renderToCanvas(t)},e.prototype.renderToCanvas=function(t){t=t||{};var e=this._zr.painter;return e.getRenderedCanvas({backgroundColor:t.backgroundColor||this._model.get("backgroundColor"),pixelRatio:t.pixelRatio||this.getDevicePixelRatio()})},e.prototype.renderToSVGString=function(t){t=t||{};var e=this._zr.painter;return e.renderToString({useViewBox:t.useViewBox})},e.prototype.getSvgDataURL=function(){if(r.svgSupported){var t=this._zr;return E(t.storage.getDisplayList(),(function(t){t.stopAnimation(null,!0)})),t.painter.toDataURL()}},e.prototype.getDataURL=function(t){if(!this._disposed){var e=(t=t||{}).excludeComponents,n=this._model,i=[],r=this;E(e,(function(t){n.eachComponent({mainType:t},(function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)}))}));var o="svg"===this._zr.painter.getType()?this.getSvgDataURL():this.renderToCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return E(i,(function(t){t.group.ignore=!1})),o}Xv(this.id)},e.prototype.getConnectedDataURL=function(t){if(!this._disposed){var e="svg"===t.type,n=this.group,i=Math.min,r=Math.max,o=1/0;if(em[n]){var a=o,s=o,l=-1/0,u=-1/0,c=[],p=t&&t.pixelRatio||this.getDevicePixelRatio();E(tm,(function(o,h){if(o.group===n){var p=e?o.getZr().painter.getSvgDom().innerHTML:o.renderToCanvas(T(t)),d=o.getDom().getBoundingClientRect();a=i(d.left,a),s=i(d.top,s),l=r(d.right,l),u=r(d.bottom,u),c.push({dom:p,left:d.left,top:d.top})}}));var d=(l*=p)-(a*=p),f=(u*=p)-(s*=p),g=h.createCanvas(),y=Er(g,{renderer:e?"svg":"canvas"});if(y.resize({width:d,height:f}),e){var v="";return E(c,(function(t){var e=t.left-a,n=t.top-s;v+=''+t.dom+""})),y.painter.getSvgRoot().innerHTML=v,t.connectedBackgroundColor&&y.painter.setBackgroundColor(t.connectedBackgroundColor),y.refreshImmediately(),y.painter.toDataURL()}return t.connectedBackgroundColor&&y.add(new Ps({shape:{x:0,y:0,width:d,height:f},style:{fill:t.connectedBackgroundColor}})),E(c,(function(t){var e=new Is({style:{x:t.left*p-a,y:t.top*p-s,image:t.dom}});y.add(e)})),y.refreshImmediately(),g.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}Xv(this.id)},e.prototype.convertToPixel=function(t,e){return Cv(this,"convertToPixel",t,e)},e.prototype.convertFromPixel=function(t,e){return Cv(this,"convertFromPixel",t,e)},e.prototype.containPixel=function(t,e){var n;if(!this._disposed)return E(ko(this._model,t),(function(t,i){i.indexOf("Models")>=0&&E(t,(function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n=n||!!r.containPoint(e);else if("seriesModels"===i){var o=this._chartsMap[t.__viewId];o&&o.containPoint&&(n=n||o.containPoint(e,t))}else 0}),this)}),this),!!n;Xv(this.id)},e.prototype.getVisual=function(t,e){var n=ko(this._model,t,{defaultMainType:"series"}),i=n.seriesModel;var r=i.getData(),o=n.hasOwnProperty("dataIndexInside")?n.dataIndexInside:n.hasOwnProperty("dataIndex")?r.indexOfRawIndex(n.dataIndex):null;return null!=o?vy(r,o,e):my(r,e)},e.prototype.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},e.prototype.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]},e.prototype._initEvents=function(){var t,e,n,i=this;E(Uv,(function(t){var e=function(e){var n,r=i.getModel(),o=e.target,a="globalout"===t;if(a?n={}:o&&wy(o,(function(t){var e=js(t);if(e&&null!=e.dataIndex){var i=e.dataModel||r.getSeriesByIndex(e.seriesIndex);return n=i&&i.getDataParams(e.dataIndex,e.dataType)||{},!0}if(e.eventData)return n=A({},e.eventData),!0}),!0),n){var s=n.componentType,l=n.componentIndex;"markLine"!==s&&"markPoint"!==s&&"markArea"!==s||(s="series",l=n.seriesIndex);var u=s&&null!=l&&r.getComponent(s,l),h=u&&i["series"===u.mainType?"_chartsMap":"_componentsMap"][u.__viewId];0,n.event=e,n.type=t,i._$eventProcessor.eventInfo={targetEl:o,packedEvent:n,model:u,view:h},i.trigger(t,n)}};e.zrEventfulCallAtLast=!0,i._zr.on(t,e,i)})),E(jv,(function(t,e){i._messageCenter.on(e,(function(t){this.trigger(e,t)}),i)})),E(["selectchanged"],(function(t){i._messageCenter.on(t,(function(e){this.trigger(t,e)}),i)})),t=this._messageCenter,e=this,n=this._api,t.on("selectchanged",(function(t){var i=n.getModel();t.isFromClick?(by("map","selectchanged",e,i,t),by("pie","selectchanged",e,i,t)):"select"===t.fromAction?(by("map","selected",e,i,t),by("pie","selected",e,i,t)):"unselect"===t.fromAction&&(by("map","unselected",e,i,t),by("pie","unselected",e,i,t))}))},e.prototype.isDisposed=function(){return this._disposed},e.prototype.clear=function(){this._disposed?Xv(this.id):this.setOption({series:[]},!0)},e.prototype.dispose=function(){if(this._disposed)Xv(this.id);else{this._disposed=!0,this.getDom()&&No(this.getDom(),rm,"");var t=this,e=t._api,n=t._model;E(t._componentsViews,(function(t){t.dispose(n,e)})),E(t._chartsViews,(function(t){t.dispose(n,e)})),t._zr.dispose(),t._dom=t._model=t._chartsMap=t._componentsMap=t._chartsViews=t._componentsViews=t._scheduler=t._api=t._zr=t._throttledZrFlush=t._theme=t._coordSysMgr=t._messageCenter=null,delete tm[t.id]}},e.prototype.resize=function(t){if(!this.__flagInMainProcess)if(this._disposed)Xv(this.id);else{this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var n=e.resetOption("media"),i=t&&t.silent;this.__pendingUpdate&&(null==i&&(i=this.__pendingUpdate.silent),n=!0,this.__pendingUpdate=null),this.__flagInMainProcess=!0;try{n&&Sv(this),Tv.update.call(this,{type:"resize",animation:A({duration:0},t&&t.animation)})}catch(t){throw this.__flagInMainProcess=!1,t}this.__flagInMainProcess=!1,kv.call(this,i),Lv.call(this,i)}}},e.prototype.showLoading=function(t,e){if(this._disposed)Xv(this.id);else if(q(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),Qv[t]){var n=Qv[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},e.prototype.hideLoading=function(){this._disposed?Xv(this.id):(this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null)},e.prototype.makeActionFromEvent=function(t){var e=A({},t);return e.type=jv[t.type],e},e.prototype.dispatchAction=function(t,e){if(this._disposed)Xv(this.id);else if(q(e)||(e={silent:!!e}),Zv[t.type]&&this._model)if(this.__flagInMainProcess)this._pendingActions.push(t);else{var n=e.silent;Av.call(this,t,n);var i=e.flush;i?this._zr.flush():!1!==i&&r.browser.weChat&&this._throttledZrFlush(),kv.call(this,n),Lv.call(this,n)}},e.prototype.updateLabelLayout=function(){cv.trigger("series:layoutlabels",this._model,this._api,{updatedSeries:[]})},e.prototype.appendData=function(t){if(this._disposed)Xv(this.id);else{var e=t.seriesIndex,n=this.getModel().getSeriesByIndex(e);0,n.appendData(t),this._scheduler.unfinished=!0,this.getZr().wakeUp()}},e.internalField=function(){function t(t){t.clearColorPalette(),t.eachSeries((function(t){t.clearColorPalette()}))}function e(t){for(var e=[],n=t.currentStates,i=0;i0?{duration:o,delay:i.get("delay"),easing:i.get("easing")}:null;n.eachRendered((function(t){if(t.states&&t.states.emphasis){if(ch(t))return;if(t instanceof _s&&function(t){var e=Js(t);e.normalFill=t.style.fill,e.normalStroke=t.style.stroke;var n=t.states.select||{};e.selectFill=n.style&&n.style.fill||null,e.selectStroke=n.style&&n.style.stroke||null}(t),t.__dirty){var n=t.prevStates;n&&t.useStates(n)}if(r){t.stateTransition=a;var i=t.getTextContent(),o=t.getTextGuideLine();i&&(i.stateTransition=a),o&&(o.stateTransition=a)}t.__dirty&&e(t)}}))}Sv=function(t){var e=t._scheduler;e.restorePipelines(t._model),e.prepareStageTasks(),Mv(t,!0),Mv(t,!1),e.plan()},Mv=function(t,e){for(var n=t._model,i=t._scheduler,r=e?t._componentsViews:t._chartsViews,o=e?t._componentsMap:t._chartsMap,a=t._zr,s=t._api,l=0;le.get("hoverLayerThreshold")&&!r.node&&!r.worker&&e.eachSeries((function(e){if(!e.preventUsingHoverLayer){var n=t._chartsMap[e.__viewId];n.__alive&&n.eachRendered((function(t){t.states.emphasis&&(t.states.emphasis.hoverLayer=!0)}))}}))}(t,e),cv.trigger("series:afterupdate",e,n,l)},Bv=function(t){t.__needsUpdateStatus=!0,t.getZr().wakeUp()},Fv=function(t){t.__needsUpdateStatus&&(t.getZr().storage.traverse((function(t){ch(t)||e(t)})),t.__needsUpdateStatus=!1)},zv=function(t){return new(function(e){function i(){return null!==e&&e.apply(this,arguments)||this}return n(i,e),i.prototype.getCoordinateSystems=function(){return t._coordSysMgr.getCoordinateSystems()},i.prototype.getComponentByElement=function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}},i.prototype.enterEmphasis=function(e,n){Il(e,n),Bv(t)},i.prototype.leaveEmphasis=function(e,n){Tl(e,n),Bv(t)},i.prototype.enterBlur=function(e){Cl(e),Bv(t)},i.prototype.leaveBlur=function(e){Dl(e),Bv(t)},i.prototype.enterSelect=function(e){Al(e),Bv(t)},i.prototype.leaveSelect=function(e){kl(e),Bv(t)},i.prototype.getModel=function(){return t.getModel()},i.prototype.getViewOfComponentModel=function(e){return t.getViewOfComponentModel(e)},i.prototype.getViewOfSeriesModel=function(e){return t.getViewOfSeriesModel(e)},i}(cd))(t)},Vv=function(t){function e(t,e){for(var n=0;n=0)){mm.push(n);var o=Yg.wrapStageHandler(n,r);o.__prio=e,o.__raw=n,t.push(o)}}function _m(t,e){Qv[t]=e}function bm(t,e,n){var i=dv("registerMap");i&&i(t,e,n)}var wm=function(t){var e=(t=T(t)).type,n="";e||co(n);var i=e.split(":");2!==i.length&&co(n);var r=!1;"echarts"===i[0]&&(e=i[1],r=!0),t.__isBuiltIn=r,Af.set(e,t)};vm(gv,Bg),vm(yv,Gg),vm(yv,Wg),vm(gv,gy),vm(yv,yy),vm(7e3,(function(t,e){t.eachRawSeries((function(n){if(!t.isSeriesFiltered(n)){var i=n.getData();i.hasItemVisual()&&i.each((function(t){var n=i.getItemVisual(t,"decal");n&&(i.ensureUniqueItemVisual(t,"style").decal=sv(n,e))}));var r=i.getVisual("decal");if(r)i.getVisual("style").decal=sv(r,e)}}))})),um(Ed),hm(900,(function(t){var e=ft();t.eachSeries((function(t){var n=t.get("stack");if(n){var i=e.get(n)||e.set(n,[]),r=t.getData(),o={stackResultDimension:r.getCalculationInfo("stackResultDimension"),stackedOverDimension:r.getCalculationInfo("stackedOverDimension"),stackedDimension:r.getCalculationInfo("stackedDimension"),stackedByDimension:r.getCalculationInfo("stackedByDimension"),isStackedByIndex:r.getCalculationInfo("isStackedByIndex"),data:r,seriesModel:t};if(!o.stackedDimension||!o.isStackedByIndex&&!o.stackedByDimension)return;i.length&&r.setCalculationInfo("stackedOnSeries",i[i.length-1].seriesModel),i.push(o)}})),e.each(zd)})),_m("default",(function(t,e){k(e=e||{},{text:"loading",textColor:"#000",fontSize:12,fontWeight:"normal",fontStyle:"normal",fontFamily:"sans-serif",maskColor:"rgba(255, 255, 255, 0.8)",showSpinner:!0,color:"#5470c6",spinnerRadius:10,lineWidth:5,zlevel:0});var n=new Pr,i=new Ps({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4});n.add(i);var r,o=new Ns({style:{text:e.text,fill:e.textColor,fontSize:e.fontSize,fontWeight:e.fontWeight,fontStyle:e.fontStyle,fontFamily:e.fontFamily},zlevel:e.zlevel,z:10001}),a=new Ps({style:{fill:"none"},textContent:o,textConfig:{position:"right",distance:10},zlevel:e.zlevel,z:10001});return n.add(a),e.showSpinner&&((r=new ju({shape:{startAngle:-Hg/2,endAngle:-Hg/2+.1,r:e.spinnerRadius},style:{stroke:e.color,lineCap:"round",lineWidth:e.lineWidth},zlevel:e.zlevel,z:10001})).animateShape(!0).when(1e3,{endAngle:3*Hg/2}).start("circularInOut"),r.animateShape(!0).when(1e3,{startAngle:3*Hg/2}).delay(300).start("circularInOut"),n.add(r)),n.resize=function(){var n=o.getBoundingRect().width,s=e.showSpinner?e.spinnerRadius:0,l=(t.getWidth()-2*s-(e.showSpinner&&n?10:0)-n)/2-(e.showSpinner&&n?0:5+n/2)+(e.showSpinner?0:n/2)+(n?0:s),u=t.getHeight()/2;e.showSpinner&&r.setShape({cx:l,cy:u}),a.setShape({x:l-s,y:u-s,width:2*s,height:2*s}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},n.resize(),n})),fm({type:il,event:il,update:il},xt),fm({type:rl,event:rl,update:rl},xt),fm({type:ol,event:ol,update:ol},xt),fm({type:al,event:al,update:al},xt),fm({type:sl,event:sl,update:sl},xt),lm("light",ay),lm("dark",cy);var Sm=[],Mm={registerPreprocessor:um,registerProcessor:hm,registerPostInit:cm,registerPostUpdate:pm,registerUpdateLifecycle:dm,registerAction:fm,registerCoordinateSystem:gm,registerLayout:ym,registerVisual:vm,registerTransform:wm,registerLoading:_m,registerMap:bm,registerImpl:function(t,e){pv[t]=e},PRIORITY:vv,ComponentModel:Ap,ComponentView:mg,SeriesModel:hg,ChartView:wg,registerComponentModel:function(t){Ap.registerClass(t)},registerComponentView:function(t){mg.registerClass(t)},registerSeriesModel:function(t){hg.registerClass(t)},registerChartView:function(t){wg.registerClass(t)},registerSubTypeDefaulter:function(t,e){Ap.registerSubTypeDefaulter(t,e)},registerPainter:function(t,e){zr(t,e)}};function Im(t){Y(t)?E(t,(function(t){Im(t)})):P(Sm,t)>=0||(Sm.push(t),U(t)&&(t={install:t}),t.install(Mm))}function Tm(t){return null==t?0:t.length||1}function Cm(t){return t}var Dm=function(){function t(t,e,n,i,r,o){this._old=t,this._new=e,this._oldKeyGetter=n||Cm,this._newKeyGetter=i||Cm,this.context=r,this._diffModeMultiple="multiple"===o}return t.prototype.add=function(t){return this._add=t,this},t.prototype.update=function(t){return this._update=t,this},t.prototype.updateManyToOne=function(t){return this._updateManyToOne=t,this},t.prototype.updateOneToMany=function(t){return this._updateOneToMany=t,this},t.prototype.updateManyToMany=function(t){return this._updateManyToMany=t,this},t.prototype.remove=function(t){return this._remove=t,this},t.prototype.execute=function(){this[this._diffModeMultiple?"_executeMultiple":"_executeOneToOne"]()},t.prototype._executeOneToOne=function(){var t=this._old,e=this._new,n={},i=new Array(t.length),r=new Array(e.length);this._initIndexMap(t,null,i,"_oldKeyGetter"),this._initIndexMap(e,n,r,"_newKeyGetter");for(var o=0;o1){var u=s.shift();1===s.length&&(n[a]=s[0]),this._update&&this._update(u,o)}else 1===l?(n[a]=null,this._update&&this._update(s,o)):this._remove&&this._remove(o)}this._performRestAdd(r,n)},t.prototype._executeMultiple=function(){var t=this._old,e=this._new,n={},i={},r=[],o=[];this._initIndexMap(t,n,r,"_oldKeyGetter"),this._initIndexMap(e,i,o,"_newKeyGetter");for(var a=0;a1&&1===c)this._updateManyToOne&&this._updateManyToOne(u,l),i[s]=null;else if(1===h&&c>1)this._updateOneToMany&&this._updateOneToMany(u,l),i[s]=null;else if(1===h&&1===c)this._update&&this._update(u,l),i[s]=null;else if(h>1&&c>1)this._updateManyToMany&&this._updateManyToMany(u,l),i[s]=null;else if(h>1)for(var p=0;p1)for(var a=0;a30}var Fm,Gm,Wm,Hm,Ym,Um,Xm,Zm=q,jm=z,qm="undefined"==typeof Int32Array?Array:Int32Array,Km=["hasItemOption","_nameList","_idList","_invertedIndicesMap","_dimSummary","userOutput","_rawData","_dimValueGetter","_nameDimIdx","_idDimIdx","_nameRepeatCount"],$m=["_approximateExtent"],Jm=function(){function t(t,e){var n;this.type="list",this._dimOmitted=!1,this._nameList=[],this._idList=[],this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._approximateExtent={},this._calculationInfo={},this.hasItemOption=!1,this.TRANSFERABLE_METHODS=["cloneShallow","downSample","lttbDownSample","map"],this.CHANGABLE_METHODS=["filterSelf","selectRange"],this.DOWNSAMPLE_METHODS=["downSample","lttbDownSample"];var i=!1;Em(t)?(n=t.dimensions,this._dimOmitted=t.isDimensionOmitted(),this._schema=t):(i=!0,n=t),n=n||["x","y"];for(var r={},o=[],a={},s=!1,l={},u=0;u=e)){var n=this._store.getProvider();this._updateOrdinalMeta();var i=this._nameList,r=this._idList;if(n.getSource().sourceFormat===Rp&&!n.pure)for(var o=[],a=t;a0},t.prototype.ensureUniqueItemVisual=function(t,e){var n=this._itemVisuals,i=n[t];i||(i=n[t]={});var r=i[e];return null==r&&(Y(r=this.getVisual(e))?r=r.slice():Zm(r)&&(r=A({},r)),i[e]=r),r},t.prototype.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{};this._itemVisuals[t]=i,Zm(e)?A(i,e):i[e]=n},t.prototype.clearAllVisual=function(){this._visual={},this._itemVisuals=[]},t.prototype.setLayout=function(t,e){Zm(t)?A(this._layout,t):this._layout[t]=e},t.prototype.getLayout=function(t){return this._layout[t]},t.prototype.getItemLayout=function(t){return this._itemLayouts[t]},t.prototype.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?A(this._itemLayouts[t]||{},e):e},t.prototype.clearItemLayouts=function(){this._itemLayouts.length=0},t.prototype.setItemGraphicEl=function(t,e){var n=this.hostModel&&this.hostModel.seriesIndex;qs(n,this.dataType,t,e),this._graphicEls[t]=e},t.prototype.getItemGraphicEl=function(t){return this._graphicEls[t]},t.prototype.eachItemGraphicEl=function(t,e){E(this._graphicEls,(function(n,i){n&&t&&t.call(e,n,i)}))},t.prototype.cloneShallow=function(e){return e||(e=new t(this._schema?this._schema:jm(this.dimensions,this._getDimInfo,this),this.hostModel)),Ym(e,this),e._store=this._store,e},t.prototype.wrapMethod=function(t,e){var n=this[t];U(n)&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(at(arguments)))})},t.internalField=(Fm=function(t){var e=t._invertedIndicesMap;E(e,(function(n,i){var r=t._dimInfos[i],o=r.ordinalMeta,a=t._store;if(o){n=e[i]=new qm(o.categories.length);for(var s=0;s1&&(s+="__ec__"+u),i[e]=s}})),t}();function Qm(t,e){Yd(t)||(t=Xd(t));var n=(e=e||{}).coordDimensions||[],i=e.dimensionsDefine||t.dimensionsDefine||[],r=ft(),o=[],a=function(t,e,n,i){var r=Math.max(t.dimensionsDetectedCount||1,e.length,n.length,i||0);return E(e,(function(t){var e;q(t)&&(e=t.dimsDef)&&(r=Math.max(r,e.length))})),r}(t,n,i,e.dimensionsCount),s=e.canOmitUnusedDimensions&&Bm(a),l=i===t.dimensionsDefine,u=l?Vm(t):zm(i),h=e.encodeDefine;!h&&e.encodeDefaulter&&(h=e.encodeDefaulter(t,a));for(var c=ft(h),p=new Ef(a),d=0;d0&&(i.name=r+(o-1)),o++,e.set(r,o)}}(o),new Nm({source:t,dimensions:o,fullDimensionCount:a,dimensionOmitted:s})}function tx(t,e,n){var i=e.data;if(n||i.hasOwnProperty(t)){for(var r=0;i.hasOwnProperty(t+r);)r++;t+=r}return e.set(t,!0),t}var ex=function(t){this.coordSysDims=[],this.axisMap=ft(),this.categoryAxisMap=ft(),this.coordSysName=t};var nx={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis",Po).models[0],o=t.getReferringComponents("yAxis",Po).models[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",o),ix(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),ix(o)&&(i.set("y",o),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},singleAxis:function(t,e,n,i){var r=t.getReferringComponents("singleAxis",Po).models[0];e.coordSysDims=["single"],n.set("single",r),ix(r)&&(i.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar",Po).models[0],o=r.findAxisModel("radiusAxis"),a=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",o),n.set("angle",a),ix(o)&&(i.set("radius",o),e.firstCategoryDimIndex=0),ix(a)&&(i.set("angle",a),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,e,n,i){var r=t.ecModel,o=r.getComponent("parallel",t.get("parallelIndex")),a=e.coordSysDims=o.dimensions.slice();E(o.parallelAxisIndex,(function(t,o){var s=r.getComponent("parallelAxis",t),l=a[o];n.set(l,s),ix(s)&&(i.set(l,s),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=o))}))}};function ix(t){return"category"===t.get("type")}function rx(t,e,n){var i,r,o,a=(n=n||{}).byIndex,s=n.stackedCoordDimension;!function(t){return!Em(t.schema)}(e)?(r=e.schema,i=r.dimensions,o=e.store):i=e;var l,u,h,c,p=!(!t||!t.get("stack"));if(E(i,(function(t,e){X(t)&&(i[e]=t={name:t}),p&&!t.isExtraCoord&&(a||l||!t.ordinalMeta||(l=t),u||"ordinal"===t.type||"time"===t.type||s&&s!==t.coordDim||(u=t))})),!u||a||l||(a=!0),u){h="__\0ecstackresult_"+t.id,c="__\0ecstackedover_"+t.id,l&&(l.createInvertedIndices=!0);var d=u.coordDim,f=u.type,g=0;E(i,(function(t){t.coordDim===d&&g++}));var y={name:h,coordDim:d,coordDimIndex:g,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length},v={name:c,coordDim:c,coordDimIndex:g+1,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length+1};r?(o&&(y.storeDimIndex=o.ensureCalculationDimension(c,f),v.storeDimIndex=o.ensureCalculationDimension(h,f)),r.appendCalculationDimension(y),r.appendCalculationDimension(v)):(i.push(y),i.push(v))}return{stackedDimension:u&&u.name,stackedByDimension:l&&l.name,isStackedByIndex:a,stackedOverDimension:c,stackResultDimension:h}}function ox(t,e){return!!e&&e===t.getCalculationInfo("stackedDimension")}function ax(t,e){return ox(t,e)?t.getCalculationInfo("stackResultDimension"):e}function sx(t,e,n){n=n||{};var i,r=e.getSourceManager(),o=!1;t?(o=!0,i=Xd(t)):o=(i=r.getSource()).sourceFormat===Rp;var a=function(t){var e=t.get("coordinateSystem"),n=new ex(e),i=nx[e];if(i)return i(t,n,n.axisMap,n.categoryAxisMap),n}(e),s=function(t,e){var n,i=t.get("coordinateSystem"),r=dd.get(i);return e&&e.coordSysDims&&(n=z(e.coordSysDims,(function(t){var n={name:t},i=e.axisMap.get(t);if(i){var r=i.get("type");n.type=Lm(r)}return n}))),n||(n=r&&(r.getDimensionsInfo?r.getDimensionsInfo():r.dimensions.slice())||["x","y"]),n}(e,a),l=n.useEncodeDefaulter,u=U(l)?l:l?H(Xp,s,e):null,h=Qm(i,{coordDimensions:s,generateCoord:n.generateCoord,encodeDefine:e.getEncode(),encodeDefaulter:u,canOmitUnusedDimensions:!o}),c=function(t,e,n){var i,r;return n&&E(t,(function(t,o){var a=t.coordDim,s=n.categoryAxisMap.get(a);s&&(null==i&&(i=o),t.ordinalMeta=s.getOrdinalMeta(),e&&(t.createInvertedIndices=!0)),null!=t.otherDims.itemName&&(r=!0)})),r||null==i||(t[i].otherDims.itemName=0),i}(h.dimensions,n.createInvertedIndices,a),p=o?null:r.getSharedDataStore(h),d=rx(e,{schema:h,store:p}),f=new Jm(h,e);f.setCalculationInfo(d);var g=null!=c&&function(t){if(t.sourceFormat===Rp){var e=function(t){var e=0;for(;ee[1]&&(e[1]=t[1])},t.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},t.prototype.isInExtentRange=function(t){return this._extent[0]<=t&&this._extent[1]>=t},t.prototype.isBlank=function(){return this._isBlank},t.prototype.setBlank=function(t){this._isBlank=t},t}();Xo(lx);var ux=0,hx=function(){function t(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication,this.uid=++ux}return t.createByAxisModel=function(e){var n=e.option,i=n.data,r=i&&z(i,cx);return new t({categories:r,needCollect:!r,deduplication:!1!==n.dedplication})},t.prototype.getOrdinal=function(t){return this._getOrCreateMap().get(t)},t.prototype.parseAndCollect=function(t){var e,n=this._needCollect;if(!X(t)&&!n)return t;if(n&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var i=this._getOrCreateMap();return null==(e=i.get(t))&&(n?(e=this.categories.length,this.categories[e]=t,i.set(t,e)):e=NaN),e},t.prototype._getOrCreateMap=function(){return this._map||(this._map=ft(this.categories))},t}();function cx(t){return q(t)&&null!=t.value?t.value:t+""}function px(t){return"interval"===t.type||"log"===t.type}function dx(t,e,n,i){var r={},o=t[1]-t[0],a=r.interval=no(o/e,!0);null!=n&&ai&&(a=r.interval=i);var s=r.intervalPrecision=gx(a);return function(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),yx(t,0,e),yx(t,1,e),t[0]>t[1]&&(t[0]=t[1])}(r.niceTickExtent=[Wr(Math.ceil(t[0]/a)*a,s),Wr(Math.floor(t[1]/a)*a,s)],t),r}function fx(t){var e=Math.pow(10,eo(t)),n=t/e;return n?2===n?n=3:3===n?n=5:n*=2:n=1,Wr(n*e)}function gx(t){return Yr(t)+2}function yx(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function vx(t,e){return t>=e[0]&&t<=e[1]}function mx(t,e){return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])}function xx(t,e){return t*(e[1]-e[0])+e[0]}var _x=function(t){function e(e){var n=t.call(this,e)||this;n.type="ordinal";var i=n.getSetting("ordinalMeta");return i||(i=new hx({})),Y(i)&&(i=new hx({categories:z(i,(function(t){return q(t)?t.value:t}))})),n._ordinalMeta=i,n._extent=n.getSetting("extent")||[0,i.categories.length-1],n}return n(e,t),e.prototype.parse=function(t){return null==t?NaN:X(t)?this._ordinalMeta.getOrdinal(t):Math.round(t)},e.prototype.contain=function(t){return vx(t=this.parse(t),this._extent)&&null!=this._ordinalMeta.categories[t]},e.prototype.normalize=function(t){return mx(t=this._getTickNumber(this.parse(t)),this._extent)},e.prototype.scale=function(t){return t=Math.round(xx(t,this._extent)),this.getRawOrdinalNumber(t)},e.prototype.getTicks=function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push({value:n}),n++;return t},e.prototype.getMinorTicks=function(t){},e.prototype.setSortInfo=function(t){if(null!=t){for(var e=t.ordinalNumbers,n=this._ordinalNumbersByTick=[],i=this._ticksByOrdinalNumber=[],r=0,o=this._ordinalMeta.categories.length,a=Math.min(o,e.length);r=0&&t=0&&t=t},e.prototype.getOrdinalMeta=function(){return this._ordinalMeta},e.prototype.calcNiceTicks=function(){},e.prototype.calcNiceExtent=function(){},e.type="ordinal",e}(lx);lx.registerClass(_x);var bx=Wr,Sx=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="interval",e._interval=0,e._intervalPrecision=2,e}return n(e,t),e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return vx(t,this._extent)},e.prototype.normalize=function(t){return mx(t,this._extent)},e.prototype.scale=function(t){return xx(t,this._extent)},e.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},e.prototype.unionExtent=function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1]),this.setExtent(e[0],e[1])},e.prototype.getInterval=function(){return this._interval},e.prototype.setInterval=function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=gx(t)},e.prototype.getTicks=function(t){var e=this._interval,n=this._extent,i=this._niceExtent,r=this._intervalPrecision,o=[];if(!e)return o;n[0]1e4)return[];var s=o.length?o[o.length-1].value:i[1];return n[1]>s&&(t?o.push({value:bx(s+e,r)}):o.push({value:n[1]})),o},e.prototype.getMinorTicks=function(t){for(var e=this.getTicks(!0),n=[],i=this.getExtent(),r=1;ri[0]&&h0&&(o=null===o?s:Math.min(o,s))}n[i]=o}}return n}(t),n=[];return E(t,(function(t){var i,r=t.coordinateSystem.getBaseAxis(),o=r.getExtent();if("category"===r.type)i=r.getBandWidth();else if("value"===r.type||"time"===r.type){var a=r.dim+"_"+r.index,s=e[a],l=Math.abs(o[1]-o[0]),u=r.scale.getExtent(),h=Math.abs(u[1]-u[0]);i=s?l/h*s:l}else{var c=t.getData();i=Math.abs(o[1]-o[0])/c.count()}var p=Gr(t.get("barWidth"),i),d=Gr(t.get("barMaxWidth"),i),f=Gr(t.get("barMinWidth")||(Ex(t)?.5:1),i),g=t.get("barGap"),y=t.get("barCategoryGap");n.push({bandWidth:i,barWidth:p,barMaxWidth:d,barMinWidth:f,barGap:g,barCategoryGap:y,axisKey:Ax(r),stackId:Dx(t)})})),Px(n)}function Px(t){var e={};E(t,(function(t,n){var i=t.axisKey,r=t.bandWidth,o=e[i]||{bandWidth:r,remainedWidth:r,autoWidthCount:0,categoryGap:null,gap:"20%",stacks:{}},a=o.stacks;e[i]=o;var s=t.stackId;a[s]||o.autoWidthCount++,a[s]=a[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!a[s].width&&(a[s].width=l,l=Math.min(o.remainedWidth,l),o.remainedWidth-=l);var u=t.barMaxWidth;u&&(a[s].maxWidth=u);var h=t.barMinWidth;h&&(a[s].minWidth=h);var c=t.barGap;null!=c&&(o.gap=c);var p=t.barCategoryGap;null!=p&&(o.categoryGap=p)}));var n={};return E(e,(function(t,e){n[e]={};var i=t.stacks,r=t.bandWidth,o=t.categoryGap;if(null==o){var a=G(i).length;o=Math.max(35-4*a,15)+"%"}var s=Gr(o,r),l=Gr(t.gap,1),u=t.remainedWidth,h=t.autoWidthCount,c=(u-s)/(h+(h-1)*l);c=Math.max(c,0),E(i,(function(t){var e=t.maxWidth,n=t.minWidth;if(t.width){i=t.width;e&&(i=Math.min(i,e)),n&&(i=Math.max(i,n)),t.width=i,u-=i+l*i,h--}else{var i=c;e&&ei&&(i=n),i!==c&&(t.width=i,u-=i+l*i,h--)}})),c=(u-s)/(h+(h-1)*l),c=Math.max(c,0);var p,d=0;E(i,(function(t,e){t.width||(t.width=c),p=t,d+=t.width*(1+l)})),p&&(d-=p.width*l);var f=-d/2;E(i,(function(t,i){n[e][i]=n[e][i]||{bandWidth:r,offset:f,width:t.width},f+=t.width*(1+l)}))})),n}function Ox(t,e){var n=kx(t,e),i=Lx(n);E(n,(function(t){var e=t.getData(),n=t.coordinateSystem.getBaseAxis(),r=Dx(t),o=i[Ax(n)][r],a=o.offset,s=o.width;e.setLayout({bandWidth:o.bandWidth,offset:a,size:s})}))}function Rx(t){return{seriesType:t,plan:xg(),reset:function(t){if(Nx(t)){var e=t.getData(),n=t.coordinateSystem,i=n.getBaseAxis(),r=n.getOtherAxis(i),o=e.getDimensionIndex(e.mapDimension(r.dim)),a=e.getDimensionIndex(e.mapDimension(i.dim)),s=t.get("showBackground",!0),l=e.mapDimension(r.dim),u=e.getCalculationInfo("stackResultDimension"),h=ox(e,l)&&!!e.getCalculationInfo("stackedOnSeries"),c=r.isHorizontal(),p=function(t,e){return e.toGlobalCoord(e.dataToCoord("log"===e.type?1:0))}(0,r),d=Ex(t),f=t.get("barMinHeight")||0,g=u&&e.getDimensionIndex(u),y=e.getLayout("size"),v=e.getLayout("offset");return{progress:function(t,e){for(var i,r=t.count,l=d&&Tx(3*r),u=d&&s&&Tx(3*r),m=d&&Tx(r),x=n.master.getRect(),_=c?x.width:x.height,b=e.getStore(),w=0;null!=(i=t.next());){var S=b.get(h?g:o,i),M=b.get(a,i),I=p,T=void 0;h&&(T=+S-b.get(o,i));var C=void 0,D=void 0,A=void 0,k=void 0;if(c){var L=n.dataToPoint([S,M]);if(h)I=n.dataToPoint([T,M])[0];C=I,D=L[1]+v,A=L[0]-I,k=y,Math.abs(A)0)for(var s=0;s=0;--s)if(l[u]){o=l[u];break}o=o||a.none}if(Y(o)){var h=null==t.level?0:t.level>=0?t.level:o.length+t.level;o=o[h=Math.min(h,o.length-1)]}}return Yc(new Date(t.value),o,r,i)}(t,e,n,this.getSetting("locale"),i)},e.prototype.getTicks=function(){var t=this._interval,e=this._extent,n=[];if(!t)return n;n.push({value:e[0],level:0});var i=this.getSetting("useUTC"),r=function(t,e,n,i){var r=1e4,o=Fc,a=0;function s(t,e,n,r,o,a,s){for(var l=new Date(e),u=e,h=l[r]();u1&&0===u&&o.unshift({value:o[0].value-p})}}for(u=0;u=i[0]&&v<=i[1]&&c++)}var m=(i[1]-i[0])/e;if(c>1.5*m&&p>m/1.5)break;if(u.push(g),c>m||t===o[d])break}h=[]}}0;var x=B(z(u,(function(t){return B(t,(function(t){return t.value>=i[0]&&t.value<=i[1]&&!t.notAdd}))})),(function(t){return t.length>0})),_=[],b=x.length-1;for(d=0;dn&&(this._approxInterval=n);var o=Vx.length,a=Math.min(function(t,e,n,i){for(;n>>1;t[r][1]16?16:t>7.5?7:t>3.5?4:t>1.5?2:1}function Fx(t){return(t/=2592e6)>6?6:t>3?3:t>2?2:1}function Gx(t){return(t/=Oc)>12?12:t>6?6:t>3.5?4:t>2?2:1}function Wx(t,e){return(t/=e?Pc:Lc)>30?30:t>20?20:t>15?15:t>10?10:t>5?5:t>2?2:1}function Hx(t){return no(t,!0)}function Yx(t,e,n){var i=new Date(t);switch(Wc(e)){case"year":case"month":i[ep(n)](0);case"day":i[np(n)](1);case"hour":i[ip(n)](0);case"minute":i[rp(n)](0);case"second":i[op(n)](0),i[ap(n)](0)}return i.getTime()}lx.registerClass(zx);var Ux=lx.prototype,Xx=Sx.prototype,Zx=Wr,jx=Math.floor,qx=Math.ceil,Kx=Math.pow,$x=Math.log,Jx=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="log",e.base=10,e._originalScale=new Sx,e._interval=0,e}return n(e,t),e.prototype.getTicks=function(t){var e=this._originalScale,n=this._extent,i=e.getExtent();return z(Xx.getTicks.call(this,t),(function(t){var e=t.value,r=Wr(Kx(this.base,e));return r=e===n[0]&&this._fixMin?t_(r,i[0]):r,{value:r=e===n[1]&&this._fixMax?t_(r,i[1]):r}}),this)},e.prototype.setExtent=function(t,e){var n=$x(this.base);t=$x(Math.max(0,t))/n,e=$x(Math.max(0,e))/n,Xx.setExtent.call(this,t,e)},e.prototype.getExtent=function(){var t=this.base,e=Ux.getExtent.call(this);e[0]=Kx(t,e[0]),e[1]=Kx(t,e[1]);var n=this._originalScale.getExtent();return this._fixMin&&(e[0]=t_(e[0],n[0])),this._fixMax&&(e[1]=t_(e[1],n[1])),e},e.prototype.unionExtent=function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=$x(t[0])/$x(e),t[1]=$x(t[1])/$x(e),Ux.unionExtent.call(this,t)},e.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},e.prototype.calcNiceTicks=function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=to(n);for(t/n*i<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var r=[Wr(qx(e[0]/i)*i),Wr(jx(e[1]/i)*i)];this._interval=i,this._niceExtent=r}},e.prototype.calcNiceExtent=function(t){Xx.calcNiceExtent.call(this,t),this._fixMin=t.fixMin,this._fixMax=t.fixMax},e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return vx(t=$x(t)/$x(this.base),this._extent)},e.prototype.normalize=function(t){return mx(t=$x(t)/$x(this.base),this._extent)},e.prototype.scale=function(t){return t=xx(t,this._extent),Kx(this.base,t)},e.type="log",e}(lx),Qx=Jx.prototype;function t_(t,e){return Zx(t,Yr(e))}Qx.getMinorTicks=Xx.getMinorTicks,Qx.getLabel=Xx.getLabel,lx.registerClass(Jx);var e_=function(){function t(t,e,n){this._prepareParams(t,e,n)}return t.prototype._prepareParams=function(t,e,n){n[1]0&&s>0&&!l&&(a=0),a<0&&s<0&&!u&&(s=0));var c=this._determinedMin,p=this._determinedMax;return null!=c&&(a=c,l=!0),null!=p&&(s=p,u=!0),{min:a,max:s,minFixed:l,maxFixed:u,isBlank:h}},t.prototype.modifyDataMinMax=function(t,e){this[i_[t]]=e},t.prototype.setDeterminedMinMax=function(t,e){var n=n_[t];this[n]=e},t.prototype.freeze=function(){this.frozen=!0},t}(),n_={min:"_determinedMin",max:"_determinedMax"},i_={min:"_dataMin",max:"_dataMax"};function r_(t,e,n){var i=t.rawExtentInfo;return i||(i=new e_(t,e,n),t.rawExtentInfo=i,i)}function o_(t,e){return null==e?null:nt(e)?NaN:t.parse(e)}function a_(t,e){var n=t.type,i=r_(t,e,t.getExtent()).calculate();t.setBlank(i.isBlank);var r=i.min,o=i.max,a=e.ecModel;if(a&&"time"===n){var s=kx("bar",a),l=!1;if(E(s,(function(t){l=l||t.getBaseAxis()===e.axis})),l){var u=Lx(s),h=function(t,e,n,i){var r=n.axis.getExtent(),o=r[1]-r[0],a=function(t,e,n){if(t&&e){var i=t[Ax(e)];return null!=i&&null!=n?i[Dx(n)]:i}}(i,n.axis);if(void 0===a)return{min:t,max:e};var s=1/0;E(a,(function(t){s=Math.min(t.offset,s)}));var l=-1/0;E(a,(function(t){l=Math.max(t.offset+t.width,l)})),s=Math.abs(s),l=Math.abs(l);var u=s+l,h=e-t,c=h/(1-(s+l)/o)-h;return{min:t-=c*(s/u),max:e+=c*(l/u)}}(r,o,e,u);r=h.min,o=h.max}}return{extent:[r,o],fixMin:i.minFixed,fixMax:i.maxFixed}}function s_(t,e){var n=e,i=a_(t,n),r=i.extent,o=n.get("splitNumber");t instanceof Jx&&(t.base=n.get("logBase"));var a=t.type,s=n.get("interval"),l="interval"===a||"time"===a;t.setExtent(r[0],r[1]),t.calcNiceExtent({splitNumber:o,fixMin:i.fixMin,fixMax:i.fixMax,minInterval:l?n.get("minInterval"):null,maxInterval:l?n.get("maxInterval"):null}),null!=s&&t.setInterval&&t.setInterval(s)}function l_(t,e){if(e=e||t.get("type"))switch(e){case"category":return new _x({ordinalMeta:t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),extent:[1/0,-1/0]});case"time":return new zx({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new(lx.getClass(e)||Sx)}}function u_(t){var e,n,i=t.getLabelModel().get("formatter"),r="category"===t.type?t.scale.getExtent()[0]:null;return"time"===t.scale.type?(n=i,function(e,i){return t.scale.getFormattedLabel(e,i,n)}):X(i)?function(e){return function(n){var i=t.scale.getLabel(n);return e.replace("{value}",null!=i?i:"")}}(i):U(i)?(e=i,function(n,i){return null!=r&&(i=n.value-r),e(h_(t,n),i,null!=n.level?{level:n.level}:null)}):function(e){return t.scale.getLabel(e)}}function h_(t,e){return"category"===t.type?t.scale.getLabel(e):e.value}function c_(t,e){var n=e*Math.PI/180,i=t.width,r=t.height,o=i*Math.abs(Math.cos(n))+Math.abs(r*Math.sin(n)),a=i*Math.abs(Math.sin(n))+Math.abs(r*Math.cos(n));return new Re(t.x,t.y,o,a)}function p_(t){var e=t.get("interval");return null==e?"auto":e}function d_(t){return"category"===t.type&&0===p_(t.getLabelModel())}function f_(t,e){var n={};return E(t.mapDimensionsAll(e),(function(e){n[ax(t,e)]=!0})),G(n)}var g_=function(){function t(){}return t.prototype.getNeedCrossZero=function(){return!this.option.scale},t.prototype.getCoordSysModel=function(){},t}();var y_={isDimensionStacked:ox,enableDataStack:rx,getStackedDimension:ax};var v_=Object.freeze({__proto__:null,createList:function(t){return sx(null,t)},getLayoutRect:wp,dataStack:y_,createScale:function(t,e){var n=e;e instanceof xc||(n=new xc(e));var i=l_(n);return i.setExtent(t[0],t[1]),s_(i,n),i},mixinAxisModelCommonMethods:function(t){R(t,g_)},getECData:js,createTextStyle:function(t,e){return $h(t,null,null,"normal"!==(e=e||{}).state)},createDimensions:function(t,e){return Qm(t,e).dimensions},createSymbol:Ry,enableHoverEmphasis:Vl});function m_(t,e){return Math.abs(t-e)<1e-8}function x_(t,e,n){var i=0,r=t[0];if(!r)return!1;for(var o=1;on&&(t=r,n=a)}if(t)return function(t){for(var e=0,n=0,i=0,r=t.length,o=t[r-1][0],a=t[r-1][1],s=0;s>1^-(1&s),l=l>>1^-(1&l),r=s+=r,o=l+=o,i.push([s/n,l/n])}return i}function k_(t,e){return z(B((t=function(t){if(!t.UTF8Encoding)return t;var e=t,n=e.UTF8Scale;return null==n&&(n=1024),E(e.features,(function(t){var e=t.geometry,i=e.encodeOffsets,r=e.coordinates;if(i)switch(e.type){case"LineString":e.coordinates=A_(r,i,n);break;case"Polygon":case"MultiLineString":D_(r,i,n);break;case"MultiPolygon":E(r,(function(t,e){return D_(t,i[e],n)}))}})),e.UTF8Encoding=!1,e}(t)).features,(function(t){return t.geometry&&t.properties&&t.geometry.coordinates.length>0})),(function(t){var n=t.properties,i=t.geometry,r=[];switch(i.type){case"Polygon":var o=i.coordinates;r.push(new M_(o[0],o.slice(1)));break;case"MultiPolygon":E(i.coordinates,(function(t){t[0]&&r.push(new M_(t[0],t.slice(1)))}));break;case"LineString":r.push(new I_([i.coordinates]));break;case"MultiLineString":r.push(new I_(i.coordinates))}var a=new T_(n[e||"name"],r,n.cp);return a.properties=n,a}))}var L_=Object.freeze({__proto__:null,linearMap:Fr,round:Wr,asc:Hr,getPrecision:Yr,getPrecisionSafe:Ur,getPixelPrecision:Xr,getPercentWithPrecision:function(t,e,n){return t[e]&&Zr(t,n)[e]||0},MAX_SAFE_INTEGER:qr,remRadian:Kr,isRadianAroundZero:$r,parseDate:Qr,quantity:to,quantityExponent:eo,nice:no,quantile:io,reformIntervals:ro,isNumeric:ao,numericToNumber:oo}),P_=Object.freeze({__proto__:null,parse:Qr,format:Yc}),O_=Object.freeze({__proto__:null,extendShape:xh,extendPath:bh,makePath:Mh,makeImage:Ih,mergePath:Ch,resizePath:Dh,createIcon:Vh,updateProps:uh,initProps:hh,getTransform:Lh,clipPointsByRect:Eh,clipRectByRect:zh,registerShape:wh,getShapeClass:Sh,Group:Pr,Image:Is,Text:Ns,Circle:gu,Ellipse:vu,Sector:Pu,Ring:Ru,Polygon:zu,Polyline:Bu,Rect:Ps,Line:Wu,BezierCurve:Xu,Arc:ju,IncrementalDisplayable:oh,CompoundPath:qu,LinearGradient:$u,RadialGradient:Ju,BoundingRect:Re}),R_=Object.freeze({__proto__:null,addCommas:sp,toCamelCase:lp,normalizeCssArray:up,encodeHTML:ee,formatTpl:dp,getTooltipMarker:fp,formatTime:function(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=Qr(e),r=n?"getUTC":"get",o=i[r+"FullYear"](),a=i[r+"Month"]()+1,s=i[r+"Date"](),l=i[r+"Hours"](),u=i[r+"Minutes"](),h=i[r+"Seconds"](),c=i[r+"Milliseconds"]();return t=t.replace("MM",Gc(a,2)).replace("M",a).replace("yyyy",o).replace("yy",Gc(o%100+"",2)).replace("dd",Gc(s,2)).replace("d",s).replace("hh",Gc(l,2)).replace("h",l).replace("mm",Gc(u,2)).replace("m",u).replace("ss",Gc(h,2)).replace("s",h).replace("SSS",Gc(c,3))},capitalFirst:function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},truncateText:na,getTextRect:function(t,e,n,i,r,o,a,s){return new Ns({style:{text:t,font:e,align:n,verticalAlign:i,padding:r,rich:o,overflow:a?"truncate":null,lineHeight:s}}).getBoundingRect()}}),N_=Object.freeze({__proto__:null,map:z,each:E,indexOf:P,inherits:O,reduce:V,filter:B,bind:W,curry:H,isArray:Y,isString:X,isObject:q,isFunction:U,extend:A,defaults:k,clone:T,merge:C}),E_=Do();function z_(t){return"category"===t.type?function(t){var e=t.getLabelModel(),n=B_(t,e);return!e.get("show")||t.scale.isBlank()?{labels:[],labelCategoryInterval:n.labelCategoryInterval}:n}(t):function(t){var e=t.scale.getTicks(),n=u_(t);return{labels:z(e,(function(e,i){return{level:e.level,formattedLabel:n(e,i),rawLabel:t.scale.getLabel(e),tickValue:e.value}}))}}(t)}function V_(t,e){return"category"===t.type?function(t,e){var n,i,r=F_(t,"ticks"),o=p_(e),a=G_(r,o);if(a)return a;e.get("show")&&!t.scale.isBlank()||(n=[]);if(U(o))n=Y_(t,o,!0);else if("auto"===o){var s=B_(t,t.getLabelModel());i=s.labelCategoryInterval,n=z(s.labels,(function(t){return t.tickValue}))}else n=H_(t,i=o,!0);return W_(r,o,{ticks:n,tickCategoryInterval:i})}(t,e):{ticks:z(t.scale.getTicks(),(function(t){return t.value}))}}function B_(t,e){var n,i,r=F_(t,"labels"),o=p_(e),a=G_(r,o);return a||(U(o)?n=Y_(t,o):(i="auto"===o?function(t){var e=E_(t).autoInterval;return null!=e?e:E_(t).autoInterval=t.calculateCategoryInterval()}(t):o,n=H_(t,i)),W_(r,o,{labels:n,labelCategoryInterval:i}))}function F_(t,e){return E_(t)[e]||(E_(t)[e]=[])}function G_(t,e){for(var n=0;n1&&h/l>2&&(u=Math.round(Math.ceil(u/l)*l));var c=d_(t),p=a.get("showMinLabel")||c,d=a.get("showMaxLabel")||c;p&&u!==o[0]&&g(o[0]);for(var f=u;f<=o[1];f+=l)g(f);function g(t){var e={value:t};s.push(n?t:{formattedLabel:i(e),rawLabel:r.getLabel(e),tickValue:t})}return d&&f-l!==o[1]&&g(o[1]),s}function Y_(t,e,n){var i=t.scale,r=u_(t),o=[];return E(i.getTicks(),(function(t){var a=i.getLabel(t),s=t.value;e(t.value,a)&&o.push(n?s:{formattedLabel:r(t),rawLabel:a,tickValue:s})})),o}var U_=[0,1],X_=function(){function t(t,e,n){this.onBand=!1,this.inverse=!1,this.dim=t,this.scale=e,this._extent=n||[0,0]}return t.prototype.contain=function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},t.prototype.containData=function(t){return this.scale.contain(t)},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.getPixelPrecision=function(t){return Xr(t||this.scale.getExtent(),this._extent)},t.prototype.setExtent=function(t,e){var n=this._extent;n[0]=t,n[1]=e},t.prototype.dataToCoord=function(t,e){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&"ordinal"===i.type&&Z_(n=n.slice(),i.count()),Fr(t,U_,n,e)},t.prototype.coordToData=function(t,e){var n=this._extent,i=this.scale;this.onBand&&"ordinal"===i.type&&Z_(n=n.slice(),i.count());var r=Fr(t,n,U_,e);return this.scale.scale(r)},t.prototype.pointToData=function(t,e){},t.prototype.getTicksCoords=function(t){var e=(t=t||{}).tickModel||this.getTickModel(),n=z(V_(this,e).ticks,(function(t){return{coord:this.dataToCoord("ordinal"===this.scale.type?this.scale.getRawOrdinalNumber(t):t),tickValue:t}}),this);return function(t,e,n,i){var r=e.length;if(!t.onBand||n||!r)return;var o,a,s=t.getExtent();if(1===r)e[0].coord=s[0],o=e[1]={coord:s[0]};else{var l=e[r-1].tickValue-e[0].tickValue,u=(e[r-1].coord-e[0].coord)/l;E(e,(function(t){t.coord-=u/2})),a=1+t.scale.getExtent()[1]-e[r-1].tickValue,o={coord:e[r-1].coord+u*a},e.push(o)}var h=s[0]>s[1];c(e[0].coord,s[0])&&(i?e[0].coord=s[0]:e.shift());i&&c(s[0],e[0].coord)&&e.unshift({coord:s[0]});c(s[1],o.coord)&&(i?o.coord=s[1]:e.pop());i&&c(o.coord,s[1])&&e.push({coord:s[1]});function c(t,e){return t=Wr(t),e=Wr(e),h?t>e:t0&&t<100||(t=5),z(this.scale.getMinorTicks(t),(function(t){return z(t,(function(t){return{coord:this.dataToCoord(t),tickValue:t}}),this)}),this)},t.prototype.getViewLabels=function(){return z_(this).labels},t.prototype.getLabelModel=function(){return this.model.getModel("axisLabel")},t.prototype.getTickModel=function(){return this.model.getModel("axisTick")},t.prototype.getBandWidth=function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},t.prototype.calculateCategoryInterval=function(){return function(t){var e=function(t){var e=t.getLabelModel();return{axisRotate:t.getRotate?t.getRotate():t.isHorizontal&&!t.isHorizontal()?90:0,labelRotate:e.get("rotate")||0,font:e.getFont()}}(t),n=u_(t),i=(e.axisRotate-e.labelRotate)/180*Math.PI,r=t.scale,o=r.getExtent(),a=r.count();if(o[1]-o[0]<1)return 0;var s=1;a>40&&(s=Math.max(1,Math.floor(a/40)));for(var l=o[0],u=t.dataToCoord(l+1)-t.dataToCoord(l),h=Math.abs(u*Math.cos(i)),c=Math.abs(u*Math.sin(i)),p=0,d=0;l<=o[1];l+=s){var f,g,y=yr(n({value:l}),e.font,"center","top");f=1.3*y.width,g=1.3*y.height,p=Math.max(p,f,7),d=Math.max(d,g,7)}var v=p/h,m=d/c;isNaN(v)&&(v=1/0),isNaN(m)&&(m=1/0);var x=Math.max(0,Math.floor(Math.min(v,m))),_=E_(t.model),b=t.getExtent(),w=_.lastAutoInterval,S=_.lastTickCount;return null!=w&&null!=S&&Math.abs(w-x)<=1&&Math.abs(S-a)<=1&&w>x&&_.axisExtent0===b[0]&&_.axisExtent1===b[1]?x=w:(_.lastTickCount=a,_.lastAutoInterval=x,_.axisExtent0=b[0],_.axisExtent1=b[1]),x}(this)},t}();function Z_(t,e){var n=(t[1]-t[0])/e/2;t[0]+=n,t[1]-=n}var j_=2*Math.PI,q_=ts.CMD,K_=["top","right","bottom","left"];function $_(t,e,n,i,r){var o=n.width,a=n.height;switch(t){case"top":i.set(n.x+o/2,n.y-e),r.set(0,-1);break;case"bottom":i.set(n.x+o/2,n.y+a+e),r.set(0,1);break;case"left":i.set(n.x-e,n.y+a/2),r.set(-1,0);break;case"right":i.set(n.x+o+e,n.y+a/2),r.set(1,0)}}function J_(t,e,n,i,r,o,a,s,l){a-=t,s-=e;var u=Math.sqrt(a*a+s*s),h=(a/=u)*n+t,c=(s/=u)*n+e;if(Math.abs(i-r)%j_<1e-4)return l[0]=h,l[1]=c,u-n;if(o){var p=i;i=os(r),r=os(p)}else i=os(i),r=os(r);i>r&&(r+=j_);var d=Math.atan2(s,a);if(d<0&&(d+=j_),d>=i&&d<=r||d+j_>=i&&d+j_<=r)return l[0]=h,l[1]=c,u-n;var f=n*Math.cos(i)+t,g=n*Math.sin(i)+e,y=n*Math.cos(r)+t,v=n*Math.sin(r)+e,m=(f-a)*(f-a)+(g-s)*(g-s),x=(y-a)*(y-a)+(v-s)*(v-s);return m0){e=e/180*Math.PI,rb.fromArray(t[0]),ob.fromArray(t[1]),ab.fromArray(t[2]),Ie.sub(sb,rb,ob),Ie.sub(lb,ab,ob);var n=sb.len(),i=lb.len();if(!(n<.001||i<.001)){sb.scale(1/n),lb.scale(1/i);var r=sb.dot(lb);if(Math.cos(e)1&&Ie.copy(cb,ab),cb.toArray(t[1])}}}}function db(t,e,n){if(n<=180&&n>0){n=n/180*Math.PI,rb.fromArray(t[0]),ob.fromArray(t[1]),ab.fromArray(t[2]),Ie.sub(sb,ob,rb),Ie.sub(lb,ab,ob);var i=sb.len(),r=lb.len();if(!(i<.001||r<.001))if(sb.scale(1/i),lb.scale(1/r),sb.dot(e)=a)Ie.copy(cb,ab);else{cb.scaleAndAdd(lb,o/Math.tan(Math.PI/2-s));var l=ab.x!==ob.x?(cb.x-ob.x)/(ab.x-ob.x):(cb.y-ob.y)/(ab.y-ob.y);if(isNaN(l))return;l<0?Ie.copy(cb,ob):l>1&&Ie.copy(cb,ab)}cb.toArray(t[1])}}}function fb(t,e,n,i){var r="normal"===n,o=r?t:t.ensureState(n);o.ignore=e;var a=i.get("smooth");a&&!0===a&&(a=.3),o.shape=o.shape||{},a>0&&(o.shape.smooth=a);var s=i.getModel("lineStyle").getLineStyle();r?t.useStyle(s):o.style=s}function gb(t,e){var n=e.smooth,i=e.points;if(i)if(t.moveTo(i[0][0],i[0][1]),n>0&&i.length>=3){var r=Et(i[0],i[1]),o=Et(i[1],i[2]);if(!r||!o)return t.lineTo(i[1][0],i[1][1]),void t.lineTo(i[2][0],i[2][1]);var a=Math.min(r,o)*n,s=Bt([],i[1],i[0],a/r),l=Bt([],i[1],i[2],a/o),u=Bt([],s,l,.5);t.bezierCurveTo(s[0],s[1],s[0],s[1],u[0],u[1]),t.bezierCurveTo(l[0],l[1],l[0],l[1],i[2][0],i[2][1])}else for(var h=1;h0&&o&&_(-h/a,0,a);var f,g,y=t[0],v=t[a-1];return m(),f<0&&b(-f,.8),g<0&&b(g,.8),m(),x(f,g,1),x(g,f,-1),m(),f<0&&w(-f),g<0&&w(g),u}function m(){f=y.rect[e]-i,g=r-v.rect[e]-v.rect[n]}function x(t,e,n){if(t<0){var i=Math.min(e,-t);if(i>0){_(i*n,0,a);var r=i+t;r<0&&b(-r*n,1)}else b(-t*n,1)}}function _(n,i,r){0!==n&&(u=!0);for(var o=i;o0)for(l=0;l0;l--){_(-(o[l-1]*c),l,a)}}}function w(t){var e=t<0?-1:1;t=Math.abs(t);for(var n=Math.ceil(t/(a-1)),i=0;i0?_(n,0,i+1):_(-n,a-i-1,a),(t-=n)<=0)return}}function _b(t,e,n,i){return xb(t,"y","height",e,n,i)}function bb(t){var e=[];t.sort((function(t,e){return e.priority-t.priority}));var n=new Re(0,0,0,0);function i(t){if(!t.ignore){var e=t.ensureState("emphasis");null==e.ignore&&(e.ignore=!1)}t.ignore=!0}for(var r=0;r=0&&n.attr(d.oldLayoutSelect),P(u,"emphasis")>=0&&n.attr(d.oldLayoutEmphasis)),uh(n,s,e,a)}else if(n.attr(s),!rc(n).valueAnimation){var h=rt(n.style.opacity,1);n.style.opacity=0,hh(n,{style:{opacity:h}},e,a)}if(d.oldLayout=s,n.states.select){var c=d.oldLayoutSelect={};Db(c,s,Ab),Db(c,n.states.select,Ab)}if(n.states.emphasis){var p=d.oldLayoutEmphasis={};Db(p,s,Ab),Db(p,n.states.emphasis,Ab)}ac(n,a,l,e,e)}if(i&&!i.ignore&&!i.invisible){r=(d=Cb(i)).oldLayout;var d,f={points:i.shape.points};r?(i.attr({shape:r}),uh(i,{shape:f},e)):(i.setShape(f),i.style.strokePercent=0,hh(i,{style:{strokePercent:1}},e)),d.oldLayout=f}},t}(),Lb=Do();var Pb=Math.sin,Ob=Math.cos,Rb=Math.PI,Nb=2*Math.PI,Eb=180/Rb,zb=function(){function t(){}return t.prototype.reset=function(t){this._start=!0,this._d=[],this._str="",this._p=Math.pow(10,t||4)},t.prototype.moveTo=function(t,e){this._add("M",t,e)},t.prototype.lineTo=function(t,e){this._add("L",t,e)},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){this._add("C",t,e,n,i,r,o)},t.prototype.quadraticCurveTo=function(t,e,n,i){this._add("Q",t,e,n,i)},t.prototype.arc=function(t,e,n,i,r,o){this.ellipse(t,e,n,n,0,i,r,o)},t.prototype.ellipse=function(t,e,n,i,r,o,a,s){var l=a-o,u=!s,h=Math.abs(l),c=si(h-Nb)||(u?l>=Nb:-l>=Nb),p=l>0?l%Nb:l%Nb+Nb,d=!1;d=!!c||!si(h)&&p>=Rb==!!u;var f=t+n*Ob(o),g=e+i*Pb(o);this._start&&this._add("M",f,g);var y=Math.round(r*Eb);if(c){var v=1/this._p,m=(u?1:-1)*(Nb-v);this._add("A",n,i,y,1,+u,t+n*Ob(o+m),e+i*Pb(o+m)),v>.01&&this._add("A",n,i,y,0,+u,f,g)}else{var x=t+n*Ob(a),_=e+i*Pb(a);this._add("A",n,i,y,+d,+u,x,_)}},t.prototype.rect=function(t,e,n,i){this._add("M",t,e),this._add("l",n,0),this._add("l",0,i),this._add("l",-n,0),this._add("Z")},t.prototype.closePath=function(){this._d.length>0&&this._add("Z")},t.prototype._add=function(t,e,n,i,r,o,a,s,l){for(var u=[],h=this._p,c=1;c"}(r,e.attrs)+ee(e.text)+(i?""+n+z(i,(function(e){return t(e)})).join(n)+n:"")+("")}(t)}function jb(t){return{zrId:t,shadowCache:{},patternCache:{},gradientCache:{},clipPathCache:{},defs:{},cssNodes:{},cssAnims:{},cssClassIdx:0,cssAnimIdx:0,shadowIdx:0,gradientIdx:0,patternIdx:0,clipPathIdx:0}}function qb(t,e,n,i){return Xb("svg","root",{width:t,height:e,xmlns:Hb,"xmlns:xlink":Yb,version:"1.1",baseProfile:"full",viewBox:!!i&&"0 0 "+t+" "+e},n)}var Kb={cubicIn:"0.32,0,0.67,0",cubicOut:"0.33,1,0.68,1",cubicInOut:"0.65,0,0.35,1",quadraticIn:"0.11,0,0.5,0",quadraticOut:"0.5,1,0.89,1",quadraticInOut:"0.45,0,0.55,1",quarticIn:"0.5,0,0.75,0",quarticOut:"0.25,1,0.5,1",quarticInOut:"0.76,0,0.24,1",quinticIn:"0.64,0,0.78,0",quinticOut:"0.22,1,0.36,1",quinticInOut:"0.83,0,0.17,1",sinusoidalIn:"0.12,0,0.39,0",sinusoidalOut:"0.61,1,0.88,1",sinusoidalInOut:"0.37,0,0.63,1",exponentialIn:"0.7,0,0.84,0",exponentialOut:"0.16,1,0.3,1",exponentialInOut:"0.87,0,0.13,1",circularIn:"0.55,0,1,0.45",circularOut:"0,0.55,0.45,1",circularInOut:"0.85,0,0.15,1"},$b="transform-origin";function Jb(t,e,n){var i=A({},t.shape);A(i,e),t.buildPath(n,i);var r=new zb;return r.reset(gi(t)),n.rebuildPath(r,1),r.generateStr(),r.getStr()}function Qb(t,e){var n=e.originX,i=e.originY;(n||i)&&(t[$b]=n+"px "+i+"px")}var tw={fill:"fill",opacity:"opacity",lineWidth:"stroke-width",lineDashOffset:"stroke-dashoffset"};function ew(t,e){var n=e.zrId+"-ani-"+e.cssAnimIdx++;return e.cssAnims[n]=t,n}function nw(t){return X(t)?Kb[t]?"cubic-bezier("+Kb[t]+")":An(t)?t:"":""}function iw(t,e,n,i){var r=t.animators,o=r.length,a=[];if(t instanceof qu){var s=function(t,e,n){var i,r,o=t.shape.paths,a={};if(E(o,(function(t){var e=jb(n.zrId);e.animation=!0,iw(t,{},e,!0);var o=e.cssAnims,s=e.cssNodes,l=G(o),u=l.length;if(u){var h=o[r=l[u-1]];for(var c in h){var p=h[c];a[c]=a[c]||{d:""},a[c].d+=p.d||""}for(var d in s){var f=s[d].animation;f.indexOf(r)>=0&&(i=f)}}})),i){e.d=!1;var s=ew(a,n);return i.replace(r,s)}}(t,e,n);if(s)a.push(s);else if(!o)return}else if(!o)return;for(var l={},u=0;u0})).length)return ew(h,n)+" "+r[0]+" both"}for(var y in l){(s=g(l[y]))&&a.push(s)}if(a.length){var v=n.zrId+"-cls-"+n.cssClassIdx++;n.cssNodes["."+v]={animation:a.join(",")},e.class=v}}var rw=Math.round;function ow(t){return t&&X(t.src)}function aw(t){return t&&U(t.toDataURL)}function sw(t,e,n,i){Wb((function(r,o){var a="fill"===r||"stroke"===r;a&&function(t){return t&&("linear"===t.type||"radial"===t.type)}(o)?function(t,e,n,i){var r,o=t[n],a={gradientUnits:o.global?"userSpaceOnUse":"objectBoundingBox"};if(pi(o))r="linearGradient",a.x1=o.x,a.y1=o.y,a.x2=o.x2,a.y2=o.y2;else{if(!di(o))return void 0;r="radialGradient",a.cx=rt(o.x,.5),a.cy=rt(o.y,.5),a.r=rt(o.r,.5)}for(var s=o.colorStops,l=[],u=0,h=s.length;ul?Lw(t,null==n[c+1]?null:n[c+1].elm,n,s,c):Pw(t,e,a,l))}(n,i,r):Cw(r)?(Cw(t.text)&&Mw(n,""),Lw(n,null,r,0,r.length-1)):Cw(i)?Pw(n,i,0,i.length-1):Cw(t.text)&&Mw(n,""):t.text!==e.text&&(Cw(i)&&Pw(n,i,0,i.length-1),Mw(n,e.text)))}var Nw=0,Ew=function(){function t(t,e,n){if(this.type="svg",this.refreshHover=zw("refreshHover"),this.configLayer=zw("configLayer"),this.storage=e,this._opts=n=A({},n),this.root=t,this._id="zr"+Nw++,this._oldVNode=qb(n.width,n.height),t&&!n.ssr){var i=this._viewport=document.createElement("div");i.style.cssText="position:relative;overflow:hidden";var r=this._svgDom=this._oldVNode.elm=Ub("svg");Ow(null,this._oldVNode),i.appendChild(r),t.appendChild(i)}this.resize(n.width,n.height)}return t.prototype.getType=function(){return this.type},t.prototype.getViewportRoot=function(){return this._viewport},t.prototype.getViewportRootOffset=function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},t.prototype.getSvgDom=function(){return this._svgDom},t.prototype.refresh=function(){if(this.root){var t=this.renderToVNode({willUpdate:!0});t.attrs.style="position:absolute;left:0;top:0;user-select:none",function(t,e){if(Aw(t,e))Rw(t,e);else{var n=t.elm,i=ww(n);kw(e),null!==i&&(xw(i,e.elm,Sw(n)),Pw(i,[t],0,0))}}(this._oldVNode,t),this._oldVNode=t}},t.prototype.renderOneToVNode=function(t){return yw(t,jb(this._id))},t.prototype.renderToVNode=function(t){t=t||{};var e=this.storage.getDisplayList(!0),n=this._backgroundColor,i=this._width,r=this._height,o=jb(this._id);o.animation=t.animation,o.willUpdate=t.willUpdate,o.compress=t.compress;var a=[];if(n&&"none"!==n){var s=oi(n),l=s.color,u=s.opacity;this._bgVNode=Xb("rect","bg",{width:i,height:r,x:"0",y:"0",id:"0",fill:l,"fill-opacity":u}),a.push(this._bgVNode)}else this._bgVNode=null;var h=t.compress?null:this._mainVNode=Xb("g","main",{},[]);this._paintList(e,o,h?h.children:a),h&&a.push(h);var c=z(G(o.defs),(function(t){return o.defs[t]}));if(c.length&&a.push(Xb("defs","defs",{},c)),t.animation){var p=function(t,e,n){var i=(n=n||{}).newline?"\n":"",r=" {"+i,o=i+"}",a=z(G(t),(function(e){return e+r+z(G(t[e]),(function(n){return n+":"+t[e][n]+";"})).join(i)+o})).join(i),s=z(G(e),(function(t){return"@keyframes "+t+r+z(G(e[t]),(function(n){return n+r+z(G(e[t][n]),(function(i){var r=e[t][n][i];return"d"===i&&(r='path("'+r+'")'),i+":"+r+";"})).join(i)+o})).join(i)+o})).join(i);return a||s?[""].join(i):""}(o.cssNodes,o.cssAnims,{newline:!0});if(p){var d=Xb("style","stl",{},[],p);a.push(d)}}return qb(i,r,a,t.useViewBox)},t.prototype.renderToString=function(t){return t=t||{},Zb(this.renderToVNode({animation:rt(t.cssAnimation,!0),willUpdate:!1,compress:!0,useViewBox:rt(t.useViewBox,!0)}),{newline:!0})},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t;var e=this._bgVNode;if(e&&e.elm){var n=oi(t),i=n.color,r=n.opacity;e.elm.setAttribute("fill",i),r<1&&e.elm.setAttribute("fill-opacity",r)}},t.prototype.getSvgRoot=function(){return this._mainVNode&&this._mainVNode.elm},t.prototype._paintList=function(t,e,n){for(var i,r,o=t.length,a=[],s=0,l=0,u=0;u=0&&(!c||!r||c[f]!==r[f]);f--);for(var g=d-1;g>f;g--)i=a[--s-1];for(var y=f+1;y=a)}}for(var h=this.__startIndex;h15)break}n.prevElClipPaths&&u.restore()};if(p)if(0===p.length)s=l.__endIndex;else for(var _=d.dpr,b=0;b0&&t>i[0]){for(s=0;st);s++);a=n[i[s]]}if(i.splice(s+1,0,t),n[t]=e,!e.virtual)if(a){var l=a.dom;l.nextSibling?o.insertBefore(e.dom,l.nextSibling):o.appendChild(e.dom)}else o.firstChild?o.insertBefore(e.dom,o.firstChild):o.appendChild(e.dom);e.__painter=this}},t.prototype.eachLayer=function(t,e){for(var n=this._zlevelList,i=0;i0?Ww:0),this._needsManuallyCompositing),u.__builtin__||I("ZLevel "+l+" has been used by unkown layer "+u.id),u!==o&&(u.__used=!0,u.__startIndex!==r&&(u.__dirty=!0),u.__startIndex=r,u.incremental?u.__drawIndex=-1:u.__drawIndex=r,e(r),o=u),1&s.__dirty&&!s.__inHover&&(u.__dirty=!0,u.incremental&&u.__drawIndex<0&&(u.__drawIndex=r))}e(r),this.eachBuiltinLayer((function(t,e){!t.__used&&t.getElementCount()>0&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)}))},t.prototype.clear=function(){return this.eachBuiltinLayer(this._clearLayer),this},t.prototype._clearLayer=function(t){t.clear()},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t,E(this._layers,(function(t){t.setUnpainted()}))},t.prototype.configLayer=function(t,e){if(e){var n=this._layerConfig;n[t]?C(n[t],e,!0):n[t]=e;for(var i=0;i-1&&(s.style.stroke=s.style.fill,s.style.fill="#fff",s.style.lineWidth=2),e},e.type="series.line",e.dependencies=["grid","polar"],e.defaultOption={z:3,coordinateSystem:"cartesian2d",legendHoverLink:!0,clip:!0,label:{position:"top"},endLabel:{show:!1,valueAnimation:!0,distance:8},lineStyle:{width:2,type:"solid"},emphasis:{scale:!0},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:"auto",connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0,universalTransition:{divideShape:"clone"},triggerLineEvent:!1},e}(hg);function Uw(t,e){var n=t.mapDimensionsAll("defaultedLabel"),i=n.length;if(1===i){var r=uf(t,e,n[0]);return null!=r?r+"":null}if(i){for(var o=[],a=0;a=0&&i.push(e[o])}return i.join(" ")}var Zw=function(t){function e(e,n,i,r){var o=t.call(this)||this;return o.updateData(e,n,i,r),o}return n(e,t),e.prototype._createSymbol=function(t,e,n,i,r){this.removeAll();var o=Ry(t,-1,-1,2,2,null,r);o.attr({z2:100,culling:!0,scaleX:i[0]/2,scaleY:i[1]/2}),o.drift=jw,this._symbolType=t,this.add(o)},e.prototype.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(null,t)},e.prototype.getSymbolType=function(){return this._symbolType},e.prototype.getSymbolPath=function(){return this.childAt(0)},e.prototype.highlight=function(){Il(this.childAt(0))},e.prototype.downplay=function(){Tl(this.childAt(0))},e.prototype.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},e.prototype.setDraggable=function(t,e){var n=this.childAt(0);n.draggable=t,n.cursor=!e&&t?"move":n.cursor},e.prototype.updateData=function(t,n,i,r){this.silent=!1;var o=t.getItemVisual(n,"symbol")||"circle",a=t.hostModel,s=e.getSymbolSize(t,n),l=o!==this._symbolType,u=r&&r.disableAnimation;if(l){var h=t.getItemVisual(n,"symbolKeepAspect");this._createSymbol(o,t,n,s,h)}else{(p=this.childAt(0)).silent=!1;var c={scaleX:s[0]/2,scaleY:s[1]/2};u?p.attr(c):uh(p,c,a,n),gh(p)}if(this._updateCommon(t,n,s,i,r),l){var p=this.childAt(0);if(!u){c={scaleX:this._sizeX,scaleY:this._sizeY,style:{opacity:p.style.opacity}};p.scaleX=p.scaleY=0,p.style.opacity=0,hh(p,c,a,n)}}u&&this.childAt(0).stopAnimation("leave")},e.prototype._updateCommon=function(t,e,n,i,r){var o,a,s,l,u,h,c,p,d,f=this.childAt(0),g=t.hostModel;if(i&&(o=i.emphasisItemStyle,a=i.blurItemStyle,s=i.selectItemStyle,l=i.focus,u=i.blurScope,c=i.labelStatesModels,p=i.hoverScale,d=i.cursorStyle,h=i.emphasisDisabled),!i||t.hasItemOption){var y=i&&i.itemModel?i.itemModel:t.getItemModel(e),v=y.getModel("emphasis");o=v.getModel("itemStyle").getItemStyle(),s=y.getModel(["select","itemStyle"]).getItemStyle(),a=y.getModel(["blur","itemStyle"]).getItemStyle(),l=v.get("focus"),u=v.get("blurScope"),h=v.get("disabled"),c=Kh(y),p=v.getShallow("scale"),d=y.getShallow("cursor")}var m=t.getItemVisual(e,"symbolRotate");f.attr("rotation",(m||0)*Math.PI/180||0);var x=Ey(t.getItemVisual(e,"symbolOffset"),n);x&&(f.x=x[0],f.y=x[1]),d&&f.attr("cursor",d);var _=t.getItemVisual(e,"style"),b=_.fill;if(f instanceof Is){var w=f.style;f.useStyle(A({image:w.image,x:w.x,y:w.y,width:w.width,height:w.height},_))}else f.__isEmptyBrush?f.useStyle(A({},_)):f.useStyle(_),f.style.decal=null,f.setColor(b,r&&r.symbolInnerColor),f.style.strokeNoScale=!0;var S=t.getItemVisual(e,"liftZ"),M=this._z2;null!=S?null==M&&(this._z2=f.z2,f.z2+=S):null!=M&&(f.z2=M,this._z2=null);var I=r&&r.useNameLabel;qh(f,c,{labelFetcher:g,labelDataIndex:e,defaultText:function(e){return I?t.getName(e):Uw(t,e)},inheritColor:b,defaultOpacity:_.opacity}),this._sizeX=n[0]/2,this._sizeY=n[1]/2;var T=f.ensureState("emphasis");T.style=o,f.ensureState("select").style=s,f.ensureState("blur").style=a;var C=null==p||!0===p?Math.max(1.1,3/this._sizeY):isFinite(p)&&p>0?+p:1;T.scaleX=this._sizeX*C,T.scaleY=this._sizeY*C,this.setSymbolScale(1),Bl(this,l,u,h)},e.prototype.setSymbolScale=function(t){this.scaleX=this.scaleY=t},e.prototype.fadeOut=function(t,e,n){var i=this.childAt(0),r=js(this).dataIndex,o=n&&n.animation;if(this.silent=i.silent=!0,n&&n.fadeLabel){var a=i.getTextContent();a&&ph(a,{style:{opacity:0}},e,{dataIndex:r,removeOpt:o,cb:function(){i.removeTextContent()}})}else i.removeTextContent();ph(i,{style:{opacity:0},scaleX:0,scaleY:0},e,{dataIndex:r,cb:t,removeOpt:o})},e.getSymbolSize=function(t,e){return Ny(t.getItemVisual(e,"symbolSize"))},e}(Pr);function jw(t,e){this.parent.drift(t,e)}function qw(t,e,n,i){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(i.isIgnore&&i.isIgnore(n))&&!(i.clipShape&&!i.clipShape.contain(e[0],e[1]))&&"none"!==t.getItemVisual(n,"symbol")}function Kw(t){return null==t||q(t)||(t={isIgnore:t}),t||{}}function $w(t){var e=t.hostModel,n=e.getModel("emphasis");return{emphasisItemStyle:n.getModel("itemStyle").getItemStyle(),blurItemStyle:e.getModel(["blur","itemStyle"]).getItemStyle(),selectItemStyle:e.getModel(["select","itemStyle"]).getItemStyle(),focus:n.get("focus"),blurScope:n.get("blurScope"),emphasisDisabled:n.get("disabled"),hoverScale:n.get("scale"),labelStatesModels:Kh(e),cursorStyle:e.get("cursor")}}var Jw=function(){function t(t){this.group=new Pr,this._SymbolCtor=t||Zw}return t.prototype.updateData=function(t,e){this._progressiveEls=null,e=Kw(e);var n=this.group,i=t.hostModel,r=this._data,o=this._SymbolCtor,a=e.disableAnimation,s=$w(t),l={disableAnimation:a},u=e.getSymbolPoint||function(e){return t.getItemLayout(e)};r||n.removeAll(),t.diff(r).add((function(i){var r=u(i);if(qw(t,r,i,e)){var a=new o(t,i,s,l);a.setPosition(r),t.setItemGraphicEl(i,a),n.add(a)}})).update((function(h,c){var p=r.getItemGraphicEl(c),d=u(h);if(qw(t,d,h,e)){var f=t.getItemVisual(h,"symbol")||"circle",g=p&&p.getSymbolType&&p.getSymbolType();if(!p||g&&g!==f)n.remove(p),(p=new o(t,h,s,l)).setPosition(d);else{p.updateData(t,h,s,l);var y={x:d[0],y:d[1]};a?p.attr(y):uh(p,y,i)}n.add(p),t.setItemGraphicEl(h,p)}else n.remove(p)})).remove((function(t){var e=r.getItemGraphicEl(t);e&&e.fadeOut((function(){n.remove(e)}),i)})).execute(),this._getSymbolPoint=u,this._data=t},t.prototype.updateLayout=function(){var t=this,e=this._data;e&&e.eachItemGraphicEl((function(e,n){var i=t._getSymbolPoint(n);e.setPosition(i),e.markRedraw()}))},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=$w(t),this._data=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e,n){function i(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}this._progressiveEls=[],n=Kw(n);for(var r=t.start;r0?n=i[0]:i[1]<0&&(n=i[1]);return n}(r,n),a=i.dim,s=r.dim,l=e.mapDimension(s),u=e.mapDimension(a),h="x"===s||"radius"===s?1:0,c=z(t.dimensions,(function(t){return e.mapDimension(t)})),p=!1,d=e.getCalculationInfo("stackResultDimension");return ox(e,c[0])&&(p=!0,c[0]=d),ox(e,c[1])&&(p=!0,c[1]=d),{dataDimsForPoint:c,valueStart:o,valueAxisDim:s,baseAxisDim:a,stacked:!!p,valueDim:l,baseDim:u,baseDataOffset:h,stackedOverDimension:e.getCalculationInfo("stackedOverDimension")}}function tS(t,e,n,i){var r=NaN;t.stacked&&(r=n.get(n.getCalculationInfo("stackedOverDimension"),i)),isNaN(r)&&(r=t.valueStart);var o=t.baseDataOffset,a=[];return a[o]=n.get(t.baseDim,i),a[1-o]=r,e.dataToPoint(a)}var eS=Math.min,nS=Math.max;function iS(t,e){return isNaN(t)||isNaN(e)}function rS(t,e,n,i,r,o,a,s,l){for(var u,h,c,p,d,f,g=n,y=0;y=r||g<0)break;if(iS(v,m)){if(l){g+=o;continue}break}if(g===n)t[o>0?"moveTo":"lineTo"](v,m),c=v,p=m;else{var x=v-u,_=m-h;if(x*x+_*_<.5){g+=o;continue}if(a>0){for(var b=g+o,w=e[2*b],S=e[2*b+1];w===v&&S===m&&y=i||iS(w,S))d=v,f=m;else{T=w-u,C=S-h;var k=v-u,L=w-v,P=m-h,O=S-m,R=void 0,N=void 0;if("x"===s){var E=T>0?1:-1;d=v-E*(R=Math.abs(k))*a,f=m,D=v+E*(N=Math.abs(L))*a,A=m}else if("y"===s){var z=C>0?1:-1;d=v,f=m-z*(R=Math.abs(P))*a,D=v,A=m+z*(N=Math.abs(O))*a}else R=Math.sqrt(k*k+P*P),d=v-T*a*(1-(I=(N=Math.sqrt(L*L+O*O))/(N+R))),f=m-C*a*(1-I),A=m+C*a*I,D=eS(D=v+T*a*I,nS(w,v)),A=eS(A,nS(S,m)),D=nS(D,eS(w,v)),f=m-(C=(A=nS(A,eS(S,m)))-m)*R/N,d=eS(d=v-(T=D-v)*R/N,nS(u,v)),f=eS(f,nS(h,m)),D=v+(T=v-(d=nS(d,eS(u,v))))*N/R,A=m+(C=m-(f=nS(f,eS(h,m))))*N/R}t.bezierCurveTo(c,p,d,f,v,m),c=D,p=A}else t.lineTo(v,m)}u=v,h=m,g+=o}return y}var oS=function(){this.smooth=0,this.smoothConstraint=!0},aS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polyline",n}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new oS},e.prototype.buildPath=function(t,e){var n=e.points,i=0,r=n.length/2;if(e.connectNulls){for(;r>0&&iS(n[2*r-2],n[2*r-1]);r--);for(;i=0){var y=a?(h-i)*g+i:(u-n)*g+n;return a?[t,y]:[y,t]}n=u,i=h;break;case o.C:u=r[l++],h=r[l++],c=r[l++],p=r[l++],d=r[l++],f=r[l++];var v=a?vn(n,u,c,d,t,s):vn(i,h,p,f,t,s);if(v>0)for(var m=0;m=0){y=a?gn(i,h,p,f,x):gn(n,u,c,d,x);return a?[t,y]:[y,t]}}n=d,i=f}}},e}(_s),sS=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e}(oS),lS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polygon",n}return n(e,t),e.prototype.getDefaultShape=function(){return new sS},e.prototype.buildPath=function(t,e){var n=e.points,i=e.stackedOnPoints,r=0,o=n.length/2,a=e.smoothMonotone;if(e.connectNulls){for(;o>0&&iS(n[2*o-2],n[2*o-1]);o--);for(;r=0;a--){var s=t.getDimensionInfo(i[a].dimension);if("x"===(r=s&&s.coordDim)||"y"===r){o=i[a];break}}if(o){var l=e.getAxis(r),u=z(o.stops,(function(t){return{coord:l.toGlobalCoord(l.dataToCoord(t.value)),color:t.color}})),h=u.length,c=o.outerColors.slice();h&&u[0].coord>u[h-1].coord&&(u.reverse(),c.reverse());var p=function(t,e){var n,i,r=[],o=t.length;function a(t,e,n){var i=t.coord;return{coord:n,color:$n((n-i)/(e.coord-i),[t.color,e.color])}}for(var s=0;se){i?r.push(a(i,l,e)):n&&r.push(a(n,l,0),a(n,l,e));break}n&&(r.push(a(n,l,0)),n=null),r.push(l),i=l}}return r}(u,"x"===r?n.getWidth():n.getHeight()),d=p.length;if(!d&&h)return u[0].coord<0?c[1]?c[1]:u[h-1].color:c[0]?c[0]:u[0].color;var f=p[0].coord-10,g=p[d-1].coord+10,y=g-f;if(y<.001)return"transparent";E(p,(function(t){t.offset=(t.coord-f)/y})),p.push({offset:d?p[d-1].offset:.5,color:c[1]||"transparent"}),p.unshift({offset:d?p[0].offset:.5,color:c[0]||"transparent"});var v=new $u(0,0,0,0,p,!0);return v[r]=f,v[r+"2"]=g,v}}}function xS(t,e,n){var i=t.get("showAllSymbol"),r="auto"===i;if(!i||r){var o=n.getAxesByScale("ordinal")[0];if(o&&(!r||!function(t,e){var n=t.getExtent(),i=Math.abs(n[1]-n[0])/t.scale.count();isNaN(i)&&(i=0);for(var r=e.count(),o=Math.max(1,Math.round(r/5)),a=0;ai)return!1;return!0}(o,e))){var a=e.mapDimension(o.dim),s={};return E(o.getViewLabels(),(function(t){var e=o.scale.getRawOrdinalNumber(t.tickValue);s[e]=1})),function(t){return!s.hasOwnProperty(e.get(a,t))}}}}function _S(t,e){return[t[2*e],t[2*e+1]]}function bS(t){if(t.get(["endLabel","show"]))return!0;for(var e=0;e0&&"bolder"===t.get(["emphasis","lineStyle","width"]))&&(d.getState("emphasis").style.lineWidth=+d.style.lineWidth+1);js(d).seriesIndex=t.seriesIndex,Bl(d,L,P,O);var R=yS(t.get("smooth")),N=t.get("smoothMonotone");if(d.setShape({smooth:R,smoothMonotone:N,connectNulls:w}),f){var E=a.getCalculationInfo("stackedOnSeries"),z=0;f.useStyle(k(l.getAreaStyle(),{fill:C,opacity:.7,lineJoin:"bevel",decal:a.getVisual("style").decal})),E&&(z=yS(E.get("smooth"))),f.setShape({smooth:R,stackedOnSmooth:z,smoothMonotone:N,connectNulls:w}),Hl(f,t,"areaStyle"),js(f).seriesIndex=t.seriesIndex,Bl(f,L,P,O)}var V=function(t){i._changePolyState(t)};a.eachItemGraphicEl((function(t){t&&(t.onHoverStateChange=V)})),this._polyline.onHoverStateChange=V,this._data=a,this._coordSys=r,this._stackedOnPoints=_,this._points=u,this._step=T,this._valueOrigin=m,t.get("triggerLineEvent")&&(this.packEventData(t,d),f&&this.packEventData(t,f))},e.prototype.packEventData=function(t,e){js(e).eventData={componentType:"series",componentSubType:"line",componentIndex:t.componentIndex,seriesIndex:t.seriesIndex,seriesName:t.name,seriesType:"line"}},e.prototype.highlight=function(t,e,n,i){var r=t.getData(),o=Co(r,i);if(this._changePolyState("emphasis"),!(o instanceof Array)&&null!=o&&o>=0){var a=r.getLayout("points"),s=r.getItemGraphicEl(o);if(!s){var l=a[2*o],u=a[2*o+1];if(isNaN(l)||isNaN(u))return;if(this._clipShapeForSymbol&&!this._clipShapeForSymbol.contain(l,u))return;var h=t.get("zlevel")||0,c=t.get("z")||0;(s=new Zw(r,o)).x=l,s.y=u,s.setZ(h,c);var p=s.getSymbolPath().getTextContent();p&&(p.zlevel=h,p.z=c,p.z2=this._polyline.z2+1),s.__temp=!0,r.setItemGraphicEl(o,s),s.stopSymbolAnimation(!0),this.group.add(s)}s.highlight()}else wg.prototype.highlight.call(this,t,e,n,i)},e.prototype.downplay=function(t,e,n,i){var r=t.getData(),o=Co(r,i);if(this._changePolyState("normal"),null!=o&&o>=0){var a=r.getItemGraphicEl(o);a&&(a.__temp?(r.setItemGraphicEl(o,null),this.group.remove(a)):a.downplay())}else wg.prototype.downplay.call(this,t,e,n,i)},e.prototype._changePolyState=function(t){var e=this._polygon;_l(this._polyline,t),e&&_l(e,t)},e.prototype._newPolyline=function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new aS({shape:{points:t},segmentIgnoreThreshold:2,z2:10}),this._lineGroup.add(e),this._polyline=e,e},e.prototype._newPolygon=function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new lS({shape:{points:t,stackedOnPoints:e},segmentIgnoreThreshold:2}),this._lineGroup.add(n),this._polygon=n,n},e.prototype._initSymbolLabelAnimation=function(t,e,n){var i,r,o=e.getBaseAxis(),a=o.inverse;"cartesian2d"===e.type?(i=o.isHorizontal(),r=!1):"polar"===e.type&&(i="angle"===o.dim,r=!0);var s=t.hostModel,l=s.get("animationDuration");U(l)&&(l=l(null));var u=s.get("animationDelay")||0,h=U(u)?u(null):u;t.eachItemGraphicEl((function(t,o){var s=t;if(s){var c=[t.x,t.y],p=void 0,d=void 0,f=void 0;if(n)if(r){var g=n,y=e.pointToCoord(c);i?(p=g.startAngle,d=g.endAngle,f=-y[1]/180*Math.PI):(p=g.r0,d=g.r,f=y[0])}else{var v=n;i?(p=v.x,d=v.x+v.width,f=t.x):(p=v.y+v.height,d=v.y,f=t.y)}var m=d===p?0:(f-p)/(d-p);a&&(m=1-m);var x=U(u)?u(o):l*m+h,_=s.getSymbolPath(),b=_.getTextContent();s.attr({scaleX:0,scaleY:0}),s.animateTo({scaleX:1,scaleY:1},{duration:200,setToFinal:!0,delay:x}),b&&b.animateFrom({style:{opacity:0}},{duration:300,delay:x}),_.disableLabelAnimation=!0}}))},e.prototype._initOrUpdateEndLabel=function(t,e,n){var i=t.getModel("endLabel");if(bS(t)){var r=t.getData(),o=this._polyline,a=r.getLayout("points");if(!a)return o.removeTextContent(),void(this._endLabel=null);var s=this._endLabel;s||((s=this._endLabel=new Ns({z2:200})).ignoreClip=!0,o.setTextContent(this._endLabel),o.disableLabelAnimation=!0);var l=function(t){for(var e,n,i=t.length/2;i>0&&(e=t[2*i-2],n=t[2*i-1],isNaN(e)||isNaN(n));i--);return i-1}(a);l>=0&&(qh(o,Kh(t,"endLabel"),{inheritColor:n,labelFetcher:t,labelDataIndex:l,defaultText:function(t,e,n){return null!=n?Xw(r,n):Uw(r,t)},enableTextSetter:!0},function(t,e){var n=e.getBaseAxis(),i=n.isHorizontal(),r=n.inverse,o=i?r?"right":"left":"center",a=i?"middle":r?"top":"bottom";return{normal:{align:t.get("align")||o,verticalAlign:t.get("verticalAlign")||a}}}(i,e)),o.textConfig.position=null)}else this._endLabel&&(this._polyline.removeTextContent(),this._endLabel=null)},e.prototype._endLabelOnDuring=function(t,e,n,i,r,o,a){var s=this._endLabel,l=this._polyline;if(s){t<1&&null==i.originalX&&(i.originalX=s.x,i.originalY=s.y);var u=n.getLayout("points"),h=n.hostModel,c=h.get("connectNulls"),p=o.get("precision"),d=o.get("distance")||0,f=a.getBaseAxis(),g=f.isHorizontal(),y=f.inverse,v=e.shape,m=y?g?v.x:v.y+v.height:g?v.x+v.width:v.y,x=(g?d:0)*(y?-1:1),_=(g?0:-d)*(y?-1:1),b=g?"x":"y",w=function(t,e,n){for(var i,r,o=t.length/2,a="x"===n?0:1,s=0,l=-1,u=0;u=e||i>=e&&r<=e){l=u;break}s=u,i=r}else i=r;return{range:[s,l],t:(e-i)/(r-i)}}(u,m,b),S=w.range,M=S[1]-S[0],I=void 0;if(M>=1){if(M>1&&!c){var T=_S(u,S[0]);s.attr({x:T[0]+x,y:T[1]+_}),r&&(I=h.getRawValue(S[0]))}else{(T=l.getPointOn(m,b))&&s.attr({x:T[0]+x,y:T[1]+_});var C=h.getRawValue(S[0]),D=h.getRawValue(S[1]);r&&(I=zo(n,p,C,D,w.t))}i.lastFrameIndex=S[0]}else{var A=1===t||i.lastFrameIndex>0?S[0]:0;T=_S(u,A);r&&(I=h.getRawValue(A)),s.attr({x:T[0]+x,y:T[1]+_})}r&&rc(s).setLabelText(I)}},e.prototype._doUpdateAnimation=function(t,e,n,i,r,o,a){var s=this._polyline,l=this._polygon,u=t.hostModel,h=function(t,e,n,i,r,o,a,s){for(var l=function(t,e){var n=[];return e.diff(t).add((function(t){n.push({cmd:"+",idx:t})})).update((function(t,e){n.push({cmd:"=",idx:e,idx1:t})})).remove((function(t){n.push({cmd:"-",idx:t})})).execute(),n}(t,e),u=[],h=[],c=[],p=[],d=[],f=[],g=[],y=Qw(r,e,a),v=t.getLayout("points")||[],m=e.getLayout("points")||[],x=0;x3e3||l&&gS(p,f)>3e3)return s.stopAnimation(),s.setShape({points:d}),void(l&&(l.stopAnimation(),l.setShape({points:d,stackedOnPoints:f})));s.shape.__points=h.current,s.shape.points=c;var g={shape:{points:d}};h.current!==c&&(g.shape.__points=h.next),s.stopAnimation(),uh(s,g,u),l&&(l.setShape({points:c,stackedOnPoints:p}),l.stopAnimation(),uh(l,{shape:{stackedOnPoints:f}},u),s.shape.points!==l.shape.points&&(l.shape.points=s.shape.points));for(var y=[],v=h.status,m=0;me&&(e=t[n]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,n=0;n10&&"cartesian2d"===o.type&&r){var s=o.getBaseAxis(),l=o.getOtherAxis(s),u=s.getExtent(),h=n.getDevicePixelRatio(),c=Math.abs(u[1]-u[0])*(h||1),p=Math.round(a/c);if(isFinite(p)&&p>1){"lttb"===r&&t.setData(i.lttbDownSample(i.mapDimension(l.dim),1/p));var d=void 0;X(r)?d=IS[r]:U(r)&&(d=r),d&&t.setData(i.downSample(i.mapDimension(l.dim),1/p,d,TS))}}}}}var DS=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(t,e){return sx(null,this,{useEncodeDefaulter:!0})},e.prototype.getMarkerPosition=function(t){var e=this.coordinateSystem;if(e&&e.clampData){var n=e.dataToPoint(e.clampData(t)),i=this.getData(),r=i.getLayout("offset"),o=i.getLayout("size");return n[e.getBaseAxis().isHorizontal()?0:1]+=r+o/2,n}return[NaN,NaN]},e.type="series.__base_bar__",e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,large:!1,largeThreshold:400,progressive:3e3,progressiveChunkMode:"mod"},e}(hg);hg.registerClass(DS);var AS=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(){return sx(null,this,{useEncodeDefaulter:!0,createInvertedIndices:!!this.get("realtimeSort",!0)||null})},e.prototype.getProgressive=function(){return!!this.get("large")&&this.get("progressive")},e.prototype.getProgressiveThreshold=function(){var t=this.get("progressiveThreshold"),e=this.get("largeThreshold");return e>t&&(t=e),t},e.prototype.brushSelector=function(t,e,n){return n.rect(e.getItemLayout(t))},e.type="series.bar",e.dependencies=["grid","polar"],e.defaultOption=wc(DS.defaultOption,{clip:!0,roundCap:!1,showBackground:!1,backgroundStyle:{color:"rgba(180, 180, 180, 0.2)",borderColor:null,borderWidth:0,borderType:"solid",borderRadius:0,shadowBlur:0,shadowColor:null,shadowOffsetX:0,shadowOffsetY:0,opacity:1},select:{itemStyle:{borderColor:"#212121"}},realtimeSort:!1}),e}(DS),kS=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0},LS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="sausage",n}return n(e,t),e.prototype.getDefaultShape=function(){return new kS},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),o=Math.max(e.r,0),a=.5*(o-r),s=r+a,l=e.startAngle,u=e.endAngle,h=e.clockwise,c=2*Math.PI,p=h?u-lo)return!0;o=u}return!1},e.prototype._isOrderDifferentInView=function(t,e){for(var n=e.scale,i=n.getExtent(),r=Math.max(0,i[0]),o=Math.min(i[1],n.getOrdinalMeta().categories.length-1);r<=o;++r)if(t.ordinalNumbers[r]!==n.getRawOrdinalNumber(r))return!0},e.prototype._updateSortWithinSameData=function(t,e,n,i){if(this._isOrderChangedWithinSameData(t,e,n)){var r=this._dataSort(t,n,e);this._isOrderDifferentInView(r,n)&&(this._removeOnRenderedListener(i),i.dispatchAction({type:"changeAxisOrder",componentType:n.dim+"Axis",axisId:n.index,sortInfo:r}))}},e.prototype._dispatchInitSort=function(t,e,n){var i=e.baseAxis,r=this._dataSort(t,i,(function(n){return t.get(t.mapDimension(e.otherAxis.dim),n)}));n.dispatchAction({type:"changeAxisOrder",componentType:i.dim+"Axis",isInitSort:!0,axisId:i.index,sortInfo:r})},e.prototype.remove=function(t,e){this._clear(this._model),this._removeOnRenderedListener(e)},e.prototype.dispose=function(t,e){this._removeOnRenderedListener(e)},e.prototype._removeOnRenderedListener=function(t){this._onRendered&&(t.getZr().off("rendered",this._onRendered),this._onRendered=null)},e.prototype._clear=function(t){var e=this.group,n=this._data;t&&t.isAnimationEnabled()&&n&&!this._isLargeDraw?(this._removeBackground(),this._backgroundEls=[],n.eachItemGraphicEl((function(e){fh(e,t,js(e).dataIndex)}))):e.removeAll(),this._data=null,this._isFirstFrame=!0},e.prototype._removeBackground=function(){this.group.remove(this._backgroundGroup),this._backgroundGroup=null},e.type="bar",e}(wg),zS={cartesian2d:function(t,e){var n=e.width<0?-1:1,i=e.height<0?-1:1;n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height);var r=t.x+t.width,o=t.y+t.height,a=RS(e.x,t.x),s=NS(e.x+e.width,r),l=RS(e.y,t.y),u=NS(e.y+e.height,o),h=sr?s:a,e.y=c&&l>o?u:l,e.width=h?0:s-a,e.height=c?0:u-l,n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height),h||c},polar:function(t,e){var n=e.r0<=e.r?1:-1;if(n<0){var i=e.r;e.r=e.r0,e.r0=i}var r=NS(e.r,t.r),o=RS(e.r0,t.r0);e.r=r,e.r0=o;var a=r-o<0;if(n<0){i=e.r;e.r=e.r0,e.r0=i}return a}},VS={cartesian2d:function(t,e,n,i,r,o,a,s,l){var u=new Ps({shape:A({},i),z2:1});(u.__dataIndex=n,u.name="item",o)&&(u.shape[r?"height":"width"]=0);return u},polar:function(t,e,n,i,r,o,a,s,l){var u=!r&&l?LS:Pu,h=new u({shape:i,z2:1});h.name="item";var c,p,d=US(r);if(h.calculateTextPosition=(c=d,p=({isRoundCap:u===LS}||{}).isRoundCap,function(t,e,n){var i=e.position;if(!i||i instanceof Array)return br(t,e,n);var r=c(i),o=null!=e.distance?e.distance:5,a=this.shape,s=a.cx,l=a.cy,u=a.r,h=a.r0,d=(u+h)/2,f=a.startAngle,g=a.endAngle,y=(f+g)/2,v=p?Math.abs(u-h)/2:0,m=Math.cos,x=Math.sin,_=s+u*m(f),b=l+u*x(f),w="left",S="top";switch(r){case"startArc":_=s+(h-o)*m(y),b=l+(h-o)*x(y),w="center",S="top";break;case"insideStartArc":_=s+(h+o)*m(y),b=l+(h+o)*x(y),w="center",S="bottom";break;case"startAngle":_=s+d*m(f)+PS(f,o+v,!1),b=l+d*x(f)+OS(f,o+v,!1),w="right",S="middle";break;case"insideStartAngle":_=s+d*m(f)+PS(f,-o+v,!1),b=l+d*x(f)+OS(f,-o+v,!1),w="left",S="middle";break;case"middle":_=s+d*m(y),b=l+d*x(y),w="center",S="middle";break;case"endArc":_=s+(u+o)*m(y),b=l+(u+o)*x(y),w="center",S="bottom";break;case"insideEndArc":_=s+(u-o)*m(y),b=l+(u-o)*x(y),w="center",S="top";break;case"endAngle":_=s+d*m(g)+PS(g,o+v,!0),b=l+d*x(g)+OS(g,o+v,!0),w="left",S="middle";break;case"insideEndAngle":_=s+d*m(g)+PS(g,-o+v,!0),b=l+d*x(g)+OS(g,-o+v,!0),w="right",S="middle";break;default:return br(t,e,n)}return(t=t||{}).x=_,t.y=b,t.align=w,t.verticalAlign=S,t}),o){var f=r?"r":"endAngle",g={};h.shape[f]=r?0:i.startAngle,g[f]=i[f],(s?uh:hh)(h,{shape:g},o)}return h}};function BS(t,e,n,i,r,o,a,s){var l,u;o?(u={x:i.x,width:i.width},l={y:i.y,height:i.height}):(u={y:i.y,height:i.height},l={x:i.x,width:i.width}),s||(a?uh:hh)(n,{shape:l},e,r,null),(a?uh:hh)(n,{shape:u},e?t.baseAxis.model:null,r)}function FS(t,e){for(var n=0;n0?1:-1,a=i.height>0?1:-1;return{x:i.x+o*r/2,y:i.y+a*r/2,width:i.width-o*r,height:i.height-a*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle,clockwise:i.clockwise}}};function US(t){return function(t){var e=t?"Arc":"Angle";return function(t){switch(t){case"start":case"insideStart":case"end":case"insideEnd":return t+e;default:return t}}}(t)}function XS(t,e,n,i,r,o,a,s){var l=e.getItemVisual(n,"style");s||t.setShape("r",i.get(["itemStyle","borderRadius"])||0),t.useStyle(l);var u=i.getShallow("cursor");u&&t.attr("cursor",u);var h=s?a?r.r>=r.r0?"endArc":"startArc":r.endAngle>=r.startAngle?"endAngle":"startAngle":a?r.height>=0?"bottom":"top":r.width>=0?"right":"left",c=Kh(i);qh(t,c,{labelFetcher:o,labelDataIndex:n,defaultText:Uw(o.getData(),n),inheritColor:l.fill,defaultOpacity:l.opacity,defaultOutsidePosition:h});var p=t.getTextContent();if(s&&p){var d=i.get(["label","position"]);t.textConfig.inside="middle"===d||null,function(t,e,n,i){if(j(i))t.setTextConfig({rotation:i});else if(Y(e))t.setTextConfig({rotation:0});else{var r,o=t.shape,a=o.clockwise?o.startAngle:o.endAngle,s=o.clockwise?o.endAngle:o.startAngle,l=(a+s)/2,u=n(e);switch(u){case"startArc":case"insideStartArc":case"middle":case"insideEndArc":case"endArc":r=l;break;case"startAngle":case"insideStartAngle":r=a;break;case"endAngle":case"insideEndAngle":r=s;break;default:return void t.setTextConfig({rotation:0})}var h=1.5*Math.PI-r;"middle"===u&&h>Math.PI/2&&h<1.5*Math.PI&&(h-=Math.PI),t.setTextConfig({rotation:h})}}(t,"outside"===d?h:d,US(a),i.get(["label","rotate"]))}oc(p,c,o.getRawValue(n),(function(t){return Xw(e,t)}));var f=i.getModel(["emphasis"]);Bl(t,f.get("focus"),f.get("blurScope"),f.get("disabled")),Hl(t,i),function(t){return null!=t.startAngle&&null!=t.endAngle&&t.startAngle===t.endAngle}(r)&&(t.style.fill="none",t.style.stroke="none",E(t.states,(function(t){t.style&&(t.style.fill=t.style.stroke="none")})))}var ZS=function(){},jS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="largeBar",n}return n(e,t),e.prototype.getDefaultShape=function(){return new ZS},e.prototype.buildPath=function(t,e){for(var n=e.points,i=this.baseDimIdx,r=1-this.baseDimIdx,o=[],a=[],s=this.barWidth,l=0;l=s[0]&&e<=s[0]+l[0]&&n>=s[1]&&n<=s[1]+l[1])return a[h]}return-1}(this,t.offsetX,t.offsetY);js(this).dataIndex=e>=0?e:null}),30,!1);function $S(t,e,n){if(pS(n,"cartesian2d")){var i=e,r=n.getArea();return{x:t?i.x:r.x,y:t?r.y:i.y,width:t?i.width:r.width,height:t?r.height:i.height}}var o=e;return{cx:(r=n.getArea()).cx,cy:r.cy,r0:t?r.r0:o.r0,r:t?r.r:o.r,startAngle:t?o.startAngle:0,endAngle:t?o.endAngle:2*Math.PI}}var JS=2*Math.PI,QS=Math.PI/180;function tM(t,e){return wp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function eM(t,e){var n=tM(t,e),i=t.get("center"),r=t.get("radius");Y(r)||(r=[0,r]),Y(i)||(i=[i,i]);var o,a,s=Gr(n.width,e.getWidth()),l=Gr(n.height,e.getHeight()),u=Math.min(s,l),h=Gr(r[0],u/2),c=Gr(r[1],u/2),p=t.coordinateSystem;if(p){var d=p.dataToPoint(i);o=d[0]||0,a=d[1]||0}else o=Gr(i[0],s)+n.x,a=Gr(i[1],l)+n.y;return{cx:o,cy:a,r0:h,r:c}}function nM(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.getData(),i=e.mapDimension("value"),r=tM(t,n),o=eM(t,n),a=o.cx,s=o.cy,l=o.r,u=o.r0,h=-t.get("startAngle")*QS,c=t.get("minAngle")*QS,p=0;e.each(i,(function(t){!isNaN(t)&&p++}));var d=e.getSum(i),f=Math.PI/(d||p)*2,g=t.get("clockwise"),y=t.get("roseType"),v=t.get("stillShowZeroSum"),m=e.getDataExtent(i);m[0]=0;var x=JS,_=0,b=h,w=g?1:-1;if(e.setLayout({viewRect:r,r:l}),e.each(i,(function(t,n){var i;if(isNaN(t))e.setItemLayout(n,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:g,cx:a,cy:s,r0:u,r:y?NaN:l});else{(i="area"!==y?0===d&&v?f:t*f:JS/p)n?a:o,h=Math.abs(l.label.y-n);if(h>=u.maxY){var c=l.label.x-e-l.len2*r,p=i+l.len,f=Math.abs(c)t.unconstrainedWidth?null:d:null;i.setStyle("width",f)}var g=i.getBoundingRect();o.width=g.width;var y=(i.style.margin||0)+2.1;o.height=g.height+y,o.y-=(o.height-c)/2}}}function sM(t){return"center"===t.position}function lM(t){var e,n,i=t.getData(),r=[],o=!1,a=(t.get("minShowLabelAngle")||0)*rM,s=i.getLayout("viewRect"),l=i.getLayout("r"),u=s.width,h=s.x,c=s.y,p=s.height;function d(t){t.ignore=!0}i.each((function(t){var s=i.getItemGraphicEl(t),c=s.shape,p=s.getTextContent(),f=s.getTextGuideLine(),g=i.getItemModel(t),y=g.getModel("label"),v=y.get("position")||g.get(["emphasis","label","position"]),m=y.get("distanceToLabelLine"),x=y.get("alignTo"),_=Gr(y.get("edgeDistance"),u),b=y.get("bleedMargin"),w=g.getModel("labelLine"),S=w.get("length");S=Gr(S,u);var M=w.get("length2");if(M=Gr(M,u),Math.abs(c.endAngle-c.startAngle)0?"right":"left":k>0?"left":"right"}var B=Math.PI,F=0,G=y.get("rotate");if(j(G))F=G*(B/180);else if("center"===v)F=0;else if("radial"===G||!0===G){F=k<0?-A+B:-A}else if("tangential"===G&&"outside"!==v&&"outer"!==v){var W=Math.atan2(k,L);W<0&&(W=2*B+W),L>0&&(W=B+W),F=W-B}if(o=!!F,p.x=I,p.y=T,p.rotation=F,p.setStyle({verticalAlign:"middle"}),P){p.setStyle({align:D});var H=p.states.select;H&&(H.x+=p.x,H.y+=p.y)}else{var Y=p.getBoundingRect().clone();Y.applyTransform(p.getComputedTransform());var U=(p.style.margin||0)+2.1;Y.y-=U/2,Y.height+=U,r.push({label:p,labelLine:f,position:v,len:S,len2:M,minTurnAngle:w.get("minTurnAngle"),maxSurfaceAngle:w.get("maxSurfaceAngle"),surfaceNormal:new Ie(k,L),linePoints:C,textAlign:D,labelDistance:m,labelAlignTo:x,edgeDistance:_,bleedMargin:b,rect:Y,unconstrainedWidth:Y.width,labelStyleWidth:p.style.width})}s.setTextConfig({inside:P})}})),!o&&t.get("avoidLabelOverlap")&&function(t,e,n,i,r,o,a,s){for(var l=[],u=[],h=Number.MAX_VALUE,c=-Number.MAX_VALUE,p=0;p0){for(var l=o.getItemLayout(0),u=1;isNaN(l&&l.startAngle)&&u=n.r0}},e.type="pie",e}(wg);function pM(t,e,n){e=Y(e)&&{coordDimensions:e}||A({encodeDefine:t.getEncode()},e);var i=t.getSource(),r=Qm(i,e).dimensions,o=new Jm(r,t);return o.initData(i,n),o}var dM=function(){function t(t,e){this._getDataWithEncodedVisual=t,this._getRawData=e}return t.prototype.getAllNames=function(){var t=this._getRawData();return t.mapArray(t.getName)},t.prototype.containName=function(t){return this._getRawData().indexOfName(t)>=0},t.prototype.indexOfName=function(t){return this._getDataWithEncodedVisual().indexOfName(t)},t.prototype.getItemVisual=function(t,e){return this._getDataWithEncodedVisual().getItemVisual(t,e)},t}(),fM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new dM(W(this.getData,this),W(this.getRawData,this)),this._defaultLabelLine(e)},e.prototype.mergeOption=function(){t.prototype.mergeOption.apply(this,arguments)},e.prototype.getInitialData=function(){var t=pM(this,{coordDimensions:["value"],encodeDefaulter:H(Zp,this)}),e=[];return t.each(t.mapDimension("value"),(function(t){e.push(t)})),this.seats=Zr(e,t.hostModel.get("percentPrecision")),t},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.call(this,e);return n.percent=this.seats[e],n.$vars.push("percent"),n},e.prototype._defaultLabelLine=function(t){vo(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.type="series.pie",e.defaultOption={z:2,legendHoverLink:!0,colorBy:"data",center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,minShowLabelAngle:0,selectedOffset:10,percentPrecision:2,stillShowZeroSum:!0,left:0,top:0,right:0,bottom:0,width:null,height:null,label:{rotate:0,show:!0,overflow:"truncate",position:"outer",alignTo:"none",edgeDistance:"25%",bleedMargin:10,distanceToLabelLine:5},labelLine:{show:!0,length:15,length2:15,smooth:!1,minTurnAngle:90,maxSurfaceAngle:90,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1,borderJoin:"round"},showEmptyCircle:!0,emptyCircleStyle:{color:"lightgray",opacity:1},labelLayout:{hideOverlap:!0},emphasis:{scale:!0,scaleSize:5},avoidLabelOverlap:!0,animationType:"expansion",animationDuration:1e3,animationTypeUpdate:"transition",animationEasingUpdate:"cubicInOut",animationDurationUpdate:500,animationEasing:"cubicInOut"},e}(hg);var gM=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){return sx(null,this,{useEncodeDefaulter:!0})},e.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?5e3:this.get("progressive"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?1e4:this.get("progressiveThreshold"):t},e.prototype.brushSelector=function(t,e,n){return n.point(e.getItemLayout(t))},e.prototype.getZLevelKey=function(){return this.getData().count()>this.getProgressiveThreshold()?this.id:""},e.type="series.scatter",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{opacity:.8},emphasis:{scale:!0},clip:!0,select:{itemStyle:{borderColor:"#212121"}},universalTransition:{divideShape:"clone"}},e}(hg),yM=function(){},vM=function(t){function e(e){var n=t.call(this,e)||this;return n._off=0,n.hoverDataIdx=-1,n}return n(e,t),e.prototype.getDefaultShape=function(){return new yM},e.prototype.reset=function(){this.notClear=!1,this._off=0},e.prototype.buildPath=function(t,e){var n,i=e.points,r=e.size,o=this.symbolProxy,a=o.shape,s=t.getContext?t.getContext():t,l=s&&r[0]<4,u=this.softClipShape;if(l)this._ctx=s;else{for(this._ctx=null,n=this._off;n=0;s--){var l=2*s,u=i[l]-o/2,h=i[l+1]-a/2;if(t>=u&&e>=h&&t<=u+o&&e<=h+a)return s}return-1},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return t=n[0],e=n[1],i.contain(t,e)?(this.hoverDataIdx=this.findDataIndex(t,e))>=0:(this.hoverDataIdx=-1,!1)},e.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var e=this.shape,n=e.points,i=e.size,r=i[0],o=i[1],a=1/0,s=1/0,l=-1/0,u=-1/0,h=0;h=0&&(l.dataIndex=n+(t.startIndex||0))}))},t.prototype.remove=function(){this._clear()},t.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},t}(),xM=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).updateData(i,{clipShape:this._getClipShape(t)}),this._finished=!0},e.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).incrementalPrepareUpdate(i),this._finished=!1},e.prototype.incrementalRender=function(t,e,n){this._symbolDraw.incrementalUpdate(t,e.getData(),{clipShape:this._getClipShape(e)}),this._finished=t.end===e.getData().count()},e.prototype.updateTransform=function(t,e,n){var i=t.getData();if(this.group.dirty(),!this._finished||i.count()>1e4)return{update:!0};var r=MS("").reset(t,e,n);r.progress&&r.progress({start:0,end:i.count(),count:i.count()},i),this._symbolDraw.updateLayout(i)},e.prototype.eachRendered=function(t){this._symbolDraw&&this._symbolDraw.eachRendered(t)},e.prototype._getClipShape=function(t){var e=t.coordinateSystem,n=e&&e.getArea&&e.getArea();return t.get("clip",!0)?n:null},e.prototype._updateSymbolDraw=function(t,e){var n=this._symbolDraw,i=e.pipelineContext.large;return n&&i===this._isLargeDraw||(n&&n.remove(),n=this._symbolDraw=i?new mM:new Jw,this._isLargeDraw=i,this.group.removeAll()),this.group.add(n.group),n},e.prototype.remove=function(t,e){this._symbolDraw&&this._symbolDraw.remove(!0),this._symbolDraw=null},e.prototype.dispose=function(){},e.type="scatter",e}(wg),_M=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.type="grid",e.dependencies=["xAxis","yAxis"],e.layoutMode="box",e.defaultOption={show:!1,z:0,left:"10%",top:60,right:"10%",bottom:70,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"},e}(Ap),bM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getCoordSysModel=function(){return this.getReferringComponents("grid",Po).models[0]},e.type="cartesian2dAxis",e}(Ap);R(bM,g_);var wM={show:!0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#6E7079",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#E0E6F1"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.2)","rgba(210,219,238,0.2)"]}}},SM=C({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},wM),MM=C({boundaryGap:[0,0],axisLine:{show:"auto"},axisTick:{show:"auto"},splitNumber:5,minorTick:{show:!1,splitNumber:5,length:3,lineStyle:{}},minorSplitLine:{show:!1,lineStyle:{color:"#F4F7FD",width:1}}},wM),IM={category:SM,value:MM,time:C({splitNumber:6,axisLabel:{showMinLabel:!1,showMaxLabel:!1,rich:{primary:{fontWeight:"bold"}}},splitLine:{show:!1}},MM),log:k({logBase:10},MM)},TM={value:1,category:1,time:1,log:1};function CM(t,e,i,r){E(TM,(function(o,a){var s=C(C({},IM[a],!0),r,!0),l=function(t){function i(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e+"Axis."+a,n}return n(i,t),i.prototype.mergeDefaultAndTheme=function(t,e){var n=Mp(this),i=n?Tp(t):{};C(t,e.getTheme().get(a+"Axis")),C(t,this.getDefaultOption()),t.type=DM(t),n&&Ip(t,i,n)},i.prototype.optionUpdated=function(){"category"===this.option.type&&(this.__ordinalMeta=hx.createByAxisModel(this))},i.prototype.getCategories=function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},i.prototype.getOrdinalMeta=function(){return this.__ordinalMeta},i.type=e+"Axis."+a,i.defaultOption=s,i}(i);t.registerComponentModel(l)})),t.registerSubTypeDefaulter(e+"Axis",DM)}function DM(t){return t.type||(t.data?"category":"value")}var AM=function(){function t(t){this.type="cartesian",this._dimList=[],this._axes={},this.name=t||""}return t.prototype.getAxis=function(t){return this._axes[t]},t.prototype.getAxes=function(){return z(this._dimList,(function(t){return this._axes[t]}),this)},t.prototype.getAxesByScale=function(t){return t=t.toLowerCase(),B(this.getAxes(),(function(e){return e.scale.type===t}))},t.prototype.addAxis=function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},t}(),kM=["x","y"];function LM(t){return"interval"===t.type||"time"===t.type}var PM=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="cartesian2d",e.dimensions=kM,e}return n(e,t),e.prototype.calcAffineTransform=function(){this._transform=this._invTransform=null;var t=this.getAxis("x").scale,e=this.getAxis("y").scale;if(LM(t)&&LM(e)){var n=t.getExtent(),i=e.getExtent(),r=this.dataToPoint([n[0],i[0]]),o=this.dataToPoint([n[1],i[1]]),a=n[1]-n[0],s=i[1]-i[0];if(a&&s){var l=(o[0]-r[0])/a,u=(o[1]-r[1])/s,h=r[0]-n[0]*l,c=r[1]-i[0]*u,p=this._transform=[l,0,0,u,h,c];this._invTransform=we([],p)}}},e.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},e.prototype.containPoint=function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},e.prototype.containData=function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},e.prototype.containZone=function(t,e){var n=this.dataToPoint(t),i=this.dataToPoint(e),r=this.getArea(),o=new Re(n[0],n[1],i[0]-n[0],i[1]-n[1]);return r.intersect(o)},e.prototype.dataToPoint=function(t,e,n){n=n||[];var i=t[0],r=t[1];if(this._transform&&null!=i&&isFinite(i)&&null!=r&&isFinite(r))return Ft(n,t,this._transform);var o=this.getAxis("x"),a=this.getAxis("y");return n[0]=o.toGlobalCoord(o.dataToCoord(i,e)),n[1]=a.toGlobalCoord(a.dataToCoord(r,e)),n},e.prototype.clampData=function(t,e){var n=this.getAxis("x").scale,i=this.getAxis("y").scale,r=n.getExtent(),o=i.getExtent(),a=n.parse(t[0]),s=i.parse(t[1]);return(e=e||[])[0]=Math.min(Math.max(Math.min(r[0],r[1]),a),Math.max(r[0],r[1])),e[1]=Math.min(Math.max(Math.min(o[0],o[1]),s),Math.max(o[0],o[1])),e},e.prototype.pointToData=function(t,e){var n=[];if(this._invTransform)return Ft(n,t,this._invTransform);var i=this.getAxis("x"),r=this.getAxis("y");return n[0]=i.coordToData(i.toLocalCoord(t[0]),e),n[1]=r.coordToData(r.toLocalCoord(t[1]),e),n},e.prototype.getOtherAxis=function(t){return this.getAxis("x"===t.dim?"y":"x")},e.prototype.getArea=function(){var t=this.getAxis("x").getGlobalExtent(),e=this.getAxis("y").getGlobalExtent(),n=Math.min(t[0],t[1]),i=Math.min(e[0],e[1]),r=Math.max(t[0],t[1])-n,o=Math.max(e[0],e[1])-i;return new Re(n,i,r,o)},e}(AM),OM=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.index=0,a.type=r||"value",a.position=o||"bottom",a}return n(e,t),e.prototype.isHorizontal=function(){var t=this.position;return"top"===t||"bottom"===t},e.prototype.getGlobalExtent=function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},e.prototype.pointToData=function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},e.prototype.setCategorySortInfo=function(t){if("category"!==this.type)return!1;this.model.option.categorySortInfo=t,this.scale.setSortInfo(t)},e}(X_);function RM(t,e,n){n=n||{};var i=t.coordinateSystem,r=e.axis,o={},a=r.getAxesOnZeroOf()[0],s=r.position,l=a?"onZero":s,u=r.dim,h=i.getRect(),c=[h.x,h.x+h.width,h.y,h.y+h.height],p={left:0,right:1,top:0,bottom:1,onZero:2},d=e.get("offset")||0,f="x"===u?[c[2]-d,c[3]+d]:[c[0]-d,c[1]+d];if(a){var g=a.toGlobalCoord(a.dataToCoord(0));f[p.onZero]=Math.max(Math.min(g,f[1]),f[0])}o.position=["y"===u?f[p[l]]:c[0],"x"===u?f[p[l]]:c[3]],o.rotation=Math.PI/2*("x"===u?0:1);o.labelDirection=o.tickDirection=o.nameDirection={top:-1,bottom:1,left:-1,right:1}[s],o.labelOffset=a?f[p[s]]-f[p.onZero]:0,e.get(["axisTick","inside"])&&(o.tickDirection=-o.tickDirection),it(n.labelInside,e.get(["axisLabel","inside"]))&&(o.labelDirection=-o.labelDirection);var y=e.get(["axisLabel","rotate"]);return o.labelRotate="top"===l?-y:y,o.z2=1,o}function NM(t){return"cartesian2d"===t.get("coordinateSystem")}function EM(t){var e={xAxisModel:null,yAxisModel:null};return E(e,(function(n,i){var r=i.replace(/Model$/,""),o=t.getReferringComponents(r,Po).models[0];e[i]=o})),e}var zM=Math.log;function VM(t,e,n){var i=Sx.prototype,r=i.getTicks.call(n),o=i.getTicks.call(n,!0),a=r.length-1,s=i.getInterval.call(n),l=a_(t,e),u=l.extent,h=l.fixMin,c=l.fixMax;if("log"===t.type){var p=zM(t.base);u=[zM(u[0])/p,zM(u[1])/p]}t.setExtent(u[0],u[1]),t.calcNiceExtent({splitNumber:a,fixMin:h,fixMax:c});var d=i.getExtent.call(t);h&&(u[0]=d[0]),c&&(u[1]=d[1]);var f=i.getInterval.call(t),g=u[0],y=u[1];if(h&&c)f=(y-g)/a;else if(h)for(y=u[0]+f*a;yu[0]&&isFinite(g)&&isFinite(u[0]);)f=fx(f),g=u[1]-f*a;else{t.getTicks().length-1>a&&(f=fx(f));var v=f*a;(g=Wr((y=Math.ceil(u[1]/f)*f)-v))<0&&u[0]>=0?(g=0,y=Wr(v)):y>0&&u[1]<=0&&(y=0,g=-Wr(v))}var m=(r[0].value-o[0].value)/s,x=(r[a].value-o[a].value)/s;i.setExtent.call(t,g+f*m,y+f*x),i.setInterval.call(t,f),(m||x)&&i.setNiceExtent.call(t,g+f,y-f)}var BM=function(){function t(t,e,n){this.type="grid",this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this.axisPointerEnabled=!0,this.dimensions=kM,this._initCartesian(t,e,n),this.model=t}return t.prototype.getRect=function(){return this._rect},t.prototype.update=function(t,e){var n=this._axesMap;function i(t){var e,n=G(t),i=n.length;if(i){for(var r=[],o=i-1;o>=0;o--){var a=t[+n[o]],s=a.model,l=a.scale;px(l)&&s.get("alignTicks")&&null==s.get("interval")?r.push(a):(s_(l,s),px(l)&&(e=a))}r.length&&(e||s_((e=r.pop()).scale,e.model),E(r,(function(t){VM(t.scale,t.model,e.scale)})))}}this._updateScale(t,this.model),i(n.x),i(n.y);var r={};E(n.x,(function(t){GM(n,"y",t,r)})),E(n.y,(function(t){GM(n,"x",t,r)})),this.resize(this.model,e)},t.prototype.resize=function(t,e,n){var i=t.getBoxLayoutParams(),r=!n&&t.get("containLabel"),o=wp(i,{width:e.getWidth(),height:e.getHeight()});this._rect=o;var a=this._axesList;function s(){E(a,(function(t){var e=t.isHorizontal(),n=e?[0,o.width]:[0,o.height],i=t.inverse?1:0;t.setExtent(n[i],n[1-i]),function(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}(t,e?o.x:o.y)}))}s(),r&&(E(a,(function(t){if(!t.model.get(["axisLabel","inside"])){var e=function(t){var e=t.model,n=t.scale;if(e.get(["axisLabel","show"])&&!n.isBlank()){var i,r,o=n.getExtent();r=n instanceof _x?n.count():(i=n.getTicks()).length;var a,s=t.getLabelModel(),l=u_(t),u=1;r>40&&(u=Math.ceil(r/40));for(var h=0;h0&&i>0||n<0&&i<0)}(t)}var HM=Math.PI,YM=function(){function t(t,e){this.group=new Pr,this.opt=e,this.axisModel=t,k(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0,handleAutoShown:function(){return!0}});var n=new Pr({x:e.position[0],y:e.position[1],rotation:e.rotation});n.updateTransform(),this._transformGroup=n}return t.prototype.hasBuilder=function(t){return!!UM[t]},t.prototype.add=function(t){UM[t](this.opt,this.axisModel,this.group,this._transformGroup)},t.prototype.getGroup=function(){return this.group},t.innerTextLayout=function(t,e,n){var i,r,o=Kr(e-t);return $r(o)?(r=n>0?"top":"bottom",i="center"):$r(o-HM)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=o>0&&o0?"right":"left":n>0?"left":"right"),{rotation:o,textAlign:i,textVerticalAlign:r}},t.makeAxisEventDataBase=function(t){var e={componentType:t.mainType,componentIndex:t.componentIndex};return e[t.mainType+"Index"]=t.componentIndex,e},t.isLabelSilent=function(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)},t}(),UM={axisLine:function(t,e,n,i){var r=e.get(["axisLine","show"]);if("auto"===r&&t.handleAutoShown&&(r=t.handleAutoShown("axisLine")),r){var o=e.axis.getExtent(),a=i.transform,s=[o[0],0],l=[o[1],0],u=s[0]>l[0];a&&(Ft(s,s,a),Ft(l,l,a));var h=A({lineCap:"round"},e.getModel(["axisLine","lineStyle"]).getLineStyle()),c=new Wu({shape:{x1:s[0],y1:s[1],x2:l[0],y2:l[1]},style:h,strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1});Ah(c.shape,c.style.lineWidth),c.anid="line",n.add(c);var p=e.get(["axisLine","symbol"]);if(null!=p){var d=e.get(["axisLine","symbolSize"]);X(p)&&(p=[p,p]),(X(d)||j(d))&&(d=[d,d]);var f=Ey(e.get(["axisLine","symbolOffset"])||0,d),g=d[0],y=d[1];E([{rotate:t.rotation+Math.PI/2,offset:f[0],r:0},{rotate:t.rotation-Math.PI/2,offset:f[1],r:Math.sqrt((s[0]-l[0])*(s[0]-l[0])+(s[1]-l[1])*(s[1]-l[1]))}],(function(e,i){if("none"!==p[i]&&null!=p[i]){var r=Ry(p[i],-g/2,-y/2,g,y,h.stroke,!0),o=e.r+e.offset,a=u?l:s;r.attr({rotation:e.rotate,x:a[0]+o*Math.cos(t.rotation),y:a[1]-o*Math.sin(t.rotation),silent:!0,z2:11}),n.add(r)}}))}}},axisTickLabel:function(t,e,n,i){var r=function(t,e,n,i){var r=n.axis,o=n.getModel("axisTick"),a=o.get("show");"auto"===a&&i.handleAutoShown&&(a=i.handleAutoShown("axisTick"));if(!a||r.scale.isBlank())return;for(var s=o.getModel("lineStyle"),l=i.tickDirection*o.get("length"),u=qM(r.getTicksCoords(),e.transform,l,k(s.getLineStyle(),{stroke:n.get(["axisLine","lineStyle","color"])}),"ticks"),h=0;hc[1]?-1:1,d=["start"===s?c[0]-p*h:"end"===s?c[1]+p*h:(c[0]+c[1])/2,jM(s)?t.labelOffset+l*h:0],f=e.get("nameRotate");null!=f&&(f=f*HM/180),jM(s)?o=YM.innerTextLayout(t.rotation,null!=f?f:t.rotation,l):(o=function(t,e,n,i){var r,o,a=Kr(n-t),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;$r(a-HM/2)?(o=l?"bottom":"top",r="center"):$r(a-1.5*HM)?(o=l?"top":"bottom",r="center"):(o="middle",r=a<1.5*HM&&a>HM/2?l?"left":"right":l?"right":"left");return{rotation:a,textAlign:r,textVerticalAlign:o}}(t.rotation,s,f||0,c),null!=(a=t.axisNameAvailableWidth)&&(a=Math.abs(a/Math.sin(o.rotation)),!isFinite(a)&&(a=null)));var g=u.getFont(),y=e.get("nameTruncate",!0)||{},v=y.ellipsis,m=it(t.nameTruncateMaxWidth,y.maxWidth,a),x=new Ns({x:d[0],y:d[1],rotation:o.rotation,silent:YM.isLabelSilent(e),style:$h(u,{text:r,font:g,overflow:"truncate",width:m,ellipsis:v,fill:u.getTextColor()||e.get(["axisLine","lineStyle","color"]),align:u.get("align")||o.textAlign,verticalAlign:u.get("verticalAlign")||o.textVerticalAlign}),z2:1});if(Wh({el:x,componentModel:e,itemName:r}),x.__fullText=r,x.anid="name",e.get("triggerEvent")){var _=YM.makeAxisEventDataBase(e);_.targetType="axisName",_.name=r,js(x).eventData=_}i.add(x),x.updateTransform(),n.add(x),x.decomposeTransform()}}};function XM(t){t&&(t.ignore=!0)}function ZM(t,e){var n=t&&t.getBoundingRect().clone(),i=e&&e.getBoundingRect().clone();if(n&&i){var r=ye([]);return _e(r,r,-t.rotation),n.applyTransform(me([],r,t.getLocalTransform())),i.applyTransform(me([],r,e.getLocalTransform())),n.intersect(i)}}function jM(t){return"middle"===t||"center"===t}function qM(t,e,n,i,r){for(var o=[],a=[],s=[],l=0;l=0||t===e}function JM(t){var e=QM(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,o=n.get("status"),a=n.get("value");null!=a&&(a=i.parse(a));var s=tI(n);null==o&&(r.status=s?"show":"hide");var l=i.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==a||a>l[1])&&(a=l[1]),a0&&!c.min?c.min=0:null!=c.min&&c.min<0&&!c.max&&(c.max=0);var p=a;null!=c.color&&(p=k({color:c.color},a));var d=C(T(c),{boundaryGap:t,splitNumber:e,scale:n,axisLine:i,axisTick:r,axisLabel:o,name:c.text,showName:s,nameLocation:"end",nameGap:u,nameTextStyle:p,triggerEvent:h},!1);if(X(l)){var f=d.name;d.name=l.replace("{value}",null!=f?f:"")}else U(l)&&(d.name=l(d.name,d));var g=new xc(d,null,this.ecModel);return R(g,g_.prototype),g.mainType="radar",g.componentIndex=this.componentIndex,g}),this);this._indicatorModels=c},e.prototype.getIndicatorModels=function(){return this._indicatorModels},e.type="radar",e.defaultOption={z:0,center:["50%","50%"],radius:"75%",startAngle:90,axisName:{show:!0},boundaryGap:[0,0],splitNumber:5,axisNameGap:15,scale:!1,shape:"polygon",axisLine:C({lineStyle:{color:"#bbb"}},wI.axisLine),axisLabel:SI(wI.axisLabel,!1),axisTick:SI(wI.axisTick,!1),splitLine:SI(wI.splitLine,!0),splitArea:SI(wI.splitArea,!0),indicator:[]},e}(Ap),II=["axisLine","axisTickLabel","axisName"],TI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeAll(),this._buildAxes(t),this._buildSplitLineAndArea(t)},e.prototype._buildAxes=function(t){var e=t.coordinateSystem;E(z(e.getIndicatorAxes(),(function(t){var n=t.model.get("showName")?t.name:"";return new YM(t.model,{axisName:n,position:[e.cx,e.cy],rotation:t.angle,labelDirection:-1,tickDirection:-1,nameDirection:1})})),(function(t){E(II,t.add,t),this.group.add(t.getGroup())}),this)},e.prototype._buildSplitLineAndArea=function(t){var e=t.coordinateSystem,n=e.getIndicatorAxes();if(n.length){var i=t.get("shape"),r=t.getModel("splitLine"),o=t.getModel("splitArea"),a=r.getModel("lineStyle"),s=o.getModel("areaStyle"),l=r.get("show"),u=o.get("show"),h=a.get("color"),c=s.get("color"),p=Y(h)?h:[h],d=Y(c)?c:[c],f=[],g=[];if("circle"===i)for(var y=n[0].getTicksCoords(),v=e.cx,m=e.cy,x=0;x3?1.4:r>1?1.2:1.1;RI(this,"zoom","zoomOnMouseWheel",t,{scale:i>0?s:1/s,originX:o,originY:a,isAvailableBehavior:null})}if(n){var l=Math.abs(i);RI(this,"scrollMove","moveOnMouseWheel",t,{scrollDelta:(i>0?1:-1)*(l>3?.4:l>1?.15:.05),originX:o,originY:a,isAvailableBehavior:null})}}},e.prototype._pinchHandler=function(t){LI(this._zr,"globalPan")||RI(this,"zoom",null,t,{scale:t.pinchScale>1?1.1:1/1.1,originX:t.pinchX,originY:t.pinchY,isAvailableBehavior:null})},e}(Xt);function RI(t,e,n,i,r){t.pointerChecker&&t.pointerChecker(i,r.originX,r.originY)&&(he(i.event),NI(t,e,n,i,r))}function NI(t,e,n,i,r){r.isAvailableBehavior=W(EI,null,n,i),t.trigger(e,r)}function EI(t,e,n){var i=n[t];return!t||i&&(!X(i)||e.event[i+"Key"])}function zI(t,e,n){var i=t.target;i.x+=e,i.y+=n,i.dirty()}function VI(t,e,n,i){var r=t.target,o=t.zoomLimit,a=t.zoom=t.zoom||1;if(a*=e,o){var s=o.min||0,l=o.max||1/0;a=Math.max(Math.min(l,a),s)}var u=a/t.zoom;t.zoom=a,r.x-=(n-r.x)*(u-1),r.y-=(i-r.y)*(u-1),r.scaleX*=u,r.scaleY*=u,r.dirty()}var BI,FI={axisPointer:1,tooltip:1,brush:1};function GI(t,e,n){var i=e.getComponentByElement(t.topTarget),r=i&&i.coordinateSystem;return i&&i!==n&&!FI.hasOwnProperty(i.mainType)&&r&&r.model!==n}function WI(t){X(t)&&(t=(new DOMParser).parseFromString(t,"text/xml"));var e=t;for(9===e.nodeType&&(e=e.firstChild);"svg"!==e.nodeName.toLowerCase()||1!==e.nodeType;)e=e.nextSibling;return e}var HI={fill:"fill",stroke:"stroke","stroke-width":"lineWidth",opacity:"opacity","fill-opacity":"fillOpacity","stroke-opacity":"strokeOpacity","stroke-dasharray":"lineDash","stroke-dashoffset":"lineDashOffset","stroke-linecap":"lineCap","stroke-linejoin":"lineJoin","stroke-miterlimit":"miterLimit","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","text-anchor":"textAlign",visibility:"visibility",display:"display"},YI=G(HI),UI={"alignment-baseline":"textBaseline","stop-color":"stopColor"},XI=G(UI),ZI=function(){function t(){this._defs={},this._root=null}return t.prototype.parse=function(t,e){e=e||{};var n=WI(t);this._defsUsePending=[];var i=new Pr;this._root=i;var r=[],o=n.getAttribute("viewBox")||"",a=parseFloat(n.getAttribute("width")||e.width),s=parseFloat(n.getAttribute("height")||e.height);isNaN(a)&&(a=null),isNaN(s)&&(s=null),QI(n,i,null,!0,!1);for(var l,u,h=n.firstChild;h;)this._parseNode(h,i,r,null,!1,!1),h=h.nextSibling;if(function(t,e){for(var n=0;n=4&&(l={x:parseFloat(c[0]||0),y:parseFloat(c[1]||0),width:parseFloat(c[2]),height:parseFloat(c[3])})}if(l&&null!=a&&null!=s&&(u=lT(l,{x:0,y:0,width:a,height:s}),!e.ignoreViewBox)){var p=i;(i=new Pr).add(p),p.scaleX=p.scaleY=u.scale,p.x=u.x,p.y=u.y}return e.ignoreRootClip||null==a||null==s||i.setClipPath(new Ps({shape:{x:0,y:0,width:a,height:s}})),{root:i,width:a,height:s,viewBoxRect:l,viewBoxTransform:u,named:r}},t.prototype._parseNode=function(t,e,n,i,r,o){var a,s=t.nodeName.toLowerCase(),l=i;if("defs"===s&&(r=!0),"text"===s&&(o=!0),"defs"===s||"switch"===s)a=e;else{if(!r){var u=BI[s];if(u&&mt(BI,s)){a=u.call(this,t,e);var h=t.getAttribute("name");if(h){var c={name:h,namedFrom:null,svgNodeTagLower:s,el:a};n.push(c),"g"===s&&(l=c)}else i&&n.push({name:i.name,namedFrom:i,svgNodeTagLower:s,el:a});e.add(a)}}var p=jI[s];if(p&&mt(jI,s)){var d=p.call(this,t),f=t.getAttribute("id");f&&(this._defs[f]=d)}}if(a&&a.isGroup)for(var g=t.firstChild;g;)1===g.nodeType?this._parseNode(g,a,n,l,r,o):3===g.nodeType&&o&&this._parseText(g,a),g=g.nextSibling},t.prototype._parseText=function(t,e){var n=new ws({style:{text:t.textContent},silent:!0,x:this._textX||0,y:this._textY||0});$I(e,n),QI(t,n,this._defsUsePending,!1,!1),function(t,e){var n=e.__selfStyle;if(n){var i=n.textBaseline,r=i;i&&"auto"!==i?"baseline"===i?r="alphabetic":"before-edge"===i||"text-before-edge"===i?r="top":"after-edge"===i||"text-after-edge"===i?r="bottom":"central"!==i&&"mathematical"!==i||(r="middle"):r="alphabetic",t.style.textBaseline=r}var o=e.__inheritedStyle;if(o){var a=o.textAlign,s=a;a&&("middle"===a&&(s="center"),t.style.textAlign=s)}}(n,e);var i=n.style,r=i.fontSize;r&&r<9&&(i.fontSize=9,n.scaleX*=r/9,n.scaleY*=r/9);var o=(i.fontSize||i.fontFamily)&&[i.fontStyle,i.fontWeight,(i.fontSize||12)+"px",i.fontFamily||"sans-serif"].join(" ");i.font=o;var a=n.getBoundingRect();return this._textX+=a.width,e.add(n),n},t.internalField=void(BI={g:function(t,e){var n=new Pr;return $I(e,n),QI(t,n,this._defsUsePending,!1,!1),n},rect:function(t,e){var n=new Ps;return $I(e,n),QI(t,n,this._defsUsePending,!1,!1),n.setShape({x:parseFloat(t.getAttribute("x")||"0"),y:parseFloat(t.getAttribute("y")||"0"),width:parseFloat(t.getAttribute("width")||"0"),height:parseFloat(t.getAttribute("height")||"0")}),n.silent=!0,n},circle:function(t,e){var n=new gu;return $I(e,n),QI(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),r:parseFloat(t.getAttribute("r")||"0")}),n.silent=!0,n},line:function(t,e){var n=new Wu;return $I(e,n),QI(t,n,this._defsUsePending,!1,!1),n.setShape({x1:parseFloat(t.getAttribute("x1")||"0"),y1:parseFloat(t.getAttribute("y1")||"0"),x2:parseFloat(t.getAttribute("x2")||"0"),y2:parseFloat(t.getAttribute("y2")||"0")}),n.silent=!0,n},ellipse:function(t,e){var n=new vu;return $I(e,n),QI(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),rx:parseFloat(t.getAttribute("rx")||"0"),ry:parseFloat(t.getAttribute("ry")||"0")}),n.silent=!0,n},polygon:function(t,e){var n,i=t.getAttribute("points");i&&(n=JI(i));var r=new zu({shape:{points:n||[]},silent:!0});return $I(e,r),QI(t,r,this._defsUsePending,!1,!1),r},polyline:function(t,e){var n,i=t.getAttribute("points");i&&(n=JI(i));var r=new Bu({shape:{points:n||[]},silent:!0});return $I(e,r),QI(t,r,this._defsUsePending,!1,!1),r},image:function(t,e){var n=new Is;return $I(e,n),QI(t,n,this._defsUsePending,!1,!1),n.setStyle({image:t.getAttribute("xlink:href")||t.getAttribute("href"),x:+t.getAttribute("x"),y:+t.getAttribute("y"),width:+t.getAttribute("width"),height:+t.getAttribute("height")}),n.silent=!0,n},text:function(t,e){var n=t.getAttribute("x")||"0",i=t.getAttribute("y")||"0",r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0";this._textX=parseFloat(n)+parseFloat(r),this._textY=parseFloat(i)+parseFloat(o);var a=new Pr;return $I(e,a),QI(t,a,this._defsUsePending,!1,!0),a},tspan:function(t,e){var n=t.getAttribute("x"),i=t.getAttribute("y");null!=n&&(this._textX=parseFloat(n)),null!=i&&(this._textY=parseFloat(i));var r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0",a=new Pr;return $I(e,a),QI(t,a,this._defsUsePending,!1,!0),this._textX+=parseFloat(r),this._textY+=parseFloat(o),a},path:function(t,e){var n=pu(t.getAttribute("d")||"");return $I(e,n),QI(t,n,this._defsUsePending,!1,!1),n.silent=!0,n}}),t}(),jI={lineargradient:function(t){var e=parseInt(t.getAttribute("x1")||"0",10),n=parseInt(t.getAttribute("y1")||"0",10),i=parseInt(t.getAttribute("x2")||"10",10),r=parseInt(t.getAttribute("y2")||"0",10),o=new $u(e,n,i,r);return qI(t,o),KI(t,o),o},radialgradient:function(t){var e=parseInt(t.getAttribute("cx")||"0",10),n=parseInt(t.getAttribute("cy")||"0",10),i=parseInt(t.getAttribute("r")||"0",10),r=new Ju(e,n,i);return qI(t,r),KI(t,r),r}};function qI(t,e){"userSpaceOnUse"===t.getAttribute("gradientUnits")&&(e.global=!0)}function KI(t,e){for(var n=t.firstChild;n;){if(1===n.nodeType&&"stop"===n.nodeName.toLocaleLowerCase()){var i=n.getAttribute("offset"),r=void 0;r=i&&i.indexOf("%")>0?parseInt(i,10)/100:i?parseFloat(i):0;var o={};sT(n,o,o);var a=o.stopColor||n.getAttribute("stop-color")||"#000000";e.colorStops.push({offset:r,color:a})}n=n.nextSibling}}function $I(t,e){t&&t.__inheritedStyle&&(e.__inheritedStyle||(e.__inheritedStyle={}),k(e.__inheritedStyle,t.__inheritedStyle))}function JI(t){for(var e=iT(t),n=[],i=0;i0;o-=2){var a=i[o],s=i[o-1],l=iT(a);switch(r=r||[1,0,0,1,0,0],s){case"translate":xe(r,r,[parseFloat(l[0]),parseFloat(l[1]||"0")]);break;case"scale":be(r,r,[parseFloat(l[0]),parseFloat(l[1]||l[0])]);break;case"rotate":_e(r,r,-parseFloat(l[0])*oT);break;case"skewX":me(r,[1,0,Math.tan(parseFloat(l[0])*oT),1,0,0],r);break;case"skewY":me(r,[1,Math.tan(parseFloat(l[0])*oT),0,1,0,0],r);break;case"matrix":r[0]=parseFloat(l[0]),r[1]=parseFloat(l[1]),r[2]=parseFloat(l[2]),r[3]=parseFloat(l[3]),r[4]=parseFloat(l[4]),r[5]=parseFloat(l[5])}}e.setLocalTransform(r)}}(t,e),sT(t,a,s),i||function(t,e,n){for(var i=0;i0,f={api:n,geo:s,mapOrGeoModel:t,data:a,isVisualEncodedByVisualMap:d,isGeo:o,transformInfoRaw:c};"geoJSON"===s.resourceType?this._buildGeoJSON(f):"geoSVG"===s.resourceType&&this._buildSVG(f),this._updateController(t,e,n),this._updateMapSelectHandler(t,l,n,i)},t.prototype._buildGeoJSON=function(t){var e=this._regionsGroupByName=ft(),n=ft(),i=this._regionsGroup,r=t.transformInfoRaw,o=t.mapOrGeoModel,a=t.data,s=t.geo.projection,l=s&&s.stream;function u(t,e){return e&&(t=e(t)),t&&[t[0]*r.scaleX+r.x,t[1]*r.scaleY+r.y]}function h(t){for(var e=[],n=!l&&s&&s.project,i=0;i=0)&&(p=r);var d=a?{normal:{align:"center",verticalAlign:"middle"}}:null;qh(e,Kh(i),{labelFetcher:p,labelDataIndex:c,defaultText:n},d);var f=e.getTextContent();if(f&&(AT(f).ignore=f.ignore,e.textConfig&&a)){var g=e.getBoundingRect().clone();e.textConfig.layoutRect=g,e.textConfig.position=[(a[0]-g.x)/g.width*100+"%",(a[1]-g.y)/g.height*100+"%"]}e.disableLabelAnimation=!0}else e.removeTextContent(),e.removeTextConfig(),e.disableLabelAnimation=null}function NT(t,e,n,i,r,o){t.data?t.data.setItemGraphicEl(o,e):js(e).eventData={componentType:"geo",componentIndex:r.componentIndex,geoIndex:r.componentIndex,name:n,region:i&&i.option||{}}}function ET(t,e,n,i,r){t.data||Wh({el:e,componentModel:r,itemName:n,itemTooltipOption:i.get("tooltip")})}function zT(t,e,n,i,r){e.highDownSilentOnTouch=!!r.get("selectedMode");var o=i.getModel("emphasis"),a=o.get("focus");return Bl(e,a,o.get("blurScope"),o.get("disabled")),t.isGeo&&function(t,e,n){var i=js(t);i.componentMainType=e.mainType,i.componentIndex=e.componentIndex,i.componentHighDownName=n}(e,r,n),a}function VT(t,e,n){var i,r=[];function o(){i=[]}function a(){i.length&&(r.push(i),i=[])}var s=e({polygonStart:o,polygonEnd:a,lineStart:o,lineEnd:a,point:function(t,e){isFinite(t)&&isFinite(e)&&i.push([t,e])},sphere:function(){}});return!n&&s.polygonStart(),E(t,(function(t){s.lineStart();for(var e=0;e-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2),n},e.type="series.map",e.dependencies=["geo"],e.layoutMode="box",e.defaultOption={z:2,coordinateSystem:"geo",map:"",left:"center",top:"center",aspectScale:null,showLegendSymbol:!0,boundingCoords:null,center:null,zoom:1,scaleLimit:null,selectedMode:!0,label:{show:!1,color:"#000"},itemStyle:{borderWidth:.5,borderColor:"#444",areaColor:"#eee"},emphasis:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{areaColor:"rgba(255,215,0,0.8)"}},select:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{color:"rgba(255,215,0,0.8)"}},nameProperty:"name"},e}(hg);function GT(t){var e={};t.eachSeriesByType("map",(function(t){var n=t.getHostGeoModel(),i=n?"o"+n.id:"i"+t.getMapType();(e[i]=e[i]||[]).push(t)})),E(e,(function(t,e){for(var n,i,r,o=(n=z(t,(function(t){return t.getData()})),i=t[0].get("mapValueCalculation"),r={},E(n,(function(t){t.each(t.mapDimension("value"),(function(e,n){var i="ec-"+t.getName(n);r[i]=r[i]||[],isNaN(e)||r[i].push(e)}))})),n[0].map(n[0].mapDimension("value"),(function(t,e){for(var o="ec-"+n[0].getName(e),a=0,s=1/0,l=-1/0,u=r[o].length,h=0;h1?(d.width=p,d.height=p/x):(d.height=p,d.width=p*x),d.y=c[1]-d.height/2,d.x=c[0]-d.width/2;else{var b=t.getBoxLayoutParams();b.aspect=x,d=wp(b,{width:v,height:m})}this.setViewRect(d.x,d.y,d.width,d.height),this.setCenter(t.get("center"),e),this.setZoom(t.get("zoom"))}R(jT,YT);var $T=function(){function t(){this.dimensions=ZT}return t.prototype.create=function(t,e){var n=[];function i(t){return{nameProperty:t.get("nameProperty"),aspectScale:t.get("aspectScale"),projection:t.get("projection")}}t.eachComponent("geo",(function(t,r){var o=t.get("map"),a=new jT(o+r,o,A({nameMap:t.get("nameMap")},i(t)));a.zoomLimit=t.get("scaleLimit"),n.push(a),t.coordinateSystem=a,a.model=t,a.resize=KT,a.resize(t,e)})),t.eachSeries((function(t){if("geo"===t.get("coordinateSystem")){var e=t.get("geoIndex")||0;t.coordinateSystem=n[e]}}));var r={};return t.eachSeriesByType("map",(function(t){if(!t.getHostGeoModel()){var e=t.getMapType();r[e]=r[e]||[],r[e].push(t)}})),E(r,(function(t,r){var o=z(t,(function(t){return t.get("nameMap")})),a=new jT(r,r,A({nameMap:D(o)},i(t[0])));a.zoomLimit=it.apply(null,z(t,(function(t){return t.get("scaleLimit")}))),n.push(a),a.resize=KT,a.resize(t[0],e),E(t,(function(t){t.coordinateSystem=a,function(t,e){E(e.get("geoCoord"),(function(e,n){t.addGeoCoord(n,e)}))}(a,t)}))})),n},t.prototype.getFilledRegions=function(t,e,n,i){for(var r=(t||[]).slice(),o=ft(),a=0;a=0;){var o=e[n];o.hierNode.prelim+=i,o.hierNode.modifier+=i,r+=o.hierNode.change,i+=o.hierNode.shift+r}}(t);var o=(n[0].hierNode.prelim+n[n.length-1].hierNode.prelim)/2;r?(t.hierNode.prelim=r.hierNode.prelim+e(t,r),t.hierNode.modifier=t.hierNode.prelim-o):t.hierNode.prelim=o}else r&&(t.hierNode.prelim=r.hierNode.prelim+e(t,r));t.parentNode.hierNode.defaultAncestor=function(t,e,n,i){if(e){for(var r=t,o=t,a=o.parentNode.children[0],s=e,l=r.hierNode.modifier,u=o.hierNode.modifier,h=a.hierNode.modifier,c=s.hierNode.modifier;s=uC(s),o=hC(o),s&&o;){r=uC(r),a=hC(a),r.hierNode.ancestor=t;var p=s.hierNode.prelim+c-o.hierNode.prelim-u+i(s,o);p>0&&(pC(cC(s,t,n),t,p),u+=p,l+=p),c+=s.hierNode.modifier,u+=o.hierNode.modifier,l+=r.hierNode.modifier,h+=a.hierNode.modifier}s&&!uC(r)&&(r.hierNode.thread=s,r.hierNode.modifier+=c-l),o&&!hC(a)&&(a.hierNode.thread=o,a.hierNode.modifier+=u-h,n=t)}return n}(t,r,t.parentNode.hierNode.defaultAncestor||i[0],e)}function aC(t){var e=t.hierNode.prelim+t.parentNode.hierNode.modifier;t.setLayout({x:e},!0),t.hierNode.modifier+=t.parentNode.hierNode.modifier}function sC(t){return arguments.length?t:dC}function lC(t,e){return t-=Math.PI/2,{x:e*Math.cos(t),y:e*Math.sin(t)}}function uC(t){var e=t.children;return e.length&&t.isExpand?e[e.length-1]:t.hierNode.thread}function hC(t){var e=t.children;return e.length&&t.isExpand?e[0]:t.hierNode.thread}function cC(t,e,n){return t.hierNode.ancestor.parentNode===e.parentNode?t.hierNode.ancestor:n}function pC(t,e,n){var i=n/(e.hierNode.i-t.hierNode.i);e.hierNode.change-=i,e.hierNode.shift+=n,e.hierNode.modifier+=n,e.hierNode.prelim+=n,t.hierNode.change+=i}function dC(t,e){return t.parentNode===e.parentNode?1:2}var fC=function(){this.parentPoint=[],this.childPoints=[]},gC=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new fC},e.prototype.buildPath=function(t,e){var n=e.childPoints,i=n.length,r=e.parentPoint,o=n[0],a=n[i-1];if(1===i)return t.moveTo(r[0],r[1]),void t.lineTo(o[0],o[1]);var s=e.orient,l="TB"===s||"BT"===s?0:1,u=1-l,h=Gr(e.forkPosition,1),c=[];c[l]=r[l],c[u]=r[u]+(a[u]-r[u])*h,t.moveTo(r[0],r[1]),t.lineTo(c[0],c[1]),t.moveTo(o[0],o[1]),c[l]=o[l],t.lineTo(c[0],c[1]),c[l]=a[l],t.lineTo(c[0],c[1]),t.lineTo(a[0],a[1]);for(var p=1;pm.x)||(_-=Math.PI);var S=b?"left":"right",M=s.getModel("label"),I=M.get("rotate"),T=I*(Math.PI/180),C=y.getTextContent();C&&(y.setTextConfig({position:M.get("position")||S,rotation:null==I?-_:T,origin:"center"}),C.setStyle("verticalAlign","middle"))}var D=s.get(["emphasis","focus"]),A="relative"===D?gt(a.getAncestorsIndices(),a.getDescendantIndices()):"ancestor"===D?a.getAncestorsIndices():"descendant"===D?a.getDescendantIndices():null;A&&(js(n).focus=A),function(t,e,n,i,r,o,a,s){var l=e.getModel(),u=t.get("edgeShape"),h=t.get("layout"),c=t.getOrient(),p=t.get(["lineStyle","curveness"]),d=t.get("edgeForkPosition"),f=l.getModel("lineStyle").getLineStyle(),g=i.__edge;if("curve"===u)e.parentNode&&e.parentNode!==n&&(g||(g=i.__edge=new Xu({shape:wC(h,c,p,r,r)})),uh(g,{shape:wC(h,c,p,o,a)},t));else if("polyline"===u)if("orthogonal"===h){if(e!==n&&e.children&&0!==e.children.length&&!0===e.isExpand){for(var y=e.children,v=[],m=0;me&&(e=i.height)}this.height=e+1},t.prototype.getNodeById=function(t){if(this.getId()===t)return this;for(var e=0,n=this.children,i=n.length;e=0&&this.hostTree.data.setItemLayout(this.dataIndex,t,e)},t.prototype.getLayout=function(){return this.hostTree.data.getItemLayout(this.dataIndex)},t.prototype.getModel=function(t){if(!(this.dataIndex<0))return this.hostTree.data.getItemModel(this.dataIndex).getModel(t)},t.prototype.getLevelModel=function(){return(this.hostTree.levelModels||[])[this.depth]},t.prototype.setVisual=function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemVisual(this.dataIndex,t,e)},t.prototype.getVisual=function(t){return this.hostTree.data.getItemVisual(this.dataIndex,t)},t.prototype.getRawIndex=function(){return this.hostTree.data.getRawIndex(this.dataIndex)},t.prototype.getId=function(){return this.hostTree.data.getId(this.dataIndex)},t.prototype.getChildIndex=function(){if(this.parentNode){for(var t=this.parentNode.children,e=0;e=0){var i=n.getData().tree.root,r=t.targetNode;if(X(r)&&(r=i.getNodeById(r)),r&&i.contains(r))return{node:r};var o=t.targetNodeId;if(null!=o&&(r=i.getNodeById(o)))return{node:r}}}function NC(t){for(var e=[];t;)(t=t.parentNode)&&e.push(t);return e.reverse()}function EC(t,e){return P(NC(t),e)>=0}function zC(t,e){for(var n=[];t;){var i=t.dataIndex;n.push({name:t.name,dataIndex:i,value:e.getRawValue(i)}),t=t.parentNode}return n.reverse(),n}var VC=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.hasSymbolVisual=!0,e.ignoreStyleOnData=!0,e}return n(e,t),e.prototype.getInitialData=function(t){var e={name:t.name,children:t.data},n=t.leaves||{},i=new xc(n,this,this.ecModel),r=OC.createTree(e,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e);return n&&n.children.length&&n.isExpand||(t.parentModel=i),t}))}));var o=0;r.eachNode("preorder",(function(t){t.depth>o&&(o=t.depth)}));var a=t.expandAndCollapse&&t.initialTreeDepth>=0?t.initialTreeDepth:o;return r.root.eachNode("preorder",(function(t){var e=t.hostTree.data.getRawDataItem(t.dataIndex);t.isExpand=e&&null!=e.collapsed?!e.collapsed:t.depth<=a})),r.data},e.prototype.getOrient=function(){var t=this.get("orient");return"horizontal"===t?t="LR":"vertical"===t&&(t="TB"),t},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.formatTooltip=function(t,e,n){for(var i=this.getData().tree,r=i.root.children[0],o=i.getNodeByDataIndex(t),a=o.getValue(),s=o.name;o&&o!==r;)s=o.parentNode.name+"."+s,o=o.parentNode;return qf("nameValue",{name:s,value:a,noValue:isNaN(a)||null==a})},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=zC(i,this),n.collapsed=!i.isExpand,n},e.type="series.tree",e.layoutMode="box",e.defaultOption={z:2,coordinateSystem:"view",left:"12%",top:"12%",right:"12%",bottom:"12%",layout:"orthogonal",edgeShape:"curve",edgeForkPosition:"50%",roam:!1,nodeScaleRatio:.4,center:null,zoom:1,orient:"LR",symbol:"emptyCircle",symbolSize:7,expandAndCollapse:!0,initialTreeDepth:2,lineStyle:{color:"#ccc",width:1.5,curveness:.5},itemStyle:{color:"lightsteelblue",borderWidth:1.5},label:{show:!0},animationEasing:"linear",animationDuration:700,animationDurationUpdate:500},e}(hg);function BC(t,e){for(var n,i=[t];n=i.pop();)if(e(n),n.isExpand){var r=n.children;if(r.length)for(var o=r.length-1;o>=0;o--)i.push(r[o])}}function FC(t,e){t.eachSeriesByType("tree",(function(t){!function(t,e){var n=function(t,e){return wp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=n;var i=t.get("layout"),r=0,o=0,a=null;"radial"===i?(r=2*Math.PI,o=Math.min(n.height,n.width)/2,a=sC((function(t,e){return(t.parentNode===e.parentNode?1:2)/t.depth}))):(r=n.width,o=n.height,a=sC());var s=t.getData().tree.root,l=s.children[0];if(l){!function(t){var e=t;e.hierNode={defaultAncestor:null,ancestor:e,prelim:0,modifier:0,change:0,shift:0,i:0,thread:null};for(var n,i,r=[e];n=r.pop();)if(i=n.children,n.isExpand&&i.length)for(var o=i.length-1;o>=0;o--){var a=i[o];a.hierNode={defaultAncestor:null,ancestor:a,prelim:0,modifier:0,change:0,shift:0,i:o,thread:null},r.push(a)}}(s),function(t,e,n){for(var i,r=[t],o=[];i=r.pop();)if(o.push(i),i.isExpand){var a=i.children;if(a.length)for(var s=0;sh.getLayout().x&&(h=t),t.depth>c.depth&&(c=t)}));var p=u===h?1:a(u,h)/2,d=p-u.getLayout().x,f=0,g=0,y=0,v=0;if("radial"===i)f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),BC(l,(function(t){y=(t.getLayout().x+d)*f,v=(t.depth-1)*g;var e=lC(y,v);t.setLayout({x:e.x,y:e.y,rawX:y,rawY:v},!0)}));else{var m=t.getOrient();"RL"===m||"LR"===m?(g=o/(h.getLayout().x+p+d),f=r/(c.depth-1||1),BC(l,(function(t){v=(t.getLayout().x+d)*g,y="LR"===m?(t.depth-1)*f:r-(t.depth-1)*f,t.setLayout({x:y,y:v},!0)}))):"TB"!==m&&"BT"!==m||(f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),BC(l,(function(t){y=(t.getLayout().x+d)*f,v="TB"===m?(t.depth-1)*g:o-(t.depth-1)*g,t.setLayout({x:y,y:v},!0)})))}}}(t,e)}))}function GC(t){t.eachSeriesByType("tree",(function(t){var e=t.getData();e.tree.eachNode((function(t){var n=t.getModel().getModel("itemStyle").getItemStyle();A(e.ensureUniqueItemVisual(t.dataIndex,"style"),n)}))}))}var WC=["treemapZoomToNode","treemapRender","treemapMove"];function HC(t){var e=t.getData().tree,n={};e.eachNode((function(e){for(var i=e;i&&i.depth>1;)i=i.parentNode;var r=rd(t.ecModel,i.name||i.dataIndex+"",n);e.setVisual("decal",r)}))}var YC=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.preventUsingHoverLayer=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};UC(n);var i=t.levels||[],r=this.designatedVisualItemStyle={},o=new xc({itemStyle:r},this,e);i=t.levels=function(t,e){var n,i,r=yo(e.get("color")),o=yo(e.get(["aria","decal","decals"]));if(!r)return;E(t=t||[],(function(t){var e=new xc(t),r=e.get("color"),o=e.get("decal");(e.get(["itemStyle","color"])||r&&"none"!==r)&&(n=!0),(e.get(["itemStyle","decal"])||o&&"none"!==o)&&(i=!0)}));var a=t[0]||(t[0]={});n||(a.color=r.slice());!i&&o&&(a.decal=o.slice());return t}(i,e);var a=z(i||[],(function(t){return new xc(t,o,e)}),this),s=OC.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=s.getNodeByDataIndex(e),i=n?a[n.depth]:null;return t.parentModel=i||o,t}))}));return s.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.formatTooltip=function(t,e,n){var i=this.getData(),r=this.getRawValue(t);return qf("nameValue",{name:i.getName(t),value:r})},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=zC(i,this),n.treePathInfo=n.treeAncestors,n},e.prototype.setLayoutInfo=function(t){this.layoutInfo=this.layoutInfo||{},A(this.layoutInfo,t)},e.prototype.mapIdToIndex=function(t){var e=this._idIndexMap;e||(e=this._idIndexMap=ft(),this._idIndexMapCount=0);var n=e.get(t);return null==n&&e.set(t,n=this._idIndexMapCount++),n},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},e.prototype.enableAriaDecal=function(){HC(this)},e.type="series.treemap",e.layoutMode="box",e.defaultOption={progressive:0,left:"center",top:"middle",width:"80%",height:"80%",sort:!0,clipWindow:"origin",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:"▶",zoomToNodeRatio:.1024,roam:!0,nodeClick:"zoomToNode",animation:!0,animationDurationUpdate:900,animationEasing:"quinticInOut",breadcrumb:{show:!0,height:22,left:"center",top:"bottom",emptyItemWidth:25,itemStyle:{color:"rgba(0,0,0,0.7)",textStyle:{color:"#fff"}},emphasis:{itemStyle:{color:"rgba(0,0,0,0.9)"}}},label:{show:!0,distance:0,padding:5,position:"inside",color:"#fff",overflow:"truncate"},upperLabel:{show:!1,position:[0,"50%"],height:20,overflow:"truncate",verticalAlign:"middle"},itemStyle:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:"#fff",borderColorSaturation:null},emphasis:{upperLabel:{show:!0,position:[0,"50%"],overflow:"truncate",verticalAlign:"middle"}},visualDimension:0,visualMin:null,visualMax:null,color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:"index",visibleMin:10,childrenVisibleMin:null,levels:[]},e}(hg);function UC(t){var e=0;E(t.children,(function(t){UC(t);var n=t.value;Y(n)&&(n=n[0]),e+=n}));var n=t.value;Y(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),Y(t.value)?t.value[0]=n:t.value=n}var XC=function(){function t(t){this.group=new Pr,t.add(this.group)}return t.prototype.render=function(t,e,n,i){var r=t.getModel("breadcrumb"),o=this.group;if(o.removeAll(),r.get("show")&&n){var a=r.getModel("itemStyle"),s=r.getModel("emphasis"),l=a.getModel("textStyle"),u=s.getModel(["itemStyle","textStyle"]),h={pos:{left:r.get("left"),right:r.get("right"),top:r.get("top"),bottom:r.get("bottom")},box:{width:e.getWidth(),height:e.getHeight()},emptyItemWidth:r.get("emptyItemWidth"),totalWidth:0,renderList:[]};this._prepare(n,h,l),this._renderContent(t,h,a,s,l,u,i),Sp(o,h.pos,h.box)}},t.prototype._prepare=function(t,e,n){for(var i=t;i;i=i.parentNode){var r=Mo(i.getModel().get("name"),""),o=n.getTextRect(r),a=Math.max(o.width+16,e.emptyItemWidth);e.totalWidth+=a+8,e.renderList.push({node:i,text:r,width:a})}},t.prototype._renderContent=function(t,e,n,i,r,o,a){for(var s,l,u,h,c,p,d,f,g,y=0,v=e.emptyItemWidth,m=t.get(["breadcrumb","height"]),x=(s=e.pos,l=e.box,h=l.width,c=l.height,p=Gr(s.left,h),d=Gr(s.top,c),f=Gr(s.right,h),g=Gr(s.bottom,c),(isNaN(p)||isNaN(parseFloat(s.left)))&&(p=0),(isNaN(f)||isNaN(parseFloat(s.right)))&&(f=h),(isNaN(d)||isNaN(parseFloat(s.top)))&&(d=0),(isNaN(g)||isNaN(parseFloat(s.bottom)))&&(g=c),u=up(u||0),{width:Math.max(f-p-u[1]-u[3],0),height:Math.max(g-d-u[0]-u[2],0)}),_=e.totalWidth,b=e.renderList,w=i.getModel("itemStyle").getItemStyle(),S=b.length-1;S>=0;S--){var M=b[S],I=M.node,T=M.width,C=M.text;_>x.width&&(_-=T-v,T=v,C=null);var D=new zu({shape:{points:ZC(y,0,T,m,S===b.length-1,0===S)},style:k(n.getItemStyle(),{lineJoin:"bevel"}),textContent:new Ns({style:$h(r,{text:C})}),textConfig:{position:"inside"},z2:1e5,onclick:H(a,I)});D.disableLabelAnimation=!0,D.getTextContent().ensureState("emphasis").style=$h(o,{text:C}),D.ensureState("emphasis").style=w,Bl(D,i.get("focus"),i.get("blurScope"),i.get("disabled")),this.group.add(D),jC(D,t,I),y+=T+8}},t.prototype.remove=function(){this.group.removeAll()},t}();function ZC(t,e,n,i,r,o){var a=[[r?t:t-5,e],[t+n,e],[t+n,e+i],[r?t:t-5,e+i]];return!o&&a.splice(2,0,[t+n+5,e+i/2]),!r&&a.push([t,e+i/2]),a}function jC(t,e,n){js(t).eventData={componentType:"series",componentSubType:"treemap",componentIndex:e.componentIndex,seriesIndex:e.seriesIndex,seriesName:e.name,seriesType:"treemap",selfType:"breadcrumb",nodeData:{dataIndex:n&&n.dataIndex,name:n&&n.name},treePathInfo:n&&zC(n,e)}}var qC=function(){function t(){this._storage=[],this._elExistsMap={}}return t.prototype.add=function(t,e,n,i,r){return!this._elExistsMap[t.id]&&(this._elExistsMap[t.id]=!0,this._storage.push({el:t,target:e,duration:n,delay:i,easing:r}),!0)},t.prototype.finished=function(t){return this._finishedCallback=t,this},t.prototype.start=function(){for(var t=this,e=this._storage.length,n=function(){--e<=0&&(t._storage.length=0,t._elExistsMap={},t._finishedCallback&&t._finishedCallback())},i=0,r=this._storage.length;i3||Math.abs(t.dy)>3)){var e=this.seriesModel.getData().tree.root;if(!e)return;var n=e.getLayout();if(!n)return;this.api.dispatchAction({type:"treemapMove",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:n.x+t.dx,y:n.y+t.dy,width:n.width,height:n.height}})}},e.prototype._onZoom=function(t){var e=t.originX,n=t.originY;if("animating"!==this._state){var i=this.seriesModel.getData().tree.root;if(!i)return;var r=i.getLayout();if(!r)return;var o=new Re(r.x,r.y,r.width,r.height),a=this.seriesModel.layoutInfo,s=[1,0,0,1,0,0];xe(s,s,[-(e-=a.x),-(n-=a.y)]),be(s,s,[t.scale,t.scale]),xe(s,s,[e,n]),o.applyTransform(s),this.api.dispatchAction({type:"treemapRender",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:o.x,y:o.y,width:o.width,height:o.height}})}},e.prototype._initEvents=function(t){var e=this;t.on("click",(function(t){if("ready"===e._state){var n=e.seriesModel.get("nodeClick",!0);if(n){var i=e.findTarget(t.offsetX,t.offsetY);if(i){var r=i.node;if(r.getLayout().isLeafRoot)e._rootToNode(i);else if("zoomToNode"===n)e._zoomToNode(i);else if("link"===n){var o=r.hostTree.data.getItemModel(r.dataIndex),a=o.get("link",!0),s=o.get("target",!0)||"blank";a&&yp(a,s)}}}}}),this)},e.prototype._renderBreadcrumb=function(t,e,n){var i=this;n||(n=null!=t.get("leafDepth",!0)?{node:t.getViewRoot()}:this.findTarget(e.getWidth()/2,e.getHeight()/2))||(n={node:t.getData().tree.root}),(this._breadcrumb||(this._breadcrumb=new XC(this.group))).render(t,e,n.node,(function(e){"animating"!==i._state&&(EC(t.getViewRoot(),e)?i._rootToNode({node:e}):i._zoomToNode({node:e}))}))},e.prototype.remove=function(){this._clearController(),this._containerGroup&&this._containerGroup.removeAll(),this._storage={nodeGroup:[],background:[],content:[]},this._state="ready",this._breadcrumb&&this._breadcrumb.remove()},e.prototype.dispose=function(){this._clearController()},e.prototype._zoomToNode=function(t){this.api.dispatchAction({type:"treemapZoomToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype._rootToNode=function(t){this.api.dispatchAction({type:"treemapRootToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype.findTarget=function(t,e){var n;return this.seriesModel.getViewRoot().eachNode({attr:"viewChildren",order:"preorder"},(function(i){var r=this._storage.background[i.getRawIndex()];if(r){var o=r.transformCoordToLocal(t,e),a=r.shape;if(!(a.x<=o[0]&&o[0]<=a.x+a.width&&a.y<=o[1]&&o[1]<=a.y+a.height))return!1;n={node:i,offsetX:o[0],offsetY:o[1]}}}),this),n},e.type="treemap",e}(wg);var rD=E,oD=q,aD=-1,sD=function(){function t(e){var n=e.mappingMethod,i=e.type,r=this.option=T(e);this.type=i,this.mappingMethod=n,this._normalizeData=vD[n];var o=t.visualHandlers[i];this.applyVisual=o.applyVisual,this.getColorMapper=o.getColorMapper,this._normalizedToVisual=o._normalizedToVisual[n],"piecewise"===n?(lD(r),function(t){var e=t.pieceList;t.hasSpecialVisual=!1,E(e,(function(e,n){e.originIndex=n,null!=e.visual&&(t.hasSpecialVisual=!0)}))}(r)):"category"===n?r.categories?function(t){var e=t.categories,n=t.categoryMap={},i=t.visual;if(rD(e,(function(t,e){n[t]=e})),!Y(i)){var r=[];q(i)?rD(i,(function(t,e){var i=n[e];r[null!=i?i:aD]=t})):r[-1]=i,i=yD(t,r)}for(var o=e.length-1;o>=0;o--)null==i[o]&&(delete n[e[o]],e.pop())}(r):lD(r,!0):(lt("linear"!==n||r.dataExtent),lD(r))}return t.prototype.mapValueToVisual=function(t){var e=this._normalizeData(t);return this._normalizedToVisual(e,t)},t.prototype.getNormalizer=function(){return W(this._normalizeData,this)},t.listVisualTypes=function(){return G(t.visualHandlers)},t.isValidType=function(e){return t.visualHandlers.hasOwnProperty(e)},t.eachVisual=function(t,e,n){q(t)?E(t,e,n):e.call(n,t)},t.mapVisual=function(e,n,i){var r,o=Y(e)?[]:q(e)?{}:(r=!0,null);return t.eachVisual(e,(function(t,e){var a=n.call(i,t,e);r?o=a:o[e]=a})),o},t.retrieveVisuals=function(e){var n,i={};return e&&rD(t.visualHandlers,(function(t,r){e.hasOwnProperty(r)&&(i[r]=e[r],n=!0)})),n?i:null},t.prepareVisualTypes=function(t){if(Y(t))t=t.slice();else{if(!oD(t))return[];var e=[];rD(t,(function(t,n){e.push(n)})),t=e}return t.sort((function(t,e){return"color"===e&&"color"!==t&&0===t.indexOf("color")?1:-1})),t},t.dependsOn=function(t,e){return"color"===e?!(!t||0!==t.indexOf(e)):t===e},t.findPieceIndex=function(t,e,n){for(var i,r=1/0,o=0,a=e.length;ou[1]&&(u[1]=l);var h=e.get("colorMappingBy"),c={type:a.name,dataExtent:u,visual:a.range};"color"!==c.type||"index"!==h&&"id"!==h?c.mappingMethod="linear":(c.mappingMethod="category",c.loop=!0);var p=new sD(c);return xD(p).drColorMappingBy=h,p}(0,r,o,0,u,d);E(d,(function(t,e){if(t.depth>=n.length||t===n[t.depth]){var o=function(t,e,n,i,r,o){var a=A({},e);if(r){var s=r.type,l="color"===s&&xD(r).drColorMappingBy,u="index"===l?i:"id"===l?o.mapIdToIndex(n.getId()):n.getValue(t.get("visualDimension"));a[s]=r.mapValueToVisual(u)}return a}(r,u,t,e,f,i);bD(t,o,n,i)}}))}else s=wD(u),h.fill=s}}function wD(t){var e=SD(t,"color");if(e){var n=SD(t,"colorAlpha"),i=SD(t,"colorSaturation");return i&&(e=Qn(e,null,null,i)),n&&(e=ti(e,n)),e}}function SD(t,e){var n=t[e];if(null!=n&&"none"!==n)return n}function MD(t,e){var n=t.get(e);return Y(n)&&n.length?{name:e,range:n}:null}var ID=Math.max,TD=Math.min,CD=it,DD=E,AD=["itemStyle","borderWidth"],kD=["itemStyle","gapWidth"],LD=["upperLabel","show"],PD=["upperLabel","height"],OD={seriesType:"treemap",reset:function(t,e,n,i){var r=n.getWidth(),o=n.getHeight(),a=t.option,s=wp(t.getBoxLayoutParams(),{width:n.getWidth(),height:n.getHeight()}),l=a.size||[],u=Gr(CD(s.width,l[0]),r),h=Gr(CD(s.height,l[1]),o),c=i&&i.type,p=RC(i,["treemapZoomToNode","treemapRootToNode"],t),d="treemapRender"===c||"treemapMove"===c?i.rootRect:null,f=t.getViewRoot(),g=NC(f);if("treemapMove"!==c){var y="treemapZoomToNode"===c?function(t,e,n,i,r){var o,a=(e||{}).node,s=[i,r];if(!a||a===n)return s;var l=i*r,u=l*t.option.zoomToNodeRatio;for(;o=a.parentNode;){for(var h=0,c=o.children,p=0,d=c.length;pqr&&(u=qr),a=o}ua[1]&&(a[1]=e)}))):a=[NaN,NaN];return{sum:i,dataExtent:a}}(e,a,s);if(0===u.sum)return t.viewChildren=[];if(u.sum=function(t,e,n,i,r){if(!i)return n;for(var o=t.get("visibleMin"),a=r.length,s=a,l=a-1;l>=0;l--){var u=r["asc"===i?a-l-1:l].getValue();u/n*ei&&(i=a));var l=t.area*t.area,u=e*e*n;return l?ID(u*i/l,l/(u*r)):1/0}function ED(t,e,n,i,r){var o=e===n.width?0:1,a=1-o,s=["x","y"],l=["width","height"],u=n[s[o]],h=e?t.area/e:0;(r||h>n[l[a]])&&(h=n[l[a]]);for(var c=0,p=t.length;ci&&(i=e);var o=i%2?i+2:i+3;r=[];for(var a=0;a0&&(m[0]=-m[0],m[1]=-m[1]);var _=v[0]<0?-1:1;if("start"!==i.__position&&"end"!==i.__position){var b=-Math.atan2(v[1],v[0]);u[0].8?"left":h[0]<-.8?"right":"center",p=h[1]>.8?"top":h[1]<-.8?"bottom":"middle";break;case"start":i.x=-h[0]*f+l[0],i.y=-h[1]*g+l[1],c=h[0]>.8?"right":h[0]<-.8?"left":"center",p=h[1]>.8?"bottom":h[1]<-.8?"top":"middle";break;case"insideStartTop":case"insideStart":case"insideStartBottom":i.x=f*_+l[0],i.y=l[1]+w,c=v[0]<0?"right":"left",i.originX=-f*_,i.originY=-w;break;case"insideMiddleTop":case"insideMiddle":case"insideMiddleBottom":case"middle":i.x=x[0],i.y=x[1]+w,c="center",i.originY=-w;break;case"insideEndTop":case"insideEnd":case"insideEndBottom":i.x=-f*_+u[0],i.y=u[1]+w,c=v[0]>=0?"right":"left",i.originX=f*_,i.originY=-w}i.scaleX=i.scaleY=r,i.setStyle({verticalAlign:i.__verticalAlign||p,align:i.__align||c})}}}function S(t,e){var n=t.__specifiedRotation;if(null==n){var i=a.tangentAt(e);t.attr("rotation",(1===e?-1:1)*Math.PI/2-Math.atan2(i[1],i[0]))}else t.attr("rotation",n)}},e}(Pr),_A=function(){function t(t){this.group=new Pr,this._LineCtor=t||xA}return t.prototype.updateData=function(t){var e=this;this._progressiveEls=null;var n=this,i=n.group,r=n._lineData;n._lineData=t,r||i.removeAll();var o=bA(t);t.diff(r).add((function(n){e._doAdd(t,n,o)})).update((function(n,i){e._doUpdate(r,t,i,n,o)})).remove((function(t){i.remove(r.getItemGraphicEl(t))})).execute()},t.prototype.updateLayout=function(){var t=this._lineData;t&&t.eachItemGraphicEl((function(e,n){e.updateLayout(t,n)}),this)},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=bA(t),this._lineData=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e){function n(t){t.isGroup||function(t){return t.animators&&t.animators.length>0}(t)||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}this._progressiveEls=[];for(var i=t.start;i=0?i+=u:i-=u:f>=0?i-=u:i+=u}return i}function LA(t,e){var n=[],i=In,r=[[],[],[]],o=[[],[]],a=[];e/=2,t.eachEdge((function(t,s){var l=t.getLayout(),u=t.getVisual("fromSymbol"),h=t.getVisual("toSymbol");l.__original||(l.__original=[Mt(l[0]),Mt(l[1])],l[2]&&l.__original.push(Mt(l[2])));var c=l.__original;if(null!=l[2]){if(St(r[0],c[0]),St(r[1],c[2]),St(r[2],c[1]),u&&"none"!==u){var p=tA(t.node1),d=kA(r,c[0],p*e);i(r[0][0],r[1][0],r[2][0],d,n),r[0][0]=n[3],r[1][0]=n[4],i(r[0][1],r[1][1],r[2][1],d,n),r[0][1]=n[3],r[1][1]=n[4]}if(h&&"none"!==h){p=tA(t.node2),d=kA(r,c[1],p*e);i(r[0][0],r[1][0],r[2][0],d,n),r[1][0]=n[1],r[2][0]=n[2],i(r[0][1],r[1][1],r[2][1],d,n),r[1][1]=n[1],r[2][1]=n[2]}St(l[0],r[0]),St(l[1],r[2]),St(l[2],r[1])}else{if(St(o[0],c[0]),St(o[1],c[1]),Dt(a,o[1],o[0]),Rt(a,a),u&&"none"!==u){p=tA(t.node1);Ct(o[0],o[0],a,p*e)}if(h&&"none"!==h){p=tA(t.node2);Ct(o[1],o[1],a,-p*e)}St(l[0],o[0]),St(l[1],o[1])}}))}function PA(t){return"view"===t.type}var OA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){var n=new Jw,i=new _A,r=this.group;this._controller=new OI(e.getZr()),this._controllerHost={target:r},r.add(n.group),r.add(i.group),this._symbolDraw=n,this._lineDraw=i,this._firstRender=!0},e.prototype.render=function(t,e,n){var i=this,r=t.coordinateSystem;this._model=t;var o=this._symbolDraw,a=this._lineDraw,s=this.group;if(PA(r)){var l={x:r.x,y:r.y,scaleX:r.scaleX,scaleY:r.scaleY};this._firstRender?s.attr(l):uh(s,l,t)}LA(t.getGraph(),QD(t));var u=t.getData();o.updateData(u);var h=t.getEdgeData();a.updateData(h),this._updateNodeAndLinkScale(),this._updateController(t,e,n),clearTimeout(this._layoutTimeout);var c=t.forceLayout,p=t.get(["force","layoutAnimation"]);c&&this._startForceLayoutIteration(c,p);var d=t.get("layout");u.graph.eachNode((function(e){var n=e.dataIndex,r=e.getGraphicEl(),o=e.getModel();if(r){r.off("drag").off("dragend");var a=o.get("draggable");a&&r.on("drag",(function(o){switch(d){case"force":c.warmUp(),!i._layouting&&i._startForceLayoutIteration(c,p),c.setFixed(n),u.setItemLayout(n,[r.x,r.y]);break;case"circular":u.setItemLayout(n,[r.x,r.y]),e.setLayout({fixed:!0},!0),iA(t,"symbolSize",e,[o.offsetX,o.offsetY]),i.updateLayout(t);break;default:u.setItemLayout(n,[r.x,r.y]),$D(t.getGraph(),t),i.updateLayout(t)}})).on("dragend",(function(){c&&c.setUnfixed(n)})),r.setDraggable(a&&!!c,!!o.get("cursor")),"adjacency"===o.get(["emphasis","focus"])&&(js(r).focus=e.getAdjacentDataIndices())}})),u.graph.eachEdge((function(t){var e=t.getGraphicEl(),n=t.getModel().get(["emphasis","focus"]);e&&"adjacency"===n&&(js(e).focus={edge:[t.dataIndex],node:[t.node1.dataIndex,t.node2.dataIndex]})}));var f="circular"===t.get("layout")&&t.get(["circular","rotateLabel"]),g=u.getLayout("cx"),y=u.getLayout("cy");u.graph.eachNode((function(t){oA(t,f,g,y)})),this._firstRender=!1},e.prototype.dispose=function(){this._controller&&this._controller.dispose(),this._controllerHost=null},e.prototype._startForceLayoutIteration=function(t,e){var n=this;!function i(){t.step((function(t){n.updateLayout(n._model),(n._layouting=!t)&&(e?n._layoutTimeout=setTimeout(i,16):i())}))}()},e.prototype._updateController=function(t,e,n){var i=this,r=this._controller,o=this._controllerHost,a=this.group;r.setPointerChecker((function(e,i,r){var o=a.getBoundingRect();return o.applyTransform(a.transform),o.contain(i,r)&&!GI(e,n,t)})),PA(t.coordinateSystem)?(r.enable(t.get("roam")),o.zoomLimit=t.get("scaleLimit"),o.zoom=t.coordinateSystem.getZoom(),r.off("pan").off("zoom").on("pan",(function(e){zI(o,e.dx,e.dy),n.dispatchAction({seriesId:t.id,type:"graphRoam",dx:e.dx,dy:e.dy})})).on("zoom",(function(e){VI(o,e.scale,e.originX,e.originY),n.dispatchAction({seriesId:t.id,type:"graphRoam",zoom:e.scale,originX:e.originX,originY:e.originY}),i._updateNodeAndLinkScale(),LA(t.getGraph(),QD(t)),i._lineDraw.updateLayout(),n.updateLabelLayout()}))):r.disable()},e.prototype._updateNodeAndLinkScale=function(){var t=this._model,e=t.getData(),n=QD(t);e.eachItemGraphicEl((function(t,e){t&&t.setSymbolScale(n)}))},e.prototype.updateLayout=function(t){LA(t.getGraph(),QD(t)),this._symbolDraw.updateLayout(),this._lineDraw.updateLayout()},e.prototype.remove=function(t,e){this._symbolDraw&&this._symbolDraw.remove(),this._lineDraw&&this._lineDraw.remove()},e.type="graph",e}(wg);function RA(t){return"_EC_"+t}var NA=function(){function t(t){this.type="graph",this.nodes=[],this.edges=[],this._nodesMap={},this._edgesMap={},this._directed=t||!1}return t.prototype.isDirected=function(){return this._directed},t.prototype.addNode=function(t,e){t=null==t?""+e:""+t;var n=this._nodesMap;if(!n[RA(t)]){var i=new EA(t,e);return i.hostGraph=this,this.nodes.push(i),n[RA(t)]=i,i}},t.prototype.getNodeByIndex=function(t){var e=this.data.getRawIndex(t);return this.nodes[e]},t.prototype.getNodeById=function(t){return this._nodesMap[RA(t)]},t.prototype.addEdge=function(t,e,n){var i=this._nodesMap,r=this._edgesMap;if(j(t)&&(t=this.nodes[t]),j(e)&&(e=this.nodes[e]),t instanceof EA||(t=i[RA(t)]),e instanceof EA||(e=i[RA(e)]),t&&e){var o=t.id+"-"+e.id,a=new zA(t,e,n);return a.hostGraph=this,this._directed&&(t.outEdges.push(a),e.inEdges.push(a)),t.edges.push(a),t!==e&&e.edges.push(a),this.edges.push(a),r[o]=a,a}},t.prototype.getEdgeByIndex=function(t){var e=this.edgeData.getRawIndex(t);return this.edges[e]},t.prototype.getEdge=function(t,e){t instanceof EA&&(t=t.id),e instanceof EA&&(e=e.id);var n=this._edgesMap;return this._directed?n[t+"-"+e]:n[t+"-"+e]||n[e+"-"+t]},t.prototype.eachNode=function(t,e){for(var n=this.nodes,i=n.length,r=0;r=0&&t.call(e,n[r],r)},t.prototype.eachEdge=function(t,e){for(var n=this.edges,i=n.length,r=0;r=0&&n[r].node1.dataIndex>=0&&n[r].node2.dataIndex>=0&&t.call(e,n[r],r)},t.prototype.breadthFirstTraverse=function(t,e,n,i){if(e instanceof EA||(e=this._nodesMap[RA(e)]),e){for(var r="out"===n?"outEdges":"in"===n?"inEdges":"edges",o=0;o=0&&n.node2.dataIndex>=0}));for(r=0,o=i.length;r=0&&this[t][e].setItemVisual(this.dataIndex,n,i)},getVisual:function(n){return this[t][e].getItemVisual(this.dataIndex,n)},setLayout:function(n,i){this.dataIndex>=0&&this[t][e].setItemLayout(this.dataIndex,n,i)},getLayout:function(){return this[t][e].getItemLayout(this.dataIndex)},getGraphicEl:function(){return this[t][e].getItemGraphicEl(this.dataIndex)},getRawIndex:function(){return this[t][e].getRawIndex(this.dataIndex)}}}function BA(t,e,n,i,r){for(var o=new NA(i),a=0;a "+p)),u++)}var d,f=n.get("coordinateSystem");if("cartesian2d"===f||"polar"===f)d=sx(t,n);else{var g=dd.get(f),y=g&&g.dimensions||[];P(y,"value")<0&&y.concat(["value"]);var v=Qm(t,{coordDimensions:y,encodeDefine:n.getEncode()}).dimensions;(d=new Jm(v,n)).initData(t)}var m=new Jm(["value"],n);return m.initData(l,s),r&&r(d,m),MC({mainData:d,struct:o,structAttr:"graph",datas:{node:d,edge:m},datasAttr:{node:"data",edge:"edgeData"}}),o.update(),o}R(EA,VA("hostGraph","data")),R(zA,VA("hostGraph","edgeData"));var FA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments);var n=this;function i(){return n._categoriesData}this.legendVisualProvider=new dM(i,i),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},e.prototype.mergeDefaultAndTheme=function(e){t.prototype.mergeDefaultAndTheme.apply(this,arguments),vo(e,"edgeLabel",["show"])},e.prototype.getInitialData=function(t,e){var n,i=t.edges||t.links||[],r=t.data||t.nodes||[],o=this;if(r&&i){YD(n=this)&&(n.__curvenessList=[],n.__edgeMap={},UD(n));var a=BA(r,i,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t){var e=o._categoriesModels[t.getShallow("category")];return e&&(e.parentModel=t.parentModel,t.parentModel=e),t}));var n=xc.prototype.getModel;function i(t,e){var i=n.call(this,t,e);return i.resolveParentPath=r,i}function r(t){if(t&&("label"===t[0]||"label"===t[1])){var e=t.slice();return"label"===t[0]?e[0]="edgeLabel":"label"===t[1]&&(e[1]="edgeLabel"),e}return t}e.wrapMethod("getItemModel",(function(t){return t.resolveParentPath=r,t.getModel=i,t}))}));return E(a.edges,(function(t){!function(t,e,n,i){if(YD(n)){var r=XD(t,e,n),o=n.__edgeMap,a=o[ZD(r)];o[r]&&!a?o[r].isForward=!0:a&&o[r]&&(a.isForward=!0,o[r].isForward=!1),o[r]=o[r]||[],o[r].push(i)}}(t.node1,t.node2,this,t.dataIndex)}),this),a.data}},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.getCategoriesData=function(){return this._categoriesData},e.prototype.formatTooltip=function(t,e,n){if("edge"===n){var i=this.getData(),r=this.getDataParams(t,n),o=i.graph.getEdgeByIndex(t),a=i.getName(o.node1.dataIndex),s=i.getName(o.node2.dataIndex),l=[];return null!=a&&l.push(a),null!=s&&l.push(s),qf("nameValue",{name:l.join(" > "),value:r.value,noValue:null==r.value})}return sg({series:this,dataIndex:t,multipleSeries:e})},e.prototype._updateCategoriesData=function(){var t=z(this.option.categories||[],(function(t){return null!=t.value?t:A({value:0},t)})),e=new Jm(["value"],this);e.initData(t),this._categoriesData=e,this._categoriesModels=e.mapArray((function(t){return e.getItemModel(t)}))},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.isAnimationEnabled=function(){return t.prototype.isAnimationEnabled.call(this)&&!("force"===this.get("layout")&&this.get(["force","layoutAnimation"]))},e.type="series.graph",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={z:2,coordinateSystem:"view",legendHoverLink:!0,layout:null,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,friction:.6,edgeLength:30,layoutAnimation:!0},left:"center",top:"center",symbol:"circle",symbolSize:10,edgeSymbol:["none","none"],edgeSymbolSize:10,edgeLabel:{position:"middle",distance:5},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{show:!1,formatter:"{b}"},itemStyle:{},lineStyle:{color:"#aaa",width:1,opacity:.5},emphasis:{scale:!0,label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},e}(hg),GA={type:"graphRoam",event:"graphRoam",update:"none"};var WA=function(){this.angle=0,this.width=10,this.r=10,this.x=0,this.y=0},HA=function(t){function e(e){var n=t.call(this,e)||this;return n.type="pointer",n}return n(e,t),e.prototype.getDefaultShape=function(){return new WA},e.prototype.buildPath=function(t,e){var n=Math.cos,i=Math.sin,r=e.r,o=e.width,a=e.angle,s=e.x-n(a)*o*(o>=r/3?1:2),l=e.y-i(a)*o*(o>=r/3?1:2);a=e.angle-Math.PI/2,t.moveTo(s,l),t.lineTo(e.x+n(a)*o,e.y+i(a)*o),t.lineTo(e.x+n(e.angle)*r,e.y+i(e.angle)*r),t.lineTo(e.x-n(a)*o,e.y-i(a)*o),t.lineTo(s,l)},e}(_s);function YA(t,e){var n=null==t?"":t+"";return e&&(X(e)?n=e.replace("{value}",n):U(e)&&(n=e(t))),n}var UA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeAll();var i=t.get(["axisLine","lineStyle","color"]),r=function(t,e){var n=t.get("center"),i=e.getWidth(),r=e.getHeight(),o=Math.min(i,r);return{cx:Gr(n[0],e.getWidth()),cy:Gr(n[1],e.getHeight()),r:Gr(t.get("radius"),o/2)}}(t,n);this._renderMain(t,e,n,i,r),this._data=t.getData()},e.prototype.dispose=function(){},e.prototype._renderMain=function(t,e,n,i,r){var o=this.group,a=t.get("clockwise"),s=-t.get("startAngle")/180*Math.PI,l=-t.get("endAngle")/180*Math.PI,u=t.getModel("axisLine"),h=u.get("roundCap")?LS:Pu,c=u.get("show"),p=u.getModel("lineStyle"),d=p.get("width"),f=[s,l];Qa(f,!a);for(var g=(l=f[1])-(s=f[0]),y=s,v=0;c&&v=t&&(0===e?0:i[e-1][0])Math.PI/2&&(V+=Math.PI):"tangential"===z?V=-M-Math.PI/2:j(z)&&(V=z*Math.PI/180),0===V?c.add(new Ns({style:$h(x,{text:O,x:N,y:E,verticalAlign:h<-.8?"top":h>.8?"bottom":"middle",align:u<-.4?"left":u>.4?"right":"center"},{inheritColor:R}),silent:!0})):c.add(new Ns({style:$h(x,{text:O,x:N,y:E,verticalAlign:"middle",align:"center"},{inheritColor:R}),silent:!0,originX:N,originY:E,rotation:V}))}if(m.get("show")&&k!==_){P=(P=m.get("distance"))?P+l:l;for(var B=0;B<=b;B++){u=Math.cos(M),h=Math.sin(M);var F=new Wu({shape:{x1:u*(f-P)+p,y1:h*(f-P)+d,x2:u*(f-S-P)+p,y2:h*(f-S-P)+d},silent:!0,style:D});"auto"===D.stroke&&F.setStyle({stroke:i((k+B/b)/_)}),c.add(F),M+=T}M-=T}else M+=I}},e.prototype._renderPointer=function(t,e,n,i,r,o,a,s,l){var u=this.group,h=this._data,c=this._progressEls,p=[],d=t.get(["pointer","show"]),f=t.getModel("progress"),g=f.get("show"),y=t.getData(),v=y.mapDimension("value"),m=+t.get("min"),x=+t.get("max"),_=[m,x],b=[o,a];function w(e,n){var i,o=y.getItemModel(e).getModel("pointer"),a=Gr(o.get("width"),r.r),s=Gr(o.get("length"),r.r),l=t.get(["pointer","icon"]),u=o.get("offsetCenter"),h=Gr(u[0],r.r),c=Gr(u[1],r.r),p=o.get("keepAspect");return(i=l?Ry(l,h-a/2,c-s,a,s,null,p):new HA({shape:{angle:-Math.PI/2,width:a,r:s,x:h,y:c}})).rotation=-(n+Math.PI/2),i.x=r.cx,i.y=r.cy,i}function S(t,e){var n=f.get("roundCap")?LS:Pu,i=f.get("overlap"),a=i?f.get("width"):l/y.count(),u=i?r.r-a:r.r-(t+1)*a,h=i?r.r:r.r-t*a,c=new n({shape:{startAngle:o,endAngle:e,cx:r.cx,cy:r.cy,clockwise:s,r0:u,r:h}});return i&&(c.z2=x-y.get(v,t)%x),c}(g||d)&&(y.diff(h).add((function(e){var n=y.get(v,e);if(d){var i=w(e,o);hh(i,{rotation:-((isNaN(+n)?b[0]:Fr(n,_,b,!0))+Math.PI/2)},t),u.add(i),y.setItemGraphicEl(e,i)}if(g){var r=S(e,o),a=f.get("clip");hh(r,{shape:{endAngle:Fr(n,_,b,a)}},t),u.add(r),qs(t.seriesIndex,y.dataType,e,r),p[e]=r}})).update((function(e,n){var i=y.get(v,e);if(d){var r=h.getItemGraphicEl(n),a=r?r.rotation:o,s=w(e,a);s.rotation=a,uh(s,{rotation:-((isNaN(+i)?b[0]:Fr(i,_,b,!0))+Math.PI/2)},t),u.add(s),y.setItemGraphicEl(e,s)}if(g){var l=c[n],m=S(e,l?l.shape.endAngle:o),x=f.get("clip");uh(m,{shape:{endAngle:Fr(i,_,b,x)}},t),u.add(m),qs(t.seriesIndex,y.dataType,e,m),p[e]=m}})).execute(),y.each((function(t){var e=y.getItemModel(t),n=e.getModel("emphasis"),r=n.get("focus"),o=n.get("blurScope"),a=n.get("disabled");if(d){var s=y.getItemGraphicEl(t),l=y.getItemVisual(t,"style"),u=l.fill;if(s instanceof Is){var h=s.style;s.useStyle(A({image:h.image,x:h.x,y:h.y,width:h.width,height:h.height},l))}else s.useStyle(l),"pointer"!==s.type&&s.setColor(u);s.setStyle(e.getModel(["pointer","itemStyle"]).getItemStyle()),"auto"===s.style.fill&&s.setStyle("fill",i(Fr(y.get(v,t),_,[0,1],!0))),s.z2EmphasisLift=0,Hl(s,e),Bl(s,r,o,a)}if(g){var c=p[t];c.useStyle(y.getItemVisual(t,"style")),c.setStyle(e.getModel(["progress","itemStyle"]).getItemStyle()),c.z2EmphasisLift=0,Hl(c,e),Bl(c,r,o,a)}})),this._progressEls=p)},e.prototype._renderAnchor=function(t,e){var n=t.getModel("anchor");if(n.get("show")){var i=n.get("size"),r=n.get("icon"),o=n.get("offsetCenter"),a=n.get("keepAspect"),s=Ry(r,e.cx-i/2+Gr(o[0],e.r),e.cy-i/2+Gr(o[1],e.r),i,i,null,a);s.z2=n.get("showAbove")?1:0,s.setStyle(n.getModel("itemStyle").getItemStyle()),this.group.add(s)}},e.prototype._renderTitleAndDetail=function(t,e,n,i,r){var o=this,a=t.getData(),s=a.mapDimension("value"),l=+t.get("min"),u=+t.get("max"),h=new Pr,c=[],p=[],d=t.isAnimationEnabled(),f=t.get(["pointer","showAbove"]);a.diff(this._data).add((function(t){c[t]=new Ns({silent:!0}),p[t]=new Ns({silent:!0})})).update((function(t,e){c[t]=o._titleEls[e],p[t]=o._detailEls[e]})).execute(),a.each((function(e){var n=a.getItemModel(e),o=a.get(s,e),g=new Pr,y=i(Fr(o,[l,u],[0,1],!0)),v=n.getModel("title");if(v.get("show")){var m=v.get("offsetCenter"),x=r.cx+Gr(m[0],r.r),_=r.cy+Gr(m[1],r.r);(D=c[e]).attr({z2:f?0:2,style:$h(v,{x:x,y:_,text:a.getName(e),align:"center",verticalAlign:"middle"},{inheritColor:y})}),g.add(D)}var b=n.getModel("detail");if(b.get("show")){var w=b.get("offsetCenter"),S=r.cx+Gr(w[0],r.r),M=r.cy+Gr(w[1],r.r),I=Gr(b.get("width"),r.r),T=Gr(b.get("height"),r.r),C=t.get(["progress","show"])?a.getItemVisual(e,"style").fill:y,D=p[e],A=b.get("formatter");D.attr({z2:f?0:2,style:$h(b,{x:S,y:M,text:YA(o,A),width:isNaN(I)?null:I,height:isNaN(T)?null:T,align:"center",verticalAlign:"middle"},{inheritColor:C})}),oc(D,{normal:b},o,(function(t){return YA(t,A)})),d&&ac(D,e,a,t,{getFormattedLabel:function(t,e,n,i,r,a){return YA(a?a.interpolatedValue:o,A)}}),g.add(D)}h.add(g)})),this.group.add(h),this._titleEls=c,this._detailEls=p},e.type="gauge",e}(wg),XA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.visualStyleAccessPath="itemStyle",n}return n(e,t),e.prototype.getInitialData=function(t,e){return pM(this,["value"])},e.type="series.gauge",e.defaultOption={z:2,colorBy:"data",center:["50%","50%"],legendHoverLink:!0,radius:"75%",startAngle:225,endAngle:-45,clockwise:!0,min:0,max:100,splitNumber:10,axisLine:{show:!0,roundCap:!1,lineStyle:{color:[[1,"#E6EBF8"]],width:10}},progress:{show:!1,overlap:!0,width:10,roundCap:!1,clip:!0},splitLine:{show:!0,length:10,distance:10,lineStyle:{color:"#63677A",width:3,type:"solid"}},axisTick:{show:!0,splitNumber:5,length:6,distance:10,lineStyle:{color:"#63677A",width:1,type:"solid"}},axisLabel:{show:!0,distance:15,color:"#464646",fontSize:12,rotate:0},pointer:{icon:null,offsetCenter:[0,0],show:!0,showAbove:!0,length:"60%",width:6,keepAspect:!1},anchor:{show:!1,showAbove:!1,size:6,icon:"circle",offsetCenter:[0,0],keepAspect:!1,itemStyle:{color:"#fff",borderWidth:0,borderColor:"#5470c6"}},title:{show:!0,offsetCenter:[0,"20%"],color:"#464646",fontSize:16,valueAnimation:!1},detail:{show:!0,backgroundColor:"rgba(0,0,0,0)",borderWidth:0,borderColor:"#ccc",width:100,height:null,padding:[5,10],offsetCenter:[0,"40%"],color:"#464646",fontSize:30,fontWeight:"bold",lineHeight:30,valueAnimation:!1}},e}(hg);var ZA=["itemStyle","opacity"],jA=function(t){function e(e,n){var i=t.call(this)||this,r=i,o=new Bu,a=new Ns;return r.setTextContent(a),i.setTextGuideLine(o),i.updateData(e,n,!0),i}return n(e,t),e.prototype.updateData=function(t,e,n){var i=this,r=t.hostModel,o=t.getItemModel(e),a=t.getItemLayout(e),s=o.getModel("emphasis"),l=o.get(ZA);l=null==l?1:l,n||gh(i),i.useStyle(t.getItemVisual(e,"style")),i.style.lineJoin="round",n?(i.setShape({points:a.points}),i.style.opacity=0,hh(i,{style:{opacity:l}},r,e)):uh(i,{style:{opacity:l},shape:{points:a.points}},r,e),Hl(i,o),this._updateLabel(t,e),Bl(this,s.get("focus"),s.get("blurScope"),s.get("disabled"))},e.prototype._updateLabel=function(t,e){var n=this,i=this.getTextGuideLine(),r=n.getTextContent(),o=t.hostModel,a=t.getItemModel(e),s=t.getItemLayout(e).label,l=t.getItemVisual(e,"style"),u=l.fill;qh(r,Kh(a),{labelFetcher:t.hostModel,labelDataIndex:e,defaultOpacity:l.opacity,defaultText:t.getName(e)},{normal:{align:s.textAlign,verticalAlign:s.verticalAlign}}),n.setTextConfig({local:!0,inside:!!s.inside,insideStroke:u,outsideFill:u});var h=s.linePoints;i.setShape({points:h}),n.textGuideLineConfig={anchor:h?new Ie(h[0][0],h[0][1]):null},uh(r,{style:{x:s.x,y:s.y}},o,e),r.attr({rotation:s.rotation,originX:s.x,originY:s.y,z2:10}),yb(n,vb(a),{stroke:u})},e}(zu),qA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.ignoreLabelLineUpdate=!0,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this._data,o=this.group;i.diff(r).add((function(t){var e=new jA(i,t);i.setItemGraphicEl(t,e),o.add(e)})).update((function(t,e){var n=r.getItemGraphicEl(e);n.updateData(i,t),o.add(n),i.setItemGraphicEl(t,n)})).remove((function(e){fh(r.getItemGraphicEl(e),t,e)})).execute(),this._data=i},e.prototype.remove=function(){this.group.removeAll(),this._data=null},e.prototype.dispose=function(){},e.type="funnel",e}(wg),KA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new dM(W(this.getData,this),W(this.getRawData,this)),this._defaultLabelLine(e)},e.prototype.getInitialData=function(t,e){return pM(this,{coordDimensions:["value"],encodeDefaulter:H(Zp,this)})},e.prototype._defaultLabelLine=function(t){vo(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.prototype.getDataParams=function(e){var n=this.getData(),i=t.prototype.getDataParams.call(this,e),r=n.mapDimension("value"),o=n.getSum(r);return i.percent=o?+(n.get(r,e)/o*100).toFixed(2):0,i.$vars.push("percent"),i},e.type="series.funnel",e.defaultOption={z:2,legendHoverLink:!0,colorBy:"data",left:80,top:60,right:80,bottom:60,minSize:"0%",maxSize:"100%",sort:"descending",orient:"vertical",gap:0,funnelAlign:"center",label:{show:!0,position:"outer"},labelLine:{show:!0,length:20,lineStyle:{width:1}},itemStyle:{borderColor:"#fff",borderWidth:1},emphasis:{label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},e}(hg);function $A(t,e){t.eachSeriesByType("funnel",(function(t){var n=t.getData(),i=n.mapDimension("value"),r=t.get("sort"),o=function(t,e){return wp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e),a=t.get("orient"),s=o.width,l=o.height,u=function(t,e){for(var n=t.mapDimension("value"),i=t.mapArray(n,(function(t){return t})),r=[],o="ascending"===e,a=0,s=t.count();a5)return;var i=this._model.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]);"none"!==i.behavior&&this._dispatchExpand({axisExpandWindow:i.axisExpandWindow})}this._mouseDownPoint=null},mousemove:function(t){if(!this._mouseDownPoint&&hk(this,"mousemove")){var e=this._model,n=e.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]),i=n.behavior;"jump"===i&&this._throttledDispatchExpand.debounceNextCall(e.get("axisExpandDebounce")),this._throttledDispatchExpand("none"===i?null:{axisExpandWindow:n.axisExpandWindow,animation:"jump"===i?null:{duration:0}})}}};function hk(t,e){var n=t._model;return n.get("axisExpandable")&&n.get("axisExpandTriggerOn")===e}var ck=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){t.prototype.init.apply(this,arguments),this.mergeOption({})},e.prototype.mergeOption=function(t){var e=this.option;t&&C(e,t,!0),this._initDimensions()},e.prototype.contains=function(t,e){var n=t.get("parallelIndex");return null!=n&&e.getComponent("parallel",n)===this},e.prototype.setAxisExpand=function(t){E(["axisExpandable","axisExpandCenter","axisExpandCount","axisExpandWidth","axisExpandWindow"],(function(e){t.hasOwnProperty(e)&&(this.option[e]=t[e])}),this)},e.prototype._initDimensions=function(){var t=this.dimensions=[],e=this.parallelAxisIndex=[];E(B(this.ecModel.queryComponents({mainType:"parallelAxis"}),(function(t){return(t.get("parallelIndex")||0)===this.componentIndex}),this),(function(n){t.push("dim"+n.get("dim")),e.push(n.componentIndex)}))},e.type="parallel",e.dependencies=["parallelAxis"],e.layoutMode="box",e.defaultOption={z:0,left:80,top:60,right:80,bottom:60,layout:"horizontal",axisExpandable:!1,axisExpandCenter:null,axisExpandCount:0,axisExpandWidth:50,axisExpandRate:17,axisExpandDebounce:50,axisExpandSlideTriggerArea:[-.15,.05,.4],axisExpandTriggerOn:"click",parallelAxisDefault:null},e}(Ap),pk=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.type=r||"value",a.axisIndex=o,a}return n(e,t),e.prototype.isHorizontal=function(){return"horizontal"!==this.coordinateSystem.getModel().get("layout")},e}(X_);function dk(t,e,n,i,r,o){t=t||0;var a=n[1]-n[0];if(null!=r&&(r=gk(r,[0,a])),null!=o&&(o=Math.max(o,null!=r?r:0)),"all"===i){var s=Math.abs(e[1]-e[0]);s=gk(s,[0,a]),r=o=gk(s,[r,o]),i=0}e[0]=gk(e[0],n),e[1]=gk(e[1],n);var l=fk(e,i);e[i]+=t;var u,h=r||0,c=n.slice();return l.sign<0?c[0]+=h:c[1]-=h,e[i]=gk(e[i],c),u=fk(e,i),null!=r&&(u.sign!==l.sign||u.spano&&(e[1-i]=e[i]+u.sign*o),e}function fk(t,e){var n=t[e]-t[1-e];return{span:Math.abs(n),sign:n>0?-1:n<0?1:e?-1:1}}function gk(t,e){return Math.min(null!=e[1]?e[1]:1/0,Math.max(null!=e[0]?e[0]:-1/0,t))}var yk=E,vk=Math.min,mk=Math.max,xk=Math.floor,_k=Math.ceil,bk=Wr,wk=Math.PI,Sk=function(){function t(t,e,n){this.type="parallel",this._axesMap=ft(),this._axesLayout={},this.dimensions=t.dimensions,this._model=t,this._init(t,e,n)}return t.prototype._init=function(t,e,n){var i=t.dimensions,r=t.parallelAxisIndex;yk(i,(function(t,n){var i=r[n],o=e.getComponent("parallelAxis",i),a=this._axesMap.set(t,new pk(t,l_(o),[0,0],o.get("type"),i)),s="category"===a.type;a.onBand=s&&o.get("boundaryGap"),a.inverse=o.get("inverse"),o.axis=a,a.model=o,a.coordinateSystem=o.coordinateSystem=this}),this)},t.prototype.update=function(t,e){this._updateAxesFromSeries(this._model,t)},t.prototype.containPoint=function(t){var e=this._makeLayoutInfo(),n=e.axisBase,i=e.layoutBase,r=e.pixelDimIndex,o=t[1-r],a=t[r];return o>=n&&o<=n+e.axisLength&&a>=i&&a<=i+e.layoutLength},t.prototype.getModel=function(){return this._model},t.prototype._updateAxesFromSeries=function(t,e){e.eachSeries((function(n){if(t.contains(n,e)){var i=n.getData();yk(this.dimensions,(function(t){var e=this._axesMap.get(t);e.scale.unionExtentFromData(i,i.mapDimension(t)),s_(e.scale,e.model)}),this)}}),this)},t.prototype.resize=function(t,e){this._rect=wp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),this._layoutAxes()},t.prototype.getRect=function(){return this._rect},t.prototype._makeLayoutInfo=function(){var t,e=this._model,n=this._rect,i=["x","y"],r=["width","height"],o=e.get("layout"),a="horizontal"===o?0:1,s=n[r[a]],l=[0,s],u=this.dimensions.length,h=Mk(e.get("axisExpandWidth"),l),c=Mk(e.get("axisExpandCount")||0,[0,u]),p=e.get("axisExpandable")&&u>3&&u>c&&c>1&&h>0&&s>0,d=e.get("axisExpandWindow");d?(t=Mk(d[1]-d[0],l),d[1]=d[0]+t):(t=Mk(h*(c-1),l),(d=[h*(e.get("axisExpandCenter")||xk(u/2))-t/2])[1]=d[0]+t);var f=(s-t)/(u-c);f<3&&(f=0);var g=[xk(bk(d[0]/h,1))+1,_k(bk(d[1]/h,1))-1],y=f/h*d[0];return{layout:o,pixelDimIndex:a,layoutBase:n[i[a]],layoutLength:s,axisBase:n[i[1-a]],axisLength:n[r[1-a]],axisExpandable:p,axisExpandWidth:h,axisCollapseWidth:f,axisExpandWindow:d,axisCount:u,winInnerIndices:g,axisExpandWindow0Pos:y}},t.prototype._layoutAxes=function(){var t=this._rect,e=this._axesMap,n=this.dimensions,i=this._makeLayoutInfo(),r=i.layout;e.each((function(t){var e=[0,i.axisLength],n=t.inverse?1:0;t.setExtent(e[n],e[1-n])})),yk(n,(function(e,n){var o=(i.axisExpandable?Tk:Ik)(n,i),a={horizontal:{x:o.position,y:i.axisLength},vertical:{x:0,y:o.position}},s={horizontal:wk/2,vertical:0},l=[a[r].x+t.x,a[r].y+t.y],u=s[r],h=[1,0,0,1,0,0];_e(h,h,u),xe(h,h,l),this._axesLayout[e]={position:l,rotation:u,transform:h,axisNameAvailableWidth:o.axisNameAvailableWidth,axisLabelShow:o.axisLabelShow,nameTruncateMaxWidth:o.nameTruncateMaxWidth,tickDirection:1,labelDirection:1}}),this)},t.prototype.getAxis=function(t){return this._axesMap.get(t)},t.prototype.dataToPoint=function(t,e){return this.axisCoordToPoint(this._axesMap.get(e).dataToCoord(t),e)},t.prototype.eachActiveState=function(t,e,n,i){null==n&&(n=0),null==i&&(i=t.count());var r=this._axesMap,o=this.dimensions,a=[],s=[];E(o,(function(e){a.push(t.mapDimension(e)),s.push(r.get(e).model)}));for(var l=this.hasAxisBrushed(),u=n;ur*(1-h[0])?(l="jump",a=s-r*(1-h[2])):(a=s-r*h[1])>=0&&(a=s-r*(1-h[1]))<=0&&(a=0),(a*=e.axisExpandWidth/u)?dk(a,i,o,"all"):l="none";else{var p=i[1]-i[0];(i=[mk(0,o[1]*s/p-p/2)])[1]=vk(o[1],i[0]+p),i[0]=i[1]-p}return{axisExpandWindow:i,behavior:l}},t}();function Mk(t,e){return vk(mk(t,e[0]),e[1])}function Ik(t,e){var n=e.layoutLength/(e.axisCount-1);return{position:n*t,axisNameAvailableWidth:n,axisLabelShow:!0}}function Tk(t,e){var n,i,r=e.layoutLength,o=e.axisExpandWidth,a=e.axisCount,s=e.axisCollapseWidth,l=e.winInnerIndices,u=s,h=!1;return t=0;n--)Hr(e[n])},e.prototype.getActiveState=function(t){var e=this.activeIntervals;if(!e.length)return"normal";if(null==t||isNaN(+t))return"inactive";if(1===e.length){var n=e[0];if(n[0]<=t&&t<=n[1])return"active"}else for(var i=0,r=e.length;i6}(t)||o){if(a&&!o){"single"===s.brushMode&&Zk(t);var l=T(s);l.brushType=hL(l.brushType,a),l.panelId=a===Ak?null:a.panelId,o=t._creatingCover=Bk(t,l),t._covers.push(o)}if(o){var u=dL[hL(t._brushType,a)];o.__brushOption.range=u.getCreatingRange(aL(t,o,t._track)),i&&(Fk(t,o),u.updateCommon(t,o)),Gk(t,o),r={isEnd:i}}}else i&&"single"===s.brushMode&&s.removeOnClick&&Uk(t,e,n)&&Zk(t)&&(r={isEnd:i,removeOnClick:!0});return r}function hL(t,e){return"auto"===t?e.defaultBrushType:t}var cL={mousedown:function(t){if(this._dragging)pL(this,t);else if(!t.target||!t.target.draggable){sL(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);this._creatingCover=null,(this._creatingPanel=Uk(this,t,e))&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(t){var e=t.offsetX,n=t.offsetY,i=this.group.transformCoordToLocal(e,n);if(function(t,e,n){if(t._brushType&&!function(t,e,n){var i=t._zr;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}(t,e.offsetX,e.offsetY)){var i=t._zr,r=t._covers,o=Uk(t,e,n);if(!t._dragging)for(var a=0;a=0&&(o[r[a].depth]=new xc(r[a],this,e));if(i&&n){var s=BA(i,n,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getData().getItemLayout(e);if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t})),e.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getGraph().getEdgeByIndex(e).node1.getLayout();if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t}))}));return s.data}},e.prototype.setNodePosition=function(t,e){var n=(this.option.data||this.option.nodes)[t];n.localX=e[0],n.localY=e[1]},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.formatTooltip=function(t,e,n){function i(t){return isNaN(t)||null==t}if("edge"===n){var r=this.getDataParams(t,n),o=r.data,a=r.value;return qf("nameValue",{name:o.source+" -- "+o.target,value:a,noValue:i(a)})}var s=this.getGraph().getNodeByIndex(t).getLayout().value,l=this.getDataParams(t,n).data.name;return qf("nameValue",{name:null!=l?l+"":null,value:s,noValue:i(s)})},e.prototype.optionUpdated=function(){},e.prototype.getDataParams=function(e,n){var i=t.prototype.getDataParams.call(this,e,n);if(null==i.value&&"node"===n){var r=this.getGraph().getNodeByIndex(e).getLayout().value;i.value=r}return i},e.type="series.sankey",e.defaultOption={z:2,coordinateSystem:"view",left:"5%",top:"5%",right:"20%",bottom:"5%",orient:"horizontal",nodeWidth:20,nodeGap:8,draggable:!0,layoutIterations:32,label:{show:!0,position:"right",fontSize:12},levels:[],nodeAlign:"justify",lineStyle:{color:"#314656",opacity:.2,curveness:.5},emphasis:{label:{show:!0},lineStyle:{opacity:.5}},select:{itemStyle:{borderColor:"#212121"}},animationEasing:"linear",animationDuration:1e3},e}(hg);function DL(t,e){t.eachSeriesByType("sankey",(function(t){var n=t.get("nodeWidth"),i=t.get("nodeGap"),r=function(t,e){return wp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=r;var o=r.width,a=r.height,s=t.getGraph(),l=s.nodes,u=s.edges;!function(t){E(t,(function(t){var e=VL(t.outEdges,zL),n=VL(t.inEdges,zL),i=t.getValue()||0,r=Math.max(e,n,i);t.setLayout({value:r},!0)}))}(l),function(t,e,n,i,r,o,a,s,l){(function(t,e,n,i,r,o,a){for(var s=[],l=[],u=[],h=[],c=0,p=0;p=0;v&&y.depth>d&&(d=y.depth),g.setLayout({depth:v?y.depth:c},!0),"vertical"===o?g.setLayout({dy:n},!0):g.setLayout({dx:n},!0);for(var m=0;mc-1?d:c-1;a&&"left"!==a&&function(t,e,n,i){if("right"===e){for(var r=[],o=t,a=0;o.length;){for(var s=0;s0;o--)LL(s,l*=.99,a),kL(s,r,n,i,a),BL(s,l,a),kL(s,r,n,i,a)}(t,e,o,r,i,a,s),function(t,e){var n="vertical"===e?"x":"y";E(t,(function(t){t.outEdges.sort((function(t,e){return t.node2.getLayout()[n]-e.node2.getLayout()[n]})),t.inEdges.sort((function(t,e){return t.node1.getLayout()[n]-e.node1.getLayout()[n]}))})),E(t,(function(t){var e=0,n=0;E(t.outEdges,(function(t){t.setLayout({sy:e},!0),e+=t.getLayout().dy})),E(t.inEdges,(function(t){t.setLayout({ty:n},!0),n+=t.getLayout().dy}))}))}(t,s)}(l,u,n,i,o,a,0!==B(l,(function(t){return 0===t.getLayout().value})).length?0:t.get("layoutIterations"),t.get("orient"),t.get("nodeAlign"))}))}function AL(t){var e=t.hostGraph.data.getRawDataItem(t.dataIndex);return null!=e.depth&&e.depth>=0}function kL(t,e,n,i,r){var o="vertical"===r?"x":"y";E(t,(function(t){var a,s,l;t.sort((function(t,e){return t.getLayout()[o]-e.getLayout()[o]}));for(var u=0,h=t.length,c="vertical"===r?"dx":"dy",p=0;p0&&(a=s.getLayout()[o]+l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]+s.getLayout()[c]+e;if((l=u-e-("vertical"===r?i:n))>0){a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0),u=a;for(p=h-2;p>=0;--p)(l=(s=t[p]).getLayout()[o]+s.getLayout()[c]+e-u)>0&&(a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]}}))}function LL(t,e,n){E(t.slice().reverse(),(function(t){E(t,(function(t){if(t.outEdges.length){var i=VL(t.outEdges,PL,n)/VL(t.outEdges,zL);if(isNaN(i)){var r=t.outEdges.length;i=r?VL(t.outEdges,OL,n)/r:0}if("vertical"===n){var o=t.getLayout().x+(i-EL(t,n))*e;t.setLayout({x:o},!0)}else{var a=t.getLayout().y+(i-EL(t,n))*e;t.setLayout({y:a},!0)}}}))}))}function PL(t,e){return EL(t.node2,e)*t.getValue()}function OL(t,e){return EL(t.node2,e)}function RL(t,e){return EL(t.node1,e)*t.getValue()}function NL(t,e){return EL(t.node1,e)}function EL(t,e){return"vertical"===e?t.getLayout().x+t.getLayout().dx/2:t.getLayout().y+t.getLayout().dy/2}function zL(t){return t.getValue()}function VL(t,e,n){for(var i=0,r=t.length,o=-1;++oi&&(i=e)})),E(e,(function(e){var r=new sD({type:"color",mappingMethod:"linear",dataExtent:[n,i],visual:t.get("color")}).mapValueToVisual(e.getLayout().value),o=e.getModel().get(["itemStyle","color"]);null!=o?(e.setVisual("color",o),e.setVisual("style",{fill:o})):(e.setVisual("color",r),e.setVisual("style",{fill:r}))}))}}))}var GL=function(){function t(){}return t.prototype.getInitialData=function(t,e){var n,i,r=e.getComponent("xAxis",this.get("xAxisIndex")),o=e.getComponent("yAxis",this.get("yAxisIndex")),a=r.get("type"),s=o.get("type");"category"===a?(t.layout="horizontal",n=r.getOrdinalMeta(),i=!0):"category"===s?(t.layout="vertical",n=o.getOrdinalMeta(),i=!0):t.layout=t.layout||"horizontal";var l=["x","y"],u="horizontal"===t.layout?0:1,h=this._baseAxisDim=l[u],c=l[1-u],p=[r,o],d=p[u].get("type"),f=p[1-u].get("type"),g=t.data;if(g&&i){var y=[];E(g,(function(t,e){var n;Y(t)?(n=t.slice(),t.unshift(e)):Y(t.value)?((n=A({},t)).value=n.value.slice(),t.value.unshift(e)):n=t,y.push(n)})),t.data=y}var v=this.defaultValueDimensions,m=[{name:h,type:Lm(d),ordinalMeta:n,otherDims:{tooltip:!1,itemName:0},dimsDef:["base"]},{name:c,type:Lm(f),dimsDef:v.slice()}];return pM(this,{coordDimensions:m,dimensionsCount:v.length+1,encodeDefaulter:H(Xp,m,this)})},t.prototype.getBaseAxis=function(){var t=this._baseAxisDim;return this.ecModel.getComponent(t+"Axis",this.get(t+"AxisIndex")).axis},t}(),WL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.defaultValueDimensions=[{name:"min",defaultTooltip:!0},{name:"Q1",defaultTooltip:!0},{name:"median",defaultTooltip:!0},{name:"Q3",defaultTooltip:!0},{name:"max",defaultTooltip:!0}],n.visualDrawType="stroke",n}return n(e,t),e.type="series.boxplot",e.dependencies=["xAxis","yAxis","grid"],e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,boxWidth:[7,50],itemStyle:{color:"#fff",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2,shadowBlur:5,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0,0,0,0.2)"}},animationDuration:800},e}(hg);R(WL,GL,!0);var HL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this.group,o=this._data;this._data||r.removeAll();var a="horizontal"===t.get("layout")?1:0;i.diff(o).add((function(t){if(i.hasValue(t)){var e=XL(i.getItemLayout(t),i,t,a,!0);i.setItemGraphicEl(t,e),r.add(e)}})).update((function(t,e){var n=o.getItemGraphicEl(e);if(i.hasValue(t)){var s=i.getItemLayout(t);n?(gh(n),ZL(s,n,i,t)):n=XL(s,i,t,a),r.add(n),i.setItemGraphicEl(t,n)}else r.remove(n)})).remove((function(t){var e=o.getItemGraphicEl(t);e&&r.remove(e)})).execute(),this._data=i},e.prototype.remove=function(t){var e=this.group,n=this._data;this._data=null,n&&n.eachItemGraphicEl((function(t){t&&e.remove(t)}))},e.type="boxplot",e}(wg),YL=function(){},UL=function(t){function e(e){var n=t.call(this,e)||this;return n.type="boxplotBoxPath",n}return n(e,t),e.prototype.getDefaultShape=function(){return new YL},e.prototype.buildPath=function(t,e){var n=e.points,i=0;for(t.moveTo(n[i][0],n[i][1]),i++;i<4;i++)t.lineTo(n[i][0],n[i][1]);for(t.closePath();ig){var _=[v,x];i.push(_)}}}return{boxData:n,outliers:i}}(e.getRawData(),t.config);return[{dimensions:["ItemName","Low","Q1","Q2","Q3","High"],data:i.boxData},{data:i.outliers}]}};var QL=["color","borderColor"],tP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeClipPath(),this._progressiveEls=null,this._updateDrawMode(t),this._isLargeDraw?this._renderLarge(t):this._renderNormal(t)},e.prototype.incrementalPrepareRender=function(t,e,n){this._clear(),this._updateDrawMode(t)},e.prototype.incrementalRender=function(t,e,n,i){this._progressiveEls=[],this._isLargeDraw?this._incrementalRenderLarge(t,e):this._incrementalRenderNormal(t,e)},e.prototype.eachRendered=function(t){Yh(this._progressiveEls||this.group,t)},e.prototype._updateDrawMode=function(t){var e=t.pipelineContext.large;null!=this._isLargeDraw&&e===this._isLargeDraw||(this._isLargeDraw=e,this._clear())},e.prototype._renderNormal=function(t){var e=t.getData(),n=this._data,i=this.group,r=e.getLayout("isSimpleBox"),o=t.get("clip",!0),a=t.coordinateSystem,s=a.getArea&&a.getArea();this._data||i.removeAll(),e.diff(n).add((function(n){if(e.hasValue(n)){var a=e.getItemLayout(n);if(o&&rP(s,a))return;var l=iP(a,n,!0);hh(l,{shape:{points:a.ends}},t,n),oP(l,e,n,r),i.add(l),e.setItemGraphicEl(n,l)}})).update((function(a,l){var u=n.getItemGraphicEl(l);if(e.hasValue(a)){var h=e.getItemLayout(a);o&&rP(s,h)?i.remove(u):(u?(uh(u,{shape:{points:h.ends}},t,a),gh(u)):u=iP(h),oP(u,e,a,r),i.add(u),e.setItemGraphicEl(a,u))}else i.remove(u)})).remove((function(t){var e=n.getItemGraphicEl(t);e&&i.remove(e)})).execute(),this._data=e},e.prototype._renderLarge=function(t){this._clear(),uP(t,this.group);var e=t.get("clip",!0)?cS(t.coordinateSystem,!1,t):null;e?this.group.setClipPath(e):this.group.removeClipPath()},e.prototype._incrementalRenderNormal=function(t,e){for(var n,i=e.getData(),r=i.getLayout("isSimpleBox");null!=(n=t.next());){var o=iP(i.getItemLayout(n));oP(o,i,n,r),o.incremental=!0,this.group.add(o),this._progressiveEls.push(o)}},e.prototype._incrementalRenderLarge=function(t,e){uP(e,this.group,this._progressiveEls,!0)},e.prototype.remove=function(t){this._clear()},e.prototype._clear=function(){this.group.removeAll(),this._data=null},e.type="candlestick",e}(wg),eP=function(){},nP=function(t){function e(e){var n=t.call(this,e)||this;return n.type="normalCandlestickBox",n}return n(e,t),e.prototype.getDefaultShape=function(){return new eP},e.prototype.buildPath=function(t,e){var n=e.points;this.__simpleBox?(t.moveTo(n[4][0],n[4][1]),t.lineTo(n[6][0],n[6][1])):(t.moveTo(n[0][0],n[0][1]),t.lineTo(n[1][0],n[1][1]),t.lineTo(n[2][0],n[2][1]),t.lineTo(n[3][0],n[3][1]),t.closePath(),t.moveTo(n[4][0],n[4][1]),t.lineTo(n[5][0],n[5][1]),t.moveTo(n[6][0],n[6][1]),t.lineTo(n[7][0],n[7][1]))},e}(_s);function iP(t,e,n){var i=t.ends;return new nP({shape:{points:n?aP(i,t):i},z2:100})}function rP(t,e){for(var n=!0,i=0;i0?"borderColor":"borderColor0"])||n.get(["itemStyle",t>0?"color":"color0"]),o=n.getModel("itemStyle").getItemStyle(QL);e.useStyle(o),e.style.fill=null,e.style.stroke=r}var cP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.defaultValueDimensions=[{name:"open",defaultTooltip:!0},{name:"close",defaultTooltip:!0},{name:"lowest",defaultTooltip:!0},{name:"highest",defaultTooltip:!0}],n}return n(e,t),e.prototype.getShadowDim=function(){return"open"},e.prototype.brushSelector=function(t,e,n){var i=e.getItemLayout(t);return i&&n.rect(i.brushRect)},e.type="series.candlestick",e.dependencies=["xAxis","yAxis","grid"],e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,clip:!0,itemStyle:{color:"#eb5454",color0:"#47b262",borderColor:"#eb5454",borderColor0:"#47b262",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2}},barMaxWidth:null,barMinWidth:null,barWidth:null,large:!0,largeThreshold:600,progressive:3e3,progressiveThreshold:1e4,progressiveChunkMode:"mod",animationEasing:"linear",animationDuration:300},e}(hg);function pP(t){t&&Y(t.series)&&E(t.series,(function(t){q(t)&&"k"===t.type&&(t.type="candlestick")}))}R(cP,GL,!0);var dP=["itemStyle","borderColor"],fP=["itemStyle","borderColor0"],gP=["itemStyle","color"],yP=["itemStyle","color0"],vP={seriesType:"candlestick",plan:xg(),performRawSeries:!0,reset:function(t,e){function n(t,e){return e.get(t>0?gP:yP)}function i(t,e){return e.get(t>0?dP:fP)}if(!e.isSeriesFiltered(t))return!t.pipelineContext.large&&{progress:function(t,e){for(var r;null!=(r=t.next());){var o=e.getItemModel(r),a=e.getItemLayout(r).sign,s=o.getItemStyle();s.fill=n(a,o),s.stroke=i(a,o)||s.fill,A(e.ensureUniqueItemVisual(r,"style"),s)}}}}},mP={seriesType:"candlestick",plan:xg(),reset:function(t){var e=t.coordinateSystem,n=t.getData(),i=function(t,e){var n,i=t.getBaseAxis(),r="category"===i.type?i.getBandWidth():(n=i.getExtent(),Math.abs(n[1]-n[0])/e.count()),o=Gr(rt(t.get("barMaxWidth"),r),r),a=Gr(rt(t.get("barMinWidth"),1),r),s=t.get("barWidth");return null!=s?Gr(s,r):Math.max(Math.min(r/2,o),a)}(t,n),r=["x","y"],o=n.getDimensionIndex(n.mapDimension(r[0])),a=z(n.mapDimensionsAll(r[1]),n.getDimensionIndex,n),s=a[0],l=a[1],u=a[2],h=a[3];if(n.setLayout({candleWidth:i,isSimpleBox:i<=1.3}),!(o<0||a.length<4))return{progress:t.pipelineContext.large?function(t,n){var i,r,a=Tx(4*t.count),c=0,p=[],d=[],f=n.getStore();for(;null!=(r=t.next());){var g=f.get(o,r),y=f.get(s,r),v=f.get(l,r),m=f.get(u,r),x=f.get(h,r);isNaN(g)||isNaN(m)||isNaN(x)?(a[c++]=NaN,c+=3):(a[c++]=xP(f,r,y,v,l),p[0]=g,p[1]=m,i=e.dataToPoint(p,null,d),a[c++]=i?i[0]:NaN,a[c++]=i?i[1]:NaN,p[1]=x,i=e.dataToPoint(p,null,d),a[c++]=i?i[1]:NaN)}n.setLayout("largePoints",a)}:function(t,n){var r,a=n.getStore();for(;null!=(r=t.next());){var c=a.get(o,r),p=a.get(s,r),d=a.get(l,r),f=a.get(u,r),g=a.get(h,r),y=Math.min(p,d),v=Math.max(p,d),m=S(y,c),x=S(v,c),_=S(f,c),b=S(g,c),w=[];M(w,x,0),M(w,m,1),w.push(T(b),T(x),T(_),T(m)),n.setItemLayout(r,{sign:xP(a,r,p,d,l),initBaseline:p>d?x[1]:m[1],ends:w,brushRect:I(f,g,c)})}function S(t,n){var i=[];return i[0]=n,i[1]=t,isNaN(n)||isNaN(t)?[NaN,NaN]:e.dataToPoint(i)}function M(t,e,n){var r=e.slice(),o=e.slice();r[0]=kh(r[0]+i/2,1,!1),o[0]=kh(o[0]-i/2,1,!0),n?t.push(r,o):t.push(o,r)}function I(t,e,n){var r=S(t,n),o=S(e,n);return r[0]-=i/2,o[0]-=i/2,{x:r[0],y:r[1],width:i,height:o[1]-r[1]}}function T(t){return t[0]=kh(t[0],1),t}}}}};function xP(t,e,n,i,r){return n>i?-1:n0?t.get(r,e-1)<=i?1:-1:1}function _P(t,e){var n=e.rippleEffectColor||e.color;t.eachChild((function(t){t.attr({z:e.z,zlevel:e.zlevel,style:{stroke:"stroke"===e.brushType?n:null,fill:"fill"===e.brushType?n:null}})}))}var bP=function(t){function e(e,n){var i=t.call(this)||this,r=new Zw(e,n),o=new Pr;return i.add(r),i.add(o),i.updateData(e,n),i}return n(e,t),e.prototype.stopEffectAnimation=function(){this.childAt(1).removeAll()},e.prototype.startEffectAnimation=function(t){for(var e=t.symbolType,n=t.color,i=t.rippleNumber,r=this.childAt(1),o=0;o0&&(o=this._getLineLength(i)/l*1e3),o!==this._period||a!==this._loop||s!==this._roundTrip){i.stopAnimation();var h=void 0;h=U(u)?u(n):u,i.__t>0&&(h=-o*i.__t),this._animateSymbol(i,o,h,a,s)}this._period=o,this._loop=a,this._roundTrip=s}},e.prototype._animateSymbol=function(t,e,n,i,r){if(e>0){t.__t=0;var o=this,a=t.animate("",i).when(r?2*e:e,{__t:r?2:1}).delay(n).during((function(){o._updateSymbolPosition(t)}));i||a.done((function(){o.remove(t)})),a.start()}},e.prototype._getLineLength=function(t){return Et(t.__p1,t.__cp1)+Et(t.__cp1,t.__p2)},e.prototype._updateAnimationPoints=function(t,e){t.__p1=e[0],t.__p2=e[1],t.__cp1=e[2]||[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]},e.prototype.updateData=function(t,e,n){this.childAt(0).updateData(t,e,n),this._updateEffectSymbol(t,e)},e.prototype._updateSymbolPosition=function(t){var e=t.__p1,n=t.__p2,i=t.__cp1,r=t.__t<1?t.__t:2-t.__t,o=[t.x,t.y],a=o.slice(),s=wn,l=Sn;o[0]=s(e[0],i[0],n[0],r),o[1]=s(e[1],i[1],n[1],r);var u=t.__t<1?l(e[0],i[0],n[0],r):l(n[0],i[0],e[0],1-r),h=t.__t<1?l(e[1],i[1],n[1],r):l(n[1],i[1],e[1],1-r);t.rotation=-Math.atan2(h,u)-Math.PI/2,"line"!==this._symbolType&&"rect"!==this._symbolType&&"roundRect"!==this._symbolType||(void 0!==t.__lastT&&t.__lastT=0&&!(i[o]<=e);o--);o=Math.min(o,r-2)}else{for(o=a;oe);o++);o=Math.min(o-1,r-2)}var s=(e-i[o])/(i[o+1]-i[o]),l=n[o],u=n[o+1];t.x=l[0]*(1-s)+s*u[0],t.y=l[1]*(1-s)+s*u[1];var h=t.__t<1?u[0]-l[0]:l[0]-u[0],c=t.__t<1?u[1]-l[1]:l[1]-u[1];t.rotation=-Math.atan2(c,h)-Math.PI/2,this._lastFrame=o,this._lastFramePercent=e,t.ignore=!1}},e}(MP),CP=function(){this.polyline=!1,this.curveness=0,this.segs=[]},DP=function(t){function e(e){var n=t.call(this,e)||this;return n._off=0,n.hoverDataIdx=-1,n}return n(e,t),e.prototype.reset=function(){this.notClear=!1,this._off=0},e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new CP},e.prototype.buildPath=function(t,e){var n,i=e.segs,r=e.curveness;if(e.polyline)for(n=this._off;n0){t.moveTo(i[n++],i[n++]);for(var a=1;a0){var c=(s+u)/2-(l-h)*r,p=(l+h)/2-(u-s)*r;t.quadraticCurveTo(c,p,u,h)}else t.lineTo(u,h)}this.incremental&&(this._off=n,this.notClear=!0)},e.prototype.findDataIndex=function(t,e){var n=this.shape,i=n.segs,r=n.curveness,o=this.style.lineWidth;if(n.polyline)for(var a=0,s=0;s0)for(var u=i[s++],h=i[s++],c=1;c0){if(is(u,h,(u+p)/2-(h-d)*r,(h+d)/2-(p-u)*r,p,d,o,t,e))return a}else if(es(u,h,p,d,o,t,e))return a;a++}return-1},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return t=n[0],e=n[1],i.contain(t,e)?(this.hoverDataIdx=this.findDataIndex(t,e))>=0:(this.hoverDataIdx=-1,!1)},e.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var e=this.shape.segs,n=1/0,i=1/0,r=-1/0,o=-1/0,a=0;a0&&(o.dataIndex=n+t.__startIndex)}))},t.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},t}(),kP={seriesType:"lines",plan:xg(),reset:function(t){var e=t.coordinateSystem;if(e){var n=t.get("polyline"),i=t.pipelineContext.large;return{progress:function(r,o){var a=[];if(i){var s=void 0,l=r.end-r.start;if(n){for(var u=0,h=r.start;h0&&(l||s.configLayer(o,{motionBlur:!0,lastFrameAlpha:Math.max(Math.min(a/10+.9,1),0)})),r.updateData(i);var u=t.get("clip",!0)&&cS(t.coordinateSystem,!1,t);u?this.group.setClipPath(u):this.group.removeClipPath(),this._lastZlevel=o,this._finished=!0},e.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateLineDraw(i,t).incrementalPrepareUpdate(i),this._clearLayer(n),this._finished=!1},e.prototype.incrementalRender=function(t,e,n){this._lineDraw.incrementalUpdate(t,e.getData()),this._finished=t.end===e.getData().count()},e.prototype.eachRendered=function(t){this._lineDraw&&this._lineDraw.eachRendered(t)},e.prototype.updateTransform=function(t,e,n){var i=t.getData(),r=t.pipelineContext;if(!this._finished||r.large||r.progressiveRender)return{update:!0};var o=kP.reset(t,e,n);o.progress&&o.progress({start:0,end:i.count(),count:i.count()},i),this._lineDraw.updateLayout(),this._clearLayer(n)},e.prototype._updateLineDraw=function(t,e){var n=this._lineDraw,i=this._showEffect(e),r=!!e.get("polyline"),o=e.pipelineContext.large;return n&&i===this._hasEffet&&r===this._isPolyline&&o===this._isLargeDraw||(n&&n.remove(),n=this._lineDraw=o?new AP:new _A(r?i?TP:IP:i?MP:xA),this._hasEffet=i,this._isPolyline=r,this._isLargeDraw=o),this.group.add(n.group),n},e.prototype._showEffect=function(t){return!!t.get(["effect","show"])},e.prototype._clearLayer=function(t){var e=t.getZr();"svg"===e.painter.getType()||null==this._lastZlevel||e.painter.getLayer(this._lastZlevel).clear(!0)},e.prototype.remove=function(t,e){this._lineDraw&&this._lineDraw.remove(),this._lineDraw=null,this._clearLayer(e)},e.prototype.dispose=function(t,e){this.remove(t,e)},e.type="lines",e}(wg),PP="undefined"==typeof Uint32Array?Array:Uint32Array,OP="undefined"==typeof Float64Array?Array:Float64Array;function RP(t){var e=t.data;e&&e[0]&&e[0][0]&&e[0][0].coord&&(t.data=z(e,(function(t){var e={coords:[t[0].coord,t[1].coord]};return t[0].name&&(e.fromName=t[0].name),t[1].name&&(e.toName=t[1].name),D([e,t[0],t[1]])})))}var NP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.visualStyleAccessPath="lineStyle",n.visualDrawType="stroke",n}return n(e,t),e.prototype.init=function(e){e.data=e.data||[],RP(e);var n=this._processFlatCoordsArray(e.data);this._flatCoords=n.flatCoords,this._flatCoordsOffset=n.flatCoordsOffset,n.flatCoords&&(e.data=new Float32Array(n.count)),t.prototype.init.apply(this,arguments)},e.prototype.mergeOption=function(e){if(RP(e),e.data){var n=this._processFlatCoordsArray(e.data);this._flatCoords=n.flatCoords,this._flatCoordsOffset=n.flatCoordsOffset,n.flatCoords&&(e.data=new Float32Array(n.count))}t.prototype.mergeOption.apply(this,arguments)},e.prototype.appendData=function(t){var e=this._processFlatCoordsArray(t.data);e.flatCoords&&(this._flatCoords?(this._flatCoords=gt(this._flatCoords,e.flatCoords),this._flatCoordsOffset=gt(this._flatCoordsOffset,e.flatCoordsOffset)):(this._flatCoords=e.flatCoords,this._flatCoordsOffset=e.flatCoordsOffset),t.data=new Float32Array(e.count)),this.getRawData().appendData(t.data)},e.prototype._getCoordsFromItemModel=function(t){var e=this.getData().getItemModel(t),n=e.option instanceof Array?e.option:e.getShallow("coords");return n},e.prototype.getLineCoordsCount=function(t){return this._flatCoordsOffset?this._flatCoordsOffset[2*t+1]:this._getCoordsFromItemModel(t).length},e.prototype.getLineCoords=function(t,e){if(this._flatCoordsOffset){for(var n=this._flatCoordsOffset[2*t],i=this._flatCoordsOffset[2*t+1],r=0;r ")})},e.prototype.preventIncremental=function(){return!!this.get(["effect","show"])},e.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?1e4:this.get("progressive"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?2e4:this.get("progressiveThreshold"):t},e.prototype.getZLevelKey=function(){var t=this.getModel("effect"),e=t.get("trailLength");return this.getData().count()>this.getProgressiveThreshold()?this.id:t.get("show")&&e>0?e+"":""},e.type="series.lines",e.dependencies=["grid","polar","geo","calendar"],e.defaultOption={coordinateSystem:"geo",z:2,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,symbol:["none","none"],symbolSize:[10,10],geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:"circle",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,polyline:!1,clip:!0,label:{show:!1,position:"end"},lineStyle:{opacity:.5}},e}(hg);function EP(t){return t instanceof Array||(t=[t,t]),t}var zP={seriesType:"lines",reset:function(t){var e=EP(t.get("symbol")),n=EP(t.get("symbolSize")),i=t.getData();return i.setVisual("fromSymbol",e&&e[0]),i.setVisual("toSymbol",e&&e[1]),i.setVisual("fromSymbolSize",n&&n[0]),i.setVisual("toSymbolSize",n&&n[1]),{dataEach:i.hasItemOption?function(t,e){var n=t.getItemModel(e),i=EP(n.getShallow("symbol",!0)),r=EP(n.getShallow("symbolSize",!0));i[0]&&t.setItemVisual(e,"fromSymbol",i[0]),i[1]&&t.setItemVisual(e,"toSymbol",i[1]),r[0]&&t.setItemVisual(e,"fromSymbolSize",r[0]),r[1]&&t.setItemVisual(e,"toSymbolSize",r[1])}:null}}};var VP=function(){function t(){this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.minOpacity=0,this._gradientPixels={inRange:null,outOfRange:null};var t=h.createCanvas();this.canvas=t}return t.prototype.update=function(t,e,n,i,r,o){var a=this._getBrush(),s=this._getGradient(r,"inRange"),l=this._getGradient(r,"outOfRange"),u=this.pointSize+this.blurSize,h=this.canvas,c=h.getContext("2d"),p=t.length;h.width=e,h.height=n;for(var d=0;d0){var I=o(v)?s:l;v>0&&(v=v*S+w),x[_++]=I[M],x[_++]=I[M+1],x[_++]=I[M+2],x[_++]=I[M+3]*v*256}else _+=4}return c.putImageData(m,0,0),h},t.prototype._getBrush=function(){var t=this._brushCanvas||(this._brushCanvas=h.createCanvas()),e=this.pointSize+this.blurSize,n=2*e;t.width=n,t.height=n;var i=t.getContext("2d");return i.clearRect(0,0,n,n),i.shadowOffsetX=n,i.shadowBlur=this.blurSize,i.shadowColor="#000",i.beginPath(),i.arc(-e,e,this.pointSize,0,2*Math.PI,!0),i.closePath(),i.fill(),t},t.prototype._getGradient=function(t,e){for(var n=this._gradientPixels,i=n[e]||(n[e]=new Uint8ClampedArray(1024)),r=[0,0,0,0],o=0,a=0;a<256;a++)t[e](a/255,!0,r),i[o++]=r[0],i[o++]=r[1],i[o++]=r[2],i[o++]=r[3];return i},t}();function BP(t){var e=t.dimensions;return"lng"===e[0]&&"lat"===e[1]}var FP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i;e.eachComponent("visualMap",(function(e){e.eachTargetSeries((function(n){n===t&&(i=e)}))})),this._progressiveEls=null,this.group.removeAll();var r=t.coordinateSystem;"cartesian2d"===r.type||"calendar"===r.type?this._renderOnCartesianAndCalendar(t,n,0,t.getData().count()):BP(r)&&this._renderOnGeo(r,t,i,n)},e.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll()},e.prototype.incrementalRender=function(t,e,n,i){var r=e.coordinateSystem;r&&(BP(r)?this.render(e,n,i):(this._progressiveEls=[],this._renderOnCartesianAndCalendar(e,i,t.start,t.end,!0)))},e.prototype.eachRendered=function(t){Yh(this._progressiveEls||this.group,t)},e.prototype._renderOnCartesianAndCalendar=function(t,e,n,i,r){var o,a,s,l,u=t.coordinateSystem,h=pS(u,"cartesian2d");if(h){var c=u.getAxis("x"),p=u.getAxis("y");0,o=c.getBandWidth()+.5,a=p.getBandWidth()+.5,s=c.scale.getExtent(),l=p.scale.getExtent()}for(var d=this.group,f=t.getData(),g=t.getModel(["emphasis","itemStyle"]).getItemStyle(),y=t.getModel(["blur","itemStyle"]).getItemStyle(),v=t.getModel(["select","itemStyle"]).getItemStyle(),m=t.get(["itemStyle","borderRadius"]),x=Kh(t),_=t.getModel("emphasis"),b=_.get("focus"),w=_.get("blurScope"),S=_.get("disabled"),M=h?[f.mapDimension("x"),f.mapDimension("y"),f.mapDimension("value")]:[f.mapDimension("time"),f.mapDimension("value")],I=n;Is[1]||Al[1])continue;var k=u.dataToPoint([D,A]);T=new Ps({shape:{x:k[0]-o/2,y:k[1]-a/2,width:o,height:a},style:C})}else{if(isNaN(f.get(M[1],I)))continue;T=new Ps({z2:1,shape:u.dataToRect([f.get(M[0],I)]).contentShape,style:C})}if(f.hasItemOption){var L=f.getItemModel(I),P=L.getModel("emphasis");g=P.getModel("itemStyle").getItemStyle(),y=L.getModel(["blur","itemStyle"]).getItemStyle(),v=L.getModel(["select","itemStyle"]).getItemStyle(),m=L.get(["itemStyle","borderRadius"]),b=P.get("focus"),w=P.get("blurScope"),S=P.get("disabled"),x=Kh(L)}T.shape.r=m;var O=t.getRawValue(I),R="-";O&&null!=O[2]&&(R=O[2]+""),qh(T,x,{labelFetcher:t,labelDataIndex:I,defaultOpacity:C.opacity,defaultText:R}),T.ensureState("emphasis").style=g,T.ensureState("blur").style=y,T.ensureState("select").style=v,Bl(T,b,w,S),T.incremental=r,r&&(T.states.emphasis.hoverLayer=!0),d.add(T),f.setItemGraphicEl(I,T),this._progressiveEls&&this._progressiveEls.push(T)}},e.prototype._renderOnGeo=function(t,e,n,i){var r=n.targetVisuals.inRange,o=n.targetVisuals.outOfRange,a=e.getData(),s=this._hmLayer||this._hmLayer||new VP;s.blurSize=e.get("blurSize"),s.pointSize=e.get("pointSize"),s.minOpacity=e.get("minOpacity"),s.maxOpacity=e.get("maxOpacity");var l=t.getViewRect().clone(),u=t.getRoamTransform();l.applyTransform(u);var h=Math.max(l.x,0),c=Math.max(l.y,0),p=Math.min(l.width+l.x,i.getWidth()),d=Math.min(l.height+l.y,i.getHeight()),f=p-h,g=d-c,y=[a.mapDimension("lng"),a.mapDimension("lat"),a.mapDimension("value")],v=a.mapArray(y,(function(e,n,i){var r=t.dataToPoint([e,n]);return r[0]-=h,r[1]-=c,r.push(i),r})),m=n.getExtent(),x="visualMap.continuous"===n.type?function(t,e){var n=t[1]-t[0];return e=[(e[0]-t[0])/n,(e[1]-t[0])/n],function(t){return t>=e[0]&&t<=e[1]}}(m,n.option.range):function(t,e,n){var i=t[1]-t[0],r=(e=z(e,(function(e){return{interval:[(e.interval[0]-t[0])/i,(e.interval[1]-t[0])/i]}}))).length,o=0;return function(t){var i;for(i=o;i=0;i--){var a;if((a=e[i].interval)[0]<=t&&t<=a[1]){o=i;break}}return i>=0&&i0?1:-1}(n,o,r,i,c),function(t,e,n,i,r,o,a,s,l,u){var h,c=l.valueDim,p=l.categoryDim,d=Math.abs(n[p.wh]),f=t.getItemVisual(e,"symbolSize");h=Y(f)?f.slice():null==f?["100%","100%"]:[f,f];h[p.index]=Gr(h[p.index],d),h[c.index]=Gr(h[c.index],i?d:Math.abs(o)),u.symbolSize=h,(u.symbolScale=[h[0]/s,h[1]/s])[c.index]*=(l.isHorizontal?-1:1)*a}(t,e,r,o,0,c.boundingLength,c.pxSign,u,i,c),function(t,e,n,i,r){var o=t.get(WP)||0;o&&(YP.attr({scaleX:e[0],scaleY:e[1],rotation:n}),YP.updateTransform(),o/=YP.getLineScale(),o*=e[i.valueDim.index]);r.valueLineWidth=o||0}(n,c.symbolScale,l,i,c);var p=c.symbolSize,d=Ey(n.get("symbolOffset"),p);return function(t,e,n,i,r,o,a,s,l,u,h,c){var p=h.categoryDim,d=h.valueDim,f=c.pxSign,g=Math.max(e[d.index]+s,0),y=g;if(i){var v=Math.abs(l),m=it(t.get("symbolMargin"),"15%")+"",x=!1;m.lastIndexOf("!")===m.length-1&&(x=!0,m=m.slice(0,m.length-1));var _=Gr(m,e[d.index]),b=Math.max(g+2*_,0),w=x?0:2*_,S=ao(i),M=S?i:lO((v+w)/b);b=g+2*(_=(v-M*g)/2/(x?M:Math.max(M-1,1))),w=x?0:2*_,S||"fixed"===i||(M=u?lO((Math.abs(u)+w)/b):0),y=M*b-w,c.repeatTimes=M,c.symbolMargin=_}var I=f*(y/2),T=c.pathPosition=[];T[p.index]=n[p.wh]/2,T[d.index]="start"===a?I:"end"===a?l-I:l/2,o&&(T[0]+=o[0],T[1]+=o[1]);var C=c.bundlePosition=[];C[p.index]=n[p.xy],C[d.index]=n[d.xy];var D=c.barRectShape=A({},n);D[d.wh]=f*Math.max(Math.abs(n[d.wh]),Math.abs(T[d.index]+I)),D[p.wh]=n[p.wh];var k=c.clipShape={};k[p.xy]=-n[p.xy],k[p.wh]=h.ecSize[p.wh],k[d.xy]=0,k[d.wh]=n[d.wh]}(n,p,r,o,0,d,s,c.valueLineWidth,c.boundingLength,c.repeatCutLength,i,c),c}function ZP(t,e){return t.toGlobalCoord(t.dataToCoord(t.scale.parse(e)))}function jP(t){var e=t.symbolPatternSize,n=Ry(t.symbolType,-e/2,-e/2,e,e);return n.attr({culling:!0}),"image"!==n.type&&n.setStyle({strokeNoScale:!0}),n}function qP(t,e,n,i){var r=t.__pictorialBundle,o=n.symbolSize,a=n.valueLineWidth,s=n.pathPosition,l=e.valueDim,u=n.repeatTimes||0,h=0,c=o[e.valueDim.index]+a+2*n.symbolMargin;for(oO(t,(function(t){t.__pictorialAnimationIndex=h,t.__pictorialRepeatTimes=u,h0:i<0)&&(r=u-1-t),e[l.index]=c*(r-u/2+.5)+s[l.index],{x:e[0],y:e[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation}}}function KP(t,e,n,i){var r=t.__pictorialBundle,o=t.__pictorialMainPath;o?aO(o,null,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation},n,i):(o=t.__pictorialMainPath=jP(n),r.add(o),aO(o,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:0,scaleY:0,rotation:n.rotation},{scaleX:n.symbolScale[0],scaleY:n.symbolScale[1]},n,i))}function $P(t,e,n){var i=A({},e.barRectShape),r=t.__pictorialBarRect;r?aO(r,null,{shape:i},e,n):((r=t.__pictorialBarRect=new Ps({z2:2,shape:i,silent:!0,style:{stroke:"transparent",fill:"transparent",lineWidth:0}})).disableMorphing=!0,t.add(r))}function JP(t,e,n,i){if(n.symbolClip){var r=t.__pictorialClipPath,o=A({},n.clipShape),a=e.valueDim,s=n.animationModel,l=n.dataIndex;if(r)uh(r,{shape:o},s,l);else{o[a.wh]=0,r=new Ps({shape:o}),t.__pictorialBundle.setClipPath(r),t.__pictorialClipPath=r;var u={};u[a.wh]=n.clipShape[a.wh],Uh[i?"updateProps":"initProps"](r,{shape:u},s,l)}}}function QP(t,e){var n=t.getItemModel(e);return n.getAnimationDelayParams=tO,n.isAnimationEnabled=eO,n}function tO(t){return{index:t.__pictorialAnimationIndex,count:t.__pictorialRepeatTimes}}function eO(){return this.parentModel.isAnimationEnabled()&&!!this.getShallow("animation")}function nO(t,e,n,i){var r=new Pr,o=new Pr;return r.add(o),r.__pictorialBundle=o,o.x=n.bundlePosition[0],o.y=n.bundlePosition[1],n.symbolRepeat?qP(r,e,n):KP(r,0,n),$P(r,n,i),JP(r,e,n,i),r.__pictorialShapeStr=rO(t,n),r.__pictorialSymbolMeta=n,r}function iO(t,e,n,i){var r=i.__pictorialBarRect;r&&r.removeTextContent();var o=[];oO(i,(function(t){o.push(t)})),i.__pictorialMainPath&&o.push(i.__pictorialMainPath),i.__pictorialClipPath&&(n=null),E(o,(function(t){ph(t,{scaleX:0,scaleY:0},n,e,(function(){i.parent&&i.parent.remove(i)}))})),t.setItemGraphicEl(e,null)}function rO(t,e){return[t.getItemVisual(e.dataIndex,"symbol")||"none",!!e.symbolRepeat,!!e.symbolClip].join(":")}function oO(t,e,n){E(t.__pictorialBundle.children(),(function(i){i!==t.__pictorialBarRect&&e.call(n,i)}))}function aO(t,e,n,i,r,o){e&&t.attr(e),i.symbolClip&&!r?n&&t.attr(n):n&&Uh[r?"updateProps":"initProps"](t,n,i.animationModel,i.dataIndex,o)}function sO(t,e,n){var i=n.dataIndex,r=n.itemModel,o=r.getModel("emphasis"),a=o.getModel("itemStyle").getItemStyle(),s=r.getModel(["blur","itemStyle"]).getItemStyle(),l=r.getModel(["select","itemStyle"]).getItemStyle(),u=r.getShallow("cursor"),h=o.get("focus"),c=o.get("blurScope"),p=o.get("scale");oO(t,(function(t){if(t instanceof Is){var e=t.style;t.useStyle(A({image:e.image,x:e.x,y:e.y,width:e.width,height:e.height},n.style))}else t.useStyle(n.style);var i=t.ensureState("emphasis");i.style=a,p&&(i.scaleX=1.1*t.scaleX,i.scaleY=1.1*t.scaleY),t.ensureState("blur").style=s,t.ensureState("select").style=l,u&&(t.cursor=u),t.z2=n.z2}));var d=e.valueDim.posDesc[+(n.boundingLength>0)];qh(t.__pictorialBarRect,Kh(r),{labelFetcher:e.seriesModel,labelDataIndex:i,defaultText:Uw(e.seriesModel.getData(),i),inheritColor:n.style.fill,defaultOpacity:n.style.opacity,defaultOutsidePosition:d}),Bl(t,h,c,o.get("disabled"))}function lO(t){var e=Math.round(t);return Math.abs(t-e)<1e-4?e:Math.ceil(t)}var uO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n.defaultSymbol="roundRect",n}return n(e,t),e.prototype.getInitialData=function(e){return e.stack=null,t.prototype.getInitialData.apply(this,arguments)},e.type="series.pictorialBar",e.dependencies=["grid"],e.defaultOption=wc(DS.defaultOption,{symbol:"circle",symbolSize:null,symbolRotate:null,symbolPosition:null,symbolOffset:null,symbolMargin:null,symbolRepeat:!1,symbolRepeatDirection:"end",symbolClip:!1,symbolBoundingData:null,symbolPatternSize:400,barGap:"-100%",progressive:0,emphasis:{scale:!1},select:{itemStyle:{borderColor:"#212121"}}}),e}(DS);var hO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._layers=[],n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this,o=this.group,a=t.getLayerSeries(),s=i.getLayout("layoutInfo"),l=s.rect,u=s.boundaryGap;function h(t){return t.name}o.x=0,o.y=l.y+u[0];var c=new Dm(this._layersSeries||[],a,h,h),p=[];function d(e,n,s){var l=r._layers;if("remove"!==e){for(var u,h,c=[],d=[],f=a[n].indices,g=0;go&&(o=s),i.push(s)}for(var u=0;uo&&(o=c)}return{y0:r,max:o}}(l),h=u.y0,c=n/u.max,p=o.length,d=o[0].indices.length,f=0;fMath.PI/2?"right":"left"):S&&"center"!==S?"left"===S?(m=r.r0+w,a>Math.PI/2&&(S="right")):"right"===S&&(m=r.r-w,a>Math.PI/2&&(S="left")):(m=o===2*Math.PI&&0===r.r0?0:(r.r+r.r0)/2,S="center"),g.style.align=S,g.style.verticalAlign=f(p,"verticalAlign")||"middle",g.x=m*s+r.cx,g.y=m*l+r.cy;var M=f(p,"rotate"),I=0;"radial"===M?(I=-a)<-Math.PI/2&&(I+=Math.PI):"tangential"===M?(I=Math.PI/2-a)>Math.PI/2?I-=Math.PI:I<-Math.PI/2&&(I+=Math.PI):j(M)&&(I=M*Math.PI/180),g.rotation=I})),h.dirtyStyle()},e}(Pu),gO="sunburstRootToNode",yO="sunburstHighlight";var vO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){var r=this;this.seriesModel=t,this.api=n,this.ecModel=e;var o=t.getData(),a=o.tree.root,s=t.getViewRoot(),l=this.group,u=t.get("renderLabelForZeroData"),h=[];s.eachNode((function(t){h.push(t)}));var c=this._oldChildren||[];!function(i,r){if(0===i.length&&0===r.length)return;function s(t){return t.getId()}function h(s,h){!function(i,r){u||!i||i.getValue()||(i=null);if(i!==a&&r!==a)if(r&&r.piece)i?(r.piece.updateData(!1,i,t,e,n),o.setItemGraphicEl(i.dataIndex,r.piece)):function(t){if(!t)return;t.piece&&(l.remove(t.piece),t.piece=null)}(r);else if(i){var s=new fO(i,t,e,n);l.add(s),o.setItemGraphicEl(i.dataIndex,s)}}(null==s?null:i[s],null==h?null:r[h])}new Dm(r,i,s,s).add(h).update(h).remove(H(h,null)).execute()}(h,c),function(i,o){o.depth>0?(r.virtualPiece?r.virtualPiece.updateData(!1,i,t,e,n):(r.virtualPiece=new fO(i,t,e,n),l.add(r.virtualPiece)),o.piece.off("click"),r.virtualPiece.on("click",(function(t){r._rootToNode(o.parentNode)}))):r.virtualPiece&&(l.remove(r.virtualPiece),r.virtualPiece=null)}(a,s),this._initEvents(),this._oldChildren=h},e.prototype._initEvents=function(){var t=this;this.group.off("click"),this.group.on("click",(function(e){var n=!1;t.seriesModel.getViewRoot().eachNode((function(i){if(!n&&i.piece&&i.piece===e.target){var r=i.getModel().get("nodeClick");if("rootToNode"===r)t._rootToNode(i);else if("link"===r){var o=i.getModel(),a=o.get("link");if(a)yp(a,o.get("target",!0)||"_blank")}n=!0}}))}))},e.prototype._rootToNode=function(t){t!==this.seriesModel.getViewRoot()&&this.api.dispatchAction({type:gO,from:this.uid,seriesId:this.seriesModel.id,targetNode:t})},e.prototype.containPoint=function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,o=Math.sqrt(i*i+r*r);return o<=n.r&&o>=n.r0}},e.type="sunburst",e}(wg),mO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.ignoreStyleOnData=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};xO(n);var i=this._levelModels=z(t.levels||[],(function(t){return new xc(t,this,e)}),this),r=OC.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e),o=i[n.depth];return o&&(t.parentModel=o),t}))}));return r.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treePathInfo=zC(i,this),n},e.prototype.getLevelModel=function(t){return this._levelModels&&this._levelModels[t.depth]},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},e.prototype.enableAriaDecal=function(){HC(this)},e.type="series.sunburst",e.defaultOption={z:2,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,stillShowZeroSum:!0,nodeClick:"rootToNode",renderLabelForZeroData:!1,label:{rotate:"radial",show:!0,opacity:1,align:"center",position:"inside",distance:5,silent:!0},itemStyle:{borderWidth:1,borderColor:"white",borderType:"solid",shadowBlur:0,shadowColor:"rgba(0, 0, 0, 0.2)",shadowOffsetX:0,shadowOffsetY:0,opacity:1},emphasis:{focus:"descendant"},blur:{itemStyle:{opacity:.2},label:{opacity:.1}},animationType:"expansion",animationDuration:1e3,animationDurationUpdate:500,data:[],sort:"desc"},e}(hg);function xO(t){var e=0;E(t.children,(function(t){xO(t);var n=t.value;Y(n)&&(n=n[0]),e+=n}));var n=t.value;Y(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),Y(t.value)?t.value[0]=n:t.value=n}var _O=Math.PI/180;function bO(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.get("center"),i=t.get("radius");Y(i)||(i=[0,i]),Y(e)||(e=[e,e]);var r=n.getWidth(),o=n.getHeight(),a=Math.min(r,o),s=Gr(e[0],r),l=Gr(e[1],o),u=Gr(i[0],a/2),h=Gr(i[1],a/2),c=-t.get("startAngle")*_O,p=t.get("minAngle")*_O,d=t.getData().tree.root,f=t.getViewRoot(),g=f.depth,y=t.get("sort");null!=y&&wO(f,y);var v=0;E(f.children,(function(t){!isNaN(t.getValue())&&v++}));var m=f.getValue(),x=Math.PI/(m||v)*2,_=f.depth>0,b=f.height-(_?-1:1),w=(h-u)/(b||1),S=t.get("clockwise"),M=t.get("stillShowZeroSum"),I=S?1:-1,T=function(e,n){if(e){var i=n;if(e!==d){var r=e.getValue(),o=0===m&&M?x:r*x;o1;)r=r.parentNode;var o=n.getColorFromPalette(r.name||r.dataIndex+"",e);return t.depth>1&&X(o)&&(o=jn(o,(t.depth-1)/(i-1)*.5)),o}(r,t,i.root.height)),A(n.ensureUniqueItemVisual(r.dataIndex,"style"),o)}))}))}var MO={color:"fill",borderColor:"stroke"},IO={symbol:1,symbolSize:1,symbolKeepAspect:1,legendIcon:1,visualMeta:1,liftZ:1,decal:1},TO=Do(),CO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){this.currentZLevel=this.get("zlevel",!0),this.currentZ=this.get("z",!0)},e.prototype.getInitialData=function(t,e){return sx(null,this)},e.prototype.getDataParams=function(e,n,i){var r=t.prototype.getDataParams.call(this,e,n);return i&&(r.info=TO(i).info),r},e.type="series.custom",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,clip:!1},e}(hg);function DO(t,e){return e=e||[0,0],z(["x","y"],(function(n,i){var r=this.getAxis(n),o=e[i],a=t[i]/2;return"category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a))}),this)}function AO(t,e){return e=e||[0,0],z([0,1],(function(n){var i=e[n],r=t[n]/2,o=[],a=[];return o[n]=i-r,a[n]=i+r,o[1-n]=a[1-n]=e[1-n],Math.abs(this.dataToPoint(o)[n]-this.dataToPoint(a)[n])}),this)}function kO(t,e){var n=this.getAxis(),i=e instanceof Array?e[0]:e,r=(t instanceof Array?t[0]:t)/2;return"category"===n.type?n.getBandWidth():Math.abs(n.dataToCoord(i-r)-n.dataToCoord(i+r))}function LO(t,e){return e=e||[0,0],z(["Radius","Angle"],(function(n,i){var r=this["get"+n+"Axis"](),o=e[i],a=t[i]/2,s="category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a));return"Angle"===n&&(s=s*Math.PI/180),s}),this)}function PO(t,e,n,i){return t&&(t.legacy||!1!==t.legacy&&!n&&!i&&"tspan"!==e&&("text"===e||mt(t,"text")))}function OO(t,e,n){var i,r,o,a=t;if("text"===e)o=a;else{o={},mt(a,"text")&&(o.text=a.text),mt(a,"rich")&&(o.rich=a.rich),mt(a,"textFill")&&(o.fill=a.textFill),mt(a,"textStroke")&&(o.stroke=a.textStroke),mt(a,"fontFamily")&&(o.fontFamily=a.fontFamily),mt(a,"fontSize")&&(o.fontSize=a.fontSize),mt(a,"fontStyle")&&(o.fontStyle=a.fontStyle),mt(a,"fontWeight")&&(o.fontWeight=a.fontWeight),r={type:"text",style:o,silent:!0},i={};var s=mt(a,"textPosition");n?i.position=s?a.textPosition:"inside":s&&(i.position=a.textPosition),mt(a,"textPosition")&&(i.position=a.textPosition),mt(a,"textOffset")&&(i.offset=a.textOffset),mt(a,"textRotation")&&(i.rotation=a.textRotation),mt(a,"textDistance")&&(i.distance=a.textDistance)}return RO(o,t),E(o.rich,(function(t){RO(t,t)})),{textConfig:i,textContent:r}}function RO(t,e){e&&(e.font=e.textFont||e.font,mt(e,"textStrokeWidth")&&(t.lineWidth=e.textStrokeWidth),mt(e,"textAlign")&&(t.align=e.textAlign),mt(e,"textVerticalAlign")&&(t.verticalAlign=e.textVerticalAlign),mt(e,"textLineHeight")&&(t.lineHeight=e.textLineHeight),mt(e,"textWidth")&&(t.width=e.textWidth),mt(e,"textHeight")&&(t.height=e.textHeight),mt(e,"textBackgroundColor")&&(t.backgroundColor=e.textBackgroundColor),mt(e,"textPadding")&&(t.padding=e.textPadding),mt(e,"textBorderColor")&&(t.borderColor=e.textBorderColor),mt(e,"textBorderWidth")&&(t.borderWidth=e.textBorderWidth),mt(e,"textBorderRadius")&&(t.borderRadius=e.textBorderRadius),mt(e,"textBoxShadowColor")&&(t.shadowColor=e.textBoxShadowColor),mt(e,"textBoxShadowBlur")&&(t.shadowBlur=e.textBoxShadowBlur),mt(e,"textBoxShadowOffsetX")&&(t.shadowOffsetX=e.textBoxShadowOffsetX),mt(e,"textBoxShadowOffsetY")&&(t.shadowOffsetY=e.textBoxShadowOffsetY))}function NO(t,e,n){var i=t;i.textPosition=i.textPosition||n.position||"inside",null!=n.offset&&(i.textOffset=n.offset),null!=n.rotation&&(i.textRotation=n.rotation),null!=n.distance&&(i.textDistance=n.distance);var r=i.textPosition.indexOf("inside")>=0,o=t.fill||"#000";EO(i,e);var a=null==i.textFill;return r?a&&(i.textFill=n.insideFill||"#fff",!i.textStroke&&n.insideStroke&&(i.textStroke=n.insideStroke),!i.textStroke&&(i.textStroke=o),null==i.textStrokeWidth&&(i.textStrokeWidth=2)):(a&&(i.textFill=t.fill||n.outsideFill||"#000"),!i.textStroke&&n.outsideStroke&&(i.textStroke=n.outsideStroke)),i.text=e.text,i.rich=e.rich,E(e.rich,(function(t){EO(t,t)})),i}function EO(t,e){e&&(mt(e,"fill")&&(t.textFill=e.fill),mt(e,"stroke")&&(t.textStroke=e.fill),mt(e,"lineWidth")&&(t.textStrokeWidth=e.lineWidth),mt(e,"font")&&(t.font=e.font),mt(e,"fontStyle")&&(t.fontStyle=e.fontStyle),mt(e,"fontWeight")&&(t.fontWeight=e.fontWeight),mt(e,"fontSize")&&(t.fontSize=e.fontSize),mt(e,"fontFamily")&&(t.fontFamily=e.fontFamily),mt(e,"align")&&(t.textAlign=e.align),mt(e,"verticalAlign")&&(t.textVerticalAlign=e.verticalAlign),mt(e,"lineHeight")&&(t.textLineHeight=e.lineHeight),mt(e,"width")&&(t.textWidth=e.width),mt(e,"height")&&(t.textHeight=e.height),mt(e,"backgroundColor")&&(t.textBackgroundColor=e.backgroundColor),mt(e,"padding")&&(t.textPadding=e.padding),mt(e,"borderColor")&&(t.textBorderColor=e.borderColor),mt(e,"borderWidth")&&(t.textBorderWidth=e.borderWidth),mt(e,"borderRadius")&&(t.textBorderRadius=e.borderRadius),mt(e,"shadowColor")&&(t.textBoxShadowColor=e.shadowColor),mt(e,"shadowBlur")&&(t.textBoxShadowBlur=e.shadowBlur),mt(e,"shadowOffsetX")&&(t.textBoxShadowOffsetX=e.shadowOffsetX),mt(e,"shadowOffsetY")&&(t.textBoxShadowOffsetY=e.shadowOffsetY),mt(e,"textShadowColor")&&(t.textShadowColor=e.textShadowColor),mt(e,"textShadowBlur")&&(t.textShadowBlur=e.textShadowBlur),mt(e,"textShadowOffsetX")&&(t.textShadowOffsetX=e.textShadowOffsetX),mt(e,"textShadowOffsetY")&&(t.textShadowOffsetY=e.textShadowOffsetY))}var zO={position:["x","y"],scale:["scaleX","scaleY"],origin:["originX","originY"]},VO=G(zO),BO=(V(cr,(function(t,e){return t[e]=1,t}),{}),cr.join(", "),["","style","shape","extra"]),FO=Do();function GO(t,e,n,i,r){var o=t+"Animation",a=sh(t,i,r)||{},s=FO(e).userDuring;return a.duration>0&&(a.during=s?W(jO,{el:e,userDuring:s}):null,a.setToFinal=!0,a.scope=t),A(a,n[o]),a}function WO(t,e,n,i){var r=(i=i||{}).dataIndex,o=i.isInit,a=i.clearStyle,s=n.isAnimationEnabled(),l=FO(t),u=e.style;l.userDuring=e.during;var h={},c={};if(function(t,e,n){for(var i=0;i=0)){var c=t.getAnimationStyleProps(),p=c?c.style:null;if(p){!r&&(r=i.style={});var d=G(n);for(u=0;u0&&t.animateFrom(p,d)}else!function(t,e,n,i,r){if(r){var o=GO("update",t,e,i,n);o.duration>0&&t.animateFrom(r,o)}}(t,e,r||0,n,h);HO(t,e),u?t.dirty():t.markRedraw()}function HO(t,e){for(var n=FO(t).leaveToProps,i=0;i=0){!o&&(o=i[t]={});var p=G(a);for(h=0;hi[1]&&i.reverse(),{coordSys:{type:"polar",cx:t.cx,cy:t.cy,r:i[1],r0:i[0]},api:{coord:function(i){var r=e.dataToRadius(i[0]),o=n.dataToAngle(i[1]),a=t.coordToPoint([r,o]);return a.push(r,o*Math.PI/180),a},size:W(LO,t)}}},calendar:function(t){var e=t.getRect(),n=t.getRangeInfo();return{coordSys:{type:"calendar",x:e.x,y:e.y,width:e.width,height:e.height,cellWidth:t.getCellWidth(),cellHeight:t.getCellHeight(),rangeInfo:{start:n.start,end:n.end,weeks:n.weeks,dayCount:n.allDay}},api:{coord:function(e,n){return t.dataToPoint(e,n)}}}}};function pR(t){return t instanceof _s}function dR(t){return t instanceof ma}var fR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){this._progressiveEls=null;var r=this._data,o=t.getData(),a=this.group,s=xR(t,o,e,n);r||a.removeAll(),o.diff(r).add((function(e){bR(n,null,e,s(e,i),t,a,o)})).remove((function(e){var n=r.getItemGraphicEl(e);n&&YO(n,TO(n).option,t)})).update((function(e,l){var u=r.getItemGraphicEl(l);bR(n,u,e,s(e,i),t,a,o)})).execute();var l=t.get("clip",!0)?cS(t.coordinateSystem,!1,t):null;l?a.setClipPath(l):a.removeClipPath(),this._data=o},e.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll(),this._data=null},e.prototype.incrementalRender=function(t,e,n,i,r){var o=e.getData(),a=xR(e,o,n,i),s=this._progressiveEls=[];function l(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}for(var u=t.start;u=0?e.getStore().get(r,n):void 0}var o=e.get(i.name,n),a=i&&i.ordinalMeta;return a?a.categories[o]:o},styleEmphasis:function(n,i){0;null==i&&(i=s);var r=m(i,nR).getItemStyle(),o=x(i,nR),a=$h(o,null,null,!0,!0);a.text=o.getShallow("show")?ot(t.getFormattedLabel(i,nR),t.getFormattedLabel(i,iR),Uw(e,i)):null;var l=Jh(o,null,!0);return b(n,r),r=NO(r,a,l),n&&_(r,n),r.legacy=!0,r},visual:function(t,n){if(null==n&&(n=s),mt(MO,t)){var i=e.getItemVisual(n,"style");return i?i[MO[t]]:null}if(mt(IO,t))return e.getItemVisual(n,t)},barLayout:function(t){if("cartesian2d"===o.type){return function(t){var e=[],n=t.axis,i="axis0";if("category"===n.type){for(var r=n.getBandWidth(),o=0;o=c;f--){var g=e.childAt(f);CR(e,g,r)}}(t,c,n,i,r),a>=0?o.replaceAt(c,a):o.add(c),c}function SR(t,e,n){var i,r=TO(t),o=e.type,a=e.shape,s=e.style;return n.isUniversalTransitionEnabled()||null!=o&&o!==r.customGraphicType||"path"===o&&((i=a)&&(mt(i,"pathData")||mt(i,"d")))&&LR(a)!==r.customPathData||"image"===o&&mt(s,"image")&&s.image!==r.customImagePath}function MR(t,e,n){var i=e?IR(t,e):t,r=e?TR(t,i,nR):t.style,o=t.type,a=i?i.textConfig:null,s=t.textContent,l=s?e?IR(s,e):s:null;if(r&&(n.isLegacy||PO(r,o,!!a,!!l))){n.isLegacy=!0;var u=OO(r,o,!e);!a&&u.textConfig&&(a=u.textConfig),!l&&u.textContent&&(l=u.textContent)}if(!e&&l){var h=l;!h.type&&(h.type="text")}var c=e?n[e]:n.normal;c.cfg=a,c.conOpt=l}function IR(t,e){return e?t?t[e]:null:t}function TR(t,e,n){var i=e&&e.style;return null==i&&n===nR&&t&&(i=t.styleEmphasis),i}function CR(t,e,n){e&&YO(e,TO(t).option,n)}function DR(t,e){var n=t&&t.name;return null!=n?n:"e\0\0"+e}function AR(t,e){var n=this.context,i=null!=t?n.newChildren[t]:null,r=null!=e?n.oldChildren[e]:null;wR(n.api,r,n.dataIndex,i,n.seriesModel,n.group)}function kR(t){var e=this.context,n=e.oldChildren[t];n&&YO(n,TO(n).option,e.seriesModel)}function LR(t){return t&&(t.pathData||t.d)}var PR=Do(),OR=T,RR=W,NR=function(){function t(){this._dragging=!1,this.animationThreshold=15}return t.prototype.render=function(t,e,n,i){var r=e.get("value"),o=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=n,i||this._lastValue!==r||this._lastStatus!==o){this._lastValue=r,this._lastStatus=o;var a=this._group,s=this._handle;if(!o||"hide"===o)return a&&a.hide(),void(s&&s.hide());a&&a.show(),s&&s.show();var l={};this.makeElOption(l,r,t,e,n);var u=l.graphicKey;u!==this._lastGraphicKey&&this.clear(n),this._lastGraphicKey=u;var h=this._moveAnimation=this.determineAnimation(t,e);if(a){var c=H(ER,e,h);this.updatePointerEl(a,l,c),this.updateLabelEl(a,l,c,e)}else a=this._group=new Pr,this.createPointerEl(a,l,t,e),this.createLabelEl(a,l,t,e),n.getZr().add(a);FR(a,e,!0),this._renderHandle(r)}},t.prototype.remove=function(t){this.clear(t)},t.prototype.dispose=function(t){this.clear(t)},t.prototype.determineAnimation=function(t,e){var n=e.get("animation"),i=t.axis,r="category"===i.type,o=e.get("snap");if(!o&&!r)return!1;if("auto"===n||null==n){var a=this.animationThreshold;if(r&&i.getBandWidth()>a)return!0;if(o){var s=QM(t).seriesDataCount,l=i.getExtent();return Math.abs(l[0]-l[1])/s>a}return!1}return!0===n},t.prototype.makeElOption=function(t,e,n,i,r){},t.prototype.createPointerEl=function(t,e,n,i){var r=e.pointer;if(r){var o=PR(t).pointerEl=new Uh[r.type](OR(e.pointer));t.add(o)}},t.prototype.createLabelEl=function(t,e,n,i){if(e.label){var r=PR(t).labelEl=new Ns(OR(e.label));t.add(r),VR(r,i)}},t.prototype.updatePointerEl=function(t,e,n){var i=PR(t).pointerEl;i&&e.pointer&&(i.setStyle(e.pointer.style),n(i,{shape:e.pointer.shape}))},t.prototype.updateLabelEl=function(t,e,n,i){var r=PR(t).labelEl;r&&(r.setStyle(e.label.style),n(r,{x:e.label.x,y:e.label.y}),VR(r,i))},t.prototype._renderHandle=function(t){if(!this._dragging&&this.updateHandleTransform){var e,n=this._axisPointerModel,i=this._api.getZr(),r=this._handle,o=n.getModel("handle"),a=n.get("status");if(!o.get("show")||!a||"hide"===a)return r&&i.remove(r),void(this._handle=null);this._handle||(e=!0,r=this._handle=Vh(o.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(t){he(t.event)},onmousedown:RR(this._onHandleDragMove,this,0,0),drift:RR(this._onHandleDragMove,this),ondragend:RR(this._onHandleDragEnd,this)}),i.add(r)),FR(r,n,!1),r.setStyle(o.getItemStyle(null,["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"]));var s=o.get("size");Y(s)||(s=[s,s]),r.scaleX=s[0]/2,r.scaleY=s[1]/2,Pg(this,"_doDispatchAxisPointer",o.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,e)}},t.prototype._moveHandleToValue=function(t,e){ER(this._axisPointerModel,!e&&this._moveAnimation,this._handle,BR(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},t.prototype._onHandleDragMove=function(t,e){var n=this._handle;if(n){this._dragging=!0;var i=this.updateHandleTransform(BR(n),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=i,n.stopAnimation(),n.attr(BR(i)),PR(n).lastProp=null,this._doDispatchAxisPointer()}},t.prototype._doDispatchAxisPointer=function(){if(this._handle){var t=this._payloadInfo,e=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:t.cursorPoint[0],y:t.cursorPoint[1],tooltipOption:t.tooltipOption,axesInfo:[{axisDim:e.axis.dim,axisIndex:e.componentIndex}]})}},t.prototype._onHandleDragEnd=function(){if(this._dragging=!1,this._handle){var t=this._axisPointerModel.get("value");this._moveHandleToValue(t),this._api.dispatchAction({type:"hideTip"})}},t.prototype.clear=function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),n=this._group,i=this._handle;e&&n&&(this._lastGraphicKey=null,n&&e.remove(n),i&&e.remove(i),this._group=null,this._handle=null,this._payloadInfo=null),Og(this,"_doDispatchAxisPointer")},t.prototype.doClear=function(){},t.prototype.buildLabel=function(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}},t}();function ER(t,e,n,i){zR(PR(n).lastProp,i)||(PR(n).lastProp=i,e?uh(n,i,t):(n.stopAnimation(),n.attr(i)))}function zR(t,e){if(q(t)&&q(e)){var n=!0;return E(e,(function(e,i){n=n&&zR(t[i],e)})),!!n}return t===e}function VR(t,e){t[e.get(["label","show"])?"show":"hide"]()}function BR(t){return{x:t.x||0,y:t.y||0,rotation:t.rotation||0}}function FR(t,e,n){var i=e.get("z"),r=e.get("zlevel");t&&t.traverse((function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=r&&(t.zlevel=r),t.silent=n)}))}function GR(t){var e,n=t.get("type"),i=t.getModel(n+"Style");return"line"===n?(e=i.getLineStyle()).fill=null:"shadow"===n&&((e=i.getAreaStyle()).stroke=null),e}function WR(t,e,n,i,r){var o=HR(n.get("value"),e.axis,e.ecModel,n.get("seriesDataIndices"),{precision:n.get(["label","precision"]),formatter:n.get(["label","formatter"])}),a=n.getModel("label"),s=up(a.get("padding")||0),l=a.getFont(),u=yr(o,l),h=r.position,c=u.width+s[1]+s[3],p=u.height+s[0]+s[2],d=r.align;"right"===d&&(h[0]-=c),"center"===d&&(h[0]-=c/2);var f=r.verticalAlign;"bottom"===f&&(h[1]-=p),"middle"===f&&(h[1]-=p/2),function(t,e,n,i){var r=i.getWidth(),o=i.getHeight();t[0]=Math.min(t[0]+e,r)-e,t[1]=Math.min(t[1]+n,o)-n,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}(h,c,p,i);var g=a.get("backgroundColor");g&&"auto"!==g||(g=e.get(["axisLine","lineStyle","color"])),t.label={x:h[0],y:h[1],style:$h(a,{text:o,font:l,fill:a.getTextColor(),padding:s,backgroundColor:g}),z2:10}}function HR(t,e,n,i,r){t=e.scale.parse(t);var o=e.scale.getLabel({value:t},{precision:r.precision}),a=r.formatter;if(a){var s={value:h_(e,{value:t}),axisDimension:e.dim,axisIndex:e.index,seriesData:[]};E(i,(function(t){var e=n.getSeriesByIndex(t.seriesIndex),i=t.dataIndexInside,r=e&&e.getDataParams(i);r&&s.seriesData.push(r)})),X(a)?o=a.replace("{value}",o):U(a)&&(o=a(s))}return o}function YR(t,e,n){var i=[1,0,0,1,0,0];return _e(i,i,n.rotation),xe(i,i,n.position),Ph([t.dataToCoord(e),(n.labelOffset||0)+(n.labelDirection||1)*(n.labelMargin||0)],i)}function UR(t,e,n,i,r,o){var a=YM.innerTextLayout(n.rotation,0,n.labelDirection);n.labelMargin=r.get(["label","margin"]),WR(e,i,r,o,{position:YR(i.axis,t,n),align:a.textAlign,verticalAlign:a.textVerticalAlign})}function XR(t,e,n){return{x1:t[n=n||0],y1:t[1-n],x2:e[n],y2:e[1-n]}}function ZR(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}}function jR(t,e,n,i,r,o){return{cx:t,cy:e,r0:n,r:i,startAngle:r,endAngle:o,clockwise:!0}}var qR=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.grid,s=i.get("type"),l=KR(a,o).getOtherAxis(o).getGlobalExtent(),u=o.toGlobalCoord(o.dataToCoord(e,!0));if(s&&"none"!==s){var h=GR(i),c=$R[s](o,u,l);c.style=h,t.graphicKey=c.type,t.pointer=c}UR(e,t,RM(a.model,n),n,i,r)},e.prototype.getHandleTransform=function(t,e,n){var i=RM(e.axis.grid.model,e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=YR(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.grid,a=r.getGlobalExtent(!0),s=KR(o,r).getOtherAxis(r).getGlobalExtent(),l="x"===r.dim?0:1,u=[t.x,t.y];u[l]+=e[l],u[l]=Math.min(a[1],u[l]),u[l]=Math.max(a[0],u[l]);var h=(s[1]+s[0])/2,c=[h,h];c[l]=u[l];return{x:u[0],y:u[1],rotation:t.rotation,cursorPoint:c,tooltipOption:[{verticalAlign:"middle"},{align:"center"}][l]}},e}(NR);function KR(t,e){var n={};return n[e.dim+"AxisIndex"]=e.index,t.getCartesian(n)}var $R={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:XR([e,n[0]],[e,n[1]],JR(t))}},shadow:function(t,e,n){var i=Math.max(1,t.getBandWidth()),r=n[1]-n[0];return{type:"Rect",shape:ZR([e-i/2,n[0]],[i,r],JR(t))}}};function JR(t){return"x"===t.dim?0:1}var QR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="axisPointer",e.defaultOption={show:"auto",z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#B9BEC9",width:1,type:"dashed"},shadowStyle:{color:"rgba(210,219,238,0.2)"},label:{show:!0,formatter:null,precision:"auto",margin:3,color:"#fff",padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,borderRadius:3},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}},e}(Ap),tN=Do(),eN=E;function nN(t,e,n){if(!r.node){var i=e.getZr();tN(i).records||(tN(i).records={}),function(t,e){if(tN(t).initialized)return;function n(n,i){t.on(n,(function(n){var r=function(t){var e={showTip:[],hideTip:[]},n=function(i){var r=e[i.type];r?r.push(i):(i.dispatchAction=n,t.dispatchAction(i))};return{dispatchAction:n,pendings:e}}(e);eN(tN(t).records,(function(t){t&&i(t,n,r.dispatchAction)})),function(t,e){var n,i=t.showTip.length,r=t.hideTip.length;i?n=t.showTip[i-1]:r&&(n=t.hideTip[r-1]);n&&(n.dispatchAction=null,e.dispatchAction(n))}(r.pendings,e)}))}tN(t).initialized=!0,n("click",H(rN,"click")),n("mousemove",H(rN,"mousemove")),n("globalout",iN)}(i,e),(tN(i).records[t]||(tN(i).records[t]={})).handler=n}}function iN(t,e,n){t.handler("leave",null,n)}function rN(t,e,n,i){e.handler(t,n,i)}function oN(t,e){if(!r.node){var n=e.getZr();(tN(n).records||{})[t]&&(tN(n).records[t]=null)}}var aN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=e.getComponent("tooltip"),r=t.get("triggerOn")||i&&i.get("triggerOn")||"mousemove|click";nN("axisPointer",n,(function(t,e,n){"none"!==r&&("leave"===t||r.indexOf(t)>=0)&&n({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})}))},e.prototype.remove=function(t,e){oN("axisPointer",e)},e.prototype.dispose=function(t,e){oN("axisPointer",e)},e.type="axisPointer",e}(mg);function sN(t,e){var n,i=[],r=t.seriesIndex;if(null==r||!(n=e.getSeriesByIndex(r)))return{point:[]};var o=n.getData(),a=Co(o,t);if(null==a||a<0||Y(a))return{point:[]};var s=o.getItemGraphicEl(a),l=n.coordinateSystem;if(n.getTooltipPosition)i=n.getTooltipPosition(a)||[];else if(l&&l.dataToPoint)if(t.isStacked){var u=l.getBaseAxis(),h=l.getOtherAxis(u).dim,c=u.dim,p="x"===h||"radius"===h?1:0,d=o.mapDimension(c),f=[];f[p]=o.get(d,a),f[1-p]=o.get(o.getCalculationInfo("stackResultDimension"),a),i=l.dataToPoint(f)||[]}else i=l.dataToPoint(o.getValues(z(l.dimensions,(function(t){return o.mapDimension(t)})),a))||[];else if(s){var g=s.getBoundingRect().clone();g.applyTransform(s.transform),i=[g.x+g.width/2,g.y+g.height/2]}return{point:i,el:s}}var lN=Do();function uN(t,e,n){var i=t.currTrigger,r=[t.x,t.y],o=t,a=t.dispatchAction||W(n.dispatchAction,n),s=e.getComponent("axisPointer").coordSysAxesInfo;if(s){fN(r)&&(r=sN({seriesIndex:o.seriesIndex,dataIndex:o.dataIndex},e).point);var l=fN(r),u=o.axesInfo,h=s.axesInfo,c="leave"===i||fN(r),p={},d={},f={list:[],map:{}},g={showPointer:H(cN,d),showTooltip:H(pN,f)};E(s.coordSysMap,(function(t,e){var n=l||t.containPoint(r);E(s.coordSysAxesInfo[e],(function(t,e){var i=t.axis,o=function(t,e){for(var n=0;n<(t||[]).length;n++){var i=t[n];if(e.axis.dim===i.axisDim&&e.axis.model.componentIndex===i.axisIndex)return i}}(u,t);if(!c&&n&&(!u||o)){var a=o&&o.value;null!=a||l||(a=i.pointToData(r)),null!=a&&hN(t,a,g,!1,p)}}))}));var y={};return E(h,(function(t,e){var n=t.linkGroup;n&&!d[e]&&E(n.axesInfo,(function(e,i){var r=d[i];if(e!==t&&r){var o=r.value;n.mapper&&(o=t.axis.scale.parse(n.mapper(o,dN(e),dN(t)))),y[t.key]=o}}))})),E(y,(function(t,e){hN(h[e],t,g,!0,p)})),function(t,e,n){var i=n.axesInfo=[];E(e,(function(e,n){var r=e.axisPointerModel.option,o=t[n];o?(!e.useHandle&&(r.status="show"),r.value=o.value,r.seriesDataIndices=(o.payloadBatch||[]).slice()):!e.useHandle&&(r.status="hide"),"show"===r.status&&i.push({axisDim:e.axis.dim,axisIndex:e.axis.model.componentIndex,value:r.value})}))}(d,h,p),function(t,e,n,i){if(fN(e)||!t.list.length)return void i({type:"hideTip"});var r=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};i({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:n.tooltipOption,position:n.position,dataIndexInside:r.dataIndexInside,dataIndex:r.dataIndex,seriesIndex:r.seriesIndex,dataByCoordSys:t.list})}(f,r,t,a),function(t,e,n){var i=n.getZr(),r="axisPointerLastHighlights",o=lN(i)[r]||{},a=lN(i)[r]={};E(t,(function(t,e){var n=t.axisPointerModel.option;"show"===n.status&&E(n.seriesDataIndices,(function(t){var e=t.seriesIndex+" | "+t.dataIndex;a[e]=t}))}));var s=[],l=[];E(o,(function(t,e){!a[e]&&l.push(t)})),E(a,(function(t,e){!o[e]&&s.push(t)})),l.length&&n.dispatchAction({type:"downplay",escapeConnect:!0,notBlur:!0,batch:l}),s.length&&n.dispatchAction({type:"highlight",escapeConnect:!0,notBlur:!0,batch:s})}(h,0,n),p}}function hN(t,e,n,i,r){var o=t.axis;if(!o.scale.isBlank()&&o.containData(e))if(t.involveSeries){var a=function(t,e){var n=e.axis,i=n.dim,r=t,o=[],a=Number.MAX_VALUE,s=-1;return E(e.seriesModels,(function(e,l){var u,h,c=e.getData().mapDimensionsAll(i);if(e.getAxisTooltipData){var p=e.getAxisTooltipData(c,t,n);h=p.dataIndices,u=p.nestestValue}else{if(!(h=e.getData().indicesOfNearest(c[0],t,"category"===n.type?.5:null)).length)return;u=e.getData().get(c[0],h[0])}if(null!=u&&isFinite(u)){var d=t-u,f=Math.abs(d);f<=a&&((f=0&&s<0)&&(a=f,s=d,r=u,o.length=0),E(h,(function(t){o.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})})))}})),{payloadBatch:o,snapToValue:r}}(e,t),s=a.payloadBatch,l=a.snapToValue;s[0]&&null==r.seriesIndex&&A(r,s[0]),!i&&t.snap&&o.containData(l)&&null!=l&&(e=l),n.showPointer(t,e,s),n.showTooltip(t,a,l)}else n.showPointer(t,e)}function cN(t,e,n,i){t[e.key]={value:n,payloadBatch:i}}function pN(t,e,n,i){var r=n.payloadBatch,o=e.axis,a=o.model,s=e.axisPointerModel;if(e.triggerTooltip&&r.length){var l=e.coordSys.model,u=eI(l),h=t.map[u];h||(h=t.map[u]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(h)),h.dataByAxis.push({axisDim:o.dim,axisIndex:a.componentIndex,axisType:a.type,axisId:a.id,value:i,valueLabelOpt:{precision:s.get(["label","precision"]),formatter:s.get(["label","formatter"])},seriesDataIndices:r.slice()})}}function dN(t){var e=t.axis.model,n={},i=n.axisDim=t.axis.dim;return n.axisIndex=n[i+"AxisIndex"]=e.componentIndex,n.axisName=n[i+"AxisName"]=e.name,n.axisId=n[i+"AxisId"]=e.id,n}function fN(t){return!t||null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}function gN(t){iI.registerAxisPointerClass("CartesianAxisPointer",qR),t.registerComponentModel(QR),t.registerComponentView(aN),t.registerPreprocessor((function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!Y(e)&&(t.axisPointer.link=[e])}})),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,(function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=KM(t,e)})),t.registerAction({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},uN)}var yN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis;"angle"===o.dim&&(this.animationThreshold=Math.PI/18);var a=o.polar,s=a.getOtherAxis(o).getExtent(),l=o.dataToCoord(e),u=i.get("type");if(u&&"none"!==u){var h=GR(i),c=vN[u](o,a,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}var p=function(t,e,n,i,r){var o=e.axis,a=o.dataToCoord(t),s=i.getAngleAxis().getExtent()[0];s=s/180*Math.PI;var l,u,h,c=i.getRadiusAxis().getExtent();if("radius"===o.dim){var p=[1,0,0,1,0,0];_e(p,p,s),xe(p,p,[i.cx,i.cy]),l=Ph([a,-r],p);var d=e.getModel("axisLabel").get("rotate")||0,f=YM.innerTextLayout(s,d*Math.PI/180,-1);u=f.textAlign,h=f.textVerticalAlign}else{var g=c[1];l=i.coordToPoint([g+r,a]);var y=i.cx,v=i.cy;u=Math.abs(l[0]-y)/g<.3?"center":l[0]>y?"left":"right",h=Math.abs(l[1]-v)/g<.3?"middle":l[1]>v?"top":"bottom"}return{position:l,align:u,verticalAlign:h}}(e,n,0,a,i.get(["label","margin"]));WR(t,n,i,r,p)},e}(NR);var vN={line:function(t,e,n,i){return"angle"===t.dim?{type:"Line",shape:XR(e.coordToPoint([i[0],n]),e.coordToPoint([i[1],n]))}:{type:"Circle",shape:{cx:e.cx,cy:e.cy,r:n}}},shadow:function(t,e,n,i){var r=Math.max(1,t.getBandWidth()),o=Math.PI/180;return"angle"===t.dim?{type:"Sector",shape:jR(e.cx,e.cy,i[0],i[1],(-n-r/2)*o,(r/2-n)*o)}:{type:"Sector",shape:jR(e.cx,e.cy,n-r/2,n+r/2,0,2*Math.PI)}}},mN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.findAxisModel=function(t){var e;return this.ecModel.eachComponent(t,(function(t){t.getCoordSysModel()===this&&(e=t)}),this),e},e.type="polar",e.dependencies=["radiusAxis","angleAxis"],e.defaultOption={z:0,center:["50%","50%"],radius:"80%"},e}(Ap),xN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getCoordSysModel=function(){return this.getReferringComponents("polar",Po).models[0]},e.type="polarAxis",e}(Ap);R(xN,g_);var _N=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="angleAxis",e}(xN),bN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="radiusAxis",e}(xN),wN=function(t){function e(e,n){return t.call(this,"radius",e,n)||this}return n(e,t),e.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},e}(X_);wN.prototype.dataToRadius=X_.prototype.dataToCoord,wN.prototype.radiusToData=X_.prototype.coordToData;var SN=Do(),MN=function(t){function e(e,n){return t.call(this,"angle",e,n||[0,360])||this}return n(e,t),e.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},e.prototype.calculateCategoryInterval=function(){var t=this,e=t.getLabelModel(),n=t.scale,i=n.getExtent(),r=n.count();if(i[1]-i[0]<1)return 0;var o=i[0],a=t.dataToCoord(o+1)-t.dataToCoord(o),s=Math.abs(a),l=yr(null==o?"":o+"",e.getFont(),"center","top"),u=Math.max(l.height,7)/s;isNaN(u)&&(u=1/0);var h=Math.max(0,Math.floor(u)),c=SN(t.model),p=c.lastAutoInterval,d=c.lastTickCount;return null!=p&&null!=d&&Math.abs(p-h)<=1&&Math.abs(d-r)<=1&&p>h?h=p:(c.lastTickCount=r,c.lastAutoInterval=h),h},e}(X_);MN.prototype.dataToAngle=X_.prototype.dataToCoord,MN.prototype.angleToData=X_.prototype.coordToData;var IN=["radius","angle"],TN=function(){function t(t){this.dimensions=IN,this.type="polar",this.cx=0,this.cy=0,this._radiusAxis=new wN,this._angleAxis=new MN,this.axisPointerEnabled=!0,this.name=t||"",this._radiusAxis.polar=this._angleAxis.polar=this}return t.prototype.containPoint=function(t){var e=this.pointToCoord(t);return this._radiusAxis.contain(e[0])&&this._angleAxis.contain(e[1])},t.prototype.containData=function(t){return this._radiusAxis.containData(t[0])&&this._angleAxis.containData(t[1])},t.prototype.getAxis=function(t){return this["_"+t+"Axis"]},t.prototype.getAxes=function(){return[this._radiusAxis,this._angleAxis]},t.prototype.getAxesByScale=function(t){var e=[],n=this._angleAxis,i=this._radiusAxis;return n.scale.type===t&&e.push(n),i.scale.type===t&&e.push(i),e},t.prototype.getAngleAxis=function(){return this._angleAxis},t.prototype.getRadiusAxis=function(){return this._radiusAxis},t.prototype.getOtherAxis=function(t){var e=this._angleAxis;return t===e?this._radiusAxis:e},t.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAngleAxis()},t.prototype.getTooltipAxes=function(t){var e=null!=t&&"auto"!==t?this.getAxis(t):this.getBaseAxis();return{baseAxes:[e],otherAxes:[this.getOtherAxis(e)]}},t.prototype.dataToPoint=function(t,e){return this.coordToPoint([this._radiusAxis.dataToRadius(t[0],e),this._angleAxis.dataToAngle(t[1],e)])},t.prototype.pointToData=function(t,e){var n=this.pointToCoord(t);return[this._radiusAxis.radiusToData(n[0],e),this._angleAxis.angleToData(n[1],e)]},t.prototype.pointToCoord=function(t){var e=t[0]-this.cx,n=t[1]-this.cy,i=this.getAngleAxis(),r=i.getExtent(),o=Math.min(r[0],r[1]),a=Math.max(r[0],r[1]);i.inverse?o=a-360:a=o+360;var s=Math.sqrt(e*e+n*n);e/=s,n/=s;for(var l=Math.atan2(-n,e)/Math.PI*180,u=la;)l+=360*u;return[s,l]},t.prototype.coordToPoint=function(t){var e=t[0],n=t[1]/180*Math.PI;return[Math.cos(n)*e+this.cx,-Math.sin(n)*e+this.cy]},t.prototype.getArea=function(){var t=this.getAngleAxis(),e=this.getRadiusAxis().getExtent().slice();e[0]>e[1]&&e.reverse();var n=t.getExtent(),i=Math.PI/180;return{cx:this.cx,cy:this.cy,r0:e[0],r:e[1],startAngle:-n[0]*i,endAngle:-n[1]*i,clockwise:t.inverse,contain:function(t,e){var n=t-this.cx,i=e-this.cy,r=n*n+i*i-1e-4,o=this.r,a=this.r0;return r<=o*o&&r>=a*a}}},t.prototype.convertToPixel=function(t,e,n){return CN(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return CN(e)===this?this.pointToData(n):null},t}();function CN(t){var e=t.seriesModel,n=t.polarModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}function DN(t,e){var n=this,i=n.getAngleAxis(),r=n.getRadiusAxis();if(i.scale.setExtent(1/0,-1/0),r.scale.setExtent(1/0,-1/0),t.eachSeries((function(t){if(t.coordinateSystem===n){var e=t.getData();E(f_(e,"radius"),(function(t){r.scale.unionExtentFromData(e,t)})),E(f_(e,"angle"),(function(t){i.scale.unionExtentFromData(e,t)}))}})),s_(i.scale,i.model),s_(r.scale,r.model),"category"===i.type&&!i.onBand){var o=i.getExtent(),a=360/i.scale.count();i.inverse?o[1]+=a:o[1]-=a,i.setExtent(o[0],o[1])}}function AN(t,e){if(t.type=e.get("type"),t.scale=l_(e),t.onBand=e.get("boundaryGap")&&"category"===t.type,t.inverse=e.get("inverse"),function(t){return"angleAxis"===t.mainType}(e)){t.inverse=t.inverse!==e.get("clockwise");var n=e.get("startAngle");t.setExtent(n,n+(t.inverse?-360:360))}e.axis=t,t.model=e}var kN={dimensions:IN,create:function(t,e){var n=[];return t.eachComponent("polar",(function(t,i){var r=new TN(i+"");r.update=DN;var o=r.getRadiusAxis(),a=r.getAngleAxis(),s=t.findAxisModel("radiusAxis"),l=t.findAxisModel("angleAxis");AN(o,s),AN(a,l),function(t,e,n){var i=e.get("center"),r=n.getWidth(),o=n.getHeight();t.cx=Gr(i[0],r),t.cy=Gr(i[1],o);var a=t.getRadiusAxis(),s=Math.min(r,o)/2,l=e.get("radius");null==l?l=[0,"100%"]:Y(l)||(l=[0,l]);var u=[Gr(l[0],s),Gr(l[1],s)];a.inverse?a.setExtent(u[1],u[0]):a.setExtent(u[0],u[1])}(r,t,e),n.push(r),t.coordinateSystem=r,r.model=t})),t.eachSeries((function(t){if("polar"===t.get("coordinateSystem")){var e=t.getReferringComponents("polar",Po).models[0];0,t.coordinateSystem=e.coordinateSystem}})),n}},LN=["axisLine","axisLabel","axisTick","minorTick","splitLine","minorSplitLine","splitArea"];function PN(t,e,n){e[1]>e[0]&&(e=e.slice().reverse());var i=t.coordToPoint([e[0],n]),r=t.coordToPoint([e[1],n]);return{x1:i[0],y1:i[1],x2:r[0],y2:r[1]}}function ON(t){return t.getRadiusAxis().inverse?0:1}function RN(t){var e=t[0],n=t[t.length-1];e&&n&&Math.abs(Math.abs(e.coord-n.coord)-360)<1e-4&&t.pop()}var NN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="PolarAxisPointer",n}return n(e,t),e.prototype.render=function(t,e){if(this.group.removeAll(),t.get("show")){var n=t.axis,i=n.polar,r=i.getRadiusAxis().getExtent(),o=n.getTicksCoords(),a=n.getMinorTicksCoords(),s=z(n.getViewLabels(),(function(t){t=T(t);var e=n.scale,i="ordinal"===e.type?e.getRawOrdinalNumber(t.tickValue):t.tickValue;return t.coord=n.dataToCoord(i),t}));RN(s),RN(o),E(LN,(function(e){!t.get([e,"show"])||n.scale.isBlank()&&"axisLine"!==e||EN[e](this.group,t,i,o,a,r,s)}),this)}},e.type="angleAxis",e}(iI),EN={axisLine:function(t,e,n,i,r,o){var a,s=e.getModel(["axisLine","lineStyle"]),l=ON(n),u=l?0:1;(a=0===o[u]?new gu({shape:{cx:n.cx,cy:n.cy,r:o[l]},style:s.getLineStyle(),z2:1,silent:!0}):new Ru({shape:{cx:n.cx,cy:n.cy,r:o[l],r0:o[u]},style:s.getLineStyle(),z2:1,silent:!0})).style.fill=null,t.add(a)},axisTick:function(t,e,n,i,r,o){var a=e.getModel("axisTick"),s=(a.get("inside")?-1:1)*a.get("length"),l=o[ON(n)],u=z(i,(function(t){return new Wu({shape:PN(n,[l,l+s],t.coord)})}));t.add(Ch(u,{style:k(a.getModel("lineStyle").getLineStyle(),{stroke:e.get(["axisLine","lineStyle","color"])})}))},minorTick:function(t,e,n,i,r,o){if(r.length){for(var a=e.getModel("axisTick"),s=e.getModel("minorTick"),l=(a.get("inside")?-1:1)*s.get("length"),u=o[ON(n)],h=[],c=0;cf?"left":"right",v=Math.abs(d[1]-g)/p<.3?"middle":d[1]>g?"top":"bottom";if(s&&s[c]){var m=s[c];q(m)&&m.textStyle&&(a=new xc(m.textStyle,l,l.ecModel))}var x=new Ns({silent:YM.isLabelSilent(e),style:$h(a,{x:d[0],y:d[1],fill:a.getTextColor()||e.get(["axisLine","lineStyle","color"]),text:i.formattedLabel,align:y,verticalAlign:v})});if(t.add(x),h){var _=YM.makeAxisEventDataBase(e);_.targetType="axisLabel",_.value=i.rawLabel,js(x).eventData=_}}),this)},splitLine:function(t,e,n,i,r,o){var a=e.getModel("splitLine").getModel("lineStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var u=[],h=0;h=0?"p":"n",T=_;m&&(i[s][M]||(i[s][M]={p:_,n:_}),T=i[s][M][I]);var C=void 0,D=void 0,A=void 0,k=void 0;if("radius"===c.dim){var L=c.dataToCoord(S)-_,P=o.dataToCoord(M);Math.abs(L)=k})}}}))}var YN={startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:0}},UN={splitNumber:5},XN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="polar",e}(mg);function ZN(t,e){e=e||{};var n=t.coordinateSystem,i=t.axis,r={},o=i.position,a=i.orient,s=n.getRect(),l=[s.x,s.x+s.width,s.y,s.y+s.height],u={horizontal:{top:l[2],bottom:l[3]},vertical:{left:l[0],right:l[1]}};r.position=["vertical"===a?u.vertical[o]:l[0],"horizontal"===a?u.horizontal[o]:l[3]];r.rotation=Math.PI/2*{horizontal:0,vertical:1}[a];r.labelDirection=r.tickDirection=r.nameDirection={top:-1,bottom:1,right:1,left:-1}[o],t.get(["axisTick","inside"])&&(r.tickDirection=-r.tickDirection),it(e.labelInside,t.get(["axisLabel","inside"]))&&(r.labelDirection=-r.labelDirection);var h=e.rotate;return null==h&&(h=t.get(["axisLabel","rotate"])),r.labelRotation="top"===o?-h:h,r.z2=1,r}var jN=["axisLine","axisTickLabel","axisName"],qN=["splitArea","splitLine"],KN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="SingleAxisPointer",n}return n(e,t),e.prototype.render=function(e,n,i,r){var o=this.group;o.removeAll();var a=this._axisGroup;this._axisGroup=new Pr;var s=ZN(e),l=new YM(e,s);E(jN,l.add,l),o.add(this._axisGroup),o.add(l.getGroup()),E(qN,(function(t){e.get([t,"show"])&&$N[t](this,this.group,this._axisGroup,e)}),this),Nh(a,this._axisGroup,e),t.prototype.render.call(this,e,n,i,r)},e.prototype.remove=function(){aI(this)},e.type="singleAxis",e}(iI),$N={splitLine:function(t,e,n,i){var r=i.axis;if(!r.scale.isBlank()){var o=i.getModel("splitLine"),a=o.getModel("lineStyle"),s=a.get("color");s=s instanceof Array?s:[s];for(var l=a.get("width"),u=i.coordinateSystem.getRect(),h=r.isHorizontal(),c=[],p=0,d=r.getTicksCoords({tickModel:o}),f=[],g=[],y=0;y=e.y&&t[1]<=e.y+e.height:n.contain(n.toLocalCoord(t[1]))&&t[0]>=e.y&&t[0]<=e.y+e.height},t.prototype.pointToData=function(t){var e=this.getAxis();return[e.coordToData(e.toLocalCoord(t["horizontal"===e.orient?0:1]))]},t.prototype.dataToPoint=function(t){var e=this.getAxis(),n=this.getRect(),i=[],r="horizontal"===e.orient?0:1;return t instanceof Array&&(t=t[0]),i[r]=e.toGlobalCoord(e.dataToCoord(+t)),i[1-r]=0===r?n.y+n.height/2:n.x+n.width/2,i},t.prototype.convertToPixel=function(t,e,n){return nE(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return nE(e)===this?this.pointToData(n):null},t}();function nE(t){var e=t.seriesModel,n=t.singleAxisModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}var iE={create:function(t,e){var n=[];return t.eachComponent("singleAxis",(function(i,r){var o=new eE(i,t,e);o.name="single_"+r,o.resize(i,e),i.coordinateSystem=o,n.push(o)})),t.eachSeries((function(t){if("singleAxis"===t.get("coordinateSystem")){var e=t.getReferringComponents("singleAxis",Po).models[0];t.coordinateSystem=e&&e.coordinateSystem}})),n},dimensions:tE},rE=["x","y"],oE=["width","height"],aE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.coordinateSystem,s=uE(a,1-lE(o)),l=a.dataToPoint(e)[0],u=i.get("type");if(u&&"none"!==u){var h=GR(i),c=sE[u](o,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}UR(e,t,ZN(n),n,i,r)},e.prototype.getHandleTransform=function(t,e,n){var i=ZN(e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=YR(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.coordinateSystem,a=lE(r),s=uE(o,a),l=[t.x,t.y];l[a]+=e[a],l[a]=Math.min(s[1],l[a]),l[a]=Math.max(s[0],l[a]);var u=uE(o,1-a),h=(u[1]+u[0])/2,c=[h,h];return c[a]=l[a],{x:l[0],y:l[1],rotation:t.rotation,cursorPoint:c,tooltipOption:{verticalAlign:"middle"}}},e}(NR),sE={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:XR([e,n[0]],[e,n[1]],lE(t))}},shadow:function(t,e,n){var i=t.getBandWidth(),r=n[1]-n[0];return{type:"Rect",shape:ZR([e-i/2,n[0]],[i,r],lE(t))}}};function lE(t){return t.isHorizontal()?0:1}function uE(t,e){var n=t.getRect();return[n[rE[e]],n[rE[e]]+n[oE[e]]]}var hE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="single",e}(mg);var cE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e,n,i){var r=Tp(e);t.prototype.init.apply(this,arguments),pE(e,r)},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),pE(this.option,e)},e.prototype.getCellSize=function(){return this.option.cellSize},e.type="calendar",e.defaultOption={z:2,left:80,top:60,cellSize:20,orient:"horizontal",splitLine:{show:!0,lineStyle:{color:"#000",width:1,type:"solid"}},itemStyle:{color:"#fff",borderWidth:1,borderColor:"#ccc"},dayLabel:{show:!0,firstDay:0,position:"start",margin:"50%",color:"#000"},monthLabel:{show:!0,position:"start",margin:5,align:"center",formatter:null,color:"#000"},yearLabel:{show:!0,position:null,margin:30,formatter:null,color:"#ccc",fontFamily:"sans-serif",fontWeight:"bolder",fontSize:20}},e}(Ap);function pE(t,e){var n,i=t.cellSize;1===(n=Y(i)?i:t.cellSize=[i,i]).length&&(n[1]=n[0]);var r=z([0,1],(function(t){return function(t,e){return null!=t[xp[e][0]]||null!=t[xp[e][1]]&&null!=t[xp[e][2]]}(e,t)&&(n[t]="auto"),null!=n[t]&&"auto"!==n[t]}));Ip(t,e,{type:"box",ignoreSize:r})}var dE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=this.group;i.removeAll();var r=t.coordinateSystem,o=r.getRangeInfo(),a=r.getOrient(),s=e.getLocaleModel();this._renderDayRect(t,o,i),this._renderLines(t,o,a,i),this._renderYearText(t,o,a,i),this._renderMonthText(t,s,a,i),this._renderWeekText(t,s,o,a,i)},e.prototype._renderDayRect=function(t,e,n){for(var i=t.coordinateSystem,r=t.getModel("itemStyle").getItemStyle(),o=i.getCellWidth(),a=i.getCellHeight(),s=e.start.time;s<=e.end.time;s=i.getNextNDay(s,1).time){var l=i.dataToRect([s],!1).tl,u=new Ps({shape:{x:l[0],y:l[1],width:o,height:a},cursor:"default",style:r});n.add(u)}},e.prototype._renderLines=function(t,e,n,i){var r=this,o=t.coordinateSystem,a=t.getModel(["splitLine","lineStyle"]).getLineStyle(),s=t.get(["splitLine","show"]),l=a.lineWidth;this._tlpoints=[],this._blpoints=[],this._firstDayOfMonth=[],this._firstDayPoints=[];for(var u=e.start,h=0;u.time<=e.end.time;h++){p(u.formatedDate),0===h&&(u=o.getDateInfo(e.start.y+"-"+e.start.m));var c=u.date;c.setMonth(c.getMonth()+1),u=o.getDateInfo(c)}function p(e){r._firstDayOfMonth.push(o.getDateInfo(e)),r._firstDayPoints.push(o.dataToRect([e],!1).tl);var l=r._getLinePointsOfOneWeek(t,e,n);r._tlpoints.push(l[0]),r._blpoints.push(l[l.length-1]),s&&r._drawSplitline(l,a,i)}p(o.getNextNDay(e.end.time,1).formatedDate),s&&this._drawSplitline(r._getEdgesPoints(r._tlpoints,l,n),a,i),s&&this._drawSplitline(r._getEdgesPoints(r._blpoints,l,n),a,i)},e.prototype._getEdgesPoints=function(t,e,n){var i=[t[0].slice(),t[t.length-1].slice()],r="horizontal"===n?0:1;return i[0][r]=i[0][r]-e/2,i[1][r]=i[1][r]+e/2,i},e.prototype._drawSplitline=function(t,e,n){var i=new Bu({z2:20,shape:{points:t},style:e});n.add(i)},e.prototype._getLinePointsOfOneWeek=function(t,e,n){for(var i=t.coordinateSystem,r=i.getDateInfo(e),o=[],a=0;a<7;a++){var s=i.getNextNDay(r.time,a),l=i.dataToRect([s.time],!1);o[2*s.day]=l.tl,o[2*s.day+1]=l["horizontal"===n?"bl":"tr"]}return o},e.prototype._formatterLabel=function(t,e){return X(t)&&t?(n=t,E(e,(function(t,e){n=n.replace("{"+e+"}",i?ee(t):t)})),n):U(t)?t(e):e.nameMap;var n,i},e.prototype._yearTextPositionControl=function(t,e,n,i,r){var o=e[0],a=e[1],s=["center","bottom"];"bottom"===i?(a+=r,s=["center","top"]):"left"===i?o-=r:"right"===i?(o+=r,s=["center","top"]):a-=r;var l=0;return"left"!==i&&"right"!==i||(l=Math.PI/2),{rotation:l,x:o,y:a,style:{align:s[0],verticalAlign:s[1]}}},e.prototype._renderYearText=function(t,e,n,i){var r=t.getModel("yearLabel");if(r.get("show")){var o=r.get("margin"),a=r.get("position");a||(a="horizontal"!==n?"top":"left");var s=[this._tlpoints[this._tlpoints.length-1],this._blpoints[0]],l=(s[0][0]+s[1][0])/2,u=(s[0][1]+s[1][1])/2,h="horizontal"===n?0:1,c={top:[l,s[h][1]],bottom:[l,s[1-h][1]],left:[s[1-h][0],u],right:[s[h][0],u]},p=e.start.y;+e.end.y>+e.start.y&&(p=p+"-"+e.end.y);var d=r.get("formatter"),f={start:e.start.y,end:e.end.y,nameMap:p},g=this._formatterLabel(d,f),y=new Ns({z2:30,style:$h(r,{text:g})});y.attr(this._yearTextPositionControl(y,c[a],n,a,o)),i.add(y)}},e.prototype._monthTextPositionControl=function(t,e,n,i,r){var o="left",a="top",s=t[0],l=t[1];return"horizontal"===n?(l+=r,e&&(o="center"),"start"===i&&(a="bottom")):(s+=r,e&&(a="middle"),"start"===i&&(o="right")),{x:s,y:l,align:o,verticalAlign:a}},e.prototype._renderMonthText=function(t,e,n,i){var r=t.getModel("monthLabel");if(r.get("show")){var o=r.get("nameMap"),a=r.get("margin"),s=r.get("position"),l=r.get("align"),u=[this._tlpoints,this._blpoints];o&&!X(o)||(o&&(e=kc(o)||e),o=e.get(["time","monthAbbr"])||[]);var h="start"===s?0:1,c="horizontal"===n?0:1;a="start"===s?-a:a;for(var p="center"===l,d=0;d=i.start.time&&n.timea.end.time&&t.reverse(),t},t.prototype._getRangeInfo=function(t){var e,n=[this.getDateInfo(t[0]),this.getDateInfo(t[1])];n[0].time>n[1].time&&(e=!0,n.reverse());var i=Math.floor(n[1].time/fE)-Math.floor(n[0].time/fE)+1,r=new Date(n[0].time),o=r.getDate(),a=n[1].date.getDate();r.setDate(o+i-1);var s=r.getDate();if(s!==a)for(var l=r.getTime()-n[1].time>0?1:-1;(s=r.getDate())!==a&&(r.getTime()-n[1].time)*l>0;)i-=l,r.setDate(s-l);var u=Math.floor((i+n[0].day+6)/7),h=e?1-u:u-1;return e&&n.reverse(),{range:[n[0].formatedDate,n[1].formatedDate],start:n[0],end:n[1],allDay:i,weeks:u,nthWeek:h,fweek:n[0].day,lweek:n[1].day}},t.prototype._getDateByWeeksAndDay=function(t,e,n){var i=this._getRangeInfo(n);if(t>i.weeks||0===t&&ei.lweek)return null;var r=7*(t-1)-i.fweek+e,o=new Date(i.start.time);return o.setDate(+i.start.d+r),this.getDateInfo(o)},t.create=function(e,n){var i=[];return e.eachComponent("calendar",(function(r){var o=new t(r,e,n);i.push(o),r.coordinateSystem=o})),e.eachSeries((function(t){"calendar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("calendarIndex")||0])})),i},t.dimensions=["time","value"],t}();function yE(t){var e=t.calendarModel,n=t.seriesModel;return e?e.coordinateSystem:n?n.coordinateSystem:null}function vE(t,e){var n;return E(e,(function(e){null!=t[e]&&"auto"!==t[e]&&(n=!0)})),n}var mE=["transition","enterFrom","leaveTo"],xE=mE.concat(["enterAnimation","updateAnimation","leaveAnimation"]);function _E(t,e,n){if(n&&(!t[n]&&e[n]&&(t[n]={}),t=t[n],e=e[n]),t&&e)for(var i=n?mE:xE,r=0;r=0;l--){var p,d,f;if(f=null!=(d=Mo((p=n[l]).id,null))?r.get(d):null){var g=f.parent,y=(c=SE(g),{}),v=Sp(f,p,g===i?{width:o,height:a}:{width:c.width,height:c.height},null,{hv:p.hv,boundingMode:p.bounding},y);if(!SE(f).isNew&&v){for(var m=p.transition,x={},_=0;_=0)?x[b]=w:f[b]=w}uh(f,x,t,0)}else f.attr(y)}}},e.prototype._clear=function(){var t=this,e=this._elMap;e.each((function(n){CE(n,SE(n).option,e,t._lastGraphicModel)})),this._elMap=ft()},e.prototype.dispose=function(){this._clear()},e.type="graphic",e}(mg);function IE(t){var e=mt(wE,t)?wE[t]:Sh(t);var n=new e({});return SE(n).type=t,n}function TE(t,e,n,i){var r=IE(n);return e.add(r),i.set(t,r),SE(r).id=t,SE(r).isNew=!0,r}function CE(t,e,n,i){t&&t.parent&&("group"===t.type&&t.traverse((function(t){CE(t,e,n,i)})),YO(t,e,i),n.removeKey(SE(t).id))}function DE(t,e,n,i){t.isGroup||E([["cursor",ma.prototype.cursor],["zlevel",i||0],["z",n||0],["z2",0]],(function(n){var i=n[0];mt(e,i)?t[i]=rt(e[i],n[1]):null==t[i]&&(t[i]=n[1])})),E(G(e),(function(n){if(0===n.indexOf("on")){var i=e[n];t[n]=U(i)?i:null}})),mt(e,"draggable")&&(t.draggable=e.draggable),null!=e.name&&(t.name=e.name),null!=e.id&&(t.id=e.id)}var AE=["x","y","radius","angle","single"],kE=["cartesian2d","polar","singleAxis"];function LE(t){return t+"Axis"}function PE(t,e){var n,i=ft(),r=[],o=ft();t.eachComponent({mainType:"dataZoom",query:e},(function(t){o.get(t.uid)||s(t)}));do{n=!1,t.eachComponent("dataZoom",a)}while(n);function a(t){!o.get(t.uid)&&function(t){var e=!1;return t.eachTargetAxis((function(t,n){var r=i.get(t);r&&r[n]&&(e=!0)})),e}(t)&&(s(t),n=!0)}function s(t){o.set(t.uid,!0),r.push(t),t.eachTargetAxis((function(t,e){(i.get(t)||i.set(t,[]))[e]=!0}))}return r}function OE(t){var e=t.ecModel,n={infoList:[],infoMap:ft()};return t.eachTargetAxis((function(t,i){var r=e.getComponent(LE(t),i);if(r){var o=r.getCoordSysModel();if(o){var a=o.uid,s=n.infoMap.get(a);s||(s={model:o,axisModels:[]},n.infoList.push(s),n.infoMap.set(a,s)),s.axisModels.push(r)}}})),n}var RE=function(){function t(){this.indexList=[],this.indexMap=[]}return t.prototype.add=function(t){this.indexMap[t]||(this.indexList.push(t),this.indexMap[t]=!0)},t}(),NE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._autoThrottle=!0,n._noTarget=!0,n._rangePropMode=["percent","percent"],n}return n(e,t),e.prototype.init=function(t,e,n){var i=EE(t);this.settledOption=i,this.mergeDefaultAndTheme(t,n),this._doInit(i)},e.prototype.mergeOption=function(t){var e=EE(t);C(this.option,t,!0),C(this.settledOption,e,!0),this._doInit(e)},e.prototype._doInit=function(t){var e=this.option;this._setDefaultThrottle(t),this._updateRangeUse(t);var n=this.settledOption;E([["start","startValue"],["end","endValue"]],(function(t,i){"value"===this._rangePropMode[i]&&(e[t[0]]=n[t[0]]=null)}),this),this._resetTarget()},e.prototype._resetTarget=function(){var t=this.get("orient",!0),e=this._targetAxisInfoMap=ft();this._fillSpecifiedTargetAxis(e)?this._orient=t||this._makeAutoOrientByTargetAxis():(this._orient=t||"horizontal",this._fillAutoTargetAxisByOrient(e,this._orient)),this._noTarget=!0,e.each((function(t){t.indexList.length&&(this._noTarget=!1)}),this)},e.prototype._fillSpecifiedTargetAxis=function(t){var e=!1;return E(AE,(function(n){var i=this.getReferringComponents(LE(n),Oo);if(i.specified){e=!0;var r=new RE;E(i.models,(function(t){r.add(t.componentIndex)})),t.set(n,r)}}),this),e},e.prototype._fillAutoTargetAxisByOrient=function(t,e){var n=this.ecModel,i=!0;if(i){var r="vertical"===e?"y":"x";o(n.findComponents({mainType:r+"Axis"}),r)}i&&o(n.findComponents({mainType:"singleAxis",filter:function(t){return t.get("orient",!0)===e}}),"single");function o(e,n){var r=e[0];if(r){var o=new RE;if(o.add(r.componentIndex),t.set(n,o),i=!1,"x"===n||"y"===n){var a=r.getReferringComponents("grid",Po).models[0];a&&E(e,(function(t){r.componentIndex!==t.componentIndex&&a===t.getReferringComponents("grid",Po).models[0]&&o.add(t.componentIndex)}))}}}i&&E(AE,(function(e){if(i){var r=n.findComponents({mainType:LE(e),filter:function(t){return"category"===t.get("type",!0)}});if(r[0]){var o=new RE;o.add(r[0].componentIndex),t.set(e,o),i=!1}}}),this)},e.prototype._makeAutoOrientByTargetAxis=function(){var t;return this.eachTargetAxis((function(e){!t&&(t=e)}),this),"y"===t?"vertical":"horizontal"},e.prototype._setDefaultThrottle=function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},e.prototype._updateRangeUse=function(t){var e=this._rangePropMode,n=this.get("rangeMode");E([["start","startValue"],["end","endValue"]],(function(i,r){var o=null!=t[i[0]],a=null!=t[i[1]];o&&!a?e[r]="percent":!o&&a?e[r]="value":n?e[r]=n[r]:o&&(e[r]="percent")}))},e.prototype.noTarget=function(){return this._noTarget},e.prototype.getFirstTargetAxisModel=function(){var t;return this.eachTargetAxis((function(e,n){null==t&&(t=this.ecModel.getComponent(LE(e),n))}),this),t},e.prototype.eachTargetAxis=function(t,e){this._targetAxisInfoMap.each((function(n,i){E(n.indexList,(function(n){t.call(e,i,n)}))}))},e.prototype.getAxisProxy=function(t,e){var n=this.getAxisModel(t,e);if(n)return n.__dzAxisProxy},e.prototype.getAxisModel=function(t,e){var n=this._targetAxisInfoMap.get(t);if(n&&n.indexMap[e])return this.ecModel.getComponent(LE(t),e)},e.prototype.setRawRange=function(t){var e=this.option,n=this.settledOption;E([["start","startValue"],["end","endValue"]],(function(i){null==t[i[0]]&&null==t[i[1]]||(e[i[0]]=n[i[0]]=t[i[0]],e[i[1]]=n[i[1]]=t[i[1]])}),this),this._updateRangeUse(t)},e.prototype.setCalculatedRange=function(t){var e=this.option;E(["start","startValue","end","endValue"],(function(n){e[n]=t[n]}))},e.prototype.getPercentRange=function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},e.prototype.getValueRange=function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var n=this.findRepresentativeAxisProxy();return n?n.getDataValueWindow():void 0},e.prototype.findRepresentativeAxisProxy=function(t){if(t)return t.__dzAxisProxy;for(var e,n=this._targetAxisInfoMap.keys(),i=0;i=0}(e)){var n=LE(this._dimName),i=e.getReferringComponents(n,Po).models[0];i&&this._axisIndex===i.componentIndex&&t.push(e)}}),this),t},t.prototype.getAxisModel=function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},t.prototype.getMinMaxSpan=function(){return T(this._minMaxSpan)},t.prototype.calculateDataWindow=function(t){var e,n=this._dataExtent,i=this.getAxisModel().axis.scale,r=this._dataZoomModel.getRangePropMode(),o=[0,100],a=[],s=[];FE(["start","end"],(function(l,u){var h=t[l],c=t[l+"Value"];"percent"===r[u]?(null==h&&(h=o[u]),c=i.parse(Fr(h,o,n))):(e=!0,h=Fr(c=null==c?n[u]:i.parse(c),n,o)),s[u]=c,a[u]=h})),GE(s),GE(a);var l=this._minMaxSpan;function u(t,e,n,r,o){var a=o?"Span":"ValueSpan";dk(0,t,n,"all",l["min"+a],l["max"+a]);for(var s=0;s<2;s++)e[s]=Fr(t[s],n,r,!0),o&&(e[s]=i.parse(e[s]))}return e?u(s,a,n,o,!1):u(a,s,o,n,!0),{valueWindow:s,percentWindow:a}},t.prototype.reset=function(t){if(t===this._dataZoomModel){var e=this.getTargetSeriesModels();this._dataExtent=function(t,e,n){var i=[1/0,-1/0];FE(n,(function(t){!function(t,e,n){e&&E(f_(e,n),(function(n){var i=e.getApproximateExtent(n);i[0]t[1]&&(t[1]=i[1])}))}(i,t.getData(),e)}));var r=t.getAxisModel(),o=r_(r.axis.scale,r,i).calculate();return[o.min,o.max]}(this,this._dimName,e),this._updateMinMaxSpan();var n=this.calculateDataWindow(t.settledOption);this._valueWindow=n.valueWindow,this._percentWindow=n.percentWindow,this._setAxisModel()}},t.prototype.filterData=function(t,e){if(t===this._dataZoomModel){var n=this._dimName,i=this.getTargetSeriesModels(),r=t.get("filterMode"),o=this._valueWindow;"none"!==r&&FE(i,(function(t){var e=t.getData(),i=e.mapDimensionsAll(n);if(i.length){if("weakFilter"===r){var a=e.getStore(),s=z(i,(function(t){return e.getDimensionIndex(t)}),e);e.filterSelf((function(t){for(var e,n,r,l=0;lo[1];if(h&&!c&&!p)return!0;h&&(r=!0),c&&(e=!0),p&&(n=!0)}return r&&e&&n}))}else FE(i,(function(n){if("empty"===r)t.setData(e=e.map(n,(function(t){return function(t){return t>=o[0]&&t<=o[1]}(t)?t:NaN})));else{var i={};i[n]=o,e.selectRange(i)}}));FE(i,(function(t){e.setApproximateExtent(o,t)}))}}))}},t.prototype._updateMinMaxSpan=function(){var t=this._minMaxSpan={},e=this._dataZoomModel,n=this._dataExtent;FE(["min","max"],(function(i){var r=e.get(i+"Span"),o=e.get(i+"ValueSpan");null!=o&&(o=this.getAxisModel().axis.scale.parse(o)),null!=o?r=Fr(n[0]+o,n,[0,100],!0):null!=r&&(o=Fr(r,[0,100],n,!0)-n[0]),t[i+"Span"]=r,t[i+"ValueSpan"]=o}),this)},t.prototype._setAxisModel=function(){var t=this.getAxisModel(),e=this._percentWindow,n=this._valueWindow;if(e){var i=Xr(n,[0,500]);i=Math.min(i,20);var r=t.axis.scale.rawExtentInfo;0!==e[0]&&r.setDeterminedMinMax("min",+n[0].toFixed(i)),100!==e[1]&&r.setDeterminedMinMax("max",+n[1].toFixed(i)),r.freeze()}},t}();var HE={getTargetSeries:function(t){function e(e){t.eachComponent("dataZoom",(function(n){n.eachTargetAxis((function(i,r){var o=t.getComponent(LE(i),r);e(i,r,o,n)}))}))}e((function(t,e,n,i){n.__dzAxisProxy=null}));var n=[];e((function(e,i,r,o){r.__dzAxisProxy||(r.__dzAxisProxy=new WE(e,i,o,t),n.push(r.__dzAxisProxy))}));var i=ft();return E(n,(function(t){E(t.getTargetSeriesModels(),(function(t){i.set(t.uid,t)}))})),i},overallReset:function(t,e){t.eachComponent("dataZoom",(function(t){t.eachTargetAxis((function(e,n){t.getAxisProxy(e,n).reset(t)})),t.eachTargetAxis((function(n,i){t.getAxisProxy(n,i).filterData(t,e)}))})),t.eachComponent("dataZoom",(function(t){var e=t.findRepresentativeAxisProxy();if(e){var n=e.getDataPercentWindow(),i=e.getDataValueWindow();t.setCalculatedRange({start:n[0],end:n[1],startValue:i[0],endValue:i[1]})}}))}};var YE=!1;function UE(t){YE||(YE=!0,t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,HE),function(t){t.registerAction("dataZoom",(function(t,e){E(PE(e,t),(function(e){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})}))}))}(t),t.registerSubTypeDefaulter("dataZoom",(function(){return"slider"})))}function XE(t){t.registerComponentModel(zE),t.registerComponentView(BE),UE(t)}var ZE=function(){},jE={};function qE(t,e){jE[t]=e}function KE(t){return jE[t]}var $E=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){t.prototype.optionUpdated.apply(this,arguments);var e=this.ecModel;E(this.option.feature,(function(t,n){var i=KE(n);i&&(i.getDefaultOption&&(i.defaultOption=i.getDefaultOption(e)),C(t,i.defaultOption))}))},e.type="toolbox",e.layoutMode={type:"box",ignoreSize:!0},e.defaultOption={show:!0,z:6,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{borderColor:"#666",color:"none"},emphasis:{iconStyle:{borderColor:"#3E98C5"}},tooltip:{show:!1,position:"bottom"}},e}(Ap);function JE(t,e){var n=up(e.get("padding")),i=e.getItemStyle(["color","opacity"]);return i.fill=e.get("backgroundColor"),t=new Ps({shape:{x:t.x-n[3],y:t.y-n[0],width:t.width+n[1]+n[3],height:t.height+n[0]+n[2],r:e.get("borderRadius")},style:i,silent:!0,z2:-1})}var QE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n,i){var r=this.group;if(r.removeAll(),t.get("show")){var o=+t.get("itemSize"),a="vertical"===t.get("orient"),s=t.get("feature")||{},l=this._features||(this._features={}),u=[];E(s,(function(t,e){u.push(e)})),new Dm(this._featureNames||[],u).add(h).update(h).remove(H(h,null)).execute(),this._featureNames=u,function(t,e,n){var i=e.getBoxLayoutParams(),r=e.get("padding"),o={width:n.getWidth(),height:n.getHeight()},a=wp(i,o,r);bp(e.get("orient"),t,e.get("itemGap"),a.width,a.height),Sp(t,i,o,r)}(r,t,n),r.add(JE(r.getBoundingRect(),t)),a||r.eachChild((function(t){var e=t.__title,i=t.ensureState("emphasis"),a=i.textConfig||(i.textConfig={}),s=t.getTextContent(),l=s&&s.ensureState("emphasis");if(l&&!U(l)&&e){var u=l.style||(l.style={}),h=yr(e,Ns.makeFont(u)),c=t.x+r.x,p=!1;t.y+r.y+o+h.height>n.getHeight()&&(a.position="top",p=!0);var d=p?-5-h.height:o+10;c+h.width/2>n.getWidth()?(a.position=["100%",d],u.align="right"):c-h.width/2<0&&(a.position=[0,d],u.align="left")}}))}function h(h,c){var p,d=u[h],f=u[c],g=s[d],y=new xc(g,t,t.ecModel);if(i&&null!=i.newTitle&&i.featureName===d&&(g.title=i.newTitle),d&&!f){if(function(t){return 0===t.indexOf("my")}(d))p={onclick:y.option.onclick,featureName:d};else{var v=KE(d);if(!v)return;p=new v}l[d]=p}else if(!(p=l[f]))return;p.uid=bc("toolbox-feature"),p.model=y,p.ecModel=e,p.api=n;var m=p instanceof ZE;d||!f?!y.get("show")||m&&p.unusable?m&&p.remove&&p.remove(e,n):(!function(i,s,l){var u,h,c=i.getModel("iconStyle"),p=i.getModel(["emphasis","iconStyle"]),d=s instanceof ZE&&s.getIcons?s.getIcons():i.get("icon"),f=i.get("title")||{};X(d)?(u={})[l]=d:u=d;X(f)?(h={})[l]=f:h=f;var g=i.iconPaths={};E(u,(function(l,u){var d=Vh(l,{},{x:-o/2,y:-o/2,width:o,height:o});d.setStyle(c.getItemStyle()),d.ensureState("emphasis").style=p.getItemStyle();var f=new Ns({style:{text:h[u],align:p.get("textAlign"),borderRadius:p.get("textBorderRadius"),padding:p.get("textPadding"),fill:null},ignore:!0});d.setTextContent(f),Wh({el:d,componentModel:t,itemName:u,formatterParamsExtra:{title:h[u]}}),d.__title=h[u],d.on("mouseover",(function(){var e=p.getItemStyle(),i=a?null==t.get("right")&&"right"!==t.get("left")?"right":"left":null==t.get("bottom")&&"bottom"!==t.get("top")?"bottom":"top";f.setStyle({fill:p.get("textFill")||e.fill||e.stroke||"#000",backgroundColor:p.get("textBackgroundColor")}),d.setTextConfig({position:p.get("textPosition")||i}),f.ignore=!t.get("showTitle"),n.enterEmphasis(this)})).on("mouseout",(function(){"emphasis"!==i.get(["iconStatus",u])&&n.leaveEmphasis(this),f.hide()})),("emphasis"===i.get(["iconStatus",u])?Il:Tl)(d),r.add(d),d.on("click",W(s.onclick,s,e,n,u)),g[u]=d}))}(y,p,d),y.setIconStatus=function(t,e){var n=this.option,i=this.iconPaths;n.iconStatus=n.iconStatus||{},n.iconStatus[t]=e,i[t]&&("emphasis"===e?Il:Tl)(i[t])},p instanceof ZE&&p.render&&p.render(y,e,n,i)):m&&p.dispose&&p.dispose(e,n)}},e.prototype.updateView=function(t,e,n,i){E(this._features,(function(t){t instanceof ZE&&t.updateView&&t.updateView(t.model,e,n,i)}))},e.prototype.remove=function(t,e){E(this._features,(function(n){n instanceof ZE&&n.remove&&n.remove(t,e)})),this.group.removeAll()},e.prototype.dispose=function(t,e){E(this._features,(function(n){n instanceof ZE&&n.dispose&&n.dispose(t,e)}))},e.type="toolbox",e}(mg);var tz=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.onclick=function(t,e){var n=this.model,i=n.get("name")||t.get("title.0.text")||"echarts",o="svg"===e.getZr().painter.getType(),a=o?"svg":n.get("type",!0)||"png",s=e.getConnectedDataURL({type:a,backgroundColor:n.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",connectedBackgroundColor:n.get("connectedBackgroundColor"),excludeComponents:n.get("excludeComponents"),pixelRatio:n.get("pixelRatio")}),l=r.browser;if(U(MouseEvent)&&(l.newEdge||!l.ie&&!l.edge)){var u=document.createElement("a");u.download=i+"."+a,u.target="_blank",u.href=s;var h=new MouseEvent("click",{view:document.defaultView,bubbles:!0,cancelable:!1});u.dispatchEvent(h)}else if(window.navigator.msSaveOrOpenBlob||o){var c=s.split(","),p=c[0].indexOf("base64")>-1,d=o?decodeURIComponent(c[1]):c[1];p&&(d=window.atob(d));var f=i+"."+a;if(window.navigator.msSaveOrOpenBlob){for(var g=d.length,y=new Uint8Array(g);g--;)y[g]=d.charCodeAt(g);var v=new Blob([y]);window.navigator.msSaveOrOpenBlob(v,f)}else{var m=document.createElement("iframe");document.body.appendChild(m);var x=m.contentWindow,_=x.document;_.open("image/svg+xml","replace"),_.write(d),_.close(),x.focus(),_.execCommand("SaveAs",!0,f),document.body.removeChild(m)}}else{var b=n.get("lang"),w='',S=window.open();S.document.write(w),S.document.title=i}},e.getDefaultOption=function(t){return{show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:t.getLocaleModel().get(["toolbox","saveAsImage","title"]),type:"png",connectedBackgroundColor:"#fff",name:"",excludeComponents:["toolbox"],lang:t.getLocaleModel().get(["toolbox","saveAsImage","lang"])}},e}(ZE),ez="__ec_magicType_stack__",nz=[["line","bar"],["stack"]],iz=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getIcons=function(){var t=this.model,e=t.get("icon"),n={};return E(t.get("type"),(function(t){e[t]&&(n[t]=e[t])})),n},e.getDefaultOption=function(t){return{show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z"},title:t.getLocaleModel().get(["toolbox","magicType","title"]),option:{},seriesIndex:{}}},e.prototype.onclick=function(t,e,n){var i=this.model,r=i.get(["seriesIndex",n]);if(rz[n]){var o,a={series:[]};E(nz,(function(t){P(t,n)>=0&&E(t,(function(t){i.setIconStatus(t,"normal")}))})),i.setIconStatus(n,"emphasis"),t.eachComponent({mainType:"series",query:null==r?null:{seriesIndex:r}},(function(t){var e=t.subType,r=t.id,o=rz[n](e,r,t,i);o&&(k(o,t.option),a.series.push(o));var s=t.coordinateSystem;if(s&&"cartesian2d"===s.type&&("line"===n||"bar"===n)){var l=s.getAxesByScale("ordinal")[0];if(l){var u=l.dim+"Axis",h=t.getReferringComponents(u,Po).models[0].componentIndex;a[u]=a[u]||[];for(var c=0;c<=h;c++)a[u][h]=a[u][h]||{};a[u][h].boundaryGap="bar"===n}}}));var s=n;"stack"===n&&(o=C({stack:i.option.title.tiled,tiled:i.option.title.stack},i.option.title),"emphasis"!==i.get(["iconStatus",n])&&(s="tiled")),e.dispatchAction({type:"changeMagicType",currentType:s,newOption:a,newTitle:o,featureName:"magicType"})}},e}(ZE),rz={line:function(t,e,n,i){if("bar"===t)return C({id:e,type:"line",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","line"])||{},!0)},bar:function(t,e,n,i){if("line"===t)return C({id:e,type:"bar",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","bar"])||{},!0)},stack:function(t,e,n,i){var r=n.get("stack")===ez;if("line"===t||"bar"===t)return i.setIconStatus("stack",r?"normal":"emphasis"),C({id:e,stack:r?"":ez},i.get(["option","stack"])||{},!0)}};fm({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},(function(t,e){e.mergeOption(t.newOption)}));var oz=new Array(60).join("-"),az="\t";function sz(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}var lz=new RegExp("[\t]+","g");function uz(t,e){var n=t.split(new RegExp("\n*"+oz+"\n*","g")),i={series:[]};return E(n,(function(t,n){if(function(t){if(t.slice(0,t.indexOf("\n")).indexOf(az)>=0)return!0}(t)){var r=function(t){for(var e=t.split(/\n+/g),n=[],i=z(sz(e.shift()).split(lz),(function(t){return{name:t,data:[]}})),r=0;r=0)&&t(r,i._targetInfoList)}))}return t.prototype.setOutputRanges=function(t,e){return this.matchOutputRanges(t,e,(function(t,e,n){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var i=Sz[t.brushType](0,n,e);t.__rangeOffset={offset:Iz[t.brushType](i.values,t.range,[1,1]),xyMinMax:i.xyMinMax}}})),t},t.prototype.matchOutputRanges=function(t,e,n){E(t,(function(t){var i=this.findTargetInfo(t,e);i&&!0!==i&&E(i.coordSyses,(function(i){var r=Sz[t.brushType](1,i,t.range,!0);n(t,r.values,i,e)}))}),this)},t.prototype.setInputRanges=function(t,e){E(t,(function(t){var n,i,r,o,a,s=this.findTargetInfo(t,e);if(t.range=t.range||[],s&&!0!==s){t.panelId=s.panelId;var l=Sz[t.brushType](0,s.coordSys,t.coordRange),u=t.__rangeOffset;t.range=u?Iz[t.brushType](l.values,u.offset,(n=l.xyMinMax,i=u.xyMinMax,r=Cz(n),o=Cz(i),a=[r[0]/o[0],r[1]/o[1]],isNaN(a[0])&&(a[0]=1),isNaN(a[1])&&(a[1]=1),a)):l.values}}),this)},t.prototype.makePanelOpts=function(t,e){return z(this._targetInfoList,(function(n){var i=n.getPanelRect();return{panelId:n.panelId,defaultBrushType:e?e(n):null,clipPath:gL(i),isTargetByCursor:vL(i,t,n.coordSysModel),getLinearBrushOtherExtent:yL(i)}}))},t.prototype.controlSeries=function(t,e,n){var i=this.findTargetInfo(t,n);return!0===i||i&&P(i.coordSyses,e.coordinateSystem)>=0},t.prototype.findTargetInfo=function(t,e){for(var n=this._targetInfoList,i=xz(e,t),r=0;rt[1]&&t.reverse(),t}function xz(t,e){return ko(t,e,{includeMainTypes:yz})}var _z={grid:function(t,e){var n=t.xAxisModels,i=t.yAxisModels,r=t.gridModels,o=ft(),a={},s={};(n||i||r)&&(E(n,(function(t){var e=t.axis.grid.model;o.set(e.id,e),a[e.id]=!0})),E(i,(function(t){var e=t.axis.grid.model;o.set(e.id,e),s[e.id]=!0})),E(r,(function(t){o.set(t.id,t),a[t.id]=!0,s[t.id]=!0})),o.each((function(t){var r=t.coordinateSystem,o=[];E(r.getCartesians(),(function(t,e){(P(n,t.getAxis("x").model)>=0||P(i,t.getAxis("y").model)>=0)&&o.push(t)})),e.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:o[0],coordSyses:o,getPanelRect:wz.grid,xAxisDeclared:a[t.id],yAxisDeclared:s[t.id]})})))},geo:function(t,e){E(t.geoModels,(function(t){var n=t.coordinateSystem;e.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:n,coordSyses:[n],getPanelRect:wz.geo})}))}},bz=[function(t,e){var n=t.xAxisModel,i=t.yAxisModel,r=t.gridModel;return!r&&n&&(r=n.axis.grid.model),!r&&i&&(r=i.axis.grid.model),r&&r===e.gridModel},function(t,e){var n=t.geoModel;return n&&n===e.geoModel}],wz={grid:function(){return this.coordSys.master.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(Lh(t)),e}},Sz={lineX:H(Mz,0),lineY:H(Mz,1),rect:function(t,e,n,i){var r=t?e.pointToData([n[0][0],n[1][0]],i):e.dataToPoint([n[0][0],n[1][0]],i),o=t?e.pointToData([n[0][1],n[1][1]],i):e.dataToPoint([n[0][1],n[1][1]],i),a=[mz([r[0],o[0]]),mz([r[1],o[1]])];return{values:a,xyMinMax:a}},polygon:function(t,e,n,i){var r=[[1/0,-1/0],[1/0,-1/0]];return{values:z(n,(function(n){var o=t?e.pointToData(n,i):e.dataToPoint(n,i);return r[0][0]=Math.min(r[0][0],o[0]),r[1][0]=Math.min(r[1][0],o[1]),r[0][1]=Math.max(r[0][1],o[0]),r[1][1]=Math.max(r[1][1],o[1]),o})),xyMinMax:r}}};function Mz(t,e,n,i){var r=n.getAxis(["x","y"][t]),o=mz(z([0,1],(function(t){return e?r.coordToData(r.toLocalCoord(i[t]),!0):r.toGlobalCoord(r.dataToCoord(i[t]))}))),a=[];return a[t]=o,a[1-t]=[NaN,NaN],{values:o,xyMinMax:a}}var Iz={lineX:H(Tz,0),lineY:H(Tz,1),rect:function(t,e,n){return[[t[0][0]-n[0]*e[0][0],t[0][1]-n[0]*e[0][1]],[t[1][0]-n[1]*e[1][0],t[1][1]-n[1]*e[1][1]]]},polygon:function(t,e,n){return z(t,(function(t,i){return[t[0]-n[0]*e[i][0],t[1]-n[1]*e[i][1]]}))}};function Tz(t,e,n,i){return[e[0]-i[t]*n[0],e[1]-i[t]*n[1]]}function Cz(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}var Dz,Az,kz=E,Lz=go+"toolbox-dataZoom_",Pz=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n,i){this._brushController||(this._brushController=new Vk(n.getZr()),this._brushController.on("brush",W(this._onBrush,this)).mount()),function(t,e,n,i,r){var o=n._isZoomActive;i&&"takeGlobalCursor"===i.type&&(o="dataZoomSelect"===i.key&&i.dataZoomSelectActive);n._isZoomActive=o,t.setIconStatus("zoom",o?"emphasis":"normal");var a=new vz(Rz(t),e,{include:["grid"]}).makePanelOpts(r,(function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"}));n._brushController.setPanels(a).enableBrush(!(!o||!a.length)&&{brushType:"auto",brushStyle:t.getModel("brushStyle").getItemStyle()})}(t,e,this,i,n),function(t,e){t.setIconStatus("back",function(t){return fz(t).length}(e)>1?"emphasis":"normal")}(t,e)},e.prototype.onclick=function(t,e,n){Oz[n].call(this)},e.prototype.remove=function(t,e){this._brushController&&this._brushController.unmount()},e.prototype.dispose=function(t,e){this._brushController&&this._brushController.dispose()},e.prototype._onBrush=function(t){var e=t.areas;if(t.isEnd&&e.length){var n={},i=this.ecModel;this._brushController.updateCovers([]),new vz(Rz(this.model),i,{include:["grid"]}).matchOutputRanges(e,i,(function(t,e,n){if("cartesian2d"===n.type){var i=t.brushType;"rect"===i?(r("x",n,e[0]),r("y",n,e[1])):r({lineX:"x",lineY:"y"}[i],n,e)}})),function(t,e){var n=fz(t);pz(e,(function(e,i){for(var r=n.length-1;r>=0&&!n[r][i];r--);if(r<0){var o=t.queryComponents({mainType:"dataZoom",subType:"select",id:i})[0];if(o){var a=o.getPercentRange();n[0][i]={dataZoomId:i,start:a[0],end:a[1]}}}})),n.push(e)}(i,n),this._dispatchZoomAction(n)}function r(t,e,r){var o=e.getAxis(t),a=o.model,s=function(t,e,n){var i;return n.eachComponent({mainType:"dataZoom",subType:"select"},(function(n){n.getAxisModel(t,e.componentIndex)&&(i=n)})),i}(t,a,i),l=s.findRepresentativeAxisProxy(a).getMinMaxSpan();null==l.minValueSpan&&null==l.maxValueSpan||(r=dk(0,r.slice(),o.scale.getExtent(),0,l.minValueSpan,l.maxValueSpan)),s&&(n[s.id]={dataZoomId:s.id,startValue:r[0],endValue:r[1]})}},e.prototype._dispatchZoomAction=function(t){var e=[];kz(t,(function(t,n){e.push(T(t))})),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},e.getDefaultOption=function(t){return{show:!0,filterMode:"filter",icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:t.getLocaleModel().get(["toolbox","dataZoom","title"]),brushStyle:{borderWidth:0,color:"rgba(210,219,238,0.2)"}}},e}(ZE),Oz={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(function(t){var e=fz(t),n=e[e.length-1];e.length>1&&e.pop();var i={};return pz(n,(function(t,n){for(var r=e.length-1;r>=0;r--)if(t=e[r][n]){i[n]=t;break}})),i}(this.ecModel))}};function Rz(t){var e={xAxisIndex:t.get("xAxisIndex",!0),yAxisIndex:t.get("yAxisIndex",!0),xAxisId:t.get("xAxisId",!0),yAxisId:t.get("yAxisId",!0)};return null==e.xAxisIndex&&null==e.xAxisId&&(e.xAxisIndex="all"),null==e.yAxisIndex&&null==e.yAxisId&&(e.yAxisIndex="all"),e}Dz="dataZoom",Az=function(t){var e=t.getComponent("toolbox",0),n=["feature","dataZoom"];if(e&&null!=e.get(n)){var i=e.getModel(n),r=[],o=ko(t,Rz(i));return kz(o.xAxisModels,(function(t){return a(t,"xAxis","xAxisIndex")})),kz(o.yAxisModels,(function(t){return a(t,"yAxis","yAxisIndex")})),r}function a(t,e,n){var o=t.componentIndex,a={type:"select",$fromToolbox:!0,filterMode:i.get("filterMode",!0)||"filter",id:Lz+e+o};a[n]=o,r.push(a)}},lt(null==$p.get(Dz)&&Az),$p.set(Dz,Az);var Nz=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="tooltip",e.dependencies=["axisPointer"],e.defaultOption={z:60,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",renderMode:"auto",confine:null,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"#fff",shadowBlur:10,shadowColor:"rgba(0, 0, 0, .2)",shadowOffsetX:1,shadowOffsetY:2,borderRadius:4,borderWidth:1,padding:null,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#666",fontSize:14}},e}(Ap);function Ez(t){var e=t.get("confine");return null!=e?!!e:"richText"===t.get("renderMode")}function zz(t){if(r.domSupported)for(var e=document.documentElement.style,n=0,i=t.length;n-1?(u+="top:50%",h+="translateY(-50%) rotate("+(a="left"===s?-225:-45)+"deg)"):(u+="left:50%",h+="translateX(-50%) rotate("+(a="top"===s?225:45)+"deg)");var c=a*Math.PI/180,p=l+r,d=p*Math.abs(Math.cos(c))+p*Math.abs(Math.sin(c)),f=e+" solid "+r+"px;";return'
'}(n,i,r)),X(t))o.innerHTML=t+a;else if(t){o.innerHTML="",Y(t)||(t=[t]);for(var s=0;s=0?this._tryShow(n,i):"leave"===e&&this._hide(i))}),this))},e.prototype._keepShow=function(){var t=this._tooltipModel,e=this._ecModel,n=this._api,i=t.get("triggerOn");if(null!=this._lastX&&null!=this._lastY&&"none"!==i&&"click"!==i){var r=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout((function(){!n.isDisposed()&&r.manuallyShowTip(t,e,n,{x:r._lastX,y:r._lastY,dataByCoordSys:r._lastDataByCoordSys})}))}},e.prototype.manuallyShowTip=function(t,e,n,i){if(i.from!==this.uid&&!r.node&&n.getDom()){var o=tV(i,n);this._ticket="";var a=i.dataByCoordSys,s=function(t,e,n){var i=Lo(t).queryOptionMap,r=i.keys()[0];if(!r||"series"===r)return;var o,a=Ro(e,r,i.get(r),{useDefault:!1,enableAll:!1,enableNone:!1}).models[0];if(!a)return;if(n.getViewOfComponentModel(a).group.traverse((function(e){var n=js(e).tooltipConfig;if(n&&n.name===t.name)return o=e,!0})),o)return{componentMainType:r,componentIndex:a.componentIndex,el:o}}(i,e,n);if(s){var l=s.el.getBoundingRect().clone();l.applyTransform(s.el.transform),this._tryShow({offsetX:l.x+l.width/2,offsetY:l.y+l.height/2,target:s.el,position:i.position,positionDefault:"bottom"},o)}else if(i.tooltip&&null!=i.x&&null!=i.y){var u=$z;u.x=i.x,u.y=i.y,u.update(),js(u).tooltipConfig={name:null,option:i.tooltip},this._tryShow({offsetX:i.x,offsetY:i.y,target:u},o)}else if(a)this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,dataByCoordSys:a,tooltipOption:i.tooltipOption},o);else if(null!=i.seriesIndex){if(this._manuallyAxisShowTip(t,e,n,i))return;var h=sN(i,e),c=h.point[0],p=h.point[1];null!=c&&null!=p&&this._tryShow({offsetX:c,offsetY:p,target:h.el,position:i.position,positionDefault:"bottom"},o)}else null!=i.x&&null!=i.y&&(n.dispatchAction({type:"updateAxisPointer",x:i.x,y:i.y}),this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,target:n.getZr().findHover(i.x,i.y).target},o))}},e.prototype.manuallyHideTip=function(t,e,n,i){var r=this._tooltipContent;!this._alwaysShowContent&&this._tooltipModel&&r.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=this._lastDataByCoordSys=null,i.from!==this.uid&&this._hide(tV(i,n))},e.prototype._manuallyAxisShowTip=function(t,e,n,i){var r=i.seriesIndex,o=i.dataIndex,a=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=r&&null!=o&&null!=a){var s=e.getSeriesByIndex(r);if(s)if("axis"===Qz([s.getData().getItemModel(o),s,(s.coordinateSystem||{}).model],this._tooltipModel).get("trigger"))return n.dispatchAction({type:"updateAxisPointer",seriesIndex:r,dataIndex:o,position:i.position}),!0}},e.prototype._tryShow=function(t,e){var n=t.target;if(this._tooltipModel){this._lastX=t.offsetX,this._lastY=t.offsetY;var i=t.dataByCoordSys;if(i&&i.length)this._showAxisTooltip(i,t);else if(n){var r,o;this._lastDataByCoordSys=null,wy(n,(function(t){return null!=js(t).dataIndex?(r=t,!0):null!=js(t).tooltipConfig?(o=t,!0):void 0}),!0),r?this._showSeriesItemTooltip(t,r,e):o?this._showComponentItemTooltip(t,o,e):this._hide(e)}else this._lastDataByCoordSys=null,this._hide(e)}},e.prototype._showOrMove=function(t,e){var n=t.get("showDelay");e=W(e,this),clearTimeout(this._showTimout),n>0?this._showTimout=setTimeout(e,n):e()},e.prototype._showAxisTooltip=function(t,e){var n=this._ecModel,i=this._tooltipModel,r=[e.offsetX,e.offsetY],o=Qz([e.tooltipOption],i),a=this._renderMode,s=[],l=qf("section",{blocks:[],noHeader:!0}),u=[],h=new ag;E(t,(function(t){E(t.dataByAxis,(function(t){var e=n.getComponent(t.axisDim+"Axis",t.axisIndex),r=t.value;if(e&&null!=r){var o=HR(r,e.axis,n,t.seriesDataIndices,t.valueLabelOpt),c=qf("section",{header:o,noHeader:!ut(o),sortBlocks:!0,blocks:[]});l.blocks.push(c),E(t.seriesDataIndices,(function(l){var p=n.getSeriesByIndex(l.seriesIndex),d=l.dataIndexInside,f=p.getDataParams(d);if(!(f.dataIndex<0)){f.axisDim=t.axisDim,f.axisIndex=t.axisIndex,f.axisType=t.axisType,f.axisId=t.axisId,f.axisValue=h_(e.axis,{value:r}),f.axisValueLabel=o,f.marker=h.makeTooltipMarker("item",gp(f.color),a);var g=pf(p.formatTooltip(d,!0,null)),y=g.frag;if(y){var v=Qz([p],i).get("valueFormatter");c.blocks.push(v?A({valueFormatter:v},y):y)}g.text&&u.push(g.text),s.push(f)}}))}}))})),l.blocks.reverse(),u.reverse();var c=e.position,p=o.get("order"),d=eg(l,h,a,p,n.get("useUTC"),o.get("textStyle"));d&&u.unshift(d);var f="richText"===a?"\n\n":"
",g=u.join(f);this._showOrMove(o,(function(){this._updateContentNotChangedOnAxis(t,s)?this._updatePosition(o,c,r[0],r[1],this._tooltipContent,s):this._showTooltipContent(o,g,s,Math.random()+"",r[0],r[1],c,null,h)}))},e.prototype._showSeriesItemTooltip=function(t,e,n){var i=this._ecModel,r=js(e),o=r.seriesIndex,a=i.getSeriesByIndex(o),s=r.dataModel||a,l=r.dataIndex,u=r.dataType,h=s.getData(u),c=this._renderMode,p=t.positionDefault,d=Qz([h.getItemModel(l),s,a&&(a.coordinateSystem||{}).model],this._tooltipModel,p?{position:p}:null),f=d.get("trigger");if(null==f||"item"===f){var g=s.getDataParams(l,u),y=new ag;g.marker=y.makeTooltipMarker("item",gp(g.color),c);var v=pf(s.formatTooltip(l,!1,u)),m=d.get("order"),x=d.get("valueFormatter"),_=v.frag,b=_?eg(x?A({valueFormatter:x},_):_,y,c,m,i.get("useUTC"),d.get("textStyle")):v.text,w="item_"+s.name+"_"+l;this._showOrMove(d,(function(){this._showTooltipContent(d,b,g,w,t.offsetX,t.offsetY,t.position,t.target,y)})),n({type:"showTip",dataIndexInside:l,dataIndex:h.getRawIndex(l),seriesIndex:o,from:this.uid})}},e.prototype._showComponentItemTooltip=function(t,e,n){var i=js(e),r=i.tooltipConfig.option||{};if(X(r)){r={content:r,formatter:r}}var o=[r],a=this._ecModel.getComponent(i.componentMainType,i.componentIndex);a&&o.push(a),o.push({formatter:r.content});var s=t.positionDefault,l=Qz(o,this._tooltipModel,s?{position:s}:null),u=l.get("content"),h=Math.random()+"",c=new ag;this._showOrMove(l,(function(){var n=T(l.get("formatterParams")||{});this._showTooltipContent(l,u,n,h,t.offsetX,t.offsetY,t.position,e,c)})),n({type:"showTip",from:this.uid})},e.prototype._showTooltipContent=function(t,e,n,i,r,o,a,s,l){if(this._ticket="",t.get("showContent")&&t.get("show")){var u=this._tooltipContent;u.setEnterable(t.get("enterable"));var h=t.get("formatter");a=a||t.get("position");var c=e,p=this._getNearestPoint([r,o],n,t.get("trigger"),t.get("borderColor")).color;if(h)if(X(h)){var d=t.ecModel.get("useUTC"),f=Y(n)?n[0]:n;c=h,f&&f.axisType&&f.axisType.indexOf("time")>=0&&(c=Yc(f.axisValue,c,d)),c=dp(c,n,!0)}else if(U(h)){var g=W((function(e,i){e===this._ticket&&(u.setContent(i,l,t,p,a),this._updatePosition(t,a,r,o,u,n,s))}),this);this._ticket=i,c=h(n,i,g)}else c=h;u.setContent(c,l,t,p,a),u.show(t,p),this._updatePosition(t,a,r,o,u,n,s)}},e.prototype._getNearestPoint=function(t,e,n,i){return"axis"===n||Y(e)?{color:i||("html"===this._renderMode?"#fff":"none")}:Y(e)?void 0:{color:i||e.color||e.borderColor}},e.prototype._updatePosition=function(t,e,n,i,r,o,a){var s=this._api.getWidth(),l=this._api.getHeight();e=e||t.get("position");var u=r.getSize(),h=t.get("align"),c=t.get("verticalAlign"),p=a&&a.getBoundingRect().clone();if(a&&p.applyTransform(a.transform),U(e)&&(e=e([n,i],o,r.el,p,{viewSize:[s,l],contentSize:u.slice()})),Y(e))n=Gr(e[0],s),i=Gr(e[1],l);else if(q(e)){var d=e;d.width=u[0],d.height=u[1];var f=wp(d,{width:s,height:l});n=f.x,i=f.y,h=null,c=null}else if(X(e)&&a){var g=function(t,e,n,i){var r=n[0],o=n[1],a=Math.ceil(Math.SQRT2*i)+8,s=0,l=0,u=e.width,h=e.height;switch(t){case"inside":s=e.x+u/2-r/2,l=e.y+h/2-o/2;break;case"top":s=e.x+u/2-r/2,l=e.y-o-a;break;case"bottom":s=e.x+u/2-r/2,l=e.y+h+a;break;case"left":s=e.x-r-a,l=e.y+h/2-o/2;break;case"right":s=e.x+u+a,l=e.y+h/2-o/2}return[s,l]}(e,p,u,t.get("borderWidth"));n=g[0],i=g[1]}else{g=function(t,e,n,i,r,o,a){var s=n.getSize(),l=s[0],u=s[1];null!=o&&(t+l+o+2>i?t-=l+o:t+=o);null!=a&&(e+u+a>r?e-=u+a:e+=a);return[t,e]}(n,i,r,s,l,h?null:20,c?null:20);n=g[0],i=g[1]}if(h&&(n-=eV(h)?u[0]/2:"right"===h?u[0]:0),c&&(i-=eV(c)?u[1]/2:"bottom"===c?u[1]:0),Ez(t)){g=function(t,e,n,i,r){var o=n.getSize(),a=o[0],s=o[1];return t=Math.min(t+a,i)-a,e=Math.min(e+s,r)-s,t=Math.max(t,0),e=Math.max(e,0),[t,e]}(n,i,r,s,l);n=g[0],i=g[1]}r.moveTo(n,i)},e.prototype._updateContentNotChangedOnAxis=function(t,e){var n=this._lastDataByCoordSys,i=this._cbParamsList,r=!!n&&n.length===t.length;return r&&E(n,(function(n,o){var a=n.dataByAxis||[],s=(t[o]||{}).dataByAxis||[];(r=r&&a.length===s.length)&&E(a,(function(t,n){var o=s[n]||{},a=t.seriesDataIndices||[],l=o.seriesDataIndices||[];(r=r&&t.value===o.value&&t.axisType===o.axisType&&t.axisId===o.axisId&&a.length===l.length)&&E(a,(function(t,e){var n=l[e];r=r&&t.seriesIndex===n.seriesIndex&&t.dataIndex===n.dataIndex})),i&&E(t.seriesDataIndices,(function(t){var n=t.seriesIndex,o=e[n],a=i[n];o&&a&&a.data!==o.data&&(r=!1)}))}))})),this._lastDataByCoordSys=t,this._cbParamsList=e,!!r},e.prototype._hide=function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},e.prototype.dispose=function(t,e){!r.node&&e.getDom()&&(Og(this,"_updatePosition"),this._tooltipContent.dispose(),oN("itemTooltip",e))},e.type="tooltip",e}(mg);function Qz(t,e,n){var i,r=e.ecModel;n?(i=new xc(n,r,r),i=new xc(e.option,i,r)):i=e;for(var o=t.length-1;o>=0;o--){var a=t[o];a&&(a instanceof xc&&(a=a.get("tooltip",!0)),X(a)&&(a={formatter:a}),a&&(i=new xc(a,i,r)))}return i}function tV(t,e){return t.dispatchAction||W(e.dispatchAction,e)}function eV(t){return"center"===t||"middle"===t}var nV=["rect","polygon","keep","clear"];function iV(t,e){var n=yo(t?t.brush:[]);if(n.length){var i=[];E(n,(function(t){var e=t.hasOwnProperty("toolbox")?t.toolbox:[];e instanceof Array&&(i=i.concat(e))}));var r=t&&t.toolbox;Y(r)&&(r=r[0]),r||(r={feature:{}},t.toolbox=[r]);var o=r.feature||(r.feature={}),a=o.brush||(o.brush={}),s=a.type||(a.type=[]);s.push.apply(s,i),function(t){var e={};E(t,(function(t){e[t]=1})),t.length=0,E(e,(function(e,n){t.push(n)}))}(s),e&&!s.length&&s.push.apply(s,nV)}}var rV=E;function oV(t){if(t)for(var e in t)if(t.hasOwnProperty(e))return!0}function aV(t,e,n){var i={};return rV(e,(function(e){var r,o=i[e]=((r=function(){}).prototype.__hidden=r.prototype,new r);rV(t[e],(function(t,i){if(sD.isValidType(i)){var r={type:i,visual:t};n&&n(r,e),o[i]=new sD(r),"opacity"===i&&((r=T(r)).type="colorAlpha",o.__hidden.__alphaForOpacity=new sD(r))}}))})),i}function sV(t,e,n){var i;E(n,(function(t){e.hasOwnProperty(t)&&oV(e[t])&&(i=!0)})),i&&E(n,(function(n){e.hasOwnProperty(n)&&oV(e[n])?t[n]=T(e[n]):delete t[n]}))}var lV={lineX:uV(0),lineY:uV(1),rect:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])},rect:function(t,e,n){return t&&n.boundingRect.intersect(t)}},polygon:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])&&x_(n.range,t[0],t[1])},rect:function(t,e,n){var i=n.range;if(!t||i.length<=1)return!1;var r=t.x,o=t.y,a=t.width,s=t.height,l=i[0];return!!(x_(i,r,o)||x_(i,r+a,o)||x_(i,r,o+s)||x_(i,r+a,o+s)||Re.create(t).contain(l[0],l[1])||Bh(r,o,r+a,o,i)||Bh(r,o,r,o+s,i)||Bh(r+a,o,r+a,o+s,i)||Bh(r,o+s,r+a,o+s,i))||void 0}}};function uV(t){var e=["x","y"],n=["width","height"];return{point:function(e,n,i){if(e){var r=i.range;return hV(e[t],r)}},rect:function(i,r,o){if(i){var a=o.range,s=[i[e[t]],i[e[t]]+i[n[t]]];return s[1]e[0][1]&&(e[0][1]=o[0]),o[1]e[1][1]&&(e[1][1]=o[1])}return e&&xV(e)}};function xV(t){return new Re(t[0][0],t[1][0],t[0][1]-t[0][0],t[1][1]-t[1][0])}var _V=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){this.ecModel=t,this.api=e,this.model,(this._brushController=new Vk(e.getZr())).on("brush",W(this._onBrush,this)).mount()},e.prototype.render=function(t,e,n,i){this.model=t,this._updateController(t,e,n,i)},e.prototype.updateTransform=function(t,e,n,i){fV(e),this._updateController(t,e,n,i)},e.prototype.updateVisual=function(t,e,n,i){this.updateTransform(t,e,n,i)},e.prototype.updateView=function(t,e,n,i){this._updateController(t,e,n,i)},e.prototype._updateController=function(t,e,n,i){(!i||i.$from!==t.id)&&this._brushController.setPanels(t.brushTargetManager.makePanelOpts(n)).enableBrush(t.brushOption).updateCovers(t.areas.slice())},e.prototype.dispose=function(){this._brushController.dispose()},e.prototype._onBrush=function(t){var e=this.model.id,n=this.model.brushTargetManager.setOutputRanges(t.areas,this.ecModel);(!t.isEnd||t.removeOnClick)&&this.api.dispatchAction({type:"brush",brushId:e,areas:T(n),$from:e}),t.isEnd&&this.api.dispatchAction({type:"brushEnd",brushId:e,areas:T(n),$from:e})},e.type="brush",e}(mg),bV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.areas=[],n.brushOption={},n}return n(e,t),e.prototype.optionUpdated=function(t,e){var n=this.option;!e&&sV(n,t,["inBrush","outOfBrush"]);var i=n.inBrush=n.inBrush||{};n.outOfBrush=n.outOfBrush||{color:"#ddd"},i.hasOwnProperty("liftZ")||(i.liftZ=5)},e.prototype.setAreas=function(t){t&&(this.areas=z(t,(function(t){return wV(this.option,t)}),this))},e.prototype.setBrushOption=function(t){this.brushOption=wV(this.option,t),this.brushType=this.brushOption.brushType},e.type="brush",e.dependencies=["geo","grid","xAxis","yAxis","parallel","series"],e.defaultOption={seriesIndex:"all",brushType:"rect",brushMode:"single",transformable:!0,brushStyle:{borderWidth:1,color:"rgba(210,219,238,0.3)",borderColor:"#D2DBEE"},throttleType:"fixRate",throttleDelay:0,removeOnClick:!0,z:1e4},e}(Ap);function wV(t,e){return C({brushType:t.brushType,brushMode:t.brushMode,transformable:t.transformable,brushStyle:new xc(t.brushStyle).getItemStyle(),removeOnClick:t.removeOnClick,z:t.z},e,!0)}var SV=["rect","polygon","lineX","lineY","keep","clear"],MV=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n){var i,r,o;e.eachComponent({mainType:"brush"},(function(t){i=t.brushType,r=t.brushOption.brushMode||"single",o=o||!!t.areas.length})),this._brushType=i,this._brushMode=r,E(t.get("type",!0),(function(e){t.setIconStatus(e,("keep"===e?"multiple"===r:"clear"===e?o:e===i)?"emphasis":"normal")}))},e.prototype.updateView=function(t,e,n){this.render(t,e,n)},e.prototype.getIcons=function(){var t=this.model,e=t.get("icon",!0),n={};return E(t.get("type",!0),(function(t){e[t]&&(n[t]=e[t])})),n},e.prototype.onclick=function(t,e,n){var i=this._brushType,r=this._brushMode;"clear"===n?(e.dispatchAction({type:"axisAreaSelect",intervals:[]}),e.dispatchAction({type:"brush",command:"clear",areas:[]})):e.dispatchAction({type:"takeGlobalCursor",key:"brush",brushOption:{brushType:"keep"===n?i:i!==n&&n,brushMode:"keep"===n?"multiple"===r?"single":"multiple":r}})},e.getDefaultOption=function(t){return{show:!0,type:SV.slice(),icon:{rect:"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13",polygon:"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2",lineX:"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4",lineY:"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4",keep:"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z",clear:"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2"},title:t.getLocaleModel().get(["toolbox","brush","title"])}},e}(ZE);var IV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode={type:"box",ignoreSize:!0},n}return n(e,t),e.type="title",e.defaultOption={z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bold",color:"#464646"},subtextStyle:{fontSize:12,color:"#6E7079"}},e}(Ap),TV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){if(this.group.removeAll(),t.get("show")){var i=this.group,r=t.getModel("textStyle"),o=t.getModel("subtextStyle"),a=t.get("textAlign"),s=rt(t.get("textBaseline"),t.get("textVerticalAlign")),l=new Ns({style:$h(r,{text:t.get("text"),fill:r.getTextColor()},{disableBox:!0}),z2:10}),u=l.getBoundingRect(),h=t.get("subtext"),c=new Ns({style:$h(o,{text:h,fill:o.getTextColor(),y:u.height+t.get("itemGap"),verticalAlign:"top"},{disableBox:!0}),z2:10}),p=t.get("link"),d=t.get("sublink"),f=t.get("triggerEvent",!0);l.silent=!p&&!f,c.silent=!d&&!f,p&&l.on("click",(function(){yp(p,"_"+t.get("target"))})),d&&c.on("click",(function(){yp(d,"_"+t.get("subtarget"))})),js(l).eventData=js(c).eventData=f?{componentType:"title",componentIndex:t.componentIndex}:null,i.add(l),h&&i.add(c);var g=i.getBoundingRect(),y=t.getBoxLayoutParams();y.width=g.width,y.height=g.height;var v=wp(y,{width:n.getWidth(),height:n.getHeight()},t.get("padding"));a||("middle"===(a=t.get("left")||t.get("right"))&&(a="center"),"right"===a?v.x+=v.width:"center"===a&&(v.x+=v.width/2)),s||("center"===(s=t.get("top")||t.get("bottom"))&&(s="middle"),"bottom"===s?v.y+=v.height:"middle"===s&&(v.y+=v.height/2),s=s||"top"),i.x=v.x,i.y=v.y,i.markRedraw();var m={align:a,verticalAlign:s};l.setStyle(m),c.setStyle(m),g=i.getBoundingRect();var x=v.margin,_=t.getItemStyle(["color","opacity"]);_.fill=t.get("backgroundColor");var b=new Ps({shape:{x:g.x-x[3],y:g.y-x[0],width:g.width+x[1]+x[3],height:g.height+x[0]+x[2],r:t.get("borderRadius")},style:_,subPixelOptimize:!0,silent:!0});i.add(b)}},e.type="title",e}(mg);var CV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode="box",n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n),this._initData()},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this._initData()},e.prototype.setCurrentIndex=function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(t>=e&&(t=e-1),t<0&&(t=0)),this.option.currentIndex=t},e.prototype.getCurrentIndex=function(){return this.option.currentIndex},e.prototype.isIndexMax=function(){return this.getCurrentIndex()>=this._data.count()-1},e.prototype.setPlayState=function(t){this.option.autoPlay=!!t},e.prototype.getPlayState=function(){return!!this.option.autoPlay},e.prototype._initData=function(){var t,e=this.option,n=e.data||[],i=e.axisType,r=this._names=[];"category"===i?(t=[],E(n,(function(e,n){var i,o=Mo(xo(e),"");q(e)?(i=T(e)).value=n:i=n,t.push(i),r.push(o)}))):t=n;var o={category:"ordinal",time:"time",value:"number"}[i]||"number";(this._data=new Jm([{name:"value",type:o}],this)).initData(t,r)},e.prototype.getData=function(){return this._data},e.prototype.getCategories=function(){if("category"===this.get("axisType"))return this._names.slice()},e.type="timeline",e.defaultOption={z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{},label:{color:"#000"},data:[]},e}(Ap),DV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="timeline.slider",e.defaultOption=wc(CV.defaultOption,{backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,orient:"horizontal",inverse:!1,tooltip:{trigger:"item"},symbol:"circle",symbolSize:12,lineStyle:{show:!0,width:2,color:"#DAE1F5"},label:{position:"auto",show:!0,interval:"auto",rotate:0,color:"#A4B1D7"},itemStyle:{color:"#A4B1D7",borderWidth:1},checkpointStyle:{symbol:"circle",symbolSize:15,color:"#316bf3",borderColor:"#fff",borderWidth:2,shadowBlur:2,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0, 0, 0, 0.3)",animation:!0,animationDuration:300,animationEasing:"quinticInOut"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:24,itemGap:12,position:"left",playIcon:"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z",stopIcon:"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z",nextIcon:"M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z",prevIcon:"M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z",prevBtnSize:18,nextBtnSize:18,color:"#A4B1D7",borderColor:"#A4B1D7",borderWidth:1},emphasis:{label:{show:!0,color:"#6f778d"},itemStyle:{color:"#316BF3"},controlStyle:{color:"#316BF3",borderColor:"#316BF3",borderWidth:2}},progress:{lineStyle:{color:"#316BF3"},itemStyle:{color:"#316BF3"},label:{color:"#6f778d"}},data:[]}),e}(CV);R(DV,cf.prototype);var AV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="timeline",e}(mg),kV=function(t){function e(e,n,i,r){var o=t.call(this,e,n,i)||this;return o.type=r||"value",o}return n(e,t),e.prototype.getLabelModel=function(){return this.model.getModel("label")},e.prototype.isHorizontal=function(){return"horizontal"===this.model.get("orient")},e}(X_),LV=Math.PI,PV=Do(),OV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){this.api=e},e.prototype.render=function(t,e,n){if(this.model=t,this.api=n,this.ecModel=e,this.group.removeAll(),t.get("show",!0)){var i=this._layout(t,n),r=this._createGroup("_mainGroup"),o=this._createGroup("_labelGroup"),a=this._axis=this._createAxis(i,t);t.formatTooltip=function(t){return qf("nameValue",{noName:!0,value:a.scale.getLabel({value:t})})},E(["AxisLine","AxisTick","Control","CurrentPointer"],(function(e){this["_render"+e](i,r,a,t)}),this),this._renderAxisLabel(i,o,a,t),this._position(i,t)}this._doPlayStop(),this._updateTicksStatus()},e.prototype.remove=function(){this._clearTimer(),this.group.removeAll()},e.prototype.dispose=function(){this._clearTimer()},e.prototype._layout=function(t,e){var n,i,r,o,a=t.get(["label","position"]),s=t.get("orient"),l=function(t,e){return wp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},t.get("padding"))}(t,e),u={horizontal:"center",vertical:(n=null==a||"auto"===a?"horizontal"===s?l.y+l.height/2=0||"+"===n?"left":"right"},h={horizontal:n>=0||"+"===n?"top":"bottom",vertical:"middle"},c={horizontal:0,vertical:LV/2},p="vertical"===s?l.height:l.width,d=t.getModel("controlStyle"),f=d.get("show",!0),g=f?d.get("itemSize"):0,y=f?d.get("itemGap"):0,v=g+y,m=t.get(["label","rotate"])||0;m=m*LV/180;var x=d.get("position",!0),_=f&&d.get("showPlayBtn",!0),b=f&&d.get("showPrevBtn",!0),w=f&&d.get("showNextBtn",!0),S=0,M=p;"left"===x||"bottom"===x?(_&&(i=[0,0],S+=v),b&&(r=[S,0],S+=v),w&&(o=[M-g,0],M-=v)):(_&&(i=[M-g,0],M-=v),b&&(r=[0,0],S+=v),w&&(o=[M-g,0],M-=v));var I=[S,M];return t.get("inverse")&&I.reverse(),{viewRect:l,mainLength:p,orient:s,rotation:c[s],labelRotation:m,labelPosOpt:n,labelAlign:t.get(["label","align"])||u[s],labelBaseline:t.get(["label","verticalAlign"])||t.get(["label","baseline"])||h[s],playPosition:i,prevBtnPosition:r,nextBtnPosition:o,axisExtent:I,controlSize:g,controlGap:y}},e.prototype._position=function(t,e){var n=this._mainGroup,i=this._labelGroup,r=t.viewRect;if("vertical"===t.orient){var o=[1,0,0,1,0,0],a=r.x,s=r.y+r.height;xe(o,o,[-a,-s]),_e(o,o,-LV/2),xe(o,o,[a,s]),(r=r.clone()).applyTransform(o)}var l=y(r),u=y(n.getBoundingRect()),h=y(i.getBoundingRect()),c=[n.x,n.y],p=[i.x,i.y];p[0]=c[0]=l[0][0];var d,f=t.labelPosOpt;null==f||X(f)?(v(c,u,l,1,d="+"===f?0:1),v(p,h,l,1,1-d)):(v(c,u,l,1,d=f>=0?0:1),p[1]=c[1]+f);function g(t){t.originX=l[0][0]-t.x,t.originY=l[1][0]-t.y}function y(t){return[[t.x,t.x+t.width],[t.y,t.y+t.height]]}function v(t,e,n,i,r){t[i]+=n[i][r]-e[i][r]}n.setPosition(c),i.setPosition(p),n.rotation=i.rotation=t.rotation,g(n),g(i)},e.prototype._createAxis=function(t,e){var n=e.getData(),i=e.get("axisType"),r=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new _x({ordinalMeta:t.getCategories(),extent:[1/0,-1/0]});case"time":return new zx({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new Sx}}(e,i);r.getTicks=function(){return n.mapArray(["value"],(function(t){return{value:t}}))};var o=n.getDataExtent("value");r.setExtent(o[0],o[1]),r.calcNiceTicks();var a=new kV("value",r,t.axisExtent,i);return a.model=e,a},e.prototype._createGroup=function(t){var e=this[t]=new Pr;return this.group.add(e),e},e.prototype._renderAxisLine=function(t,e,n,i){var r=n.getExtent();if(i.get(["lineStyle","show"])){var o=new Wu({shape:{x1:r[0],y1:0,x2:r[1],y2:0},style:A({lineCap:"round"},i.getModel("lineStyle").getLineStyle()),silent:!0,z2:1});e.add(o);var a=this._progressLine=new Wu({shape:{x1:r[0],x2:this._currentPointer?this._currentPointer.x:r[0],y1:0,y2:0},style:k({lineCap:"round",lineWidth:o.style.lineWidth},i.getModel(["progress","lineStyle"]).getLineStyle()),silent:!0,z2:1});e.add(a)}},e.prototype._renderAxisTick=function(t,e,n,i){var r=this,o=i.getData(),a=n.scale.getTicks();this._tickSymbols=[],E(a,(function(t){var a=n.dataToCoord(t.value),s=o.getItemModel(t.value),l=s.getModel("itemStyle"),u=s.getModel(["emphasis","itemStyle"]),h=s.getModel(["progress","itemStyle"]),c={x:a,y:0,onclick:W(r._changeTimeline,r,t.value)},p=RV(s,l,e,c);p.ensureState("emphasis").style=u.getItemStyle(),p.ensureState("progress").style=h.getItemStyle(),Vl(p);var d=js(p);s.get("tooltip")?(d.dataIndex=t.value,d.dataModel=i):d.dataIndex=d.dataModel=null,r._tickSymbols.push(p)}))},e.prototype._renderAxisLabel=function(t,e,n,i){var r=this;if(n.getLabelModel().get("show")){var o=i.getData(),a=n.getViewLabels();this._tickLabels=[],E(a,(function(i){var a=i.tickValue,s=o.getItemModel(a),l=s.getModel("label"),u=s.getModel(["emphasis","label"]),h=s.getModel(["progress","label"]),c=n.dataToCoord(i.tickValue),p=new Ns({x:c,y:0,rotation:t.labelRotation-t.rotation,onclick:W(r._changeTimeline,r,a),silent:!1,style:$h(l,{text:i.formattedLabel,align:t.labelAlign,verticalAlign:t.labelBaseline})});p.ensureState("emphasis").style=$h(u),p.ensureState("progress").style=$h(h),e.add(p),Vl(p),PV(p).dataIndex=a,r._tickLabels.push(p)}))}},e.prototype._renderControl=function(t,e,n,i){var r=t.controlSize,o=t.rotation,a=i.getModel("controlStyle").getItemStyle(),s=i.getModel(["emphasis","controlStyle"]).getItemStyle(),l=i.getPlayState(),u=i.get("inverse",!0);function h(t,n,l,u){if(t){var h=_r(rt(i.get(["controlStyle",n+"BtnSize"]),r),r),c=function(t,e,n,i){var r=i.style,o=Vh(t.get(["controlStyle",e]),i||{},new Re(n[0],n[1],n[2],n[3]));r&&o.setStyle(r);return o}(i,n+"Icon",[0,-h/2,h,h],{x:t[0],y:t[1],originX:r/2,originY:0,rotation:u?-o:0,rectHover:!0,style:a,onclick:l});c.ensureState("emphasis").style=s,e.add(c),Vl(c)}}h(t.nextBtnPosition,"next",W(this._changeTimeline,this,u?"-":"+")),h(t.prevBtnPosition,"prev",W(this._changeTimeline,this,u?"+":"-")),h(t.playPosition,l?"stop":"play",W(this._handlePlayClick,this,!l),!0)},e.prototype._renderCurrentPointer=function(t,e,n,i){var r=i.getData(),o=i.getCurrentIndex(),a=r.getItemModel(o).getModel("checkpointStyle"),s=this,l={onCreate:function(t){t.draggable=!0,t.drift=W(s._handlePointerDrag,s),t.ondragend=W(s._handlePointerDragend,s),NV(t,s._progressLine,o,n,i,!0)},onUpdate:function(t){NV(t,s._progressLine,o,n,i)}};this._currentPointer=RV(a,a,this._mainGroup,{},this._currentPointer,l)},e.prototype._handlePlayClick=function(t){this._clearTimer(),this.api.dispatchAction({type:"timelinePlayChange",playState:t,from:this.uid})},e.prototype._handlePointerDrag=function(t,e,n){this._clearTimer(),this._pointerChangeTimeline([n.offsetX,n.offsetY])},e.prototype._handlePointerDragend=function(t){this._pointerChangeTimeline([t.offsetX,t.offsetY],!0)},e.prototype._pointerChangeTimeline=function(t,e){var n=this._toAxisCoord(t)[0],i=Hr(this._axis.getExtent().slice());n>i[1]&&(n=i[1]),n=0&&(a[o]=+a[o].toFixed(c)),[a,h]}var XV={min:H(UV,"min"),max:H(UV,"max"),average:H(UV,"average"),median:H(UV,"median")};function ZV(t,e){var n=t.getData(),i=t.coordinateSystem;if(e&&!function(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}(e)&&!Y(e.coord)&&i){var r=i.dimensions,o=jV(e,n,i,t);if((e=T(e)).type&&XV[e.type]&&o.baseAxis&&o.valueAxis){var a=P(r,o.baseAxis.dim),s=P(r,o.valueAxis.dim),l=XV[e.type](n,o.baseDataDim,o.valueDataDim,a,s);e.coord=l[0],e.value=l[1]}else{for(var u=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],h=0;h<2;h++)XV[u[h]]&&(u[h]=$V(n,n.mapDimension(r[h]),u[h]));e.coord=u}}return e}function jV(t,e,n,i){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=n.getAxis(function(t,e){var n=t.getData().getDimensionInfo(e);return n&&n.coordDim}(i,r.valueDataDim)),r.baseAxis=n.getOtherAxis(r.valueAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim)):(r.baseAxis=i.getBaseAxis(),r.valueAxis=n.getOtherAxis(r.baseAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim),r.valueDataDim=e.mapDimension(r.valueAxis.dim)),r}function qV(t,e){return!(t&&t.containData&&e.coord&&!YV(e))||t.containData(e.coord)}function KV(t,e){return t?function(t,n,i,r){return yf(r<2?t.coord&&t.coord[r]:t.value,e[r])}:function(t,n,i,r){return yf(t.value,e[r])}}function $V(t,e,n){if("average"===n){var i=0,r=0;return t.each(e,(function(t,e){isNaN(t)||(i+=t,r++)})),i/r}return"median"===n?t.getMedian(e):t.getDataExtent(e)["max"===n?1:0]}var JV=Do(),QV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){this.markerGroupMap=ft()},e.prototype.render=function(t,e,n){var i=this,r=this.markerGroupMap;r.each((function(t){JV(t).keep=!1})),e.eachSeries((function(t){var r=WV.getMarkerModelFromSeries(t,i.type);r&&i.renderSeries(t,r,e,n)})),r.each((function(t){!JV(t).keep&&i.group.remove(t.group)}))},e.prototype.markKeep=function(t){JV(t).keep=!0},e.prototype.toggleBlurSeries=function(t,e){var n=this;E(t,(function(t){var i=WV.getMarkerModelFromSeries(t,n.type);i&&i.getData().eachItemGraphicEl((function(t){t&&(e?Cl(t):Dl(t))}))}))},e.type="marker",e}(mg);function tB(t,e,n){var i=e.coordinateSystem;t.each((function(r){var o,a=t.getItemModel(r),s=Gr(a.get("x"),n.getWidth()),l=Gr(a.get("y"),n.getHeight());if(isNaN(s)||isNaN(l)){if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,r));else if(i){var u=t.get(i.dimensions[0],r),h=t.get(i.dimensions[1],r);o=i.dataToPoint([u,h])}}else o=[s,l];isNaN(s)||(o[0]=s),isNaN(l)||(o[1]=l),t.setItemLayout(r,o)}))}var eB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=WV.getMarkerModelFromSeries(t,"markPoint");e&&(tB(e.getData(),t,n),this.markerGroupMap.get(t.id).updateLayout())}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new Jw),u=function(t,e,n){var i;i=t?z(t&&t.dimensions,(function(t){return A(A({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new Jm(i,n),o=z(n.get("data"),H(ZV,e));t&&(o=B(o,H(qV,t)));var a=KV(!!t,i);return r.initData(o,null,a),r}(r,t,e);e.setData(u),tB(e.getData(),t,i),u.each((function(t){var n=u.getItemModel(t),i=n.getShallow("symbol"),r=n.getShallow("symbolSize"),o=n.getShallow("symbolRotate"),s=n.getShallow("symbolOffset"),l=n.getShallow("symbolKeepAspect");if(U(i)||U(r)||U(o)||U(s)){var h=e.getRawValue(t),c=e.getDataParams(t);U(i)&&(i=i(h,c)),U(r)&&(r=r(h,c)),U(o)&&(o=o(h,c)),U(s)&&(s=s(h,c))}var p=n.getModel("itemStyle").getItemStyle(),d=my(a,"color");p.fill||(p.fill=d),u.setItemVisual(t,{symbol:i,symbolSize:r,symbolRotate:o,symbolOffset:s,symbolKeepAspect:l,style:p})})),l.updateData(u),this.group.add(l.group),u.eachItemGraphicEl((function(t){t.traverse((function(t){js(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},e.type="markPoint",e}(QV);var nB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markLine",e.defaultOption={z:5,symbol:["circle","arrow"],symbolSize:[8,16],symbolOffset:0,precision:2,tooltip:{trigger:"item"},label:{show:!0,position:"end",distance:5},lineStyle:{type:"dashed"},emphasis:{label:{show:!0},lineStyle:{width:3}},animationEasing:"linear"},e}(WV),iB=Do(),rB=function(t,e,n,i){var r,o=t.getData();if(Y(i))r=i;else{var a=i.type;if("min"===a||"max"===a||"average"===a||"median"===a||null!=i.xAxis||null!=i.yAxis){var s=void 0,l=void 0;if(null!=i.yAxis||null!=i.xAxis)s=e.getAxis(null!=i.yAxis?"y":"x"),l=it(i.yAxis,i.xAxis);else{var u=jV(i,o,e,t);s=u.valueAxis,l=$V(o,ax(o,u.valueDataDim),a)}var h="x"===s.dim?0:1,c=1-h,p=T(i),d={coord:[]};p.type=null,p.coord=[],p.coord[c]=-1/0,d.coord[c]=1/0;var f=n.get("precision");f>=0&&j(l)&&(l=+l.toFixed(Math.min(f,20))),p.coord[h]=d.coord[h]=l,r=[p,d,{type:a,valueIndex:i.valueIndex,value:l}]}else r=[]}var g=[ZV(t,r[0]),ZV(t,r[1]),A({},r[2])];return g[2].type=g[2].type||null,C(g[2],g[0]),C(g[2],g[1]),g};function oB(t){return!isNaN(t)&&!isFinite(t)}function aB(t,e,n,i){var r=1-t,o=i.dimensions[t];return oB(e[r])&&oB(n[r])&&e[t]===n[t]&&i.getAxis(o).containData(e[t])}function sB(t,e){if("cartesian2d"===t.type){var n=e[0].coord,i=e[1].coord;if(n&&i&&(aB(1,n,i,t)||aB(0,n,i,t)))return!0}return qV(t,e[0])&&qV(t,e[1])}function lB(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Gr(s.get("x"),r.getWidth()),u=Gr(s.get("y"),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(t.dimensions,e));else{var h=a.dimensions,c=t.get(h[0],e),p=t.get(h[1],e);o=a.dataToPoint([c,p])}if(pS(a,"cartesian2d")){var d=a.getAxis("x"),f=a.getAxis("y");h=a.dimensions;oB(t.get(h[0],e))?o[0]=d.toGlobalCoord(d.getExtent()[n?0:1]):oB(t.get(h[1],e))&&(o[1]=f.toGlobalCoord(f.getExtent()[n?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];t.setItemLayout(e,o)}var uB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=WV.getMarkerModelFromSeries(t,"markLine");if(e){var i=e.getData(),r=iB(e).from,o=iB(e).to;r.each((function(e){lB(r,e,!0,t,n),lB(o,e,!1,t,n)})),i.each((function(t){i.setItemLayout(t,[r.getItemLayout(t),o.getItemLayout(t)])})),this.markerGroupMap.get(t.id).updateLayout()}}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new _A);this.group.add(l.group);var u=function(t,e,n){var i;i=t?z(t&&t.dimensions,(function(t){return A(A({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new Jm(i,n),o=new Jm(i,n),a=new Jm([],n),s=z(n.get("data"),H(rB,e,t,n));t&&(s=B(s,H(sB,t)));var l=KV(!!t,i);return r.initData(z(s,(function(t){return t[0]})),null,l),o.initData(z(s,(function(t){return t[1]})),null,l),a.initData(z(s,(function(t){return t[2]}))),a.hasItemOption=!0,{from:r,to:o,line:a}}(r,t,e),h=u.from,c=u.to,p=u.line;iB(e).from=h,iB(e).to=c,e.setData(p);var d=e.get("symbol"),f=e.get("symbolSize"),g=e.get("symbolRotate"),y=e.get("symbolOffset");function v(e,n,r){var o=e.getItemModel(n);lB(e,n,r,t,i);var s=o.getModel("itemStyle").getItemStyle();null==s.fill&&(s.fill=my(a,"color")),e.setItemVisual(n,{symbolKeepAspect:o.get("symbolKeepAspect"),symbolOffset:rt(o.get("symbolOffset",!0),y[r?0:1]),symbolRotate:rt(o.get("symbolRotate",!0),g[r?0:1]),symbolSize:rt(o.get("symbolSize"),f[r?0:1]),symbol:rt(o.get("symbol",!0),d[r?0:1]),style:s})}Y(d)||(d=[d,d]),Y(f)||(f=[f,f]),Y(g)||(g=[g,g]),Y(y)||(y=[y,y]),u.from.each((function(t){v(h,t,!0),v(c,t,!1)})),p.each((function(t){var e=p.getItemModel(t).getModel("lineStyle").getLineStyle();p.setItemLayout(t,[h.getItemLayout(t),c.getItemLayout(t)]),null==e.stroke&&(e.stroke=h.getItemVisual(t,"style").fill),p.setItemVisual(t,{fromSymbolKeepAspect:h.getItemVisual(t,"symbolKeepAspect"),fromSymbolOffset:h.getItemVisual(t,"symbolOffset"),fromSymbolRotate:h.getItemVisual(t,"symbolRotate"),fromSymbolSize:h.getItemVisual(t,"symbolSize"),fromSymbol:h.getItemVisual(t,"symbol"),toSymbolKeepAspect:c.getItemVisual(t,"symbolKeepAspect"),toSymbolOffset:c.getItemVisual(t,"symbolOffset"),toSymbolRotate:c.getItemVisual(t,"symbolRotate"),toSymbolSize:c.getItemVisual(t,"symbolSize"),toSymbol:c.getItemVisual(t,"symbol"),style:e})})),l.updateData(p),u.line.eachItemGraphicEl((function(t){js(t).dataModel=e,t.traverse((function(t){js(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},e.type="markLine",e}(QV);var hB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markArea",e.defaultOption={z:1,tooltip:{trigger:"item"},animation:!1,label:{show:!0,position:"top"},itemStyle:{borderWidth:0},emphasis:{label:{show:!0,position:"top"}}},e}(WV),cB=Do(),pB=function(t,e,n,i){var r=ZV(t,i[0]),o=ZV(t,i[1]),a=r.coord,s=o.coord;a[0]=it(a[0],-1/0),a[1]=it(a[1],-1/0),s[0]=it(s[0],1/0),s[1]=it(s[1],1/0);var l=D([{},r,o]);return l.coord=[r.coord,o.coord],l.x0=r.x,l.y0=r.y,l.x1=o.x,l.y1=o.y,l};function dB(t){return!isNaN(t)&&!isFinite(t)}function fB(t,e,n,i){var r=1-t;return dB(e[r])&&dB(n[r])}function gB(t,e){var n=e.coord[0],i=e.coord[1],r={coord:n,x:e.x0,y:e.y0},o={coord:i,x:e.x1,y:e.y1};return pS(t,"cartesian2d")?!(!n||!i||!fB(1,n,i)&&!fB(0,n,i))||function(t,e,n){return!(t&&t.containZone&&e.coord&&n.coord&&!YV(e)&&!YV(n))||t.containZone(e.coord,n.coord)}(t,r,o):qV(t,r)||qV(t,o)}function yB(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Gr(s.get(n[0]),r.getWidth()),u=Gr(s.get(n[1]),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(n,e));else{var h=[d=t.get(n[0],e),f=t.get(n[1],e)];a.clampData&&a.clampData(h,h),o=a.dataToPoint(h,!0)}if(pS(a,"cartesian2d")){var c=a.getAxis("x"),p=a.getAxis("y"),d=t.get(n[0],e),f=t.get(n[1],e);dB(d)?o[0]=c.toGlobalCoord(c.getExtent()["x0"===n[0]?0:1]):dB(f)&&(o[1]=p.toGlobalCoord(p.getExtent()["y0"===n[1]?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];return o}var vB=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]],mB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=WV.getMarkerModelFromSeries(t,"markArea");if(e){var i=e.getData();i.each((function(e){var r=z(vB,(function(r){return yB(i,e,r,t,n)}));i.setItemLayout(e,r),i.getItemGraphicEl(e).setShape("points",r)}))}}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,{group:new Pr});this.group.add(l.group),this.markKeep(l);var u=function(t,e,n){var i,r,o=["x0","y0","x1","y1"];if(t){var a=z(t&&t.dimensions,(function(t){var n=e.getData();return A(A({},n.getDimensionInfo(n.mapDimension(t))||{}),{name:t,ordinalMeta:null})}));r=z(o,(function(t,e){return{name:t,type:a[e%2].type}})),i=new Jm(r,n)}else i=new Jm(r=[{name:"value",type:"float"}],n);var s=z(n.get("data"),H(pB,e,t,n));t&&(s=B(s,H(gB,t)));var l=t?function(t,e,n,i){return yf(t.coord[Math.floor(i/2)][i%2],r[i])}:function(t,e,n,i){return yf(t.value,r[i])};return i.initData(s,null,l),i.hasItemOption=!0,i}(r,t,e);e.setData(u),u.each((function(e){var n=z(vB,(function(n){return yB(u,e,n,t,i)})),o=r.getAxis("x").scale,s=r.getAxis("y").scale,l=o.getExtent(),h=s.getExtent(),c=[o.parse(u.get("x0",e)),o.parse(u.get("x1",e))],p=[s.parse(u.get("y0",e)),s.parse(u.get("y1",e))];Hr(c),Hr(p);var d=!!(l[0]>c[1]||l[1]p[1]||h[1]=0},e.prototype.getOrient=function(){return"vertical"===this.get("orient")?{index:1,name:"vertical"}:{index:0,name:"horizontal"}},e.type="legend.plain",e.dependencies=["series"],e.defaultOption={z:4,show:!0,orient:"horizontal",left:"center",top:0,align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,symbolRotate:"inherit",symbolKeepAspect:!0,inactiveColor:"#ccc",inactiveBorderColor:"#ccc",inactiveBorderWidth:"auto",itemStyle:{color:"inherit",opacity:"inherit",borderColor:"inherit",borderWidth:"auto",borderCap:"inherit",borderJoin:"inherit",borderDashOffset:"inherit",borderMiterLimit:"inherit"},lineStyle:{width:"auto",color:"inherit",inactiveColor:"#ccc",inactiveWidth:2,opacity:"inherit",type:"inherit",cap:"inherit",join:"inherit",dashOffset:"inherit",miterLimit:"inherit"},textStyle:{color:"#333"},selectedMode:!0,selector:!1,selectorLabel:{show:!0,borderRadius:10,padding:[3,5,3,5],fontSize:12,fontFamily:"sans-serif",color:"#666",borderWidth:1,borderColor:"#666"},emphasis:{selectorLabel:{show:!0,color:"#eee",backgroundColor:"#666"}},selectorPosition:"auto",selectorItemGap:7,selectorButtonGap:10,tooltip:{show:!1}},e}(Ap),_B=H,bB=E,wB=Pr,SB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.newlineDisabled=!1,n}return n(e,t),e.prototype.init=function(){this.group.add(this._contentGroup=new wB),this.group.add(this._selectorGroup=new wB),this._isFirstRender=!0},e.prototype.getContentGroup=function(){return this._contentGroup},e.prototype.getSelectorGroup=function(){return this._selectorGroup},e.prototype.render=function(t,e,n){var i=this._isFirstRender;if(this._isFirstRender=!1,this.resetInner(),t.get("show",!0)){var r=t.get("align"),o=t.get("orient");r&&"auto"!==r||(r="right"===t.get("left")&&"vertical"===o?"right":"left");var a=t.get("selector",!0),s=t.get("selectorPosition",!0);!a||s&&"auto"!==s||(s="horizontal"===o?"end":"start"),this.renderInner(r,t,e,n,a,o,s);var l=t.getBoxLayoutParams(),u={width:n.getWidth(),height:n.getHeight()},h=t.get("padding"),c=wp(l,u,h),p=this.layoutInner(t,r,c,i,a,s),d=wp(k({width:p.width,height:p.height},l),u,h);this.group.x=d.x-p.x,this.group.y=d.y-p.y,this.group.markRedraw(),this.group.add(this._backgroundEl=JE(p,t))}},e.prototype.resetInner=function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl),this.getSelectorGroup().removeAll()},e.prototype.renderInner=function(t,e,n,i,r,o,a){var s=this.getContentGroup(),l=ft(),u=e.get("selectedMode"),h=[];n.eachRawSeries((function(t){!t.get("legendHoverLink")&&h.push(t.id)})),bB(e.getData(),(function(r,o){var a=r.get("name");if(!this.newlineDisabled&&(""===a||"\n"===a)){var c=new wB;return c.newline=!0,void s.add(c)}var p=n.getSeriesByName(a)[0];if(!l.get(a)){if(p){var d=p.getData(),f=d.getVisual("legendLineStyle")||{},g=d.getVisual("legendIcon"),y=d.getVisual("style");this._createItem(p,a,o,r,e,t,f,y,g,u,i).on("click",_B(MB,a,null,i,h)).on("mouseover",_B(TB,p.name,null,i,h)).on("mouseout",_B(CB,p.name,null,i,h)),l.set(a,!0)}else n.eachRawSeries((function(n){if(!l.get(a)&&n.legendVisualProvider){var s=n.legendVisualProvider;if(!s.containName(a))return;var c=s.indexOfName(a),p=s.getItemVisual(c,"style"),d=s.getItemVisual(c,"legendIcon"),f=Xn(p.fill);f&&0===f[3]&&(f[3]=.2,p=A(A({},p),{fill:ei(f,"rgba")})),this._createItem(n,a,o,r,e,t,{},p,d,u,i).on("click",_B(MB,null,a,i,h)).on("mouseover",_B(TB,null,a,i,h)).on("mouseout",_B(CB,null,a,i,h)),l.set(a,!0)}}),this);0}}),this),r&&this._createSelector(r,e,i,o,a)},e.prototype._createSelector=function(t,e,n,i,r){var o=this.getSelectorGroup();bB(t,(function(t){var i=t.type,r=new Ns({style:{x:0,y:0,align:"center",verticalAlign:"middle"},onclick:function(){n.dispatchAction({type:"all"===i?"legendAllSelect":"legendInverseSelect"})}});o.add(r),qh(r,{normal:e.getModel("selectorLabel"),emphasis:e.getModel(["emphasis","selectorLabel"])},{defaultText:t.title}),Vl(r)}))},e.prototype._createItem=function(t,e,n,i,r,o,a,s,l,u,h){var c=t.visualDrawType,p=r.get("itemWidth"),d=r.get("itemHeight"),f=r.isSelected(e),g=i.get("symbolRotate"),y=i.get("symbolKeepAspect"),v=i.get("icon"),m=function(t,e,n,i,r,o,a){function s(t,e){"auto"===t.lineWidth&&(t.lineWidth=e.lineWidth>0?2:0),bB(t,(function(n,i){"inherit"===t[i]&&(t[i]=e[i])}))}var l=e.getModel("itemStyle"),u=l.getItemStyle(),h=0===t.lastIndexOf("empty",0)?"fill":"stroke",c=l.getShallow("decal");u.decal=c&&"inherit"!==c?sv(c,a):i.decal,"inherit"===u.fill&&(u.fill=i[r]);"inherit"===u.stroke&&(u.stroke=i[h]);"inherit"===u.opacity&&(u.opacity=("fill"===r?i:n).opacity);s(u,i);var p=e.getModel("lineStyle"),d=p.getLineStyle();if(s(d,n),"auto"===u.fill&&(u.fill=i.fill),"auto"===u.stroke&&(u.stroke=i.fill),"auto"===d.stroke&&(d.stroke=i.fill),!o){var f=e.get("inactiveBorderWidth"),g=u[h];u.lineWidth="auto"===f?i.lineWidth>0&&g?2:0:u.lineWidth,u.fill=e.get("inactiveColor"),u.stroke=e.get("inactiveBorderColor"),d.stroke=p.get("inactiveColor"),d.lineWidth=p.get("inactiveWidth")}return{itemStyle:u,lineStyle:d}}(l=v||l||"roundRect",i,a,s,c,f,h),x=new wB,_=i.getModel("textStyle");if(!U(t.getLegendIcon)||v&&"inherit"!==v){var b="inherit"===v&&t.getData().getVisual("symbol")?"inherit"===g?t.getData().getVisual("symbolRotate"):g:0;x.add(function(t){var e=t.icon||"roundRect",n=Ry(e,0,0,t.itemWidth,t.itemHeight,t.itemStyle.fill,t.symbolKeepAspect);n.setStyle(t.itemStyle),n.rotation=(t.iconRotate||0)*Math.PI/180,n.setOrigin([t.itemWidth/2,t.itemHeight/2]),e.indexOf("empty")>-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2);return n}({itemWidth:p,itemHeight:d,icon:l,iconRotate:b,itemStyle:m.itemStyle,lineStyle:m.lineStyle,symbolKeepAspect:y}))}else x.add(t.getLegendIcon({itemWidth:p,itemHeight:d,icon:l,iconRotate:g,itemStyle:m.itemStyle,lineStyle:m.lineStyle,symbolKeepAspect:y}));var w="left"===o?p+5:-5,S=o,M=r.get("formatter"),I=e;X(M)&&M?I=M.replace("{name}",null!=e?e:""):U(M)&&(I=M(e));var T=i.get("inactiveColor");x.add(new Ns({style:$h(_,{text:I,x:w,y:d/2,fill:f?_.getTextColor():T,align:S,verticalAlign:"middle"})}));var C=new Ps({shape:x.getBoundingRect(),invisible:!0}),D=i.getModel("tooltip");return D.get("show")&&Wh({el:C,componentModel:r,itemName:e,itemTooltipOption:D.option}),x.add(C),x.eachChild((function(t){t.silent=!0})),C.silent=!u,this.getContentGroup().add(x),Vl(x),x.__legendDataIndex=n,x},e.prototype.layoutInner=function(t,e,n,i,r,o){var a=this.getContentGroup(),s=this.getSelectorGroup();bp(t.get("orient"),a,t.get("itemGap"),n.width,n.height);var l=a.getBoundingRect(),u=[-l.x,-l.y];if(s.markRedraw(),a.markRedraw(),r){bp("horizontal",s,t.get("selectorItemGap",!0));var h=s.getBoundingRect(),c=[-h.x,-h.y],p=t.get("selectorButtonGap",!0),d=t.getOrient().index,f=0===d?"width":"height",g=0===d?"height":"width",y=0===d?"y":"x";"end"===o?c[d]+=l[f]+p:u[d]+=h[f]+p,c[1-d]+=l[g]/2-h[g]/2,s.x=c[0],s.y=c[1],a.x=u[0],a.y=u[1];var v={x:0,y:0};return v[f]=l[f]+p+h[f],v[g]=Math.max(l[g],h[g]),v[y]=Math.min(0,h[y]+c[1-d]),v}return a.x=u[0],a.y=u[1],this.group.getBoundingRect()},e.prototype.remove=function(){this.getContentGroup().removeAll(),this._isFirstRender=!0},e.type="legend.plain",e}(mg);function MB(t,e,n,i){CB(t,e,n,i),n.dispatchAction({type:"legendToggleSelect",name:null!=t?t:e}),TB(t,e,n,i)}function IB(t){for(var e,n=t.getZr().storage.getDisplayList(),i=0,r=n.length;in[r],f=[-c.x,-c.y];e||(f[i]=l[s]);var g=[0,0],y=[-p.x,-p.y],v=rt(t.get("pageButtonGap",!0),t.get("itemGap",!0));d&&("end"===t.get("pageButtonPosition",!0)?y[i]+=n[r]-p[r]:g[i]+=p[r]+v);y[1-i]+=c[o]/2-p[o]/2,l.setPosition(f),u.setPosition(g),h.setPosition(y);var m={x:0,y:0};if(m[r]=d?n[r]:c[r],m[o]=Math.max(c[o],p[o]),m[a]=Math.min(0,p[a]+y[1-i]),u.__rectSize=n[r],d){var x={x:0,y:0};x[r]=Math.max(n[r]-p[r]-v,0),x[o]=m[o],u.setClipPath(new Ps({shape:x})),u.__rectSize=x[r]}else h.eachChild((function(t){t.attr({invisible:!0,silent:!0})}));var _=this._getPageInfo(t);return null!=_.pageIndex&&uh(l,{x:_.contentPosition[0],y:_.contentPosition[1]},d?t:null),this._updatePageInfoView(t,_),m},e.prototype._pageGo=function(t,e,n){var i=this._getPageInfo(e)[t];null!=i&&n.dispatchAction({type:"legendScroll",scrollDataIndex:i,legendId:e.id})},e.prototype._updatePageInfoView=function(t,e){var n=this._controllerGroup;E(["pagePrev","pageNext"],(function(i){var r=null!=e[i+"DataIndex"],o=n.childOfName(i);o&&(o.setStyle("fill",r?t.get("pageIconColor",!0):t.get("pageIconInactiveColor",!0)),o.cursor=r?"pointer":"default")}));var i=n.childOfName("pageText"),r=t.get("pageFormatter"),o=e.pageIndex,a=null!=o?o+1:0,s=e.pageCount;i&&r&&i.setStyle("text",X(r)?r.replace("{current}",null==a?"":a+"").replace("{total}",null==s?"":s+""):r({current:a,total:s}))},e.prototype._getPageInfo=function(t){var e=t.get("scrollDataIndex",!0),n=this.getContentGroup(),i=this._containerGroup.__rectSize,r=t.getOrient().index,o=RB[r],a=NB[r],s=this._findTargetItemIndex(e),l=n.children(),u=l[s],h=l.length,c=h?1:0,p={contentPosition:[n.x,n.y],pageCount:c,pageIndex:c-1,pagePrevDataIndex:null,pageNextDataIndex:null};if(!u)return p;var d=m(u);p.contentPosition[r]=-d.s;for(var f=s+1,g=d,y=d,v=null;f<=h;++f)(!(v=m(l[f]))&&y.e>g.s+i||v&&!x(v,g.s))&&(g=y.i>g.i?y:v)&&(null==p.pageNextDataIndex&&(p.pageNextDataIndex=g.i),++p.pageCount),y=v;for(f=s-1,g=d,y=d,v=null;f>=-1;--f)(v=m(l[f]))&&x(y,v.s)||!(g.i=e&&t.s<=e+i}},e.prototype._findTargetItemIndex=function(t){return this._showController?(this.getContentGroup().eachChild((function(i,r){var o=i.__legendDataIndex;null==n&&null!=o&&(n=r),o===t&&(e=r)})),null!=e?e:n):0;var e,n},e.type="legend.scroll",e}(SB);function zB(t){Im(kB),t.registerComponentModel(LB),t.registerComponentView(EB),function(t){t.registerAction("legendScroll","legendscroll",(function(t,e){var n=t.scrollDataIndex;null!=n&&e.eachComponent({mainType:"legend",subType:"scroll",query:t},(function(t){t.setScrollDataIndex(n)}))}))}(t)}var VB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.inside",e.defaultOption=wc(NE.defaultOption,{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),e}(NE),BB=Do();function FB(t,e,n){BB(t).coordSysRecordMap.each((function(t){var i=t.dataZoomInfoMap.get(e.uid);i&&(i.getRange=n)}))}function GB(t,e){if(e){t.removeKey(e.model.uid);var n=e.controller;n&&n.dispose()}}function WB(t,e){t.isDisposed()||t.dispatchAction({type:"dataZoom",animation:{easing:"cubicOut",duration:100},batch:e})}function HB(t,e,n,i){return t.coordinateSystem.containPoint([n,i])}function YB(t){t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,(function(t,e){var n=BB(e),i=n.coordSysRecordMap||(n.coordSysRecordMap=ft());i.each((function(t){t.dataZoomInfoMap=null})),t.eachComponent({mainType:"dataZoom",subType:"inside"},(function(t){E(OE(t).infoList,(function(n){var r=n.model.uid,o=i.get(r)||i.set(r,function(t,e){var n={model:e,containsPoint:H(HB,e),dispatchAction:H(WB,t),dataZoomInfoMap:null,controller:null},i=n.controller=new OI(t.getZr());return E(["pan","zoom","scrollMove"],(function(t){i.on(t,(function(e){var i=[];n.dataZoomInfoMap.each((function(r){if(e.isAvailableBehavior(r.model.option)){var o=(r.getRange||{})[t],a=o&&o(r.dzReferCoordSysInfo,n.model.mainType,n.controller,e);!r.model.get("disabled",!0)&&a&&i.push({dataZoomId:r.model.id,start:a[0],end:a[1]})}})),i.length&&n.dispatchAction(i)}))})),n}(e,n.model));(o.dataZoomInfoMap||(o.dataZoomInfoMap=ft())).set(t.uid,{dzReferCoordSysInfo:n,model:t,getRange:null})}))})),i.each((function(t){var e,n=t.controller,r=t.dataZoomInfoMap;if(r){var o=r.keys()[0];null!=o&&(e=r.get(o))}if(e){var a=function(t){var e,n="type_",i={type_true:2,type_move:1,type_false:0,type_undefined:-1},r=!0;return t.each((function(t){var o=t.model,a=!o.get("disabled",!0)&&(!o.get("zoomLock",!0)||"move");i[n+a]>i[n+e]&&(e=a),r=r&&o.get("preventDefaultMouseMove",!0)})),{controlType:e,opt:{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!0,preventDefaultMouseMove:!!r}}}(r);n.enable(a.controlType,a.opt),n.setPointerChecker(t.containsPoint),Pg(t,"dispatchAction",e.model.get("throttle",!0),"fixRate")}else GB(i,t)}))}))}var UB=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="dataZoom.inside",e}return n(e,t),e.prototype.render=function(e,n,i){t.prototype.render.apply(this,arguments),e.noTarget()?this._clear():(this.range=e.getPercentRange(),FB(i,e,{pan:W(XB.pan,this),zoom:W(XB.zoom,this),scrollMove:W(XB.scrollMove,this)}))},e.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){!function(t,e){for(var n=BB(t).coordSysRecordMap,i=n.keys(),r=0;r0?s.pixelStart+s.pixelLength-s.pixel:s.pixel-s.pixelStart)/s.pixelLength*(o[1]-o[0])+o[0],u=Math.max(1/i.scale,0);o[0]=(o[0]-l)*u+l,o[1]=(o[1]-l)*u+l;var h=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return dk(0,o,[0,100],0,h.minSpan,h.maxSpan),this.range=o,r[0]!==o[0]||r[1]!==o[1]?o:void 0}},pan:ZB((function(t,e,n,i,r,o){var a=jB[i]([o.oldX,o.oldY],[o.newX,o.newY],e,r,n);return a.signal*(t[1]-t[0])*a.pixel/a.pixelLength})),scrollMove:ZB((function(t,e,n,i,r,o){return jB[i]([0,0],[o.scrollDelta,o.scrollDelta],e,r,n).signal*(t[1]-t[0])*o.scrollDelta}))};function ZB(t){return function(e,n,i,r){var o=this.range,a=o.slice(),s=e.axisModels[0];if(s)return dk(t(a,s,e,n,i,r),a,[0,100],"all"),this.range=a,o[0]!==a[0]||o[1]!==a[1]?a:void 0}}var jB={grid:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem.getRect();return t=t||[0,0],"x"===o.dim?(a.pixel=e[0]-t[0],a.pixelLength=s.width,a.pixelStart=s.x,a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=s.height,a.pixelStart=s.y,a.signal=o.inverse?-1:1),a},polar:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),u=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===n.mainType?(a.pixel=e[0]-t[0],a.pixelLength=l[1]-l[0],a.pixelStart=l[0],a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=u[1]-u[0],a.pixelStart=u[0],a.signal=o.inverse?-1:1),a},singleAxis:function(t,e,n,i,r){var o=n.axis,a=r.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===o.orient?(s.pixel=e[0]-t[0],s.pixelLength=a.width,s.pixelStart=a.x,s.signal=o.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=a.height,s.pixelStart=a.y,s.signal=o.inverse?-1:1),s}};function qB(t){UE(t),t.registerComponentModel(VB),t.registerComponentView(UB),YB(t)}var KB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.slider",e.layoutMode="box",e.defaultOption=wc(NE.defaultOption,{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,borderColor:"#d2dbee",borderRadius:3,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#d2dbee",width:.5},areaStyle:{color:"#d2dbee",opacity:.2}},selectedDataBackground:{lineStyle:{color:"#8fb0f7",width:.5},areaStyle:{color:"#8fb0f7",opacity:.2}},fillerColor:"rgba(135,175,274,0.2)",handleIcon:"path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z",handleSize:"100%",handleStyle:{color:"#fff",borderColor:"#ACB8D1"},moveHandleSize:7,moveHandleIcon:"path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z",moveHandleStyle:{color:"#D2DBEE",opacity:.7},showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#6E7079"},brushSelect:!0,brushStyle:{color:"rgba(135,175,274,0.15)"},emphasis:{handleStyle:{borderColor:"#8FB0F7"},moveHandleStyle:{color:"#8FB0F7"}}}),e}(NE),$B=Ps,JB="horizontal",QB="vertical",tF=["line","bar","candlestick","scatter"],eF={easing:"cubicOut",duration:100,delay:0},nF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._displayables={},n}return n(e,t),e.prototype.init=function(t,e){this.api=e,this._onBrush=W(this._onBrush,this),this._onBrushEnd=W(this._onBrushEnd,this)},e.prototype.render=function(e,n,i,r){if(t.prototype.render.apply(this,arguments),Pg(this,"_dispatchZoomAction",e.get("throttle"),"fixRate"),this._orient=e.getOrient(),!1!==e.get("show")){if(e.noTarget())return this._clear(),void this.group.removeAll();r&&"dataZoom"===r.type&&r.from===this.uid||this._buildView(),this._updateView()}else this.group.removeAll()},e.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){Og(this,"_dispatchZoomAction");var t=this.api.getZr();t.off("mousemove",this._onBrush),t.off("mouseup",this._onBrushEnd)},e.prototype._buildView=function(){var t=this.group;t.removeAll(),this._brushing=!1,this._displayables.brushRect=null,this._resetLocation(),this._resetInterval();var e=this._displayables.sliderGroup=new Pr;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},e.prototype._resetLocation=function(){var t=this.dataZoomModel,e=this.api,n=t.get("brushSelect")?7:0,i=this._findCoordRect(),r={width:e.getWidth(),height:e.getHeight()},o=this._orient===JB?{right:r.width-i.x-i.width,top:r.height-30-7-n,width:i.width,height:30}:{right:7,top:i.y,width:30,height:i.height},a=Tp(t.option);E(["right","top","width","height"],(function(t){"ph"===a[t]&&(a[t]=o[t])}));var s=wp(a,r);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===QB&&this._size.reverse()},e.prototype._positionGroup=function(){var t=this.group,e=this._location,n=this._orient,i=this.dataZoomModel.getFirstTargetAxisModel(),r=i&&i.get("inverse"),o=this._displayables.sliderGroup,a=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(n!==JB||r?n===JB&&r?{scaleY:a?1:-1,scaleX:-1}:n!==QB||r?{scaleY:a?-1:1,scaleX:-1,rotation:Math.PI/2}:{scaleY:a?-1:1,scaleX:1,rotation:Math.PI/2}:{scaleY:a?1:-1,scaleX:1});var s=t.getBoundingRect([o]);t.x=e.x-s.x,t.y=e.y-s.y,t.markRedraw()},e.prototype._getViewExtent=function(){return[0,this._size[0]]},e.prototype._renderBackground=function(){var t=this.dataZoomModel,e=this._size,n=this._displayables.sliderGroup,i=t.get("brushSelect");n.add(new $B({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40}));var r=new $B({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:W(this._onClickPanel,this)}),o=this.api.getZr();i?(r.on("mousedown",this._onBrushStart,this),r.cursor="crosshair",o.on("mousemove",this._onBrush),o.on("mouseup",this._onBrushEnd)):(o.off("mousemove",this._onBrush),o.off("mouseup",this._onBrushEnd)),n.add(r)},e.prototype._renderDataShadow=function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(this._displayables.dataShadowSegs=[],t){var e=this._size,n=this._shadowSize||[],i=t.series,r=i.getRawData(),o=i.getShadowDim&&i.getShadowDim(),a=o&&r.getDimensionInfo(o)?i.getShadowDim():t.otherDim;if(null!=a){var s=this._shadowPolygonPts,l=this._shadowPolylinePts;if(r!==this._shadowData||a!==this._shadowDim||e[0]!==n[0]||e[1]!==n[1]){var u=r.getDataExtent(a),h=.3*(u[1]-u[0]);u=[u[0]-h,u[1]+h];var c,p=[0,e[1]],d=[0,e[0]],f=[[e[0],0],[0,0]],g=[],y=d[1]/(r.count()-1),v=0,m=Math.round(r.count()/e[0]);r.each([a],(function(t,e){if(m>0&&e%m)v+=y;else{var n=null==t||isNaN(t)||""===t,i=n?0:Fr(t,u,p,!0);n&&!c&&e?(f.push([f[f.length-1][0],0]),g.push([g[g.length-1][0],0])):!n&&c&&(f.push([v,0]),g.push([v,0])),f.push([v,i]),g.push([v,i]),v+=y,c=n}})),s=this._shadowPolygonPts=f,l=this._shadowPolylinePts=g}this._shadowData=r,this._shadowDim=a,this._shadowSize=[e[0],e[1]];for(var x=this.dataZoomModel,_=0;_<3;_++){var b=w(1===_);this._displayables.sliderGroup.add(b),this._displayables.dataShadowSegs.push(b)}}}function w(t){var e=x.getModel(t?"selectedDataBackground":"dataBackground"),n=new Pr,i=new zu({shape:{points:s},segmentIgnoreThreshold:1,style:e.getModel("areaStyle").getAreaStyle(),silent:!0,z2:-20}),r=new Bu({shape:{points:l},segmentIgnoreThreshold:1,style:e.getModel("lineStyle").getLineStyle(),silent:!0,z2:-19});return n.add(i),n.add(r),n}},e.prototype._prepareDataShadowInfo=function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(!1!==e){var n,i=this.ecModel;return t.eachTargetAxis((function(r,o){E(t.getAxisProxy(r,o).getTargetSeriesModels(),(function(t){if(!(n||!0!==e&&P(tF,t.get("type"))<0)){var a,s=i.getComponent(LE(r),o).axis,l={x:"y",y:"x",radius:"angle",angle:"radius"}[r],u=t.coordinateSystem;null!=l&&u.getOtherAxis&&(a=u.getOtherAxis(s).inverse),l=t.getData().mapDimension(l),n={thisAxis:s,series:t,thisDim:r,otherDim:l,otherAxisInverse:a}}}),this)}),this),n}},e.prototype._renderHandle=function(){var t=this.group,e=this._displayables,n=e.handles=[null,null],i=e.handleLabels=[null,null],r=this._displayables.sliderGroup,o=this._size,a=this.dataZoomModel,s=this.api,l=a.get("borderRadius")||0,u=a.get("brushSelect"),h=e.filler=new $B({silent:u,style:{fill:a.get("fillerColor")},textConfig:{position:"inside"}});r.add(h),r.add(new $B({silent:!0,subPixelOptimize:!0,shape:{x:0,y:0,width:o[0],height:o[1],r:l},style:{stroke:a.get("dataBackgroundColor")||a.get("borderColor"),lineWidth:1,fill:"rgba(0,0,0,0)"}})),E([0,1],(function(e){var o=a.get("handleIcon");!Ly[o]&&o.indexOf("path://")<0&&o.indexOf("image://")<0&&(o="path://"+o);var s=Ry(o,-1,0,2,2,null,!0);s.attr({cursor:iF(this._orient),draggable:!0,drift:W(this._onDragMove,this,e),ondragend:W(this._onDragEnd,this),onmouseover:W(this._showDataInfo,this,!0),onmouseout:W(this._showDataInfo,this,!1),z2:5});var l=s.getBoundingRect(),u=a.get("handleSize");this._handleHeight=Gr(u,this._size[1]),this._handleWidth=l.width/l.height*this._handleHeight,s.setStyle(a.getModel("handleStyle").getItemStyle()),s.style.strokeNoScale=!0,s.rectHover=!0,s.ensureState("emphasis").style=a.getModel(["emphasis","handleStyle"]).getItemStyle(),Vl(s);var h=a.get("handleColor");null!=h&&(s.style.fill=h),r.add(n[e]=s);var c=a.getModel("textStyle");t.add(i[e]=new Ns({silent:!0,invisible:!0,style:$h(c,{x:0,y:0,text:"",verticalAlign:"middle",align:"center",fill:c.getTextColor(),font:c.getFont()}),z2:10}))}),this);var c=h;if(u){var p=Gr(a.get("moveHandleSize"),o[1]),d=e.moveHandle=new Ps({style:a.getModel("moveHandleStyle").getItemStyle(),silent:!0,shape:{r:[0,0,2,2],y:o[1]-.5,height:p}}),f=.8*p,g=e.moveHandleIcon=Ry(a.get("moveHandleIcon"),-f/2,-f/2,f,f,"#fff",!0);g.silent=!0,g.y=o[1]+p/2-.5,d.ensureState("emphasis").style=a.getModel(["emphasis","moveHandleStyle"]).getItemStyle();var y=Math.min(o[1]/2,Math.max(p,10));(c=e.moveZone=new Ps({invisible:!0,shape:{y:o[1]-y,height:p+y}})).on("mouseover",(function(){s.enterEmphasis(d)})).on("mouseout",(function(){s.leaveEmphasis(d)})),r.add(d),r.add(g),r.add(c)}c.attr({draggable:!0,cursor:iF(this._orient),drift:W(this._onDragMove,this,"all"),ondragstart:W(this._showDataInfo,this,!0),ondragend:W(this._onDragEnd,this),onmouseover:W(this._showDataInfo,this,!0),onmouseout:W(this._showDataInfo,this,!1)})},e.prototype._resetInterval=function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[Fr(t[0],[0,100],e,!0),Fr(t[1],[0,100],e,!0)]},e.prototype._updateInterval=function(t,e){var n=this.dataZoomModel,i=this._handleEnds,r=this._getViewExtent(),o=n.findRepresentativeAxisProxy().getMinMaxSpan(),a=[0,100];dk(e,i,r,n.get("zoomLock")?"all":t,null!=o.minSpan?Fr(o.minSpan,a,r,!0):null,null!=o.maxSpan?Fr(o.maxSpan,a,r,!0):null);var s=this._range,l=this._range=Hr([Fr(i[0],r,a,!0),Fr(i[1],r,a,!0)]);return!s||s[0]!==l[0]||s[1]!==l[1]},e.prototype._updateView=function(t){var e=this._displayables,n=this._handleEnds,i=Hr(n.slice()),r=this._size;E([0,1],(function(t){var i=e.handles[t],o=this._handleHeight;i.attr({scaleX:o/2,scaleY:o/2,x:n[t]+(t?-1:1),y:r[1]/2-o/2})}),this),e.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:r[1]});var o={x:i[0],width:i[1]-i[0]};e.moveHandle&&(e.moveHandle.setShape(o),e.moveZone.setShape(o),e.moveZone.getBoundingRect(),e.moveHandleIcon&&e.moveHandleIcon.attr("x",o.x+o.width/2));for(var a=e.dataShadowSegs,s=[0,i[0],i[1],r[0]],l=0;le[0]||n[1]<0||n[1]>e[1])){var i=this._handleEnds,r=(i[0]+i[1])/2,o=this._updateInterval("all",n[0]-r);this._updateView(),o&&this._dispatchZoomAction(!1)}},e.prototype._onBrushStart=function(t){var e=t.offsetX,n=t.offsetY;this._brushStart=new Ie(e,n),this._brushing=!0,this._brushStartTime=+new Date},e.prototype._onBrushEnd=function(t){if(this._brushing){var e=this._displayables.brushRect;if(this._brushing=!1,e){e.attr("ignore",!0);var n=e.shape;if(!(+new Date-this._brushStartTime<200&&Math.abs(n.width)<5)){var i=this._getViewExtent(),r=[0,100];this._range=Hr([Fr(n.x,i,r,!0),Fr(n.x+n.width,i,r,!0)]),this._handleEnds=[n.x,n.x+n.width],this._updateView(),this._dispatchZoomAction(!1)}}}},e.prototype._onBrush=function(t){this._brushing&&(he(t.event),this._updateBrushRect(t.offsetX,t.offsetY))},e.prototype._updateBrushRect=function(t,e){var n=this._displayables,i=this.dataZoomModel,r=n.brushRect;r||(r=n.brushRect=new $B({silent:!0,style:i.getModel("brushStyle").getItemStyle()}),n.sliderGroup.add(r)),r.attr("ignore",!1);var o=this._brushStart,a=this._displayables.sliderGroup,s=a.transformCoordToLocal(t,e),l=a.transformCoordToLocal(o.x,o.y),u=this._size;s[0]=Math.max(Math.min(u[0],s[0]),0),r.setShape({x:l[0],y:0,width:s[0]-l[0],height:u[1]})},e.prototype._dispatchZoomAction=function(t){var e=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,animation:t?eF:null,start:e[0],end:e[1]})},e.prototype._findCoordRect=function(){var t,e=OE(this.dataZoomModel).infoList;if(!t&&e.length){var n=e[0].model.coordinateSystem;t=n.getRect&&n.getRect()}if(!t){var i=this.api.getWidth(),r=this.api.getHeight();t={x:.2*i,y:.2*r,width:.6*i,height:.6*r}}return t},e.type="dataZoom.slider",e}(VE);function iF(t){return"vertical"===t?"ns-resize":"ew-resize"}function rF(t){t.registerComponentModel(KB),t.registerComponentView(nF),UE(t)}var oF=function(t,e,n){var i=T((aF[t]||{})[e]);return n&&Y(i)?i[i.length-1]:i},aF={color:{active:["#006edd","#e0ffff"],inactive:["rgba(0,0,0,0)"]},colorHue:{active:[0,360],inactive:[0,0]},colorSaturation:{active:[.3,1],inactive:[0,0]},colorLightness:{active:[.9,.5],inactive:[0,0]},colorAlpha:{active:[.3,1],inactive:[0,0]},opacity:{active:[.3,1],inactive:[0,0]},symbol:{active:["circle","roundRect","diamond"],inactive:["none"]},symbolSize:{active:[10,50],inactive:[0,0]}},sF=sD.mapVisual,lF=sD.eachVisual,uF=Y,hF=E,cF=Hr,pF=Fr,dF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.stateList=["inRange","outOfRange"],n.replacableOptionKeys=["inRange","outOfRange","target","controller","color"],n.layoutMode={type:"box",ignoreSize:!0},n.dataBound=[-1/0,1/0],n.targetVisuals={},n.controllerVisuals={},n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n)},e.prototype.optionUpdated=function(t,e){var n=this.option;!e&&sV(n,t,this.replacableOptionKeys),this.textStyleModel=this.getModel("textStyle"),this.resetItemSize(),this.completeVisualOption()},e.prototype.resetVisual=function(t){var e=this.stateList;t=W(t,this),this.controllerVisuals=aV(this.option.controller,e,t),this.targetVisuals=aV(this.option.target,e,t)},e.prototype.getItemSymbol=function(){return null},e.prototype.getTargetSeriesIndices=function(){var t=this.option.seriesIndex,e=[];return null==t||"all"===t?this.ecModel.eachSeries((function(t,n){e.push(n)})):e=yo(t),e},e.prototype.eachTargetSeries=function(t,e){E(this.getTargetSeriesIndices(),(function(n){var i=this.ecModel.getSeriesByIndex(n);i&&t.call(e,i)}),this)},e.prototype.isTargetSeries=function(t){var e=!1;return this.eachTargetSeries((function(n){n===t&&(e=!0)})),e},e.prototype.formatValueText=function(t,e,n){var i,r=this.option,o=r.precision,a=this.dataBound,s=r.formatter;n=n||["<",">"],Y(t)&&(t=t.slice(),i=!0);var l=e?t:i?[u(t[0]),u(t[1])]:u(t);return X(s)?s.replace("{value}",i?l[0]:l).replace("{value2}",i?l[1]:l):U(s)?i?s(t[0],t[1]):s(t):i?t[0]===a[0]?n[0]+" "+l[1]:t[1]===a[1]?n[1]+" "+l[0]:l[0]+" - "+l[1]:l;function u(t){return t===a[0]?"min":t===a[1]?"max":(+t).toFixed(Math.min(o,20))}},e.prototype.resetExtent=function(){var t=this.option,e=cF([t.min,t.max]);this._dataExtent=e},e.prototype.getDataDimensionIndex=function(t){var e=this.option.dimension;if(null!=e)return t.getDimensionIndex(e);for(var n=t.dimensions,i=n.length-1;i>=0;i--){var r=n[i],o=t.getDimensionInfo(r);if(!o.isCalculationCoord)return o.storeDimIndex}},e.prototype.getExtent=function(){return this._dataExtent.slice()},e.prototype.completeVisualOption=function(){var t=this.ecModel,e=this.option,n={inRange:e.inRange,outOfRange:e.outOfRange},i=e.target||(e.target={}),r=e.controller||(e.controller={});C(i,n),C(r,n);var o=this.isCategory();function a(n){uF(e.color)&&!n.inRange&&(n.inRange={color:e.color.slice().reverse()}),n.inRange=n.inRange||{color:t.get("gradientColor")}}a.call(this,i),a.call(this,r),function(t,e,n){var i=t[e],r=t[n];i&&!r&&(r=t[n]={},hF(i,(function(t,e){if(sD.isValidType(e)){var n=oF(e,"inactive",o);null!=n&&(r[e]=n,"color"!==e||r.hasOwnProperty("opacity")||r.hasOwnProperty("colorAlpha")||(r.opacity=[0,0]))}})))}.call(this,i,"inRange","outOfRange"),function(t){var e=(t.inRange||{}).symbol||(t.outOfRange||{}).symbol,n=(t.inRange||{}).symbolSize||(t.outOfRange||{}).symbolSize,i=this.get("inactiveColor"),r=this.getItemSymbol()||"roundRect";hF(this.stateList,(function(a){var s=this.itemSize,l=t[a];l||(l=t[a]={color:o?i:[i]}),null==l.symbol&&(l.symbol=e&&T(e)||(o?r:[r])),null==l.symbolSize&&(l.symbolSize=n&&T(n)||(o?s[0]:[s[0],s[0]])),l.symbol=sF(l.symbol,(function(t){return"none"===t?r:t}));var u=l.symbolSize;if(null!=u){var h=-1/0;lF(u,(function(t){t>h&&(h=t)})),l.symbolSize=sF(u,(function(t){return pF(t,[0,h],[0,s[0]],!0)}))}}),this)}.call(this,r)},e.prototype.resetItemSize=function(){this.itemSize=[parseFloat(this.get("itemWidth")),parseFloat(this.get("itemHeight"))]},e.prototype.isCategory=function(){return!!this.option.categories},e.prototype.setSelected=function(t){},e.prototype.getSelected=function(){return null},e.prototype.getValueState=function(t){return null},e.prototype.getVisualMeta=function(t){return null},e.type="visualMap",e.dependencies=["series"],e.defaultOption={show:!0,z:4,seriesIndex:"all",min:0,max:200,left:0,right:null,top:null,bottom:0,itemWidth:null,itemHeight:null,inverse:!1,orient:"vertical",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",contentColor:"#5793f3",inactiveColor:"#aaa",borderWidth:0,padding:5,textGap:10,precision:0,textStyle:{color:"#333"}},e}(Ap),fF=[20,140],gF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent(),this.resetVisual((function(t){t.mappingMethod="linear",t.dataExtent=this.getExtent()})),this._resetRange()},e.prototype.resetItemSize=function(){t.prototype.resetItemSize.apply(this,arguments);var e=this.itemSize;(null==e[0]||isNaN(e[0]))&&(e[0]=fF[0]),(null==e[1]||isNaN(e[1]))&&(e[1]=fF[1])},e.prototype._resetRange=function(){var t=this.getExtent(),e=this.option.range;!e||e.auto?(t.auto=1,this.option.range=t):Y(e)&&(e[0]>e[1]&&e.reverse(),e[0]=Math.max(e[0],t[0]),e[1]=Math.min(e[1],t[1]))},e.prototype.completeVisualOption=function(){t.prototype.completeVisualOption.apply(this,arguments),E(this.stateList,(function(t){var e=this.option.controller[t].symbolSize;e&&e[0]!==e[1]&&(e[0]=e[1]/3)}),this)},e.prototype.setSelected=function(t){this.option.range=t.slice(),this._resetRange()},e.prototype.getSelected=function(){var t=this.getExtent(),e=Hr((this.get("range")||[]).slice());return e[0]>t[1]&&(e[0]=t[1]),e[1]>t[1]&&(e[1]=t[1]),e[0]=n[1]||t<=e[1])?"inRange":"outOfRange"},e.prototype.findTargetDataIndices=function(t){var e=[];return this.eachTargetSeries((function(n){var i=[],r=n.getData();r.each(this.getDataDimensionIndex(r),(function(e,n){t[0]<=e&&e<=t[1]&&i.push(n)}),this),e.push({seriesId:n.id,dataIndex:i})}),this),e},e.prototype.getVisualMeta=function(t){var e=yF(this,"outOfRange",this.getExtent()),n=yF(this,"inRange",this.option.range.slice()),i=[];function r(e,n){i.push({value:e,color:t(e,n)})}for(var o=0,a=0,s=n.length,l=e.length;at[1])break;n.push({color:this.getControllerVisual(o,"color",e),offset:r/100})}return n.push({color:this.getControllerVisual(t[1],"color",e),offset:1}),n},e.prototype._createBarPoints=function(t,e){var n=this.visualMapModel.itemSize;return[[n[0]-e[0],t[0]],[n[0],t[0]],[n[0],t[1]],[n[0]-e[1],t[1]]]},e.prototype._createBarGroup=function(t){var e=this._orient,n=this.visualMapModel.get("inverse");return new Pr("horizontal"!==e||n?"horizontal"===e&&n?{scaleX:"bottom"===t?-1:1,rotation:-Math.PI/2}:"vertical"!==e||n?{scaleX:"left"===t?1:-1}:{scaleX:"left"===t?1:-1,scaleY:-1}:{scaleX:"bottom"===t?1:-1,rotation:Math.PI/2})},e.prototype._updateHandle=function(t,e){if(this._useHandle){var n=this._shapes,i=this.visualMapModel,r=n.handleThumbs,o=n.handleLabels,a=i.itemSize,s=i.getExtent();wF([0,1],(function(l){var u=r[l];u.setStyle("fill",e.handlesColor[l]),u.y=t[l];var h=bF(t[l],[0,a[1]],s,!0),c=this.getControllerVisual(h,"symbolSize");u.scaleX=u.scaleY=c/a[0],u.x=a[0]-c/2;var p=Ph(n.handleLabelPoints[l],Lh(u,this.group));o[l].setStyle({x:p[0],y:p[1],text:i.formatValueText(this._dataInterval[l]),verticalAlign:"middle",align:"vertical"===this._orient?this._applyTransform("left",n.mainGroup):"center"})}),this)}},e.prototype._showIndicator=function(t,e,n,i){var r=this.visualMapModel,o=r.getExtent(),a=r.itemSize,s=[0,a[1]],l=this._shapes,u=l.indicator;if(u){u.attr("invisible",!1);var h=this.getControllerVisual(t,"color",{convertOpacityToAlpha:!0}),c=this.getControllerVisual(t,"symbolSize"),p=bF(t,o,s,!0),d=a[0]-c/2,f={x:u.x,y:u.y};u.y=p,u.x=d;var g=Ph(l.indicatorLabelPoint,Lh(u,this.group)),y=l.indicatorLabel;y.attr("invisible",!1);var v=this._applyTransform("left",l.mainGroup),m="horizontal"===this._orient;y.setStyle({text:(n||"")+r.formatValueText(e),verticalAlign:m?v:"middle",align:m?"center":v});var x={x:d,y:p,style:{fill:h}},_={style:{x:g[0],y:g[1]}};if(r.ecModel.isAnimationEnabled()&&!this._firstShowIndicator){var b={duration:100,easing:"cubicInOut",additive:!0};u.x=f.x,u.y=f.y,u.animateTo(x,b),y.animateTo(_,b)}else u.attr(x),y.attr(_);this._firstShowIndicator=!1;var w=this._shapes.handleLabels;if(w)for(var S=0;Sr[1]&&(u[1]=1/0),e&&(u[0]===-1/0?this._showIndicator(l,u[1],"< ",a):u[1]===1/0?this._showIndicator(l,u[0],"> ",a):this._showIndicator(l,l,"≈ ",a));var h=this._hoverLinkDataIndices,c=[];(e||CF(n))&&(c=this._hoverLinkDataIndices=n.findTargetDataIndices(u));var p=function(t,e){var n={},i={};return r(t||[],n),r(e||[],i,n),[o(n),o(i)];function r(t,e,n){for(var i=0,r=t.length;i=0&&(r.dimension=o,i.push(r))}})),t.getData().setVisual("visualMeta",i)}}];function PF(t,e,n,i){for(var r=e.targetVisuals[i],o=sD.prepareVisualTypes(r),a={color:my(t.getData(),"color")},s=0,l=o.length;s0:t.splitNumber>0)&&!t.calculable?"piecewise":"continuous"})),t.registerAction(AF,kF),E(LF,(function(e){t.registerVisual(t.PRIORITY.VISUAL.COMPONENT,e)})),t.registerPreprocessor(RF))}function VF(t){t.registerComponentModel(gF),t.registerComponentView(IF),zF(t)}var BF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._pieceList=[],n}return n(e,t),e.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent();var i=this._mode=this._determineMode();this._pieceList=[],FF[this._mode].call(this,this._pieceList),this._resetSelected(e,n);var r=this.option.categories;this.resetVisual((function(t,e){"categories"===i?(t.mappingMethod="category",t.categories=T(r)):(t.dataExtent=this.getExtent(),t.mappingMethod="piecewise",t.pieceList=z(this._pieceList,(function(t){return t=T(t),"inRange"!==e&&(t.visual=null),t})))}))},e.prototype.completeVisualOption=function(){var e=this.option,n={},i=sD.listVisualTypes(),r=this.isCategory();function o(t,e,n){return t&&t[e]&&t[e].hasOwnProperty(n)}E(e.pieces,(function(t){E(i,(function(e){t.hasOwnProperty(e)&&(n[e]=1)}))})),E(n,(function(t,n){var i=!1;E(this.stateList,(function(t){i=i||o(e,t,n)||o(e.target,t,n)}),this),!i&&E(this.stateList,(function(t){(e[t]||(e[t]={}))[n]=oF(n,"inRange"===t?"active":"inactive",r)}))}),this),t.prototype.completeVisualOption.apply(this,arguments)},e.prototype._resetSelected=function(t,e){var n=this.option,i=this._pieceList,r=(e?n:t).selected||{};if(n.selected=r,E(i,(function(t,e){var n=this.getSelectedMapKey(t);r.hasOwnProperty(n)||(r[n]=!0)}),this),"single"===n.selectedMode){var o=!1;E(i,(function(t,e){var n=this.getSelectedMapKey(t);r[n]&&(o?r[n]=!1:o=!0)}),this)}},e.prototype.getItemSymbol=function(){return this.get("itemSymbol")},e.prototype.getSelectedMapKey=function(t){return"categories"===this._mode?t.value+"":t.index+""},e.prototype.getPieceList=function(){return this._pieceList},e.prototype._determineMode=function(){var t=this.option;return t.pieces&&t.pieces.length>0?"pieces":this.option.categories?"categories":"splitNumber"},e.prototype.setSelected=function(t){this.option.selected=T(t)},e.prototype.getValueState=function(t){var e=sD.findPieceIndex(t,this._pieceList);return null!=e&&this.option.selected[this.getSelectedMapKey(this._pieceList[e])]?"inRange":"outOfRange"},e.prototype.findTargetDataIndices=function(t){var e=[],n=this._pieceList;return this.eachTargetSeries((function(i){var r=[],o=i.getData();o.each(this.getDataDimensionIndex(o),(function(e,i){sD.findPieceIndex(e,n)===t&&r.push(i)}),this),e.push({seriesId:i.id,dataIndex:r})}),this),e},e.prototype.getRepresentValue=function(t){var e;if(this.isCategory())e=t.value;else if(null!=t.value)e=t.value;else{var n=t.interval||[];e=n[0]===-1/0&&n[1]===1/0?0:(n[0]+n[1])/2}return e},e.prototype.getVisualMeta=function(t){if(!this.isCategory()){var e=[],n=["",""],i=this,r=this._pieceList.slice();if(r.length){var o=r[0].interval[0];o!==-1/0&&r.unshift({interval:[-1/0,o]}),(o=r[r.length-1].interval[1])!==1/0&&r.push({interval:[o,1/0]})}else r.push({interval:[-1/0,1/0]});var a=-1/0;return E(r,(function(t){var e=t.interval;e&&(e[0]>a&&s([a,e[0]],"outOfRange"),s(e.slice()),a=e[1])}),this),{stops:e,outerColors:n}}function s(r,o){var a=i.getRepresentValue({interval:r});o||(o=i.getValueState(a));var s=t(a,o);r[0]===-1/0?n[0]=s:r[1]===1/0?n[1]=s:e.push({value:r[0],color:s},{value:r[1],color:s})}},e.type="visualMap.piecewise",e.defaultOption=wc(dF.defaultOption,{selected:null,minOpen:!1,maxOpen:!1,align:"auto",itemWidth:20,itemHeight:14,itemSymbol:"roundRect",pieces:null,categories:null,splitNumber:5,selectedMode:"multiple",itemGap:10,hoverLink:!0}),e}(dF),FF={splitNumber:function(t){var e=this.option,n=Math.min(e.precision,20),i=this.getExtent(),r=e.splitNumber;r=Math.max(parseInt(r,10),1),e.splitNumber=r;for(var o=(i[1]-i[0])/r;+o.toFixed(n)!==o&&n<5;)n++;e.precision=n,o=+o.toFixed(n),e.minOpen&&t.push({interval:[-1/0,i[0]],close:[0,0]});for(var a=0,s=i[0];a","≥"][e[0]]];t.text=t.text||this.formatValueText(null!=t.value?t.value:t.interval,!1,n)}),this)}};function GF(t,e){var n=t.inverse;("vertical"===t.orient?!n:n)&&e.reverse()}var WF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.doRender=function(){var t=this.group;t.removeAll();var e=this.visualMapModel,n=e.get("textGap"),i=e.textStyleModel,r=i.getFont(),o=i.getTextColor(),a=this._getItemAlign(),s=e.itemSize,l=this._getViewData(),u=l.endsText,h=it(e.get("showLabel",!0),!u);u&&this._renderEndsText(t,u[0],s,h,a),E(l.viewPieceList,(function(i){var l=i.piece,u=new Pr;u.onclick=W(this._onItemClick,this,l),this._enableHoverLink(u,i.indexInModelPieceList);var c=e.getRepresentValue(l);if(this._createItemSymbol(u,c,[0,0,s[0],s[1]]),h){var p=this.visualMapModel.getValueState(c);u.add(new Ns({style:{x:"right"===a?-n:s[0]+n,y:s[1]/2,text:l.text,verticalAlign:"middle",align:a,font:r,fill:o,opacity:"outOfRange"===p?.5:1}}))}t.add(u)}),this),u&&this._renderEndsText(t,u[1],s,h,a),bp(e.get("orient"),t,e.get("itemGap")),this.renderBackground(t),this.positionGroup(t)},e.prototype._enableHoverLink=function(t,e){var n=this;t.on("mouseover",(function(){return i("highlight")})).on("mouseout",(function(){return i("downplay")}));var i=function(t){var i=n.visualMapModel;i.option.hoverLink&&n.api.dispatchAction({type:t,batch:_F(i.findTargetDataIndices(e),i)})}},e.prototype._getItemAlign=function(){var t=this.visualMapModel,e=t.option;if("vertical"===e.orient)return xF(t,this.api,t.itemSize);var n=e.align;return n&&"auto"!==n||(n="left"),n},e.prototype._renderEndsText=function(t,e,n,i,r){if(e){var o=new Pr,a=this.visualMapModel.textStyleModel;o.add(new Ns({style:$h(a,{x:i?"right"===r?n[0]:0:n[0]/2,y:n[1]/2,verticalAlign:"middle",align:i?r:"center",text:e})})),t.add(o)}},e.prototype._getViewData=function(){var t=this.visualMapModel,e=z(t.getPieceList(),(function(t,e){return{piece:t,indexInModelPieceList:e}})),n=t.get("text"),i=t.get("orient"),r=t.get("inverse");return("horizontal"===i?r:!r)?e.reverse():n&&(n=n.slice().reverse()),{viewPieceList:e,endsText:n}},e.prototype._createItemSymbol=function(t,e,n){t.add(Ry(this.getControllerVisual(e,"symbol"),n[0],n[1],n[2],n[3],this.getControllerVisual(e,"color")))},e.prototype._onItemClick=function(t){var e=this.visualMapModel,n=e.option,i=n.selectedMode;if(i){var r=T(n.selected),o=e.getSelectedMapKey(t);"single"===i||!0===i?(r[o]=!0,E(r,(function(t,e){r[e]=e===o}))):r[o]=!r[o],this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:r})}},e.type="visualMap.piecewise",e}(vF);function HF(t){t.registerComponentModel(BF),t.registerComponentView(WF),zF(t)}var YF={label:{enabled:!0},decal:{show:!1}},UF=Do(),XF={};function ZF(t,e){var n=t.getModel("aria");if(n.get("enabled")){var i=T(YF);C(i.label,t.getLocaleModel().get("aria"),!1),C(n.option,i,!1),function(){if(n.getModel("decal").get("show")){var e=ft();t.eachSeries((function(t){if(!t.isColorBySeries()){var n=e.get(t.type);n||(n={},e.set(t.type,n)),UF(t).scope=n}})),t.eachRawSeries((function(e){if(!t.isSeriesFiltered(e))if(U(e.enableAriaDecal))e.enableAriaDecal();else{var n=e.getData();if(e.isColorBySeries()){var i=rd(e.ecModel,e.name,XF,t.getSeriesCount()),r=n.getVisual("decal");n.setVisual("decal",u(r,i))}else{var o=e.getRawData(),a={},s=UF(e).scope;n.each((function(t){var e=n.getRawIndex(t);a[e]=t}));var l=o.count();o.each((function(t){var i=a[t],r=o.getName(t)||t+"",h=rd(e.ecModel,r,s,l),c=n.getItemVisual(i,"decal");n.setItemVisual(i,"decal",u(c,h))}))}}function u(t,e){var n=t?A(A({},e),t):e;return n.dirty=!0,n}}))}}(),function(){var i=t.getLocaleModel().get("aria"),o=n.getModel("label");if(o.option=k(o.option,i),!o.get("enabled"))return;var a=e.getZr().dom;if(o.get("description"))return void a.setAttribute("aria-label",o.get("description"));var s,l=t.getSeriesCount(),u=o.get(["data","maxCount"])||10,h=o.get(["series","maxCount"])||10,c=Math.min(l,h);if(l<1)return;var p=function(){var e=t.get("title");e&&e.length&&(e=e[0]);return e&&e.text}();if(p){var d=o.get(["general","withTitle"]);s=r(d,{title:p})}else s=o.get(["general","withoutTitle"]);var f=[],g=l>1?o.get(["series","multiple","prefix"]):o.get(["series","single","prefix"]);s+=r(g,{seriesCount:l}),t.eachSeries((function(e,n){if(n1?o.get(["series","multiple",a]):o.get(["series","single",a]),{seriesId:e.seriesIndex,seriesName:e.get("name"),seriesType:(x=e.subType,t.getLocaleModel().get(["series","typeNames"])[x]||"自定义图")});var s=e.getData();if(s.count()>u)i+=r(o.get(["data","partialData"]),{displayCnt:u});else i+=o.get(["data","allData"]);for(var h=o.get(["data","separator","middle"]),p=o.get(["data","separator","end"]),d=[],g=0;g":"gt",">=":"gte","=":"eq","!=":"ne","<>":"ne"},KF=function(){function t(t){if(null==(this._condVal=X(t)?new RegExp(t):et(t)?t:null)){var e="";0,co(e)}}return t.prototype.evaluate=function(t){var e=typeof t;return X(e)?this._condVal.test(t):!!j(e)&&this._condVal.test(t+"")},t}(),$F=function(){function t(){}return t.prototype.evaluate=function(){return this.value},t}(),JF=function(){function t(){}return t.prototype.evaluate=function(){for(var t=this.children,e=0;e2&&l.push(e),e=[t,n]}function f(t,n,i,r){cG(t,i)&&cG(n,r)||e.push(t,n,i,r,i,r)}function g(t,n,i,r,o,a){var s=Math.abs(n-t),l=4*Math.tan(s/4)/3,u=nM:C2&&l.push(e),l}function dG(t,e,n,i,r,o,a,s,l,u){if(cG(t,n)&&cG(e,i)&&cG(r,a)&&cG(o,s))l.push(a,s);else{var h=2/u,c=h*h,p=a-t,d=s-e,f=Math.sqrt(p*p+d*d);p/=f,d/=f;var g=n-t,y=i-e,v=r-a,m=o-s,x=g*g+y*y,_=v*v+m*m;if(x=0&&_-w*w=0)l.push(a,s);else{var S=[],M=[];xn(t,n,r,a,.5,S),xn(e,i,o,s,.5,M),dG(S[0],M[0],S[1],M[1],S[2],M[2],S[3],M[3],l,u),dG(S[4],M[4],S[5],M[5],S[6],M[6],S[7],M[7],l,u)}}}}function fG(t,e,n){var i=t[e],r=t[1-e],o=Math.abs(i/r),a=Math.ceil(Math.sqrt(o*n)),s=Math.floor(n/a);0===s&&(s=1,a=n);for(var l=[],u=0;u0)for(u=0;uMath.abs(u),c=fG([l,u],h?0:1,e),p=(h?s:u)/c.length,d=0;d1?null:new Ie(d*l+t,d*u+e)}function mG(t,e,n){var i=new Ie;Ie.sub(i,n,e),i.normalize();var r=new Ie;return Ie.sub(r,t,e),r.dot(i)}function xG(t,e){var n=t[t.length-1];n&&n[0]===e[0]&&n[1]===e[1]||t.push(e)}function _G(t){var e=t.points,n=[],i=[];Aa(e,n,i);var r=new Re(n[0],n[1],i[0]-n[0],i[1]-n[1]),o=r.width,a=r.height,s=r.x,l=r.y,u=new Ie,h=new Ie;return o>a?(u.x=h.x=s+o/2,u.y=l,h.y=l+a):(u.y=h.y=l+a/2,u.x=s,h.x=s+o),function(t,e,n){for(var i=t.length,r=[],o=0;or,a=fG([i,r],o?0:1,e),s=o?"width":"height",l=o?"height":"width",u=o?"x":"y",h=o?"y":"x",c=t[s]/a.length,p=0;p0)for(var b=i/n,w=-i/2;w<=i/2;w+=b){var S=Math.sin(w),M=Math.cos(w),I=0;for(x=0;x0;l/=2){var u=0,h=0;(t&l)>0&&(u=1),(e&l)>0&&(h=1),s+=l*l*(3*u^h),0===h&&(1===u&&(t=l-1-t,e=l-1-e),a=t,t=e,e=a)}return s}function zG(t){var e=1/0,n=1/0,i=-1/0,r=-1/0,o=z(t,(function(t){var o=t.getBoundingRect(),a=t.getComputedTransform(),s=o.x+o.width/2+(a?a[4]:0),l=o.y+o.height/2+(a?a[5]:0);return e=Math.min(s,e),n=Math.min(l,n),i=Math.max(s,i),r=Math.max(l,r),[s,l]}));return z(o,(function(o,a){return{cp:o,z:EG(o[0],o[1],e,n,i,r),path:t[a]}})).sort((function(t,e){return t.z-e.z})).map((function(t){return t.path}))}function VG(t){return SG(t.path,t.count)}function BG(t){return Y(t[0])}function FG(t,e){for(var n=[],i=t.length,r=0;r=0;r--)if(!n[r].many.length){var l=n[s].many;if(l.length<=1){if(!s)return n;s=0}o=l.length;var u=Math.ceil(o/2);n[r].many=l.slice(u,o),n[s].many=l.slice(0,u),s++}return n}var GG={clone:function(t){for(var e=[],n=1-Math.pow(1-t.path.style.opacity,1/t.count),i=0;i0){var s,l,u=i.getModel("universalTransition").get("delay"),h=Object.assign({setToFinal:!0},a);BG(t)&&(s=t,l=e),BG(e)&&(s=e,l=t);for(var c=s?s===t:t.length>e.length,p=s?FG(l,s):FG(c?e:t,[c?t:e]),d=0,f=0;f1e4))for(var i=n.getIndices(),r=function(t){for(var e=t.dimensions,n=0;n0&&i.group.traverse((function(t){t instanceof _s&&!t.animators.length&&t.animateFrom({style:{opacity:0}},r)}))}))}function $G(t){var e=t.getModel("universalTransition").get("seriesKey");return e||t.id}function JG(t){return Y(t)?t.sort().join(","):t}function QG(t){if(t.hostModel)return t.hostModel.getModel("universalTransition").get("divideShape")}function tW(t,e){for(var n=0;n=0&&r.push({data:e.oldData[n],divide:QG(e.oldData[n]),dim:t.dimension})})),E(yo(t.to),(function(t){var e=tW(n.updatedSeries,t);if(e>=0){var i=n.updatedSeries[e].getData();o.push({data:i,divide:QG(i),dim:t.dimension})}})),r.length>0&&o.length>0&&KG(r,o,i)}(t,i,n,e)}));else{var o=function(t,e){var n=ft(),i=ft(),r=ft();return E(t.oldSeries,(function(e,n){var o=t.oldData[n],a=$G(e),s=JG(a);i.set(s,o),Y(a)&&E(a,(function(t){r.set(t,{data:o,key:s})}))})),E(e.updatedSeries,(function(t){if(t.isUniversalTransitionEnabled()&&t.isAnimationEnabled()){var e=t.getData(),o=$G(t),a=JG(o),s=i.get(a);if(s)n.set(a,{oldSeries:[{divide:QG(s),data:s}],newSeries:[{divide:QG(e),data:e}]});else if(Y(o)){var l=[];E(o,(function(t){var e=i.get(t);e&&l.push({divide:QG(e),data:e})})),l.length&&n.set(a,{oldSeries:l,newSeries:[{data:e,divide:QG(e)}]})}else{var u=r.get(o);if(u){var h=n.get(u.key);h||(h={oldSeries:[{data:u.data,divide:QG(u.data)}],newSeries:[]},n.set(u.key,h)),h.newSeries.push({data:e,divide:QG(e)})}}}})),n}(i,n);E(o.keys(),(function(t){var n=o.get(t);KG(n.oldSeries,n.newSeries,e)}))}E(n.updatedSeries,(function(t){t.__universalTransitionEnabled&&(t.__universalTransitionEnabled=!1)}))}for(var a=t.getSeries(),s=i.oldSeries=[],l=i.oldData=[],u=0;u + + + + + + + + + {{@headStyle}} + + + +
+
+
ID: {{uid}}
+

充值统计

+ +
+
+
数据总览
+
+ {{each topData.slice(0,4) data}} +
+
{{data.value}}
+
{{data.title}}
+
+ {{/each}} +
+
+ {{each topData.slice(4,8) data}} +
+
{{data.value}}
+
{{data.title}}
+
+ {{/each}} +
+
+ {{each topData.slice(8,12) data}} +
+
{{data.value}}
+
{{data.title}}
+
+ {{/each}} +
+
+
+
月份统计
+
+
+
+
详细统计
+
+
+ +
+ + + + + + + \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/roleBag/roleBag.css b/src/Yunzai-Bot/plugins/genshin/resources/html/roleBag/roleBag.css new file mode 100644 index 0000000000000000000000000000000000000000..8506b64c149ee9284ec457eb37dc0017a0da4e65 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/roleBag/roleBag.css @@ -0,0 +1,242 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + font-size: 12px; + color: #1e1f20; + max-width: 660px; + font-family: PingFangSC-Medium, PingFang SC, sans-serif; + transform: scale(1.5); + transform-origin: 0 0; +} +.list8{ + max-width: 450px; +} +.container { + float: left; + min-width: 210px; + padding: 10px; + background-color: #ececec; +} +.main_box { + border-radius: 15px; + padding: 10px 10px 0 0; + background: #f5f5f5; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); +} +.base_info { + /*width: 200px;*/ + margin: 0 0 10px 10px; + font-size: 16px; + position: relative; +} +.uid { + font-family: tttgbnumber; + margin-left: 17px; +} +.uid:before { + content: " "; + position: absolute; + width: 5px; + height: 24px; + border-radius: 1px; + left: 0px; + top: 0px; + background: #d3bc8d; +} +.item_box { + display: flex; + flex-wrap: wrap; +} +.item { + margin: 0px 0 10px 10px; + border-radius: 7px; + overflow: hidden; + box-shadow: 0 2px 6px 0 rgb(132 93 90 / 30%); + width: 95px; + background: #e9e5dc; +} +.role_box { + overflow: hidden; + height: 95px; + width: 95px; + position: relative; + background: #e9e5dc; +} +.role_box .role_img { + width: 100%; + overflow: hidden; + background-size: 100%; + background-repeat: no-repeat; + position: absolute; + top: 0; + /*filter: contrast(95%);*/ +} +.bg105 { + background-image: url(../../img/other/bg105.png); + width: 100%; + height: 95px; + background-size: 100%; + background-repeat: no-repeat; +} +.bg5 { + background-image: url(../../img/other/bg5.png); + width: 100%; + height: 95px; + /*filter: brightness(1.1);*/ + background-size: 100%; + background-repeat: no-repeat; +} +.bg4 { + width: 100%; + height: 95px; + background-image: url(../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} +.item .text_box{ + font-size: 12px; + background: #e9e5dc; + padding: 5px 0px 4px 0px; + font-family: tttgbnumber; + display: flex; + align-items: flex-start; +} +.item .text_box .weapon_box{ + flex: 0 0 34px; + width: 34px; + height: 34px; + padding: 2px; + border-radius: 5px; + background: rgba(0,0,0,.6); + overflow: hidden; + margin-left: 3px; +} +.item .text_box .weapon_boder{ + border: 1px solid #d3bc8d; + border-radius: 5px; + width: 30px; + height: 30px; + overflow: hidden; +} +.item .text_box .weapon_img{ + width: 100%; + transform: scale(1.2, 1.2); + +} +.item .text_box .weapon_name_box{ + margin-left: 3px; + white-space: nowrap; +} +.item .text_box .weapon_name_box .weapon_level{ + margin-top: 2px; +} +.item .text_box .weapon_affix{ + border-radius: 2px; + background-color: #ff5722; + padding: 2px 3px; + color:#fff; + display: inline-block; + transform: scale(0.8); + transform-origin: 12px 7px; +} +.role_box .fill_img { + position: absolute; + width: 15px; + right: 0; + bottom: 17px; +} +.role_box .desc { + font-weight: 500; + text-align: center; + line-height: 18px; + position: absolute; + bottom: 0; + /* background: #e9e5dc; */ + background: rgba(0,0,0,.6); + color: #ececec; + width: 100%; + height: 18px; + font-size: 14px; + font-family: tttgbnumber; +} +.role_name { + /* overflow: hidden; */ + white-space: nowrap; + margin-top: 5px; + font-weight: 500; + text-align: center; + font-size: 14px; + /*margin-top: 5px;*/ +} +.role_box .life { + position: absolute; + top: 0px; + right: 0px; + z-index: 9; + font-size: 16px; + text-align: center; + color: #fff; + border-radius: 2px; + padding: 1px 3px; + border-radius: 3px; + font-family: "tttgbnumber"; +} +.life1 { + background-color: #62a8ea; +} +.life2 { + background-color: #62a8ea; +} +.life3 { + background-color: #45b97c; +} +.life4 { + background-color: #45b97c; +} +.life5 { + background-color: #ff5722; +} +.life6 { + background-color: #ff5722; +} +.base_info span { + margin-left: 5px; +} +.avatar { + height: 24px; + width: 24px; + background-color: #ffb285; + vertical-align: -5px; + margin-left: 2px; + margin-right: 3px; + border: 1px solid #ffb285; + border-radius: 100%; +} +.heart { + background-image: url(./心形.png); + background-size: 100%; + background-repeat: no-repeat; + background-position: center; + z-index: 10; + color: #fff; + font-family: tttgbnumber; + text-align: center; + font-size: 12px; + margin-left: 5px; + display: inline-block; + width: 15px; +} +.fetter { + display: inline-block; + transform: scale(0.8); +} diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/roleBag/roleBag.html b/src/Yunzai-Bot/plugins/genshin/resources/html/roleBag/roleBag.html new file mode 100644 index 0000000000000000000000000000000000000000..0725e41a35a85ce5c2c8533db51758c851b14caf --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/roleBag/roleBag.html @@ -0,0 +1,55 @@ + + + + + + + + + + + + + +
+
+
+
ID: {{uid}}
+
+
+ {{each list val}} +
+
+ {{ if val.actived_constellation_num>0}} + {{val.actived_constellation_num}}命 + {{/if}} +
+ +
Lv.{{val.level}}
+
+
+
+
+ +
+
+
+
{{val.weapon.showName}}
+
+ Lv.{{val.weapon.level}}{{ if val.weapon.affix_level>1}}{{val.weapon.affix_level}}{{/if}} +
+
+
+
+ {{/each}} +
+
+
+ + + diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/roleCard/roleCard.css b/src/Yunzai-Bot/plugins/genshin/resources/html/roleCard/roleCard.css new file mode 100644 index 0000000000000000000000000000000000000000..0f5bb44227ae3408b8fb54e5f82ea6d4261d320c --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/roleCard/roleCard.css @@ -0,0 +1,290 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + font-size: 16px; + color: #1e1f20; + font-family: "tttgbnumber"; + transform: scale(1.3); + transform-origin: 0 0; +} +.container { + width: 840px; + height: 470px; + display: flex; + position: relative; +} +.info-box { + width: 400px; + padding: 10px 10px 10px 20px; +} +.list-box { + width: 450px; +} +.list-box .list { + display: flex; + flex-wrap: wrap; + justify-content: center; + padding: 0px 0px 10px 0px; + margin: 4px 10px 0px 0px; +} +.list-box .list .item { + width: 90px; + height: 180px; + margin: 20px 7px 15px 7px; +} +.item .item-bg { + background-color: #fff; + width: 100%; + height: 100%; + padding: 6px 0 8px 0; + border-radius: 8px; + position: relative; + filter: drop-shadow(3px 9px 2px #0000004d); +} +.item .item-bg .role-box { + width: 100%; + height: 100%; + position: relative; + overflow: hidden; + border-radius: 10px; + border-bottom-left-radius: 5px; + /* border: 0px; */ +} +.item .item-bg .role { + width: 100%; + position: absolute; + top: -40px; +} + +.item .item-bg .role-lv { + width: 58px; + background-color: #fff; + padding-left: 6px; + position: relative; + border-bottom-left-radius: 5px; + font-weight: 600; + color: #1e1f20; + border-bottom-right-radius: 2px; + font-size: 18px; +} +.item .item-bg .role-lv .text { + position: relative; + z-index: 2; + height: 23px; +} +.item .item-bg .role-lv .text-bg { + width: 40px; + height: 23px; + top: 0px; + background-color: #fff; + position: absolute; + right: -6px; + transform: skewX(341deg); + z-index: 1; + border-radius: 4px; +} +.item .item-bg .role-life { + width: 34px; + /* background-color: #ff5722; */ + color: #fff; + position: absolute; + z-index: 1; + bottom: 14px; + font-size: 18px; + line-height: 1; + padding: 1px 0 1px 4px; + border-bottom-right-radius: 2px; +} +.item .item-bg .role-life::after { + display: block; + content: " "; + width: 28px; + height: 20px; + top: 0px; + /* background-color: #ff5722; */ + position: absolute; + right: -6px; + transform: skewX(341deg); + z-index: -1; + border-top-right-radius: 8px; + border-bottom-right-radius: 4px; +} +.冰 { + background-color: #b2d9e7; + background-image: linear-gradient(180deg, #b2d9e7 0%, #b2d9e7 100%); +} +.风 { + background-color: #cfe1e2; + background-image: linear-gradient(180deg, #cfe1e2 0%, #70b2b4 100%); +} +.火 { + background-color: #fdbfc2; + background-image: linear-gradient(180deg, #fdbfc2 0%, #d96469 100%); +} +.水 { + background-color: #d1e8f0; + background-image: linear-gradient(180deg, #d1e8f0 0%, #73a9c6 100%); +} +.雷 { + background-color: #e1ddef; + background-image: linear-gradient(180deg, #e1ddef 0%, #7a6da7 100%); +} +.岩 { + background-color: #f4e3cb; + background-image: linear-gradient(180deg, #f4e3cb 0%, #d8b37f 100%); +} +.life1 { + background-color: #62a8ea; +} +.life1::after { + background-color: #62a8ea; +} +.life2 { + background-color: #62a8ea; +} +.life2::after { + background-color: #62a8ea; +} +.life3 { + background-color: #45b97c; +} +.life3::after { + background-color: #45b97c; +} +.life4 { + background-color: #45b97c; +} +.life4::after { + background-color: #45b97c; +} +.life5 { + background-color: #ff5722; +} +.life5::after { + background-color: #ff5722; +} +.life6 { + background-color: #ff5722; +} +.life6::after { + background-color: #ff5722; +} +.head-box { + position: relative; + height: 184px; +} +.head-box .name-card { + width: 378px; + position: absolute; + top: -2px; + left: -1px; +} +.head-box .name-card img { + width: 100%; + border-radius: 5px; +} +.head-box .genshin { + z-index: 3; + position: absolute; + left: 2px; + top: 2px; + width: 60px; +} +.head-box .genshin-img { + width: 100%; +} +.head-box .avatar { + width: 90px; + height: 90px; + position: absolute; + left: 0; + right: 0; + top: 16px; + bottom: 0; + margin: 0 auto; + padding: 3px; + border: 1px solid #e6d9be; + border-radius: 50%; + background-color: #f8f1e1; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); +} +.head-box .avatar img { + width: 100%; + border-radius: 50%; + border: 1px solid #e6d9be; + background-color: #ffb285; +} +.head-box .name { + color: #fff; + text-align: center; + position: relative; + z-index: 1; + padding-top: 120px; + font-size: 20px; + overflow: hidden; + white-space: nowrap; +} +.head-box .uid { + color: #fff; + text-align: center; + position: relative; + z-index: 1; + margin-top: 8px; + font-size: 20px; +} +.data-box { + width: 365px; + color: #fff; + margin: 10px 5px 0px 5px; + padding-top: 20px; + border-radius: 10px; + border: 1px solid #ffffff; +} +.data-line { + display: flex; + justify-content: space-around; + margin-bottom: 14px; +} +.data-line-item { + width: 100px; + text-align: center; + /*margin: 0 20px;*/ +} +.data-line-item .num { + font-size: 22px; +} +.data-line-item .lable { + font-size: 12px; + color: #f1f2f3; + line-height: 1; + margin-top: 3px; +} +.tab { + position: absolute; + top: 198px; + left: 10px; + background: #d4b98c; + color: rgb(255, 255, 255); + font-size: 14px; + padding: 3px 10px; + border-radius: 15px 0px 15px 15px; + z-index: 20; +} +.logo{ + position: absolute; + z-index: 1; + font-size: 12px; + right: 22px; + bottom: 8px; + color: #ffffff; +} diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/roleCard/roleCard.html b/src/Yunzai-Bot/plugins/genshin/resources/html/roleCard/roleCard.html new file mode 100644 index 0000000000000000000000000000000000000000..3413600a58d9720e5760eccab35192ef23f85422 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/roleCard/roleCard.html @@ -0,0 +1,75 @@ + + + + + + + + + + + + +
+
+
+ +
+ +
+
{{name}}
+
UID:{{uid}}
+
+ +
+
+
数据总览
+
+ {{each line val}} +
+ {{each val item}} +
+
{{item.num}}
+
{{item.lable}}
+
+ {{/each}} +
+ {{/each}} +
+
+
+
+ {{each avatars val}} +
+
+
+ +
+ {{ if val.actived_constellation_num>0}} +
{{val.actived_constellation_num}}命
+ {{/if}} +
+
Lv {{val.level}}
+
+
+
+
+ {{/each}} +
+
+ +
+ + + diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/roleDetail/roleDetail.css b/src/Yunzai-Bot/plugins/genshin/resources/html/roleDetail/roleDetail.css new file mode 100644 index 0000000000000000000000000000000000000000..d2432fa44ade51f777f53e2f474e10dbf4f31358 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/roleDetail/roleDetail.css @@ -0,0 +1,1056 @@ +@font-face { + font-family: "华文中宋"; + src: url("../../../../../resources/font/华文中宋.TTF"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + font-size: 16px; + color: #fff; + font-family: "tttgbnumber"; + transform: scale(1.6); + transform-origin: 0 0; +} +.container { + width: 480px; + height: 300px; + position: relative; + background-color: #1234; +} +.drag { + position: absolute; + top: 55px; + left: 0px; + width: 300px; + height: 50px; + background: inherit; + filter: blur(15px); + border-radius: 5px; +} +.role_box { + width: 480px; + padding: 5px 10px; + height: 300px; + background-repeat: no-repeat; + position: relative; +} +.title_box { + display: flex; + align-items: flex-end; + margin-left: 10px; + position: relative; +} +.title { + font-size: 36px; + display: flex; + align-items: flex-end; +} +.role_name { + font-family: "华文中宋"; +} +.lv { + font-size: 16px; + margin-left: 5px; + margin-bottom: 2px; +} +.uid { + margin-left: 3px; +} +.title_right { + display: flex; +} +.title_right .item { + margin-bottom: 2px; + margin-left: 15px; +} +.text_box { + position: relative; +} +.detail { + margin-left: 5px; + width: 300px; + margin-top: 3px; + padding: 5px 0; + display: flex; + position: relative; +} + +.skill { + margin-left: 5px; + width: 300px; + padding-bottom: 6px; + display: flex; + position: relative; +} +.text_box::before { + content: ""; + display: block; + position: absolute; + background-image: linear-gradient( + to right, + rgba(255, 255, 255, 0) 0%, + rgba(255, 255, 255, 0.5) 20%, + rgba(255, 255, 255, 0.5) 80%, + rgba(255, 255, 255, 0) 100% + ); + width: 0%; + height: 1px; + top: 0; + left: -15px; + width: 300px; + opacity: 1; + transition: width 0.3s 0.1s, opacity 0.3s 0.1s; +} +.text_box::after { + content: ""; + display: block; + position: absolute; + background-image: linear-gradient( + to right, + rgba(255, 255, 255, 0) 0%, + rgba(255, 255, 255, 0.5) 20%, + rgba(255, 255, 255, 0.5) 80%, + rgba(255, 255, 255, 0) 100% + ); + width: 0%; + height: 1px; + bottom: 0; + left: -15px; + width: 300px; + opacity: 1; + transition: width 0.3s 0.1s, opacity 0.3s 0.1s; +} +.detail p, +.skill p { + margin-right: 4px; + line-height: 16px; + width: 90px; + white-space: nowrap; +} +.no_skill { + padding: 10px 0; +} +.star { + width: 16px; + vertical-align: -2px; + margin-right: 1px; +} +.equiv { + margin-top: 12px; + min-height: 120px; +} +.row { + width: 240px; + display: flex; + flex-wrap: wrap; + /*margin-bottom: 5px;*/ +} +.row .item { + margin: 0 10px 8px 10px; + text-align: center; + font-size: 20px; + padding: 3px; + background: rgba(0, 0, 0, 0.6); + border-radius: 5px; + height: 52px; + width: 52px; + position: relative; +} +.row .item .num { + position: absolute; + top: -4px; + right: -7px; + font-size: 12px; + /*background: rgba(0,0,0,.6);*/ + border-radius: 5px; + padding: 1px 5px; + background-color: rgba(0, 0, 0, var(--bg-opacity)); + --bg-opacity: 0.75; + border-radius: 9999px; +} +.weapon_num { + position: absolute; + bottom: 0; + right: 0; + font-size: 12px; + /*background: #ff4d4d; + background: rgba(0,0,0,.6);*/ + border-radius: 5px; + padding: 1px 3px; + background-color: rgba(0, 0, 0, var(--bg-opacity)); + --bg-opacity: 0.75; +} +.row .item .img_box { + width: 46px; + height: 46px; + border: 1px solid #d3bc8d; + border-radius: 5px; + overflow: hidden; +} +.row .item img { + width: 100%; + transform: scale(1.2, 1.2); +} +.equiv_info { + max-width: 410px; + display: inline-block; + font-size: 15px; + padding: 5px 5px 1px 7px; + border-radius: 10px; + background: linear-gradient(0deg, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2)), rgba(114, 102, 104, 0.3); + margin-left: 5px; +} +.equiv_info .text { + margin-bottom: 5px; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} +.温迪_bg1 { + background: url(../../../../../data/roleDetail/温迪1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.温迪_drag { + background-position: -150px -55px; +} +.温迪_bg2 { + background-image: url(../../../../../data/roleDetail/温迪2.png); + background-size: 100%; + background-position: 133px 0px; +} +.阿贝多_bg1 { + background: url(../../../../../data/roleDetail/阿贝多1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.阿贝多_drag { + background-position: -150px -55px; +} +.阿贝多_bg2 { + background-image: url(../../../../../data/roleDetail/阿贝多2.png); + background-size: 100%; + background-position: -15px 0px; +} +.安柏_bg1 { + background: url(../../../../../data/roleDetail/安柏1.png) no-repeat; + background-size: auto 300px; + /* background-position: 100% 0%; */ +} +.安柏_drag { + background-position: 0px -55px; +} +.安柏_bg2 { + background-image: url(../../../../../data/roleDetail/安柏2.png); + background-size: 100%; + background-position: 140px 0px; +} +.芭芭拉_bg1 { + background: url(../../../../../data/roleDetail/芭芭拉1.png) no-repeat; + background-size: auto 300px; + /*background-position: 100% 0%;*/ +} +.芭芭拉_drag { + background-position: 0px -55px; +} +.芭芭拉_bg2 { + background-image: url(../../../../../data/roleDetail/芭芭拉2.png); + background-size: 100%; + background-position: 50px 27px; +} +.芭芭拉_bg3 { + background-image: url(../../../../../data/roleDetail/芭芭拉3.png); + background-size: 100%; + background-position: 65px 10px; +} +.班尼特_bg1 { + background: url(../../../../../data/roleDetail/班尼特1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.班尼特_drag { + background-position: -150px -55px; +} +.班尼特_bg2 { + background-image: url(../../../../../data/roleDetail/班尼特2.png); + background-size: 100%; + background-position: -5px 0px; +} +.迪奥娜_bg1 { + background: url(../../../../../data/roleDetail/迪奥娜1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.迪奥娜_drag { + background-position: -150px -55px; +} +.迪奥娜_bg2 { + background-image: url(../../../../../data/roleDetail/迪奥娜2.png); + background-size: 100%; + background-position: 40px 10px; +} +.迪卢克_bg1 { + background: url(../../../../../data/roleDetail/迪卢克1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.迪卢克_drag { + background-position: -150px -55px; +} +.迪卢克_bg2 { + background-image: url(../../../../../data/roleDetail/迪卢克2.png); + background-size: 100%; + background-position: 40px 10px; +} +.菲谢尔_bg1 { + background: url(../../../../../data/roleDetail/菲谢尔1.png) no-repeat; + background-size: auto 300px; + /*background-position: 100% 0%;*/ +} +.菲谢尔_drag { + background-position: 0px -55px; +} +.菲谢尔_bg2 { + background-image: url(../../../../../data/roleDetail/菲谢尔2.png); + background-size: 100%; + background-position: 90px 0px; +} +.凯亚_bg1 { + background: url(../../../../../data/roleDetail/凯亚1.png) no-repeat; + background-size: auto 300px; + /*background-position: 100% 0%;*/ +} +.凯亚_drag { + background-position: 0px -55px; +} +.凯亚_bg2 { + background-image: url(../../../../../data/roleDetail/凯亚2.png); + background-size: 100%; + background-position: 90px 5px; +} +.可莉_bg1 { + background: url(../../../../../data/roleDetail/可莉1.png) no-repeat; + background-size: auto 300px; + /*background-position: 100% 0%;*/ +} +.可莉_drag { + background-position: 0px -55px; +} +.可莉_bg2 { + background-image: url(../../../../../data/roleDetail/可莉2.png); + background-size: 100%; + background-position: 10px 0px; +} +.雷泽_bg1 { + background: url(../../../../../data/roleDetail/雷泽1.png) no-repeat; + background-size: auto 300px; + background-position: 37% 0%; +} +.雷泽_drag { + background-position: -55px -55px; +} +.雷泽_bg2 { + background-image: url(../../../../../data/roleDetail/雷泽2.png); + background-size: 100%; + background-position: 120px 0px; +} +.丽莎_bg1 { + background: url(../../../../../data/roleDetail/丽莎1.png) no-repeat; + background-size: auto 300px; + /*background-position: 100% 0%;*/ +} +.丽莎_drag { + background-position: 0px -55px; +} +.丽莎_bg2 { + background-image: url(../../../../../data/roleDetail/丽莎2.png); + background-size: 100%; + background-position: 10px 0px; +} +.莫娜_bg1 { + background: url(../../../../../data/roleDetail/莫娜1.png) no-repeat; + background-size: auto 300px; + /*background-position: 100% 0%;*/ +} +.莫娜_drag { + background-position: 0px -55px; +} +.莫娜_bg2 { + background-image: url(../../../../../data/roleDetail/莫娜2.png); + background-size: 100%; + background-position: 55px 0px; +} +.诺艾尔_bg1 { + background: url(../../../../../data/roleDetail/诺艾尔1.png) no-repeat; + background-size: auto 300px; + /*background-position: 100% 0%;*/ +} +.诺艾尔_drag { + background-position: 0px -55px; +} +.诺艾尔_bg2 { + background-image: url(../../../../../data/roleDetail/诺艾尔2.png); + background-size: 100%; + background-position: 15px 0px; +} +.琴_bg1 { + background: url(../../../../../data/roleDetail/琴1.png) no-repeat; + background-size: auto 300px; + /*background-position: 100% 0%;*/ +} +.琴_drag { + background-position: 0px -55px; +} +.琴_bg2 { + background-image: url(../../../../../data/roleDetail/琴2.png); + background-size: 100%; + background-position: 50px 0px; +} +.琴_bg3 { + background-image: url(../../../../../data/roleDetail/琴3.png); + background-size: 110%; + background-position: 80px 0px; +} +.砂糖_bg1 { + background: url(../../../../../data/roleDetail/砂糖1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.砂糖_drag { + background-position: -150px -55px; +} +.砂糖_bg2 { + background-image: url(../../../../../data/roleDetail/砂糖2.png); + background-size: 100%; + background-position: -10px 0px; +} +.北斗_bg1 { + background: url(../../../../../data/roleDetail/北斗1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.北斗_drag { + background-position: -150px -55px; +} +.北斗_bg2 { + background-image: url(../../../../../data/roleDetail/北斗2.png); + background-size: 100%; + background-position: 100px 0px; +} +.达达利亚_bg1 { + background: url(../../../../../data/roleDetail/达达利亚1.png) no-repeat; + background-size: auto 300px; + background-position: 90% 0%; +} +.达达利亚_drag { + background-position: -60px -55px; +} +.达达利亚_bg2 { + background-image: url(../../../../../data/roleDetail/达达利亚2.png); + background-size: 100%; + background-position: 60px 0px; +} +.甘雨_bg1 { + background: url(../../../../../data/roleDetail/甘雨1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.甘雨_drag { + background-position: -150px -55px; +} +.甘雨_bg2 { + background-image: url(../../../../../data/roleDetail/甘雨2.png); + background-size: 100%; + background-position: 90px 0px; +} +.甘雨_bg3 { + background-image: url(../../../../../data/roleDetail/甘雨3.png); + background-size: 100%; + background-position: 20px 0px; +} +.行秋_bg1 { + background: url(../../../../../data/roleDetail/行秋1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.行秋_drag { + background-position: -150px -55px; +} +.行秋_bg2 { + background-image: url(../../../../../data/roleDetail/行秋2.png); + background-size: 100%; + background-position: 0px 0px; +} +.胡桃_bg1 { + background: url(../../../../../data/roleDetail/胡桃1.png) no-repeat; + background-size: auto 300px; + background-position: 34% 0%; +} +.胡桃_drag { + background-position: -51px -55px; +} +.胡桃_bg2 { + background-image: url(../../../../../data/roleDetail/胡桃2.png); + background-size: 100%; + background-position: 95px 0px; +} +.刻晴_bg1 { + background: url(../../../../../data/roleDetail/刻晴1.png) no-repeat; + background-size: auto 300px; +} +.刻晴_drag { + background-position: 0px -55px; +} +.刻晴_bg2 { + background-image: url(../../../../../data/roleDetail/刻晴2.png); + background-size: 105%; + background-position: 87px -15px; +} +.刻晴_bg3 { + background-image: url(../../../../../data/roleDetail/刻晴3.png); + background-size: 105%; + background-position: 87px 0px; +} +.凝光_bg1 { + background: url(../../../../../data/roleDetail/凝光1.png) no-repeat; + background-size: auto 300px; + /*background-position: 34% 0%;*/ +} +.凝光_drag { + background-position: 0px -55px; +} +.凝光_bg2 { + background-image: url(../../../../../data/roleDetail/凝光2.png); + background-size: 100%; + background-position: 140px 0px; +} +.凝光_bg3 { + background-image: url(../../../../../data/roleDetail/凝光3.png); + background-size: 100%; + background-position: 60px 0px; +} +.七七_bg1 { + background: url(../../../../../data/roleDetail/七七1.png) no-repeat; + background-size: auto 300px; +} +.七七_drag { + background-position: 0px -55px; +} +.七七_bg2 { + background-image: url(../../../../../data/roleDetail/七七2.png); + background-size: 100%; + background-position: 25px 0px; +} +.香菱_bg1 { + background: url(../../../../../data/roleDetail/香菱1.png) no-repeat; + background-size: auto 300px; + background-position: 34% 0%; +} +.香菱_drag { + background-position: -51px -55px; +} +.香菱_bg2 { + background-image: url(../../../../../data/roleDetail/香菱2.png); + background-size: 100%; + background-position: 5px 0px; +} +.魈_bg1 { + background: url(../../../../../data/roleDetail/魈1.png) no-repeat; + background-size: auto 300px; + background-position: 65% 0%; +} +.魈_drag { + background-position: -97px -55px; +} +.魈_bg2 { + background-image: url(../../../../../data/roleDetail/魈2.png); + background-size: 100%; + background-position: 30px 0px; +} +.魈_bg3 { + background-image: url(../../../../../data/roleDetail/魈3.png); + background-size: 100%; + background-position: 40px 0px; +} +.辛焱_bg1 { + background: url(../../../../../data/roleDetail/辛焱1.png) no-repeat; + background-size: auto 300px; + background-position: 42% 0%; +} +.辛焱_drag { + background-position: -63px -55px; +} +.辛焱_bg2 { + background-image: url(../../../../../data/roleDetail/辛焱2.png); + background-size: 100%; + background-position: 100px 0px; +} +.钟离_bg1 { + background: url(../../../../../data/roleDetail/钟离1.png) no-repeat; + background-size: auto 300px; + background-position: 95% 0%; +} +.钟离_drag { + background-position: -143px -55px; +} +.钟离_bg2 { + background-image: url(../../../../../data/roleDetail/钟离2.png); + background-size: 100%; + background-position: -35px 0px; +} +.重云_bg1 { + background: url(../../../../../data/roleDetail/重云1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.重云_drag { + background-position: -150px -55px; +} +.重云_bg2 { + background-image: url(../../../../../data/roleDetail/重云2.png); + background-size: 100%; + background-position: 100px 0px; +} +.罗莎莉亚_bg1 { + background: url(../../../../../data/roleDetail/罗莎莉亚1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.罗莎莉亚_drag { + background-position: -150px -55px; +} +.罗莎莉亚_bg2 { + background-image: url(../../../../../data/roleDetail/罗莎莉亚2.png); + background-size: 100%; + background-position: 120px 0px; +} +.空_bg1 { + background: url(../../../../../data/roleDetail/空1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.空_drag { + background-position: -150px -55px; +} +.空_bg2 { + background-image: url(../../../../../data/roleDetail/空2.png); + background-size: 100%; + background-position: 40px 0px; +} +.荧_bg1 { + background: url(../../../../../data/roleDetail/荧1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.荧_drag { + background-position: -150px -55px; +} +.荧_bg2 { + background-image: url(../../../../../data/roleDetail/荧2.png); + background-size: 100%; + background-position: 30px 15px; +} +.烟绯_bg1 { + background: url(../../../../../data/roleDetail/烟绯1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.烟绯_drag { + background-position: -150px -55px; +} +.烟绯_bg2 { + background-image: url(../../../../../data/roleDetail/烟绯2.png); + background-size: 100%; + background-position: 140px 0px; +} +.优菈_bg1 { + background: url(../../../../../data/roleDetail/优菈1.png) no-repeat; + background-size: auto 300px; + background-position: 0% 0%; +} +.优菈_drag { + background-position: 0px -55px; +} +.优菈_bg2 { + background-image: url(../../../../../data/roleDetail/优菈2.png); + background-size: 100%; + background-position: 80px 0px; +} +.枫原万叶_bg1 { + background: url(../../../../../data/roleDetail/枫原万叶1.png) no-repeat; + background-size: auto 300px; + background-position: 10% 0%; +} +.枫原万叶_drag { + background-position: -15px -55px; +} +.枫原万叶_bg2 { + background-image: url(../../../../../data/roleDetail/枫原万叶2.png); + background-size: 100%; + background-position: 100px 0px; +} +.神里绫华_bg1 { + background: url(../../../../../data/roleDetail/神里绫华1.png) no-repeat; + background-size: auto 300px; + background-position: 85% 0%; +} +.神里绫华_drag { + background-position: -127px -55px; +} +.神里绫华_bg2 { + background-image: url(../../../../../data/roleDetail/神里绫华2.png); + background-size: 100%; + background-position: 0px 0px; +} +.宵宫_bg1 { + background: url(../../../../../data/roleDetail/宵宫1.png) no-repeat; + background-size: auto 300px; + background-position: 34% 0%; +} +.宵宫_drag { + background-position: -51px -55px; +} +.宵宫_bg2 { + background-image: url(../../../../../data/roleDetail/宵宫2.png); + background-size: 100%; + background-position: 60px 0px; +} +.早柚_bg1 { + background: url(../../../../../data/roleDetail/早柚1.png) no-repeat; + background-size: auto 300px; + background-position: 8% 0%; +} +.早柚_drag { + background-position: -12px -55px; +} +.早柚_bg2 { + background-image: url(../../../../../data/roleDetail/早柚2.png); + background-size: 100%; + background-position: 110px 0px; +} +.雷电将军_bg1 { + background: url(../../../../../data/roleDetail/雷电将军1.png) no-repeat; + background-size: auto 300px; + background-position: 15% 0%; +} +.雷电将军_drag { + background-position: -22px -55px; +} +.雷电将军_bg2 { + background-image: url(../../../../../data/roleDetail/雷电将军2.png); + background-size: 100%; + background-position: 110px 0px; +} +.九条裟罗_bg1 { + background: url(../../../../../data/roleDetail/九条裟罗1.png) no-repeat; + background-size: auto 300px; + background-position: 44% 0%; +} +.九条裟罗_drag { + background-position: -66px -55px; +} +.九条裟罗_bg2 { + background-image: url(../../../../../data/roleDetail/九条裟罗2.png); + background-size: 100%; + background-position: 0px 0px; +} +.埃洛伊_bg1 { + background: url(../../../../../data/roleDetail/埃洛伊1.png) no-repeat; + background-size: auto 300px; + background-position: 0% 0%; +} +.埃洛伊_drag { + background-position: 0px -55px; +} +.埃洛伊_bg2 { + background-image: url(../../../../../data/roleDetail/埃洛伊2.png); + background-size: 100%; + background-position: 60px 0px; +} +.珊瑚宫心海_bg1 { + background: url(../../../../../data/roleDetail/珊瑚宫心海1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.珊瑚宫心海_drag { + background-position: -150px -55px; +} +.珊瑚宫心海_bg2 { + background-image: url(../../../../../data/roleDetail/珊瑚宫心海2.png); + background-size: 100%; + background-position: 100px 0px; +} +.托马_bg1 { + background: url(../../../../../data/roleDetail/托马1.png) no-repeat; + background-size: auto 300px; + background-position: 34% 0%; +} +.托马_drag { + background-position: -51px -55px; +} +.托马_bg2 { + background-image: url(../../../../../data/roleDetail/托马2.png); + background-size: 100%; + background-position: 110px 0px; +} +.荒泷一斗_bg1 { + background: url(../../../../../data/roleDetail/荒泷一斗1.png) no-repeat; + background-size: auto 300px; + background-position: 0% 0%; +} +.荒泷一斗_drag { + background-position: 0px -55px; +} +.荒泷一斗_bg2 { + background-image: url(../../../../../data/roleDetail/荒泷一斗2.png); + background-size: 100%; + background-position: 150px 0px; +} +.五郎_bg1 { + background: url(../../../../../data/roleDetail/五郎1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.五郎_drag { + background-position: -150px -55px; +} +.五郎_bg2 { + background-image: url(../../../../../data/roleDetail/五郎2.png); + background-size: 100%; + background-position: 110px 0px; +} +.申鹤_bg1 { + background: url(../../../../../data/roleDetail/申鹤1.png) no-repeat; + background-size: auto 300px; + background-position: 0% 0%; +} +.申鹤_drag { + background-position: 0px -55px; +} +.申鹤_bg2 { + background-image: url(../../../../../data/roleDetail/申鹤2.png); + background-size: 100%; + background-position: 40px 0px; +} +.云堇_bg1 { + background: url(../../../../../data/roleDetail/云堇1.png) no-repeat; + background-size: auto 300px; + background-position: 40% 0%; +} +.云堇_drag { + background-position: -60px -55px; +} +.云堇_bg2 { + background-image: url(../../../../../data/roleDetail/云堇2.png); + background-size: 100%; + background-position: 50px 0px; +} +.八重神子_bg1 { + background: url(../../../../../data/roleDetail/八重神子1.png) no-repeat; + background-size: auto 300px; + background-position: 10% 0%; +} +.八重神子_drag { + background-position: -15px -55px; +} +.八重神子_bg2 { + background-image: url(../../../../../data/roleDetail/八重神子2.png); + background-size: 100%; + background-position: 35px 0px; +} +.神里绫人_bg1 { + background: url(../../../../../data/roleDetail/神里绫人1.png) no-repeat; + background-size: auto 300px; + background-position: 40% 0%; +} +.神里绫人_drag { + background-position: -60px -55px; +} +.神里绫人_bg2 { + background-image: url(../../../../../data/roleDetail/神里绫人2.png); + background-size: 100%; + background-position: 110px 0px; +} +.夜兰_bg1 { + background: url(../../../../../data/roleDetail/夜兰1.png) no-repeat; + background-size: auto 300px; + background-position: 40% 0%; +} +.夜兰_drag { + background-position: -60px -55px; +} +.夜兰_bg2 { + background-image: url(../../../../../data/roleDetail/夜兰2.png); + background-size: 100%; + background-position: 100px 0px; +} +.久岐忍_bg1 { + background: url(../../../../../data/roleDetail/久岐忍1.png) no-repeat; + background-size: auto 300px; + background-position: 46% 0%; +} +.久岐忍_drag { + background-position: -69px -55px; +} +.久岐忍_bg2 { + background-image: url(../../../../../data/roleDetail/久岐忍2.png); + background-size: 100%; + background-position: 20px 0px; +} +.鹿野院平藏_bg1 { + background: url(../../../../../data/roleDetail/鹿野院平藏1.png) no-repeat; + background-size: auto 300px; + background-position: 73% 0%; +} +.鹿野院平藏_drag { + background-position: -110px -55px; +} +.鹿野院平藏_bg2 { + background-image: url(../../../../../data/roleDetail/鹿野院平藏2.png); + background-size: 100%; + background-position: 100px 0px; +} +.提纳里_bg1 { + background: url(../../../../../data/roleDetail/提纳里1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.提纳里_drag { + background-position: -110px -55px; +} +.提纳里_bg2 { + background-image: url(../../../../../data/roleDetail/提纳里2.png); + background-size: 100%; + background-position: 70px 0px; +} +.柯莱_bg1 { + background: url(../../../../../data/roleDetail/柯莱1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.柯莱_drag { + background-position: -110px -55px; +} +.柯莱_bg2 { + background-image: url(../../../../../data/roleDetail/柯莱2.png); + background-size: 100%; + background-position: 60px 0px; +} +.多莉_bg1 { + background: url(../../../../../data/roleDetail/多莉1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.多莉_drag { + background-position: -150px -55px; +} +.多莉_bg2 { + background-image: url(../../../../../data/roleDetail/多莉2.png); + background-size: 100%; + background-position: 60px 0px; +} +.赛诺_bg1 { + background: url(../../../../../data/roleDetail/赛诺1.png) no-repeat; + background-size: auto 300px; + background-position: 0% 0%; +} +.赛诺_drag { + background-position: 0px -55px; +} +.赛诺_bg2 { + background-image: url(../../../../../data/roleDetail/赛诺2.png); + background-size: 100%; + background-position: 100px 0px; +} +.坎蒂丝_bg1 { + background: url(../../../../../data/roleDetail/坎蒂丝1.png) no-repeat; + background-size: auto 300px; + background-position: 50% 0%; +} +.坎蒂丝_drag { + background-position: -75px -55px; +} +.坎蒂丝_bg2 { + background-image: url(../../../../../data/roleDetail/坎蒂丝2.png); + background-size: 100%; + background-position: 120px 0px; +} +.妮露_bg1 { + background: url(../../../../../data/roleDetail/妮露1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.妮露_drag { + background-position: -110px -55px; +} +.妮露_bg2 { + background-image: url(../../../../../data/roleDetail/妮露2.png); + background-size: 100%; + background-position: 40px 0px; +} +.纳西妲_bg1 { + background: url(../../../../../data/roleDetail/纳西妲1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.纳西妲_drag { + background-position: -150px -55px; +} +.纳西妲_bg2 { + background-image: url(../../../../../data/roleDetail/纳西妲2.png); + background-size: 100%; + background-position: 60px 0px; +} +.莱依拉_bg1 { + background: url(../../../../../data/roleDetail/莱依拉1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.莱依拉_drag { + background-position: -150px -55px; +} +.莱依拉_bg2 { + background-image: url(../../../../../data/roleDetail/莱依拉2.png); + background-size: 100%; + background-position: 90px 0px; +} +.流浪者_bg1 { + background: url(../../../../../data/roleDetail/流浪者1.png) no-repeat; + background-size: auto 300px; + background-position: 100% 0%; +} +.流浪者_drag { + background-position: -150px -55px; +} +.流浪者_bg2 { + background-image: url(../../../../../data/roleDetail/流浪者2.png); + background-size: 100%; + background-position: 100px 0px; +} +.珐露珊_bg1 { + background: url(../../../../../data/roleDetail/珐露珊1.png) no-repeat; + background-size: auto 300px; + background-position: 0% 0%; +} +.珐露珊_drag { + background-position: 0px -55px; +} +.珐露珊_bg2 { + background-image: url(../../../../../data/roleDetail/珐露珊2.png); + background-size: 100%; + background-position: 105px 0px; +} \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/roleDetail/roleDetail.html b/src/Yunzai-Bot/plugins/genshin/resources/html/roleDetail/roleDetail.html new file mode 100644 index 0000000000000000000000000000000000000000..a70011f2128534a81e5745596d90490e68c7421e --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/roleDetail/roleDetail.html @@ -0,0 +1,89 @@ + + + + + + + + + + + + {{each list val}} + + {{/each}} + + +
+
+
+
+
+
+
{{showName}}
+
ID:{{uid}}
+
+
+
+
+
+

+ + 等级:{{level}} +

+

+ + 命座:{{actived_constellation_num}} +

+

+ + 好感:{{fetter}} +

+
+ {{ if skill.a }} +
+

+ + 爆发:{{ skill.q.level_current}} +

+

+ + 战技:{{ skill.e.level_current}} +

+

+ + 普攻:{{ skill.a.level_current}} +

+
+ {{/if}} +
+
+
+ {{each list val}} +
+
+ +
+ {{ if val.type =='weapon'}} +

lv{{val.level}}

+

{{val.affix_level}}

+ {{else}} +

+{{val.level}}

+ {{/if}} +
+ {{/each}} +
+
+ {{ if text1}} +
+
{{text1}}
+
{{text2}}
+
+ {{/if}} +
+
+ + + diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/html/roleDetail/\346\230\237\346\230\237.png" "b/src/Yunzai-Bot/plugins/genshin/resources/html/roleDetail/\346\230\237\346\230\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..99f2bd6681e23682a4200f659686b1dc8d8ed7e0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/html/roleDetail/\346\230\237\346\230\237.png" differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/roleExplore/roleExplore.css b/src/Yunzai-Bot/plugins/genshin/resources/html/roleExplore/roleExplore.css new file mode 100644 index 0000000000000000000000000000000000000000..8b6320b75cf8dd6efb527d42893ddb5369c2325a --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/roleExplore/roleExplore.css @@ -0,0 +1,178 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + font-size: 18px; + color: #1e1f20; + transform: scale(1.5); + transform-origin: 0 0; +} +.container { + width: 470px; + padding: 10px 15px; + background-color: #f5f6fb; +} +.base_info { + position: relative; + padding-left: 10px; +} +.head_box { + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); +} +.head_box .id_text{ + font-size: 24px; +} +.head_box .day_text{ + font-size: 20px; +} +.head_box .genshin_logo { + position: absolute; + top: 1px; + right: 15px; + width: 97px; +} +.uid{ + font-family: tttgbnumber; +} +.uid:before { + content: " "; + position: absolute; + width: 5px; + height: 24px; + border-radius: 1px; + left: 0; + top: 0; + background: #d3bc8d; +} +.data_box { + border-radius: 15px; + margin-top: 20px; + margin-bottom: 20px; + padding: 10px 15px 0px 15px; + background: #fff; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); + padding: 20px 15px 5px 15px; + position: relative; +} +.tab_lable { + position: absolute; + top: -10px; + left: -8px; + background: #d4b98c; + color:#fff; + font-size: 14px; + padding: 3px 10px; + border-radius: 15px 0px 15px 15px; + z-index: 20; +} +.data_line { + display: flex; + justify-content: space-around; + margin-bottom: 14px; +} +.data_line_item { + width: 100px; + text-align: center; + /*margin: 0 20px;*/ +} +.num { + font-family: tttgbnumber; + font-size: 24px; +} +.explor_box .num{ + font-family: tttgbnumber; + font-size: 16px; +} +.lable { + font-size: 14px; + color: #7f858a; + line-height: 1; + margin-top: 3px; +} +.explor_box { + position: relative; + font-size: 16px; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + border-radius: 15px; + margin-top: 10px; + margin-bottom: 12px; + background: #fff; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); + padding: 15px; +} +.explor_box .item { + margin-top: 10px; + /*margin-right: 10px;*/ + display: flex; + /*justify-content: center;*/ + align-items: center; + width: 200px; + height: 85px; + padding: 3px 4px; + border-radius: 6px; + color: #fff; + line-height: 1; + background: #394467 url(../../img/other/world-exploration-frame.png) center center + no-repeat; + background-origin: content-box; + background-size: 100% 97%; +} +.explor_box .icon { + width: 62px; + margin-left: 3px; +} +.explor_box .content { + margin-left: 4px; + width: 130px; +} +.explor_box .content p { + margin: 7px 0; +} +.explor_box .name { + /* color: #fff; */ + font-weight: 500; + white-space: nowrap; +} +.progress { + position: relative; + width: 120px; + height: 3px; + background-color: rgba(0, 0, 0, 0.3); +} +.progress .value { + position: absolute; + right: 0; + top: -14px; + font-size: 12px; +} +.progress .bar { + height: 100%; + background-color: #d3bc8d; +} +.explor_box .prestige { + color: #1e1f20; + background: #e9e5dc; + width: 88px; + border-radius: 2px; + padding: 3px 7px; +} +.homes_hidden { + display: none; +} +.logo { + font-size: 12px; + font-family: "tttgbnumber"; + text-align: center; + color: #7994a7; +} diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/roleExplore/roleExplore.html b/src/Yunzai-Bot/plugins/genshin/resources/html/roleExplore/roleExplore.html new file mode 100644 index 0000000000000000000000000000000000000000..96b0e05aeec1b3b902f4b81a62e52cbc437b81c1 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/roleExplore/roleExplore.html @@ -0,0 +1,48 @@ + + + + + + + + + {{@headIndexStyle}} + + +
+
+
ID: {{uid}}
+
{{activeDay}}
+ +
+
+
数据总览
+ {{each line val}} +
+ {{each val item}} +
+
{{item.num}}
+
{{item.lable}}
+
+ {{/each}} +
+ {{/each}} +
+
+
地图探险
+ {{each explor val}} +
+ +
+ {{each val.line line}} +

{{line.name}}:{{line.text}}

+ {{/each}} +
+
+ {{/each}} +
+ +
+ + + diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/roleIndex/roleIndex.css b/src/Yunzai-Bot/plugins/genshin/resources/html/roleIndex/roleIndex.css new file mode 100644 index 0000000000000000000000000000000000000000..da9a444bf701a0b6556b07b351a89f9c1b1a3b4b --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/roleIndex/roleIndex.css @@ -0,0 +1,541 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + font-size: 18px; + color: #1e1f20; + font-family: PingFangSC-Medium, PingFang SC, sans-serif; + transform: scale(2); + transform-origin: 0 0; +} +.container { + width: 465px; + padding: 20px 15px 10px 15px; + background-color: #ececec; +} +.head_box { + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); +} +.head_box .id_text{ + font-size: 24px; +} +.head_box .day_text{ + font-size: 20px; +} +.head_box .genshin_logo { + position: absolute; + top: 1px; + right: 15px; + width: 97px; +} +.base_info { + position: relative; + padding-left: 10px; +} +.uid:before { + content: " "; + position: absolute; + width: 5px; + height: 24px; + border-radius: 1px; + left: 0; + top: 0; + background: #d3bc8d; +} +.uid { + font-family: tttgbnumber; +} +.data_box { + border-radius: 15px; + margin-top: 20px; + margin-bottom: 20px; + padding: 20px 15px 5px 15px; + background: #f5f5f5; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); + position: relative; +} +.tab_lable { + position: absolute; + top: -10px; + left: -8px; + background: #d4b98c; + color:#fff; + font-size: 14px; + padding: 3px 10px; + border-radius: 15px 0px 15px 15px; + z-index: 20; +} +.data_line { + display: flex; + justify-content: space-around; + margin-bottom: 14px; +} +.data_line_item { + width: 100px; + text-align: center; + /*margin: 0 20px;*/ +} +.num { + font-family: tttgbnumber; + font-size: 24px; +} +.data_box .lable { + font-size: 14px; + color: #7f858a; + line-height: 1; + margin-top: 3px; +} + +.avatars_box { + display: flex; + flex-wrap: wrap; + border-radius: 15px; + margin-top: 15px; + margin-bottom: 15px; + padding: 25px 5px 0px 2px; + background: #f5f5f5; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); + position: relative; +} +.avatars_box .item { + margin: 0px 0 10px 10px; + border-radius: 7px; + overflow: hidden; + box-shadow: 0 2px 6px 0 rgb(132 93 90 / 30%); + width: 95px; + background: #e9e5dc; +} +.avatars_box .role_box { + overflow: hidden; + height: 95px; + width: 95px; + position: relative; + background: #e9e5dc; +} +.role_box .role_img { + width: 100%; + overflow: hidden; + background-size: 100%; + background-repeat: no-repeat; + position: absolute; + top: 0; + /*filter: contrast(95%);*/ +} +.avatars_box .bg105 { + background-image: url(../../img/other/bg105.png); + width: 100%; + height: 95px; + background-size: 100%; + background-repeat: no-repeat; +} +.avatars_box .bg5 { + background-image: url(../../img/other/bg5.png); + width: 100%; + height: 95px; + /*filter: brightness(1.1);*/ + background-size: 100%; + background-repeat: no-repeat; +} +.avatars_box .bg4 { + width: 100%; + height: 95px; + background-image: url(../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} +.item .text_box{ + font-size: 12px; + background: #e9e5dc; + padding: 5px 0px 4px 0px; + font-family: tttgbnumber; + display: flex; + align-items: flex-start; +} +.item .text_box .weapon_box{ + flex: 0 0 34px; + width: 34px; + height: 34px; + padding: 2px; + border-radius: 5px; + background: rgba(0,0,0,.6); + overflow: hidden; + margin-left: 4px; +} +.item .text_box .weapon_boder{ + border: 1px solid #d3bc8d; + border-radius: 5px; + width: 30px; + height: 30px; + overflow: hidden; +} +.item .text_box .weapon_img{ + width: 100%; + transform: scale(1.2, 1.2); + +} +.item .text_box .weapon_name_box{ + margin-left: 4px; + white-space: nowrap; +} +.item .text_box .weapon_name_box .weapon_level{ + margin-top: 2px; +} +.item .text_box .weapon_affix{ + border-radius: 2px; + background-color: #ff5722; + padding: 2px 3px; + color:#fff; + display: inline-block; + transform: scale(0.8); + transform-origin: 12px 7px; +} +.role_box .fill_img { + position: absolute; + width: 15px; + right: 0; + bottom: 17px; +} +.role_box .desc { + font-weight: 500; + text-align: center; + line-height: 18px; + position: absolute; + bottom: 0; + /* background: #e9e5dc; */ + background: rgba(0,0,0,.6); + color: #ececec; + width: 100%; + height: 18px; + font-size: 14px; + font-family: tttgbnumber; +} +.role_name { + /* overflow: hidden; */ + white-space: nowrap; + margin-top: 5px; + font-weight: 500; + text-align: center; + font-size: 14px; + /*margin-top: 5px;*/ +} +.role_box .life { + position: absolute; + top: 0px; + right: 0px; + z-index: 9; + font-size: 16px; + text-align: center; + color: #fff; + border-radius: 2px; + padding: 1px 3px; + border-radius: 3px; + font-family: "tttgbnumber"; +} +.life1 { + background-color: #62a8ea; +} +.life2 { + background-color: #62a8ea; +} +.life3 { + background-color: #45b97c; +} +.life4 { + background-color: #45b97c; +} +.life5 { + background-color: #ff5722; +} +.life6 { + background-color: #ff5722; +} +.base_info span { + margin-left: 5px; +} +.avatar { + height: 24px; + width: 24px; + background-color: #ffb285; + vertical-align: -5px; + margin-left: 2px; + margin-right: 3px; + border: 1px solid #ffb285; + border-radius: 100%; +} + +.abyss_box { + width: 435px; + background-image: url(../../img/abyss/bg.png); + background-size: 100%; + background-repeat: no-repeat; + padding: 7px 0 0 0; + font-family: "tttgbnumber"; + color: #fff; + margin: 10px auto; + border-radius: 15px; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); + overflow: hidden; +} +.row { + width: 100%; + background: rgba(56, 74, 91, 0.59); + padding: 0px 0px 0px 50px; + display: flex; + font-size: 14px; +} +.abyss_box .row { + padding-bottom: 5px; +} +.abyss_box .row .item { + flex: 1; + position: relative; +} +.abyss_box .row .item div { + padding-top: 4px; +} +.abyss_box .role { + margin-top: 5px; +} +.abyss_box .title { + padding-left: 20px; + font-weight: 500; + color: #d3bc8d; +} +.abyss_box .role .list { + display: flex; + justify-content: center; + margin-top: 7px; +} +.abyss_box .role .list .item { + overflow: hidden; + width: 58px; + height: 70px; + border-radius: 5px; + position: relative; + /*border: 2px solid #d3bc8d;*/ + /*background: #e9e5dc;*/ + box-shadow: 0 2px 6px 0 rgb(132 93 90 / 30%); + margin: 0 13px; +} +.abyss_box .role .list .item .role_img { + width: 100%; + overflow: hidden; + background-size: 100%; + background-repeat: no-repeat; +} +.abyss_box .role .list .item .desc { + font-weight: 500; + text-align: center; + line-height: 16px; + position: absolute; + bottom: 0; + background: #e9e5dc; + width: 100%; + height: 16px; + color: #1e1f20; + font-size: 14px; +} +.abyss_box .role .list .item .fill_img { + position: absolute; + width: 14px; + right: 0; + bottom: 14px; +} +.abyss_box .bg5 { + background-image: url(../../img/other/bg5.png); + background-size: 100%; + background-repeat: no-repeat; +} +.abyss_box .bg4 { + background-image: url(../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} +.abyss_box .bg105 { + background-image: url(../../img/other/bg105.png); + background-size: 100%; + background-repeat: no-repeat; +} +.detail { + margin-top: 7px; + padding-bottom: 5px; +} +.detail .title { + margin-bottom: 5px; +} +.detail .row { + width: 100%; + background: rgba(56, 74, 91, 0.59); + padding: 4px 0px 4px 50px; + margin-top: 0px; + display: flex; + font-size: 14px; +} +.detail .row .item { + padding-top: 0px; +} +.detail .two { + background: none; +} +.line-icon { + width: 30px; + position: absolute; + top: -12px; + right: 36px; +} +.two_img { + right: 56px; +} + +.abyss_box .item .life { + position: absolute; + top: 0px; + right: 0px; + z-index: 9; + font-size: 12px; + text-align: center; + color: #fff; + border-radius: 2px; + padding: 0px 3px; + border-radius: 3px; + font-family: "tttgbnumber"; +} +.tab-avatar-item { + height: 30px; + display: flex; + position: relative; + margin: 10px auto; + margin-top: 0; + margin-bottom: 20px; + cursor: pointer; + min-width: 100px; + width: 170px; + text-align: center; +} +.tab-avatar-item-left { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH8AAABACAMAAAAET1hZAAAA4VBMVEUAAADt5+Dt6OHr5d7s5t/r5d7r5d7r5d7s5t/r5d7s5t/r5d7s5t/r5d7r5d7s5t/t5+Ds5t/v6ePr5d7x7OXr5d7u6eLw6+Tu6OHs5t/t6OHu6OLs5+Dt5+Dr5d7s5t/r5d7r5d7v6uPr5d7x7Obr5d7t5+Ds5t/u6eLv6uPr5d7u6eLr5d7v6uTr5d7x7Obs5t/w6+Xt6OHu6eLr5d7r5d7s5+Dv6uTv6uPx7Obx7Obu6eLu6eLr5d7x7Obw6+Tw6+Xu6eLr5d7x7Obx7Obu6eLw6uTw6+Xt5+Hu6OHr5d5gDh/TAAAARHRSTlMAAQPljPv0vV9aOy0dBtqlfBMJ69zRdGdMJiMXDgTuoJuTY/zMy8KpcEZCNTL28OPdwbWGglJFGAb57Ozm1aCNT9KwrUCNbKEAAARwSURBVFjDxZnXdqMwFEUv4N5b3Hv6JJPepjer3f//oBG2sYwFGIhZ2S8J8oJ9VCwJGfZQ6l7MJiQ5IIBhrmqhDdFI3m9cnmekupmdwQdg5o8Q0w+dHnwIn34g3l0M5H+NQidVJckBHtSriJW8CdCvnX0mLgTndOGGrVjEw6vyFmbaZRjl7gkJsjNKZRERNsSGUsbe7Tdqx5gtgTlvES527UQ9n8priSOXiHWGd/lHEzyuGXB1Ij8TrgDyalN5RmyzO55sDeo0Q2x/+S/evIBZ4wsbwckGWflN1YUmX4sVLJbfqGLzGupnYiVjgrt6XtmJF9QFi+FPYbMIpYr0rXSM87WebLc88YbuwKL6c5i5gv53QnYCbFVet+t+BYvk72UwD6UWkagAgis9E8oe6Few8P7REc6g8UcNOLZuAalXlY/gZyvC+ttYacD59ohfWR09UfYofkkofymDnyBHiDuAQkh9TD8L459iFQbfyDZcbOtJRL30K/b6S+l0H6aEeAdgPnqxwSMD22afP3U8gR6Kncc7ATj3lHMpdrR6KzA3gf636WkPfhKuBSDO0Nflsowy91Jsp/DxB9e/0SvA6xe9l2WBVwcs5d6PtDPEaH8woC2vvQLo49+u+cIfFsMvOVE97RWAcKGtxH6wGP7+6k4uggKo6zAJwvtnJeg4s2xQALUYhUoQ1j/M1GT3+wcQmwCrZSF0gpD+RxzX3058A0gvWweQ+ghQGsp/nUY8NwYtvwCq1Yn8EwVGQ/h7FkpSxuB+XUq8A8QhRP2fx7jkvG5efNUCaKMwKsH+UTeLDuOn0rBzEhCAHd5/dYSKTArMudMCRIMLenA/wIuTIP00bNRuZaF/AE4T6P/yFG2sa+je7tnwyDJ2+PEPM6lv9uFCFuwNwOnhv/9l2QXP0Nm6zSuAWn0OPv99wixcfdmUcs4CAghB2IHnfzjqwuNCDT013wqiI/jeBEzZQ/kLI7jc7nfOtQDaWUCAPc7+o/F5oZROALUW6AkEZX7uyH7DMOCn0rsC+CUQ9ie2ZaldNTmRxPEXc89wqfRqsgl86xRLiPo49v67OLbKZsvd3CLkm59mj+GHU8zBXOndS57sg2ju6OMvjxWz3OLCe7qlIkQTvOv9z6hgHrpcX3HUliTZ9988WkN48F/wqEj2/d84wxS8ft/Rq3tjnn/Q0OcfxfRxAV6Et14dfkXwLzMswvqhhnd1aHs1PiFOEwQliHb8pPvNLGbL8Kh9/Rfuw09JSL+0R/HDwMKqYfza1VNuT7U7h7+JnH8Wb3BqQFvs6nd3XlRFOOj5LxQyWC3D5TdNLwO41jtGZcEqhJKT6D8DwG6AMWbr8Pqw0TPOffZ+TPqEEFwiVih5bD8ULbQKAL9vHb0I2H2qNfdgv3/AIIvp1BDeOq31lOOCq4OfgwA65lMarbwB5u9/n5HroMQeCwn5JcUzxEpuBNDo/rr/ukgS8MTIVRCbqWsDPgozf4qI1mReqMMHUUzdoU3zB0kOCKQ/n5zeIJLk+A/ZGBfLTAmknQAAAABJRU5ErkJggg==); + background-size: 70px 40px; + height: 40px; + width: 70px; + z-index: 1; + position: absolute; + left: 0; + top: 0; +} +.tab-avatar-item-middle { + z-index: 0; + height: 40px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAABAAgMAAABNSE7QAAAACVBMVEUAAADx7Obv6eNXnHu8AAAAAXRSTlMAQObYZgAAABVJREFUCNdjWACEQAAkA+gJoXYuAAAl+xRROZX4mgAAAABJRU5ErkJggg==); + background-repeat: repeat-x; + background-size: contain; + position: absolute; + left: 20px; + right: 20px; + width: auto; +} +.tab-avatar-item-right { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH8AAABACAMAAAAET1hZAAAA2FBMVEUAAADt5+Dt5+Ht5+Dr5d7r5d7u6eLr5d7r5d7r5d7r5d7t5+Dr5d7s5t/r5d7u6OLs5t/x7OXr5d7t5+Ds5t/t5+Ht5+Dr5d7s5t/t6OHv6ePr5d7s5t/r5d7u6OLv6uPs5t/r5d7t6OHs5t/r5d7s5t/x7Obr5d7s5+Ds5t/r5d7u6OHx6+Xv6uPt5+Dv6uTx7Obw6+Tt6OHr5d7v6uTs5t/t5+Ds5+Dx7Obx7Obu6eLu6eLx7Obu6eLu6eLr5d7x7Obx7Obu6eLw6uTw6+Tt5+Hu6OHr5d6e08eTAAAAQXRSTlMAAQMF5fQX++vYvTQtpY1yE9zRfVxMRDomIwnvoJuIY2BZURz83czLwqmUd2ZHD/bjwbWEaj4fDPns7OagjtKwrYRRDJYAAARaSURBVFjDxZnnYpswFEYvw3vHe4/s2ex0twFJ9/3fqMIGX2wFjGK7Pn+Mwcn5JDSQAGd/DK4qzVeIZ59+9LBLkzs4FOV8FhFTl7cGHIrO82MG8Whq/v/6L41uXnpSka6cIuZa8CHvn4MtWDvrci6cFb5c1LsA5jSHWKpu4yex6zoewsOROtdlaoIwDw0LrEoK7Zdt/b47MAgJ557RpZ846wkEd2pjE47zeHJtbOEPCu468wNinsJhyyoQKwHkN3nyrABG/QQHpq6f5ERYThHEshIczumS1HvwugmtFP6x9P1kJ78KJaBWQHr5eVGFQhZLhoaf7Kpfxb8LgW+h52wRSH49fYViFkc6frLH+ylBqApW9ZIfXSiksKHhJ/smP7U2RgG4IL1H7RimmOok9rMFGn6qAmn1S8+oOf5+gys8MoGItev5qb/7Afwk4d5wCb0cVhL5mb6ferxPoCcm0MLU8WY/C5GwARDhAMLTE9/TUMLhRj8L84FbLIkIwEi/yhC6mQxVQLSeUEseHEo//zAC54F+7arADgxOyp+rf8/M1vqnVKkRgk7gKHru/ITO+dDS9wduBTaPoFS/r1daxtc0tDs9fT/JVbxaUNu/qp9fqYCh2f7j7TTrUv8nvdoqzpKMfzp20sXrBV/8n66OP4Gdppx4fTAy38DxVVJ/Urs/0C/1IkovuYZ66i6Z3/X+RiOAr2cyR6T+zKr28SmRP2nhqR/QnYjS19LGJWKmkKj875pE6x3/4kPaKKPE7mzw69upI0Tqvz2b1Uuck53txc9i9Gc3d6/1LAbkm9bO/a50KQSlH5tQTiFxVNj1/Xd5tF5yf927e8oE9tau2z+jXh/1OHTfhIKNHkNr1/3f5dF6ogJdrwlc7XD8oxkoUh8qyDPMEI+s3Y7/zBEiRs84fw/4WoA8tmCTXycB80SOiqDxWB4FjKB5pDf/R0egNX+cnvNwO7gFs63rj8zAXEF2ZcwP9OEx8EsPCB2//+TLGO3FOJ48yr6ipwA/wTAMLT/hEMJfBMSuRGlIogC3MJsUdZ//1QSJV4Fi9YbUTMvuF3XXP5oZ/LqnyZACjGGC51r3X1sfbMXQgExXapaZw+le17/0sKHORrwJDcwZe13/Czd6OnyENxsbSfc/3C32P6jvhfiRhjJeGFr7P0n9tAUWGUC0oH2SKYLi19qAirMHhXecj25BBaqnWAfFr5cgwi5Z2QJ9VwaAEVh5zJt72P9c2wLmXJ5w1wP8MowS2uld7v+S3F1/ClsPIK7BGGK/uO3+t+NKSL3Yf2ehn831SoDvt2CVMNWGVT7x7kEs4BL54QRy9RmQc7Y8+5iGah777V29/wjm4tgnUBEEuJ8BvNhoF0HDr7/wkYgw/mBUu7HgrZzBfBp27ad7jhKugl/+zkwwGjZmnkzQ8m/Pt4dfzR6ANckhXhThIBiFchYx1zDg/1Ntjwc2Ip5PzQO8f85l0eN0VDzU++/++WDchTj+Ace+yEEyeEjrAAAAAElFTkSuQmCC); + background-size: 70px 40px; + height: 40px; + width: 70px; + z-index: 1; + position: absolute; + right: 0; + top: 0; +} +.tab-avatar-item-text { + z-index: 2; + font-size: 20px; + font-weight: 600; + line-height: 40px; + height: 40px; + position: relative; + margin: 0 auto; +} +.logo { + font-size: 12px; + font-family: "tttgbnumber"; + text-align: center; + color: #7994a7; +} +.bottom-msg { + font-size: 12px; + font-family: "tttgbnumber"; + text-align: center; + color: #7994a7; + margin-bottom:5px; + margin-top:-5px; +} + +.basicInfo{ + padding: 5px 5px 10px; + background: #f5f5f5; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); + border-radius: 15px; + position: relative; + margin-bottom: 12px; +} +.basicInfo_header{ + display: flex; +} +.basicInfo_icon { + display: inline-block; + position: relative; +} +.basicInfo_icon{ + background-image: url(../../img/icon/七圣召唤.png); + background-size: 70px 70px; + background-repeat: no-repeat; + width: 67px; + color: #fff; + text-align: center; + font-size: 35px; + line-height: 70px; + margin: 10px 10px 0; +} +.basicInfo_right{ + display: inline-block; + width:calc(78% - 15px); + padding: 10px 0px; + margin-left: 7px; +} +.basicInfo_right .item{ + width: 100%; + padding: 5px 10px 0; + height: 29px; + color: #877254; + font-size: 13px; + border:1px solid #ebeadc; + margin: 5px 0; + background-color: #f5eee4; + display: flex; +} +.basicInfo_right .item div:first-child { + width: 50%; +} +.basicInfo_right .item div:nth-child(2) { + width: 50%; + text-align: right; +} +.basicInfo_covers{ + display: flex; + width: 100%; +} +.basicInfo_covers div{ + padding: 5px; +} +.basicInfo_covers img{ + width: 100%; + height: 100%; + border: 2px solid #c3b6aa; + border-radius: 5px; +} \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/roleIndex/roleIndex.html b/src/Yunzai-Bot/plugins/genshin/resources/html/roleIndex/roleIndex.html new file mode 100644 index 0000000000000000000000000000000000000000..f3bd70ca7d250e16c39a59cfbdf37ecc5db2274b --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/roleIndex/roleIndex.html @@ -0,0 +1,182 @@ + + + + + + + + + + + + + {{@headIndexStyle}} + + +
+
+
ID: {{uid}}
+
{{activeDay}}
+ +
+
+
数据总览
+ {{each line val}} +
+ {{each val item}} +
+
{{item.num}}
+
{{item.lable}}
+
+ {{/each}} +
+ {{/each}} +
+ {{if avatars.length>0}} +
+
我的角色
+ {{each avatars val}} +
+
+ {{ if val.actived_constellation_num>0}} + {{val.actived_constellation_num}}命 + {{/if}} +
+ +
Lv.{{val.level}} ❤{{val.fetter}}
+
+
+
+
+ +
+
+
+
{{val.weapon.showName}}
+
+ Lv.{{val.weapon.level}}{{ if val.weapon.affix_level>1}}{{val.weapon.affix_level}}{{/if}} +
+
+
+
+ + {{/each}} +
+ {{/if}} {{if basicInfo.level>0}} +
+
七圣召唤
+
+
{{basicInfo.level}}
+
+
+
已收集角色牌
+
{{basicInfo.avatar_card_num_gained}}/{{basicInfo.avatar_card_num_total}}
+
+
+
已收集行动牌
+
{{basicInfo.action_card_num_gained}}/{{basicInfo.action_card_num_total}}
+
+
+
+
+ {{each basicInfo.covers val}} +
+ {{/each}}
+ +
+ {{/if}} + {{if abyss.time}} +
+
+
+
ID:{{uid}}
+
时间:{{abyss.time}}
+
+
+
最深抵达:{{abyss.max_floor}}
+
星数:{{abyss.totalStar}}
+
+
+
+
出战角色
+
+ {{each abyss.list val}} +
+ {{ if val.life>0}} + {{val.life}}命 + {{/if}} + +
{{val.value}}次
+ +
+ {{/each}} +
+
+
+
战斗数据
+
+
战斗次数:{{abyss.total_battle_times}}次
+
+ 最多击破:{{abyss.defeat.num}} + +
+
+
+
+ 承受伤害:{{abyss.take_damage.num}} +
+
+ 元素战技:{{abyss.normal_skill.num}} +
+
+
+
+ 最强一击:{{abyss.damage.num}} +
+
+ 元素爆发:{{abyss.energy_skill.num}} +
+
+
+
+ {{/if}} + {{if msg}} +
{{msg}}
+ {{/if}} + +
+ + + diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/roleList/crown.png b/src/Yunzai-Bot/plugins/genshin/resources/html/roleList/crown.png new file mode 100644 index 0000000000000000000000000000000000000000..177c58e440b67498235bfdbcfa402c68e8937293 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/html/roleList/crown.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/roleList/roleList.css b/src/Yunzai-Bot/plugins/genshin/resources/html/roleList/roleList.css new file mode 100644 index 0000000000000000000000000000000000000000..0d46fad7eb78f581f8aac0b5938f6a4b23f69a9b --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/roleList/roleList.css @@ -0,0 +1,507 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: "HYWenHei-55W"; + src: url("../../../../../resources/font/HYWenHei-55W.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} + +body { + font-size: 18px; + color: #1e1f20; + font-family: PingFangSC-Medium, PingFang SC, sans-serif; + transform: scale(1.7); + transform-origin: 0 0; + width: 465px; +} + +.container { + width: 465px; + padding: 20px 15px 10px 15px; + background-color: #ececec; +} + +.weapon_mode .for_talent { + display: none !important; +} + +.talent_mode .for_weapon { + display: none !important; +} + +.head_box { + border-radius: 15px; + font-family: tttgbnumber; + padding: 10px 20px; + position: relative; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); +} + +.head_box .id_text { + font-size: 24px; +} + +.head_box .day_text { + font-size: 20px; +} + +.head_box .genshin_logo { + position: absolute; + top: 1px; + right: 15px; + width: 97px; +} + +.logo { + font-size: 12px; + font-family: "tttgbnumber"; + text-align: center; + color: #7994a7; + position: relative; + text-align: center; + padding-left: 10px; +} + +.logo span { + position: absolute; + right: 0px; + font-size: 12px; + transform: scale(0.8); + transform-origin: right center; +} + +.data_box { + border-radius: 15px; + margin-top: 20px; + margin-bottom: 20px; + padding: 20px 15px 5px 15px; + background: #f5f5f5; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); + position: relative; +} + +.tab_lable { + position: absolute; + top: -10px; + left: -8px; + background: #a98242; + color: #fff; + font-size: 14px; + padding: 3px 10px; + border-radius: 15px 0px 15px 15px; + z-index: 20; + font-family: HYWenHei-55W; +} + +.data_line { + display: flex; + justify-content: space-around; + margin-bottom: 14px; +} + +.data_line_item { + width: 100px; + text-align: center; + /*margin: 0 20px;*/ +} + +.num { + font-family: tttgbnumber; + font-size: 24px; +} + +.num .unit { + font-size: 12px; +} + +.data_box .lable { + font-size: 14px; + color: #7f858a; + line-height: 1; + margin-top: 3px; +} + +.head_box { + background-position-x: 42px; + background-repeat: no-repeat; + background-size: auto 101%; +} + +.data_box { + +} + +.talent_list { + display: table; + border-collapse: collapse; + width: calc(100% + 30px); + margin: 0 -15px -5px; + font-size: 12px; + /* border-radius: 0 0 15px 15px; */ + overflow: hidden; +} + +.talent_list .avatar { + display: table-row; + font-family: tttgbnumber; +} + +.talent_list .avatar { + display: table-row; +} + +.talent_list .th { + font-family: HYWenHei-55W; +} + +.talent_list .avatar > div { + box-shadow: 0 0 0.5px 0 #555 inset; +} + +.talent_list .avatar:nth-child(odd) { + background: #e0e0e0; +} + +.talent_list .avatar:nth-child(even) { + +} + +.talent_list .avatar:nth-child(1) { + background: #ccc; + +} + +.talent_list .avatar > div { + display: table-cell; + text-align: center; + height: 30px; + vertical-align: middle; + line-height: 30px; +} + +.talent_list .avatar .index { + color: #333; + width: 30px; + padding-left: 5px; + +} + +.talent_list .avatar .name_cont { + width: 80px; +} + + +.talent_list .avatar .star4 { + background: rgba(137, 189, 233, .6); +} + +.talent_list .avatar .star5 { + background: rgba(239, 214, 137, .6); +} + +.talent_list .avatar .name_cont { + width: 80px; +} + +.talent_list .avatar .name { + text-align: left; + display: flex; + width: 80px; +} + +.talent_list .th .name { + justify-content: center; +} + +.talent_list .avatar .name .avatar_img { + width: 26px; + height: 26px; + position: relative; + margin-right: 3px; +} + +.talent_list .avatar .name img { + width: 100%; + height: 100%; + position: absolute; + top: -3px; + margin-left: 3px; +} + +.talent_list .avatar .name .avatar_name { + white-space: nowrap; + overflow: hidden; + width: 48px; + font-family: "HYWenHei-55W"; +} + +.talent_list .avatar .res { + font-size: 12px; + width: 90px; +} + +.talent_list .avatar .res img { + width: 20px; + height: 20px; + vertical-align: middle; +} + +.talent_list .avatar > div.lvl90 { +} + +.talent_list .avatar > div.fetter10 { + background: url("../../img/other/fetter10.png") center center no-repeat; + background-size: contain; +} + +.talent_list .cons span { + display: inline-block; + width: 14px; + height: 18px; + line-height: 18px; + vertical-align: middle; + border-radius: 4px; + margin-bottom: 2px; +} + +.talent_list .life0 { + color: #666; +} + +.talent_list .life1 { + background-color: #71b167; + color: #fff; +} + +.talent_list .life2 { + background-color: #369961; + color: #fff; +} + +.talent_list .life3 { + background-color: #4596b9; + color: #fff; +} + +.talent_list .life4 { + background-color: #4560b9; + color: #fff; +} + +.talent_list .life5 { + background-color: #531ba9cf; + color: #fff; +} + +.talent_list .life6 { + background-color: #ff5722; + color: #fff; +} + +.talent_list .avatar .weapon { + text-align: left; + width:148px; +} + +.talent_list .avatar .weapon_1 { + box-shadow: 0 0 4px 0 #a3a3a3 inset; + background: #ebebebaa; +} + +.talent_list .avatar .weapon_2 { + box-shadow: 0 0 4px 0 #51b72fbd inset; + background: #ddffdeaa; +} + +.talent_list .avatar .weapon_3 { + box-shadow: 0 0 4px 0 #396cdecf inset; + background: #ddebffaa; +} + +.talent_list .avatar .weapon_4 { + box-shadow: 0 0 4px 0 #c539debf inset; + background: #ffddf0aa; +} + +.talent_list .avatar .weapon_5 { + box-shadow: 0 0 4px 0 #deaf39 inset; + background: #fff6dd; +} + +.talent_list .avatar.th > div { + box-shadow: none; +} + +.talent_list .avatar.th .name, +.talent_list .avatar.th .weapon { + text-align: center; +} + + +.talent_list .avatar .weapon_icon { + width: 20px; + height: 20px; + position: relative; + display: inline-block; + +} + +.talent_list .avatar .weapon_icon span { + position: absolute; + top: 0; + right: 0; + transform: scale(.5); +} + +.talent_list .weapon img, +.talent_list .talent_res img { + width: 20px; + height: 20px; + vertical-align: middle; + margin-bottom: 2px; +} + + +.talent_list .weapon .weapon_box { + display: flex; + align-items: center; +} + +.talent_list .weapon .weapon_box span { + +} + +.talent_list .weapon .weapon_lv { + width: 30px; + margin-left: 8px; +} + +.talent_list .weapon .weapon_alv { + width: 14px; + text-align: center; + height: 18px; + line-height: 18px; + padding: 0 3px; + border-radius: 4px; + margin-right: 5px; +} + +.talent_list .weapon .weapon_alv_0 { + background-color: #555; + color: #fff; +} + +.talent_list .weapon .weapon_alv_1 { + background-color: #45b97c; + color: #fff; +} + +.talent_list .weapon .weapon_alv_2 { + background-color: #45abb9; + color: #fff; +} + +.talent_list .weapon .weapon_alv_3 { + background-color: #4560b9; + color: #fff; +} + +.talent_list .weapon .weapon_alv_4 { + background-color: #b545b9; + color: #fff; +} + +.talent_list .weapon .weapon_alv_5 { + background-color: #ff5722; + color: #fff; +} + + +.talent_list .weapon .weapon_name { + flex-grow: 1; + max-width: 60px; + overflow: hidden; + white-space: nowrap; + padding-left: 2px; + margin-left: 2px; + font-family: "HYWenHei-55W"; +} + +.talent_list .talent_res { + color: #333; +} + +.talent_list .talent_res.today_talent { + box-shadow: 0 0 4px 0 #deaf39 inset; + background: #fff6dd; +} + + +.talent_list .talent { + color: #333; +} + +.talent_list .avatar > div.talent_plus { + +} + +.talent_list .talent_plus { + color: #006cc7; + font-weight: bold; + font-size: 13px; + position: relative; + text-shadow: 0px 0px 1px #fff; + +} + +.talent_list .lv1 { + background: rgba(60, 63, 65, .3) +} + +.talent_list .lv2 { + background: rgba(23, 184, 58, .5) +} + +.talent_list .lv2.talent_plus { + color: #005800; +} + +.talent_list .lv3 { + background: rgba(27, 128, 212, .5) +} + +.talent_list .lv4 { + background: rgba(146, 90, 255, .55); +} + +.talent_list .lv4.talent_plus { + color: #720465; +} + +.talent_list .lv5 { + background: url("./crown.png") center center no-repeat rgba(255, 36, 26, .55); + background-size: contain; +} + +.talent_list .lv5.talent_plus { + color: #b70000; + +} + +.talent_notice { + color: #888; + font-size: 12px; + text-align: right; + padding: 12px 5px 5px; +} \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/roleList/roleList.html b/src/Yunzai-Bot/plugins/genshin/resources/html/roleList/roleList.html new file mode 100644 index 0000000000000000000000000000000000000000..1a007558d60996c84183fb4be7971b94e903854c --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/roleList/roleList.html @@ -0,0 +1,87 @@ + + + + + + + + {{@headStyle}} + + +
+
+
+
+ ID: {{uid}} +
+
共{{avatars.length }}名角色
+ +
+ +
+
角色技能列表
+
角色详情列表
+
+
+
#
+
角色
+
等级
+
好感
+
命座
+
普攻
+
技能
+
爆发
+
武器
+
天赋素材(周)
+
+ {{each avatars avatar idx}} +
+
{{idx+1}}
+
+
+
+ +
+
+ {{abbr[avatar.name] || avatar.name}} +
+
+
+
{{avatar.level}}
+
{{avatar.fetter == 10 ? '' : avatar.fetter}}
+
{{avatar.cons}}
+
{{avatar.a}}
+
{{avatar.e}}
+
{{avatar.q}}
+
+ {{if avatar.weapon_name}} +
+ + Lv{{avatar.weapon_level}} + + {{avatar.weapon_affix_level}} + + {{abbr[avatar.weapon_name] || avatar.weapon_name}} +
+ {{/if}} +
+
+ {{if avatar.talent}} + + {{avatar.talent}}({{avatar.talentWeek}},{{avatar.talentWeek+3}}) + {{else}} + - + {{/if}} +
+ +
+ {{/each}} +
+

{{talentNotice}}

+
+ +
+
+ + + \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/todayMaterial/item_bg.png b/src/Yunzai-Bot/plugins/genshin/resources/html/todayMaterial/item_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..6663dffbe5ed53b3fb3330138cb9719ddfa4687c Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/html/todayMaterial/item_bg.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/todayMaterial/todayMaterial.css b/src/Yunzai-Bot/plugins/genshin/resources/html/todayMaterial/todayMaterial.css new file mode 100644 index 0000000000000000000000000000000000000000..cf2ba7f42911c68fba42d4ac7e6fb9325710064f --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/todayMaterial/todayMaterial.css @@ -0,0 +1,507 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + font-size: 16px; + color: #1e1f20; + max-width: 680px; + transform: scale(1.5); + transform-origin: 0 0; +} +.container { + padding: 20px 20px; + background-color: #f5f1eb; + position: relative; +} +.main_box { + margin-bottom: 40px; +} +.base_info { + display: flex; + position: relative; + margin-bottom: 9px; + color: #504c49; + font-family: tttgbnumber; + font-size: 24px; + padding: 0 10px; +} +.base_info .id { + flex: 1; + line-height: 18px; + padding-left: 10px; +} +.base_info .id:before { + content: " "; + position: absolute; + width: 5px; + height: 24px; + border-radius: 1px; + left: 10px; + top: -3px; + background: #d3bc8d; +} +.base_info .day { + line-height: 18px; +} +.ele_info { + display: flex; + margin: 30px 0px 14px 0px; + padding: 0 10px 10px 0px; + position: relative; + display: flex; + flex-flow: row nowrap; + justify-content: space-between; +} +.tab-line { + position: absolute; + bottom: 0; + left: 2%; + z-index: 1; + height: 1px; + background: #eae4db; + width: 96%; +} +.ele_info .area { + position: relative; +} +.tab-item-icon { + width: 36px; + height: 36px; + position: absolute; + background: #c3b6aa; + z-index: 2; + border-radius: 50%; + left: 21px; + top: 7px; +} +.tab-item-left { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH8AAABACAMAAAAET1hZAAABWVBMVEUAAADt5NXx6t7x6d3r4tPx6t7w6dzx6t7v5tnx6t7x6t7o3c3t49Tx6t7w6Nvs5Nbx6t7x6t7x6t7o3s3s5Nbq387x6t7k2cjx6t7s49Px6t7x6t7x6t7x6t7x6t7p3s3r4dHq4NDq387x6t7x6t7t5Nbp3s7u5tjx6t7s49Tq387l2snq387l2snx6t7x6t7s49Tk2cjx6t7x6t7s4tLw6Nvm28rx6t7s49Tl2sns49Tm28rx6t7s49Tx6t7x6t7x6t7s49Tq387q387s49Tk2cjq387x6t7k2cjk2cjs49Tk2cjm28rn3Mvx6t7j2Mbx6t7x6t7q4dLj2Mbx6t7x6t7l2sns49To3czx6t7s49Tm28rs49Tj2Mfl2snl2sns49Ts49Tq387q387q387x6t7r4tTq387l2snp3s3x6t7m28ro3czj2Mfk2cjn3Mvi18bs49To3cu60oRAAAAAZ3RSTlMACPwCFZ07IgP5dxwF7h0LyrprNhfr6N3TzcOypJODcltQSEY0MCIRDf769PPn28+2jX5oZlVDQir9+vjx6uTe2tbTx728t6urpp6Uf29fWFBMGfrr6uni4N/d1dLPzsaupJePd3MtOW819gAABTxJREFUWMPFmVV3IjEUgC+u9W63slu3dXd3d3dfIpNMyv9/2EsgZIbpMIQtp98D5UzhfPfGb4BuFFf/7BudSrMBEi9Pnbk3xGIYvL+wvyE/mjt1DnaBQg4bfXR8GHaF1HyJlXLn8V322Yk7e5UIoJQS3KvtGBAlf42lc5j6yydfhJBBmnbqJHD1Z8ppNroK8PfBBdKBVMIPfZlS6iH4Z8f8m3MsPV+Eyn0ZsYtg6rTO8RGRGvwv53WP/r8/O8qmVqD4+zARstNOaFvucyk06Nafa75yz7klOvTT7HoBKrfwH1IFA0BT3XzFI0KJcHhcQzi+82n//pFRNj0JE291jlIEklfEfMGXelCSMDyIR/vzZ+bY0SycPdSUUSFs25sZx4XJPM7v6xeP9uEvszcFWL6EPh4MQCpCTcsrY4/3N+A+jkZXfz6dXoGJQ43eVr7W6QCE4CZ5Y0/0e/qFOvlTR9k8TB5pDjfltVpACjPnPaEwnN78dQ+pYwQO/pPsWLV4pz3eqXF67Z6XxMWvobRXf6HE8rBASDgA32TPdfKufoT26M+xHFQOkXAABipN8q75myZI8g+X0gW4TwIoaT+F8z9BH+dH8CXZv5/tg/PhHUfIdvZq2+ylhSAxfk2SvzrF1uBB53YnTfZyG3lz+W95m61A4vxId//a2BhkX8nOAIid91E5Cc8v6vm8EUyMn3b1Z1KT8AR9nRpeM+tA6LEym2EntLH8hvyWpPXvVk2KSADNFqDBLsD3MbPKNAP3o36ku3+D2i0n0gUUp4N5Iv1ad6he/6N+Gu8/vQRLZsWPBKBpBaCPIYl42AVO+c8ch9N6vVPdA7CbUWIb+A7+M1sH8tWbMQEI2V6C7aLYSxv07K9c2dr6mK3s0ZboZBeStgJQLid/2qt/+MYWMpNdvxkTgDn/EF5zAgNI9mcWMfsG75ZSj/fYkRae8I5m2wRJ/tOYvGFmMbV4MBoA0ncAif789wNGf/HH2tpP3c6d662dd+4BJPb/+Zmm/vbw+t32hkci6IOYKz2Nv9Txhv5hcfmweWpWYuc+cO//BiOfMfvi8sGapePAY5ZeuuPjXzNx4GJhA8d+UgBC8AHMf+T4Q1gwjziPDYAIIeq92usO/uUJOGu+aA7/JoBIHez1ZK877r+pg+aoKwS1O04/EdBG/eO0/1Y3R+CuaXa73ipBHCOwBxAn//ixMizanDGArlWHFEpybxs39Tji113PP3l2NTNy2Ohtxe3HVV1SIK0LD9oAZZwTbe/n/HedrcCvwN5nZpoXW/ZJHYJE7DNt7+f8C2U2BpVL+vgVDoDKrpWf1XOk7/M/bA6xPJyQkbNvculp3f3XP8hJbICRI6HUTO1dN30QT4K/luzfeM2ew1LHeq9o6/QtBlz/IqfY1Q14RAx2CJhhKAda/0NmFkvg1NfoqW+w9x+W4SF2Cib3RvT22lEIF39Pd2AQ4AUrnYP1I516TszVoxkGyf667+umd/LDPLu8Cuu6Bew+y5UiNHj5mejXON3/2VuQoVXIfjMXcK2CCKU82AtSdvXbK1hnf/Eeu7wC1RNC+UYvhF7sZXswUC5VJAYexDefdfZDMcfS5Qyc/WT1pgjkNgKPE9FAhuX6vU69bz9kTqbZ2CRUF/bUwvW4DP/yQn2zAyGygZU7+SOcm2JD4xkYWXiv9ZEfQCxUb7ktYu683f3wco6xY88zABOP9srO359cyyB3P/LiGmPTTzfxXeXZ49pAgW1JjX9grLTvTBZ2i+rTWYZM58qwWxTKsyU2aKArqfz4/rlZNkD+AS9t0igJhV9uAAAAAElFTkSuQmCC); + background-size: 80px 50px; + height: 50px; + width: 80px; + z-index: 1; + position: absolute; + left: 0; + top: 0; +} +.tab-item-middle { + z-index: 0; + height: 50px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAABAAgMAAABNSE7QAAAACVBMVEUAAADq387x6t7Yd13LAAAAAXRSTlMAQObYZgAAABNJREFUCNdjWACEIBBAZwgEILsBAMsUAXqDjfEAAAAASUVORK5CYII=); + background-repeat: repeat-x; + background-size: contain; + position: absolute; + left: 40px; + right: 40px; + width: auto; +} +.tab-item-right { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH8AAABACAMAAAAET1hZAAABblBMVEUAAADj2Mfx6t7x6d3t5dft5dft49Tv5tnx6t7x6t7x6t7s49Ts4tPx6t7r4dLx6t7x6t7x6t7x6t7x6t7x6t7t49Xx6t7p3s7w6dzq387l2sns49Tx6t7n3Mvx6t7x6t7t5NXr4dDw6dzq4NDv59nl2snl2snq387l2snx6t7s4tLx6t7x6t7x6t7s49Tx6t7x6t7x6t7m28rx6t7x6t7q387x6t7x6t7p3s3p4M/l2snw6Nvs49To3czq387s49Tk2cjx6t7q387k2cjx6t7o3czk2cjx6t7s49Tk2cjo3czn3Mvj2Mbx6t7o3czq387q387q387x6t7s49Ts49Ts49Tx6t7s49Ts49Tq387x6t7s49Ts49Ts49Tj2Mfx6t7x6t7l2sns49Tq387x6t7i18bx6t7i18Xq387x6t7x6t7v59nx6t7q387l2snp3s3x6t7m28ro3czn3Mvl2cjj2Mbs49To3cvk2Mfh1sXXumlfAAAAbXRSTlMA/vwCChcIA/nuIxQFdx0O6tu6a0ZENyIf69rNyrmym2VbVFA0+fTz6OXY09DCtqSelZSDfnJoTUk9Ny8qG/z64t7Rz83FpaGekHZvWDsvE/n48uvp4t/d0srFvbyurayqqKSXjoqFgnx5dVw9oah5bgAABV1JREFUWMPFmQV34zAMx+3y1nYdb3c33o55jMfMzMw0Q2K32bc/OVnqpk0D3fr6f3uDJstPkm1ZchBroxK9Y2f/zGVRkFjb1fVxJoM6pKHlyT5lwvlu1DGNDozBUNxsYsH2vsngeGdH4lpdGr99Lw+Qzckcyy2k2soHUY6llFhYNcL46t0tCMJkgl3+t598SqkBgh+ej00sLVInceMBQsPXWKKY3A8+NSqcq8cKC76IIIRXqCcIgtTJ+tCDsgsJNlHaIx+cVmiAOt+FwCCIOTdp9R6CsdcCgcnRO1k02MvG8nvhUxPgnHBbXgDYQAz3vgr8XXtVCvjw+hbq7mOn8q3ywXMtL94ZDIwt072ZyJoQYGHH5tg6Sp9kY6k4fA03FdT05+soYO6uRj0GGFPHpCNDKN3HJpKx+TDjTG6CgvnKAumOAiVS1OI52HN4FXX3smJMPvgOMkL42gI3BBxjG28bZEr1x5F1NJhI3I/DB3rFAFWi8QEoHSIwMRa73huAVzqWRj9YXyYy30kyAfzAEBhYStsWCnhH49nCKbYYlQ/02HxQ1QATm/ZjapbjHTTMcnozCnM+nv86BEJnRI1XOtKDzrFJzQ+iU1AzPieBklg/ScjaK59RdyI3GspX7GZ820Ut3wjIagQE9l7aRDfZtxA+pU35xPF81w5hYZDwMWAHu97XXb2BNlhvIZBPm/AVkpsG9a5Pok1oXASkHi8O51F//0YQn/rzVQKm/v+gVr3whB87d/KG2EhxF6VTyQA+9eMDHRwPWKmAbMSTBjwW26+RVhieut4r14NlCilcPKENwdeb0YWHAI7lPwTfiLBREIl38dtN8eo5s2h2Kg7fDPVdbzkevFWPl3Y+nEJnDsXgR/Fdp7pq8hVY+OOvFNbK5ZnofBqnC5A7Dp4K2ZiT7EsHevIvy+VnPcF8jd+OJU7c+qcJ/spI/lAZdKInAl87H0/cmw70rDzwKzP7vGzr6XQylN86nvjhL0xnpsF5VyemAvit4ynBvnjQ1wcbXy5W+e/XwudffLyJJWlQdTscHxl959APbbZl/HXsvVnX1dHV7C2FP5Npx/ynlhR+5dC21qPV7Nty+VWqHeufYxyCBx14OHKxPIci8ytRLahgv9gL6eA5d+9bQrfOxMn/lUgWGLrv9atFDSndhwyhuaFY+6/qf2g43fItBIm7M7hF8eNMvP0/vPwAupSWfyug87E7EOMoVSpEj3+1AgEZlPrAuSWxCOxEDIl1LKbR72sDLdR/tgWEc7UklJzjEF19+jXkpqcbt5QBR1PJ42y4pfrX9PQdAmTDBWmGN3RZYsuCeMyjQdbXev2vpA0I7AIF9eJBGB/eQv2suKf+R9sQiOd+VaD1HRrQrlJ4/xfED8dD7CtuD+4J0qUUuL/Y9v4X71bgVO54x2gWzbDeUlv7f7E78fTga82j0nG23N7zD30K1lAJXs2gs+x0Ms75D5Dj8DHgwHl/Aw6m0TLrGo17/gX5vxLG1wNvumeQvN6AYyNoKMdWWjj/A3QEvoWxMHUzJnl1X8a29yNorosttHb+qZiBfGE5kdeFiN3u6PR/PY2Gu9j5Vs9/DQXXapjxUnBavVfYCd9N//bx4+0CGnzCPmXj83UQHKzXBECpsocbms4toCtpAw6uoWQxwc5pvObHN0GALOzIApRJvW9hLJ2EDbviWyqgdD9LLCb35f2HWY0+53XlKa1WoNqAE0splBzoYscH2/b+SR8DSQhIVfDrwfl1hJIrpxibSCMfflv1855qcktTJxm7vII6ovzM2RxjLwYyqAMqnjvJQG/+Fjr2/jl3utjdofffpyfOD9xPoSD9B3QMEaQ3IFb0AAAAAElFTkSuQmCC); + background-size: 80px 50px; + height: 50px; + width: 80px; + z-index: 1; + position: absolute; + right: 0; + top: 0; +} +.tab-item-text { + position: relative; + z-index: 2; + color: #504c49; + font-weight: 700; + font-size: 26px; + height: 50px; + line-height: 50px; + padding-left: 70px; + padding-right: 40px; +} +.ele_box { + display: flex; +} +.ele_box .ele_name { + font-size: 26px; + color: #504c49; + font-weight: 600; + line-height: 50px; + margin-right: 10px; +} +.ele_box .ele_img { + display: flex; +} +.ele_box .ele_img .img_item { + width: 50px; + height: 50px; + background-image: url(./item_bg.png); + background-size: 100%; + background-repeat: no-repeat; + margin-right: 3px; +} +.ele_box .ele_img .img_item img { + padding: 4px; + width: 100%; + height: 100%; +} +.item_box { + display: flex; + flex-wrap: wrap; +} +.item { + margin: 0px 0 10px 10px; + border-radius: 7px; + overflow: hidden; + box-shadow: 0 3px 6px 0 rgb(132 93 90 / 40%); + width: 95px; + background: #e9e5dc; +} +.role_box { + overflow: hidden; + height: 95px; + width: 95px; + position: relative; + background: #e9e5dc; +} +.role_box .role_img { + width: 100%; + overflow: hidden; + background-size: 100%; + background-repeat: no-repeat; + position: absolute; + top: 0; + /*filter: contrast(95%);*/ +} +.talent { + height: 23px; + padding: 3px 3px; + display: flex; + justify-content: center; + font-size: 16px; + color: #222; + font-family: tttgbnumber; +} +.talent-item { + width: 20px; + height: 16px; + line-height: 17px; + margin: 0 3px; + text-align: center; + display: block; + background-size: contain; + opacity: 0.8; + position: relative; + border-radius: 3px; + box-shadow: 0 0 1px 0 rgba(0, 0, 0, 0.5); +} +.bg105 { + background-image: url(../../img/other/bg105.png); + width: 100%; + height: 95px; + background-size: 100%; + background-repeat: no-repeat; +} +.bg5 { + background-image: url(../../img/other/bg5.png); + width: 100%; + height: 95px; + /*filter: brightness(1.1);*/ + background-size: 100%; + background-repeat: no-repeat; +} +.bg4 { + width: 100%; + height: 95px; + background-image: url(../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} +.item .text_box { + font-size: 12px; + background: #e9e5dc; + padding: 5px 0px 4px 0px; + font-family: tttgbnumber; + display: flex; + align-items: flex-start; +} +.item .text_box .weapon_box { + flex: 0 0 34px; + width: 34px; + height: 34px; + padding: 2px; + border-radius: 5px; + background: rgba(0, 0, 0, 0.6); + overflow: hidden; + margin-left: 3px; +} +.item .text_box .weapon_boder { + border: 1px solid #d3bc8d; + border-radius: 5px; + width: 30px; + height: 30px; + overflow: hidden; +} +.item .text_box .weapon_img { + width: 100%; + transform: scale(1.2, 1.2); +} +.item .text_box .weapon_name_box { + margin-left: 3px; + white-space: nowrap; +} +.item .text_box .weapon_name_box .weapon_level { + margin-top: 2px; +} +.item .text_box .weapon_affix { + border-radius: 2px; + background-color: #ff5722; + padding: 2px 3px; + color: #fff; + display: inline-block; + transform: scale(0.8); + transform-origin: 12px 7px; +} +.role_box .fill_img { + position: absolute; + width: 15px; + right: 0; + bottom: 17px; +} +.role_box .desc { + font-weight: 500; + text-align: center; + line-height: 22px; + position: absolute; + bottom: 0; + background: rgba(0, 0, 0, 0.6); + color: #ececec; + width: 100%; + height: 22px; + font-size: 16px; + font-family: tttgbnumber; +} +.role_box .role_name { + /* overflow: hidden; */ + white-space: nowrap; + margin-top: 5px; + font-weight: 500; + text-align: center; + font-size: 14px; + /*margin-top: 5px;*/ +} +.role_box .life { + position: absolute; + top: 0px; + right: 0px; + z-index: 9; + font-size: 16px; + text-align: center; + color: #fff; + border-radius: 2px; + padding: 1px 3px; + border-radius: 3px; + font-family: "tttgbnumber"; +} +.life1 { + background-color: #62a8ea; +} +.life2 { + background-color: #62a8ea; +} +.life3 { + background-color: #45b97c; +} +.life4 { + background-color: #45b97c; +} +.life5 { + background-color: #ff5722; +} +.life6 { + background-color: #ff5722; +} +.base_info span { + margin-left: 5px; +} +.avatar { + height: 24px; + width: 24px; + background-color: #ffb285; + vertical-align: -5px; + margin-left: 2px; + margin-right: 3px; + border: 1px solid #ffb285; + border-radius: 100%; +} +.heart { + background-image: url(./心形.png); + background-size: 100%; + background-repeat: no-repeat; + background-position: center; + z-index: 10; + color: #fff; + font-family: tttgbnumber; + text-align: center; + font-size: 12px; + margin-left: 5px; + display: inline-block; + width: 15px; +} +.fetter { + display: inline-block; + transform: scale(0.8); +} +.explain { + color: #757c83; + font-size: 16px; + position: absolute; + left: 30px; + bottom: 10px; +} + +.weapon_box { + display: flex; + flex-wrap: wrap; +} +.weapon_item { + width: 65px; + margin: 0px 0 10px 12px; + position: relative; +} +.weapon_role_box { + overflow: hidden; + height: 80px; + border-radius: 5px; + position: relative; + /*border: 2px solid #d3bc8d;*/ + background: #e9e5dc; + box-shadow: 0 2px 6px 0 rgb(132 93 90 / 30%); +} +.weapon_role_box .weapon_role_img { + width: 100%; + overflow: hidden; + background-size: 100%; + background-repeat: no-repeat; + position: absolute; + top: 0; + /*filter: contrast(95%);*/ +} +.weapon_bg5 { + background-image: url(../../img/other/bg5.png); + width: 100%; + height: 70px; + /*filter: brightness(1.1);*/ + background-size: 100%; + background-repeat: no-repeat; +} +.weapon_bg4 { + width: 100%; + height: 70px; + background-image: url(../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} +.weapon_bg3 { + width: 100%; + height: 70px; + background-image: url(../../img/other/bg3.png); + background-size: 100%; + background-repeat: no-repeat; +} +.weapon_bg2 { + width: 100%; + height: 70px; + background-image: url(../../img/other/bg3.png); + background-size: 100%; + background-repeat: no-repeat; +} +.weapon_bg1 { + width: 100%; + height: 70px; + background-image: url(../../img/other/bg3.png); + background-size: 100%; + background-repeat: no-repeat; +} +.weapon_role_box .fill_img { + position: absolute; + width: 15px; + right: 0; + bottom: 17px; +} +.weapon_role_box .desc_1 { + font-weight: 500; + text-align: center; + line-height: 18px; + position: absolute; + bottom: 0; + background: #e9e5dc; + width: 100%; + height: 18px; + font-size: 14px; + font-family: "tttgbnumber"; +} +.role_name { + overflow: hidden; + white-space: nowrap; + margin-top: 5px; + font-weight: 500; + text-align: center; + font-size: 14px; + /*margin-top: 5px;*/ +} +.weapon_role_box .life { + position: absolute; + top: 0px; + left: 0px; + z-index: 9; + font-size: 13px; + text-align: center; + color: #fff; + border-radius: 2px; + padding: 1px 4px; + border-radius: 3px; + font-family: "tttgbnumber"; +} +.life1 { + background-color: #62a8ea; +} +.life2 { + background-color: #62a8ea; +} +.life3 { + background-color: #62a8ea; +} +.life4 { + background-color: #ff5722; +} +.life5 { + background-color: #ff5722; +} +.weapon_user { + position: absolute; + top: -5px; + right: -5px; + z-index: 9; + font-size: 12px; + text-align: center; + color: #fff; + padding: 1px 3px; + border-radius: 100%; + border: 1px solid #fff; + width: 24px; + height: 24px; + background-color: #4e5362; +} +.user_img { + width: 32px; + position: absolute; + top: -12px; + right: -5px; +} diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/todayMaterial/todayMaterial.html b/src/Yunzai-Bot/plugins/genshin/resources/html/todayMaterial/todayMaterial.html new file mode 100644 index 0000000000000000000000000000000000000000..58febf19ea2e57e703ac427065553463e0fcb4b4 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/todayMaterial/todayMaterial.html @@ -0,0 +1,106 @@ + + + + + + + + + + +
+
+
+
+ ID:{{uid}} +
+
+ {{day}} +
+
+ {{each mainList temp}} + {{ if temp.list.length>0}} +
+
+ +
+
+
{{temp.area}}
+
+
+
+
{{temp.name}}
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+ {{ if temp.isTalent}} +
+ {{each temp.list val}} +
+
+ {{ if val.actived_constellation_num>0}} + {{val.actived_constellation_num}}命 + {{/if}} +
+ +
Lv.{{val.level}}
+ +
+ {{ if skill[val.id] && skill[val.id].a }} +
+ {{skill[val.id].a.level_current}} + {{skill[val.id].e.level_current}} + {{skill[val.id].q.level_current}} +
+ {{/if}} +
+ {{/each}} +
+ {{/if}} + {{ if !temp.isTalent}} +
+ {{each temp.list val}} +
+ + + +
+ {{ if val.affix_level>1}} + + {{val.affix_level}} + + {{/if}} +
+ +
Lv.{{val.level}}
+ +
+
{{val.showName}}
+
+ {{/each}} +
+ {{/if}} + {{/if}} + {{/each}} +
+
*根据你所拥有的角色查询今天可升天赋角色
*仅显现已装备的武器
+
+ + + diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/userAdmin/userAdmin.css b/src/Yunzai-Bot/plugins/genshin/resources/html/userAdmin/userAdmin.css new file mode 100644 index 0000000000000000000000000000000000000000..24fa83ea0c0dc240a78bb90232223e6ffc64a652 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/userAdmin/userAdmin.css @@ -0,0 +1,192 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + font-size: 18px; + color: #1e1f20; + font-family: PingFangSC-Medium, PingFang SC, sans-serif; + transform-origin: 0 0; + width: 530px; + background: url("../../img/userAdmin/bg.jpg") top left no-repeat #0a1720; + background-size: 530px auto; +} +.container { + width: 530px; + padding: 20px 15px 15px 15px; + color: #caced9; + background: url("../../img/userAdmin/footer.png") bottom left no-repeat; + background-size: 530px auto; + font-family: tttgbnumber, PingFangSC-Medium, PingFang SC, sans-serif; +} +.stat { + height: 270px; + position: relative; +} +.stat .total { + font-size: 45px; + width: 190px; + height: 50px; + line-height: 50px; + text-align: center; + left: 10px; + top: 75px; + position: absolute; +} +.stat .detail { + position: absolute; + width: 280px; + left: 230px; + top: 45px; +} +.stat .detail li { + list-style: none; + height: 60px; + font-size: 16px; + display: flex; + padding: 5px 0; +} +.stat .detail li strong { + display: block; + text-align: right; + width: 100px; +} +.stat .detail li strong i, +.stat .detail li strong b { + display: block; +} +.stat .detail li strong b { + color: #7fdeff; + font-size: 20px; + height: 35px; + line-height: 35px; +} +.stat .detail li strong i { + font-style: normal; + font-weight: normal; + height: 15px; + line-height: 12px; + font-size: 12px; + color: #aaa; +} +.stat .detail li span { + padding-left: 15px; + display: block; + height: 50px; + line-height: 45px; + font-size: 25px; +} +.stat .detail li span i { + font-style: normal; + font-size: 16px; +} +.stat .cookie-type { + position: absolute; + width: 180px; + left: 20px; + bottom: 38px; + text-align: center; +} +.cont-title { + font-size: 15px; + font-weight: bold; + margin: 10px 0; +} +.uids { + display: flex; + flex-wrap: wrap; + background: rgba(10, 23, 32, 0.7); + border-radius: 10px; + overflow: hidden; + box-shadow: 0 0 1px 0 #caced9 inset, 2px 2px 5px 0 rgba(30, 30, 30, 0.7); +} +.uids .uid { + font-size: 12px; + width: 100px; + padding: 3px 5px; + box-shadow: 0 0 1px 0 #caced9 inset; + text-align: center; + line-height: 30px; + color: #caced9; + text-shadow: 0 0 2px #393f4f; + position: relative; + overflow: hidden; +} +.uids .uid span { + font-family: tttgbnumber; + font-size: 15px; + margin-right: 3px; +} +.uids .uid .uid-inner { + position: relative; + z-index: 100; + white-space: nowrap; + overflow: hidden; +} +.uids .uid.uid-tips { + width: 100%; + background: rgba(50, 50, 50, 0.5); +} +.uid-process { + position: absolute; + z-index: 99; + top: 0; + left: 0; + border-radius: 3px; + background-size: 100% 100%; + background-position: 0 0; + width: 100%; + height: 100%; + opacity: 0.5; +} +.type-0 .uid-process { + background-image: linear-gradient(to right, #7288c4, #5dc1d9); +} +.type-1 .uid-process { + background-image: linear-gradient(to right, #7288c4, #5dc1d9); +} +.type-2 .uid-process { + background-image: linear-gradient(to right, #7288c4, #5dc1d9); +} +.type-3 .uid-process { + background-image: linear-gradient(to right, #7288c4, #5dc1d9); +} +.type-4 .uid-process { + background: #888; + border-radius: 0; +} +.notice { + margin-top: 15px; + background: rgba(10, 23, 32, 0.7); + border-radius: 10px; + overflow: hidden; + box-shadow: 0 0 1px 0 #caced9 inset, 2px 2px 5px 0 rgba(30, 30, 30, 0.7); +} +.notice ul { + padding: 10px 10px 10px 30px; + font-size: 15px; + line-height: 24px; +} +.notice ul li { + padding-bottom: 3px 0; +} +.notice ul li span { + background: rgba(50, 50, 50, 0.5); + padding: 0 5px; + border-radius: 4px; + margin: 0 5px; + color: #7fdeff; +} +.copyright { + text-align: center; + margin: 10px 0 0; +} +/*# sourceMappingURL=userAdmin.css.map */ \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/userAdmin/userAdmin.html b/src/Yunzai-Bot/plugins/genshin/resources/html/userAdmin/userAdmin.html new file mode 100644 index 0000000000000000000000000000000000000000..046bc0c6766eee2bc65d2e290c5b8b1f6600ed64 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/userAdmin/userAdmin.html @@ -0,0 +1,83 @@ + + + + + + + + +
+
+
{{count.last}}
+
    +
  • + + 总用户量 + 用户CK+系统CK + + {{count.total}} +
  • + {{set mysCount = servs?.mys?.count }} +
  • + + 米游社 + 可用CK / 失效CK + + {{mysCount?.total}} + ({{mysCount?.normal}}/{{mysCount?.disable}}) + +
  • + {{set hoyoCount = servs?.hoyolab?.count }} +
  • + + HoyoLab + 可用CK / 失效CK + + {{hoyoCount?.normal}} + ({{hoyoCount?.normal}}/{{hoyoCount?.disable}}) + +
  • +
+ +
+ {{set servName = {mys:'米游社', hoyolab:'HoyoLab'} }} + {{set uidLimit = 60 }} + {{each servs servData servKey}} +
{{servName[servKey]}}-CK列表 (请求次数 / CK-Ltuid)
+
+ {{set listLen = servData.list.length }} + {{if listLen > 0 }} + {{each servData.list uid idx}} {{if idx < uidLimit}} +
+
+ {{uid.num>60 ? "×" : uid.num}} + {{uid.ltuid}} +
+ {{set process = 100 - uid.num/30*100 }} +
+
+ {{/if}} {{/each}} + {{if listLen > uidLimit}} +
还有{{listLen-uidLimit}}个CK记录...
+ {{/if}} + {{else}} +
暂无
+ {{/if}} +
+ {{/each}} +
+
    +
  • 本页面统计的用户数量为CK(通行证 ltuid)数量
  • +
  • 已默认开启全部CK的使用,系统将全局最优化使用查询CK,可大幅降低CK使用次数消耗
  • +
  • 查询注册CK的用户及今日已查询过的uid,不会重复消耗查询次数
  • +
  • 预计剩余查询次数为预计值,仅供参考
  • +
  • 【常用命令】 +
  • #刷新用户缓存: 保留当前请求次数统计,重新加载所有ck文件
  • +
  • #重置用户缓存: 强制重置查询数据,会清空本日请求次数统计
  • +
  • #删除无效用户: 删除当前所有请求失效的用户的CK数据,暂不会删除公共CK
  • +
+
+ +
+ + \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/userAdmin/userAdmin.less b/src/Yunzai-Bot/plugins/genshin/resources/html/userAdmin/userAdmin.less new file mode 100644 index 0000000000000000000000000000000000000000..94b33a564d0b063ef65161efa6a9eb22677b4575 --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/userAdmin/userAdmin.less @@ -0,0 +1,223 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} + +body { + font-size: 18px; + color: #1e1f20; + font-family: PingFangSC-Medium, PingFang SC, sans-serif; + transform-origin: 0 0; + width: 530px; + background: url("../../img/userAdmin/bg.jpg") top left no-repeat #0a1720; + background-size: 530px auto; +} + +.container { + width: 530px; + padding: 20px 15px 15px 15px; + color: #caced9; + background: url("../../img/userAdmin/footer.png") bottom left no-repeat; + background-size: 530px auto; + font-family: tttgbnumber, PingFangSC-Medium, PingFang SC, sans-serif; +} + +.stat { + height: 270px; + position: relative; + + .total { + + font-size: 45px; + width: 190px; + height: 50px; + line-height: 50px; + text-align: center; + left: 10px; + top: 75px; + position: absolute; + } + + .detail { + position: absolute; + width: 280px; + left: 230px; + top: 45px; + + li { + list-style: none; + height: 60px; + font-size: 16px; + display: flex; + padding: 5px 0; + + strong { + display: block; + text-align: right; + width: 100px; + + i, b { + display: block; + } + + b { + color: #7fdeff; + font-size: 20px; + height: 35px; + line-height: 35px; + } + + i { + font-style: normal; + font-weight: normal; + height: 15px; + line-height: 12px; + font-size: 12px; + color: #aaa; + } + } + + span { + padding-left: 15px; + display: block; + height: 50px; + line-height: 45px; + font-size: 25px; + + i { + font-style: normal; + font-size: 16px; + } + } + } + } + + .cookie-type { + position: absolute; + width: 180px; + left: 20px; + bottom: 38px; + text-align: center; + } +} + +.cont-title { + font-size: 15px; + font-weight: bold; + margin: 10px 0; +} + +.uids { + display: flex; + flex-wrap: wrap; + background: rgba(10, 23, 32, .7); + border-radius: 10px; + overflow: hidden; + box-shadow: 0 0 1px 0 #caced9 inset, 2px 2px 5px 0 rgba(30, 30, 30, .7); + + .uid { + font-size: 12px; + width: 100px; + padding: 3px 5px; + box-shadow: 0 0 1px 0 #caced9 inset; + text-align: center; + line-height: 30px; + color: #caced9; + text-shadow: 0 0 2px #393f4f; + position: relative; + overflow: hidden; + + span { + font-family: tttgbnumber; + font-size: 15px; + margin-right: 3px; + } + + .uid-inner { + position: relative; + z-index: 100; + white-space: nowrap; + overflow: hidden; + } + + &.uid-tips { + width: 100%; + background: rgba(50, 50, 50, .5) + } + } +} + +.uid-process { + position: absolute; + z-index: 99; + top: 0; + left: 0; + border-radius: 3px; + + background-size: 100% 100%; + background-position: 0 0; + width: 100%; + height: 100%; + opacity: 0.5; +} + +.type-0 .uid-process { + background-image: linear-gradient(to right, #7288c4, #5dc1d9); +} + +.type-1 .uid-process { + background-image: linear-gradient(to right, #7288c4, #5dc1d9); +} + +.type-2 .uid-process { + background-image: linear-gradient(to right, #7288c4, #5dc1d9); +} + +.type-3 .uid-process { + background-image: linear-gradient(to right, #7288c4, #5dc1d9); +} + +.type-4 .uid-process { + background: #888; + border-radius: 0; +} + +.notice { + margin-top: 15px; + background: rgba(10, 23, 32, .7); + border-radius: 10px; + overflow: hidden; + box-shadow: 0 0 1px 0 #caced9 inset, 2px 2px 5px 0 rgba(30, 30, 30, .7); + + ul { + padding: 10px 10px 10px 30px; + font-size: 15px; + line-height: 24px; + + li { + padding-bottom: 3px 0; + + span { + background: rgba(50, 50, 50, .5); + padding: 0 5px; + border-radius: 4px; + margin: 0 5px; + color: #7fdeff; + } + } + } +} + +.copyright { + text-align: center; + margin: 10px 0 0; +} \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/weapon/weapon.css b/src/Yunzai-Bot/plugins/genshin/resources/html/weapon/weapon.css new file mode 100644 index 0000000000000000000000000000000000000000..439f93689c3581b2df17cd24c9440d3173ed9c5e --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/weapon/weapon.css @@ -0,0 +1,245 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} +body { + font-size: 12px; + color: #1e1f20; + max-width: 580px; + font-family: PingFangSC-Medium, PingFang SC, sans-serif; + transform: scale(1.5); + transform-origin: 0 0; +} +.list8{ + max-width: 342px; +} +.container { + float: left; + min-width: 210px; + padding-right: 15px; + /*border: 1px solid #333;*/ + padding: 10px; + background-color: #ececec; +} +.main_box { + border-radius: 15px; + padding: 10px 10px 6px 0; + background: #fff; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); +} +.base_info { + /*width: 200px;*/ + margin: 0 0 15px 10px; + font-size: 16px; + position: relative; +} +.uid { + font-family: tttgbnumber; + margin-left: 17px; +} +.uid:before { + content: " "; + position: absolute; + width: 5px; + height: 24px; + border-radius: 1px; + left: 0; + top: -1px; + background: #d3bc8d; +} +.lab{ + display: flex; + margin-top: 12px; + flex-wrap: wrap; +} +.lab-item{ + font-size: 14px; + font-family: tttgbnumber; + margin-right: 6px; + margin-bottom: 8px; + background: #F6F7F8; + /* color: #61666D; */ + padding: 0px 10px 2px 6px; + border-radius: 12px; + border: solid 1px #939393; + display: flex; + align-items:center; +} +.lab-item-5{ + background: #d59258; + width: 6px; + height: 6px; + border-radius: 100%; + margin-right: 4px; +} +.lab-item-4{ + background: #9073ba; + width: 6px; + height: 6px; + border-radius: 100%; + margin-right: 4px; +} +.lab-item-weapon{ + width: 16px; + height: 16px; + background-color: #a18479; + border-radius: 100%; + margin-left: -2px; + margin-right: 4px; +} +.lab-item-weapon img{ + width: 100%; + height: 100%; +} +.item_box { + display: flex; + flex-wrap: wrap; +} +.item { + width: 66px; + margin: 0px 0 10px 12px; + position: relative; +} +.role_box { + overflow: hidden; + height: 80px; + border-radius: 5px; + position: relative; + /*border: 2px solid #d3bc8d;*/ + background: #e9e5dc; + box-shadow: 0 2px 6px 0 rgb(132 93 90 / 30%); +} +.role_box .role_img { + width: 100%; + overflow: hidden; + background-size: 100%; + background-repeat: no-repeat; + position: absolute; + top: 0; + /*filter: contrast(95%);*/ +} +.bg5 { + background-image: url(../../img/other/bg5.png); + width: 100%; + height: 70px; + /*filter: brightness(1.1);*/ + background-size: 100%; + background-repeat: no-repeat; +} +.bg4 { + width: 100%; + height: 70px; + background-image: url(../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} +.bg3 { + width: 100%; + height: 70px; + background-image: url(../../img/other/bg3.png); + background-size: 100%; + background-repeat: no-repeat; +} +.bg2 { + width: 100%; + height: 70px; + background-image: url(../../img/other/bg3.png); + background-size: 100%; + background-repeat: no-repeat; +} +.bg1 { + width: 100%; + height: 70px; + background-image: url(../../img/other/bg3.png); + background-size: 100%; + background-repeat: no-repeat; +} +.role_box .fill_img { + position: absolute; + width: 15px; + right: 0; + bottom: 17px; +} +.role_box .desc { + font-weight: 500; + text-align: center; + line-height: 18px; + position: absolute; + bottom: 0; + background: #e9e5dc; + width: 100%; + height: 18px; + font-size: 14px; + font-family: "tttgbnumber"; +} +.role_name { + overflow: hidden; + white-space: nowrap; + margin-top: 5px; + font-weight: 500; + text-align: center; + font-size: 14px; + /*margin-top: 5px;*/ +} +.role_box .life { + position: absolute; + top: 0px; + left: 0px; + z-index: 9; + font-size: 13px; + text-align: center; + color: #fff; + border-radius: 2px; + padding: 1px 4px; + border-radius: 3px; + font-family: "tttgbnumber"; +} +.life1 { + background-color: #62a8ea; +} +.life2 { + background-color: #62a8ea; +} +.life3 { + background-color: #62a8ea; +} +.life4 { + background-color: #ff5722; +} +.life5 { + background-color: #ff5722; +} +.user { + position: absolute; + top: -5px; + right: -5px; + z-index: 9; + font-size: 12px; + text-align: center; + color: #fff; + padding: 1px 3px; + border-radius: 100%; + border: 1px solid #fff; + width: 24px; + height: 24px; + background-color: #4e5362; +} +.user_img { + width: 32px; + position: absolute; + top: -12px; + right: -5px; +} +.tips{ + margin: 0px 0px 6px 12px; + font-size: 12px; + color: #7f858a; +} diff --git a/src/Yunzai-Bot/plugins/genshin/resources/html/weapon/weapon.html b/src/Yunzai-Bot/plugins/genshin/resources/html/weapon/weapon.html new file mode 100644 index 0000000000000000000000000000000000000000..767f29ae167f92c23d77377da887e0482b833f6f --- /dev/null +++ b/src/Yunzai-Bot/plugins/genshin/resources/html/weapon/weapon.html @@ -0,0 +1,77 @@ + + + + + + + + + +
+
+
+
ID: {{uid}}
+ {{ if list.length>8 }} +
+
+
+
五星:{{count.five}}
+
+
+
+
四星:{{count.five}}
+
+
+
+
单手剑:{{count['单手剑']}}
+
+
+
+
双手剑:{{count['双手剑']}}
+
+
+
+
弓:{{count['弓']}}
+
+
+
+
枪:{{count['长柄武器']}}
+
+
+
+
法器:{{count['法器']}}
+
+
+ {{/if}} +
+
+ {{each list val}} +
+ + + +
+ {{ if val.affix_level>1}} + + {{val.affix_level}} + + {{/if}} +
+ +
Lv.{{val.level}}
+ +
+
{{val.showName}}
+
+ {{/each}} +
+
*仅显现已装备的武器
+
+
+ + + + \ No newline at end of file diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/bg.png b/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..c8d064ec4f9b18c4c7a427244a63385d2efa8ff3 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/bg.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/floor10.png b/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/floor10.png new file mode 100644 index 0000000000000000000000000000000000000000..18a364ff351c0b2d37b8b94009913dd77b7a4dfb Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/floor10.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/floor11.png b/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/floor11.png new file mode 100644 index 0000000000000000000000000000000000000000..df319f614349659ead9767dee73bd795f71db49f Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/floor11.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/floor12.png b/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/floor12.png new file mode 100644 index 0000000000000000000000000000000000000000..775233d4739a80fd0d77f23420ad837ffa50d920 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/floor12.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/floor9.png b/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/floor9.png new file mode 100644 index 0000000000000000000000000000000000000000..d22f314caa119eb48766c5238ece391d31167e6a Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/floor9.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/star.png b/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/star.png new file mode 100644 index 0000000000000000000000000000000000000000..fb5901cf81f58aa2a9085e06b51072f94f22fc25 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/abyss/star.png differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\270\203\344\270\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\270\203\344\270\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..1b0e629c27c80390da57035c44d2ace12a613f17 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\270\203\344\270\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\270\275\350\216\216.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\270\275\350\216\216.png" new file mode 100644 index 0000000000000000000000000000000000000000..9ef67f74685df5f1720aa1319e209564fb1280ef Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\270\275\350\216\216.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\271\205\345\262\220\345\277\215.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\271\205\345\262\220\345\277\215.png" new file mode 100644 index 0000000000000000000000000000000000000000..490a3d820bd02bf7d21ef4c4bcbf4263720f94bd Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\271\205\345\262\220\345\277\215.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\271\235\346\235\241\350\243\237\347\275\227.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\271\235\346\235\241\350\243\237\347\275\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..d0f204c6a4e6216f1eb835837f981b3541557710 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\271\235\346\235\241\350\243\237\347\275\227.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\272\221\345\240\207.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\272\221\345\240\207.png" new file mode 100644 index 0000000000000000000000000000000000000000..28fee78c9984e568128440f77c2f911c1fb5dd98 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\272\221\345\240\207.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\272\224\351\203\216.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\272\224\351\203\216.png" new file mode 100644 index 0000000000000000000000000000000000000000..7a72b6e317b8e7bf3fcfbebb5f723743bea2db45 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\272\224\351\203\216.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\274\230\350\217\210.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\274\230\350\217\210.png" new file mode 100644 index 0000000000000000000000000000000000000000..1ebfa899f2f7d3bd2e5d1a855f94e003ac79618a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\344\274\230\350\217\210.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\205\253\351\207\215\347\245\236\345\255\220.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\205\253\351\207\215\347\245\236\345\255\220.png" new file mode 100644 index 0000000000000000000000000000000000000000..9d379365df0ccc93f2e76aea5e6d5cd07601e8eb Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\205\253\351\207\215\347\245\236\345\255\220.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\207\235\345\205\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\207\235\345\205\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..a86382ef0bb52c6d9ee3d75e1da9a209f7174ea8 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\207\235\345\205\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\207\257\344\272\232.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\207\257\344\272\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..29b28f0985e19ef2ac51833fc068a71dd0e2eff7 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\207\257\344\272\232.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\210\273\346\231\264.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\210\273\346\231\264.png" new file mode 100644 index 0000000000000000000000000000000000000000..74880da888d45759c21ad597418ae2b8576d6269 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\210\273\346\231\264.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\214\227\346\226\227.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\214\227\346\226\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..e6b18e898d349b0206e38b68e2dd1f3e7b1e5dbd Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\214\227\346\226\227.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\217\257\350\216\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\217\257\350\216\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..49afd0d93a1d21bd7be86f055b5054aa5dfa62d8 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\217\257\350\216\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\235\216\350\222\202\344\270\235.webp" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\235\216\350\222\202\344\270\235.webp" new file mode 100644 index 0000000000000000000000000000000000000000..ae76d1426bbb4ca12579fe8cb713c520ac750b03 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\235\216\350\222\202\344\270\235.webp" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\237\203\346\264\233\344\274\212.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\237\203\346\264\233\344\274\212.png" new file mode 100644 index 0000000000000000000000000000000000000000..f5a88f2c7146f82d3c6973f47d4d76b35aabe9c4 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\237\203\346\264\233\344\274\212.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\244\232\350\216\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\244\232\350\216\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..522b2b8efee36fb88ff71826d416bbb0c9e2ad59 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\244\232\350\216\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\244\234\345\205\260.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\244\234\345\205\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..47bac69279903f2c57a4d54ebf604389f73e78e1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\244\234\345\205\260.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\246\256\351\234\262.webp" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\246\256\351\234\262.webp" new file mode 100644 index 0000000000000000000000000000000000000000..f8a0885bc4388bdafdf8b0648c2d7de6293de3fa Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\246\256\351\234\262.webp" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\256\211\346\237\217.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\256\211\346\237\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..dfcc7e64c25b55b2e70a38e931205b81f8cf5aa1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\256\211\346\237\217.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\256\265\345\256\253.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\256\265\345\256\253.png" new file mode 100644 index 0000000000000000000000000000000000000000..3d1224fbbee73b4316f4a5657ef43bfd993b5bbf Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\345\256\265\345\256\253.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\211\230\351\251\254.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\211\230\351\251\254.png" new file mode 100644 index 0000000000000000000000000000000000000000..06e403f787f373e555f0ec1b3112512fb4db3eed Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\211\230\351\251\254.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\217\220\347\272\263\351\207\214.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\217\220\347\272\263\351\207\214.png" new file mode 100644 index 0000000000000000000000000000000000000000..e74f49c4204c8de84a769af665a0cc108d0e7322 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\217\220\347\272\263\351\207\214.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\227\251\346\237\232.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\227\251\346\237\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..f55ad332ae61c75a1aa3c2322c7ad837b46008b5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\227\251\346\237\232.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\236\253\345\216\237\344\270\207\345\217\266.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\236\253\345\216\237\344\270\207\345\217\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..f54c9f47f42c106f9d232dff11bf772782685cb9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\236\253\345\216\237\344\270\207\345\217\266.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\237\257\350\216\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\237\257\350\216\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..c3dda07795c0ac5e7028c915de81020df09c8189 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\237\257\350\216\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\265\201\346\265\252\350\200\205.webp" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\265\201\346\265\252\350\200\205.webp" new file mode 100644 index 0000000000000000000000000000000000000000..09748cb8dc722428f5a81a73b028849fbdcc2eb2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\265\201\346\265\252\350\200\205.webp" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\270\251\350\277\252.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\270\251\350\277\252.png" new file mode 100644 index 0000000000000000000000000000000000000000..6f9d11ce21a771bb89e1dd7c0b980d1109396f7f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\346\270\251\350\277\252.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\203\237\347\273\257.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\203\237\347\273\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..2dca489713f0e0cc5ea4b26b3d9dbdd5f4909d27 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\203\237\347\273\257.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\217\212\347\221\232\345\256\253\345\277\203\346\265\267.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\217\212\347\221\232\345\256\253\345\277\203\346\265\267.png" new file mode 100644 index 0000000000000000000000000000000000000000..5827520ddaf35ebbab19d67ebd60838f73ab1a73 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\217\212\347\221\232\345\256\253\345\277\203\346\265\267.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\217\220\351\234\262\347\217\212.webp" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\217\220\351\234\262\347\217\212.webp" new file mode 100644 index 0000000000000000000000000000000000000000..7a2482f38853d3d95865ba885fd231fb1ce1cdb3 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\217\220\351\234\262\347\217\212.webp" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\217\255\345\260\274\347\211\271.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\217\255\345\260\274\347\211\271.png" new file mode 100644 index 0000000000000000000000000000000000000000..a6e9502176f94534a433fc4058d9c09c9300eec5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\217\255\345\260\274\347\211\271.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\220\264.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\220\264.png" new file mode 100644 index 0000000000000000000000000000000000000000..22e9095c83a77155e14b05fddc68633b5ecea00a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\220\264.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\221\266\347\221\266.webp" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\221\266\347\221\266.webp" new file mode 100644 index 0000000000000000000000000000000000000000..584f327eaa12539319f5018022f749dd927318ac Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\221\266\347\221\266.webp" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\224\230\351\233\250.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\224\230\351\233\250.png" new file mode 100644 index 0000000000000000000000000000000000000000..aa0eec056237cf3ad616a87d56ba770d58bcb932 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\224\230\351\233\250.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\224\263\351\271\244.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\224\263\351\271\244.png" new file mode 100644 index 0000000000000000000000000000000000000000..e8c6ae9ff0ca66951e8faf5cb7b38c00a981e3ed Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\224\263\351\271\244.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\240\202\347\263\226.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\240\202\347\263\226.png" new file mode 100644 index 0000000000000000000000000000000000000000..d2891625df08b48462bc7f8e74e1274af76a0c55 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\240\202\347\263\226.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\245\236\351\207\214\347\273\253\344\272\272.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\245\236\351\207\214\347\273\253\344\272\272.png" new file mode 100644 index 0000000000000000000000000000000000000000..db8af63e004e208442ca78c25b85792f04186902 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\245\236\351\207\214\347\273\253\344\272\272.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\245\236\351\207\214\347\273\253\345\215\216.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\245\236\351\207\214\347\273\253\345\215\216.png" new file mode 100644 index 0000000000000000000000000000000000000000..c4a5a09690d7010cd990d5828ad69dde3884c8ab Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\245\236\351\207\214\347\273\253\345\215\216.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\251\272.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\251\272.png" new file mode 100644 index 0000000000000000000000000000000000000000..ee7c0524b585e3b037c3a40f08d0bc32818fd11b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\251\272.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\261\263\345\215\241.webp" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\261\263\345\215\241.webp" new file mode 100644 index 0000000000000000000000000000000000000000..56b78d84d289e200e94ec2d17f2e616420df75dc Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\261\263\345\215\241.webp" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\272\263\350\245\277\345\246\262.webp" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\272\263\350\245\277\345\246\262.webp" new file mode 100644 index 0000000000000000000000000000000000000000..33d104294bf5c1e458ad226eafee5a03d28f41cc Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\272\263\350\245\277\345\246\262.webp" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\275\227\350\216\216\350\216\211\344\272\232.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\275\227\350\216\216\350\216\211\344\272\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..7de44c65914ba5e7ba8bb6e64b60d10b26eab5b2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\347\275\227\350\216\216\350\216\211\344\272\232.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\203\241\346\241\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\203\241\346\241\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..a9a99da059591f466708c18928be72b7f50384e5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\203\241\346\241\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\211\276\345\260\224\346\265\267\346\243\256.webp" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\211\276\345\260\224\346\265\267\346\243\256.webp" new file mode 100644 index 0000000000000000000000000000000000000000..5a1e44e498b80cd3f38fe4b4f5281f63b810b70b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\211\276\345\260\224\346\265\267\346\243\256.webp" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\212\255\350\212\255\346\213\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\212\255\350\212\255\346\213\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..26f39a1f4523a72c8defd94c4c3b720b070a3159 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\212\255\350\212\255\346\213\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\215\222\346\263\267\344\270\200\346\226\227.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\215\222\346\263\267\344\270\200\346\226\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..69f2b501280565039a5b3d5fab68ba9a8f7988a3 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\215\222\346\263\267\344\270\200\346\226\227.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\215\247.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\215\247.png" new file mode 100644 index 0000000000000000000000000000000000000000..df661d7e2768010afbb4b0102c325a5f6ea6fb28 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\215\247.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\216\253\345\250\234.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\216\253\345\250\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..1104ea574b43e03ab2f2e77c98ccf67ad19d3d26 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\216\253\345\250\234.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\216\261\344\276\235\346\213\211.webp" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\216\261\344\276\235\346\213\211.webp" new file mode 100644 index 0000000000000000000000000000000000000000..17b446a29e1ee68e221ca5733d8271fe3dd39cc9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\216\261\344\276\235\346\213\211.webp" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\217\262\350\260\242\345\260\224.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\217\262\350\260\242\345\260\224.png" new file mode 100644 index 0000000000000000000000000000000000000000..42b2052a112b2790c406b0610adfabc0880d7d69 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\217\262\350\260\242\345\260\224.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\241\214\347\247\213.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\241\214\347\247\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..0d09fe799513ae23e318b819dece42ad0165185e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\241\214\347\247\213.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\257\272\350\211\276\345\260\224.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\257\272\350\211\276\345\260\224.png" new file mode 100644 index 0000000000000000000000000000000000000000..aeee1e17b0df4c85bf5350c265a4c73e269e2cff Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\257\272\350\211\276\345\260\224.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\265\233\350\257\272.webp" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\265\233\350\257\272.webp" new file mode 100644 index 0000000000000000000000000000000000000000..5739d06e58631ebc9dd9bbd92a262d100c7c89a9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\265\233\350\257\272.webp" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\276\233\347\204\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\276\233\347\204\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..1113aaf689c64f881973f415fc1a50abed01b79e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\276\233\347\204\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\276\276\350\276\276\345\210\251\344\272\232.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\276\276\350\276\276\345\210\251\344\272\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..c6ced2b3b9c899392cd6fb584b0f14e0f46ee158 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\276\276\350\276\276\345\210\251\344\272\232.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\277\252\345\215\242\345\205\213.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\277\252\345\215\242\345\205\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..1f841ae7ebbbd7d0cfd33c5c7297bce629278714 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\277\252\345\215\242\345\205\213.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\277\252\345\245\245\345\250\234.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\277\252\345\245\245\345\250\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..705dc17cbca26b4e9777d4fba4447e1f25aa0123 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\277\252\345\245\245\345\250\234.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\277\252\345\270\214\351\233\205.webp" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\277\252\345\270\214\351\233\205.webp" new file mode 100644 index 0000000000000000000000000000000000000000..bcb368f2bdf2d9bacda3c6f4d3f3b2348062ed5d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\350\277\252\345\270\214\351\233\205.webp" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\207\215\344\272\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\207\215\344\272\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..6ac280aff1abbb05b0884c059ddd1a3573152bc5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\207\215\344\272\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\222\237\347\246\273.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\222\237\347\246\273.png" new file mode 100644 index 0000000000000000000000000000000000000000..31592f49aa508cefffb44cc05b58650f9024d5d0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\222\237\347\246\273.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\230\277\350\264\235\345\244\232.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\230\277\350\264\235\345\244\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..0bbe464ded897d02657bb65421bb7835ca9a09a9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\230\277\350\264\235\345\244\232.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\233\267\346\263\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\233\267\346\263\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..b614c6a1b3a8c3b491bd58db2f9bfb52d139ec58 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\233\267\346\263\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\233\267\347\224\265\345\260\206\345\206\233.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\233\267\347\224\265\345\260\206\345\206\233.png" new file mode 100644 index 0000000000000000000000000000000000000000..9f542dc0499532887303b2bc1ba67958e195fd9d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\233\267\347\224\265\345\260\206\345\206\233.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\246\231\350\217\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\246\231\350\217\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..493b4fe76ab3de7fc9856c9a54245db770c0513b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\246\231\350\217\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\255\210.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\255\210.png" new file mode 100644 index 0000000000000000000000000000000000000000..74935a78ee5027589ba639ffeae252b481fb650d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\255\210.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\271\277\351\207\216\351\231\242\345\271\263\350\227\217.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\271\277\351\207\216\351\231\242\345\271\263\350\227\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..adc8ad5c20861f07dee314e6c6067366dc7e9ad7 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/character/\351\271\277\351\207\216\351\231\242\345\271\263\350\227\217.png" differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/background.jpg b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d8604a6901d001efdcca65d31ccc0577124033e1 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/background.jpg differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/bg.png b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..154e2eb725014c3f9159c5b7dd74f485265b78e0 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/bg.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/bg2.png b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/bg2.png new file mode 100644 index 0000000000000000000000000000000000000000..3b541202c3ee5f59178c3403bef36e4f21a59a48 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/bg2.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/bgWeapon.png b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/bgWeapon.png new file mode 100644 index 0000000000000000000000000000000000000000..5ab179c2f9f887d341d234bdce1fc1bf88183c8e Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/bgWeapon.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/s-3.png b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/s-3.png new file mode 100644 index 0000000000000000000000000000000000000000..fb224cc37d34a73639c204e78dfa933002022a75 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/s-3.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/s-4.png b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/s-4.png new file mode 100644 index 0000000000000000000000000000000000000000..ea84b0e9db301334c5ea47435c10db371a514c56 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/s-4.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/s-5.png b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/s-5.png new file mode 100644 index 0000000000000000000000000000000000000000..b4ee48a1786c5edbd6796208f0ffb583a6b9130a Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/s-5.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-3.png b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-3.png new file mode 100644 index 0000000000000000000000000000000000000000..71d983b7aeb404cd19e40a8db5d06dde78caf986 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-3.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-4.png b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-4.png new file mode 100644 index 0000000000000000000000000000000000000000..663ff949a3b14849fce22cdd5718974cc293519b Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-4.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-1.png b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-1.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd864d28f083841188b0cb76d273527acc96e47 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-1.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-2.png b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-2.png new file mode 100644 index 0000000000000000000000000000000000000000..0000bd2937836b8c2a2108e4b4882c2f942160b4 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-2.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-3.png b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-3.png new file mode 100644 index 0000000000000000000000000000000000000000..f4891ee9339fb37a4f6a7c0bdb2f2410464258ff Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-3.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-4.png b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-4.png new file mode 100644 index 0000000000000000000000000000000000000000..01f3dac94918df76d87d7270efe1c3350eb11359 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-4.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-5.png b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-5.png new file mode 100644 index 0000000000000000000000000000000000000000..a060852e95c254f0b21eea7a8e8ac6b20c5220cb Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-5.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-6.png b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-6.png new file mode 100644 index 0000000000000000000000000000000000000000..bb83f78ec4c62d16ac0007bc4d9c2b01a3aeb3af Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-6.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-7.png b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-7.png new file mode 100644 index 0000000000000000000000000000000000000000..3f0f1456afa489a7dc2189cf5e1da083ea830610 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/shadow-5-7.png differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\345\206\260.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\345\206\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..b958e0afd919a39c70d4e6b0497eb597c250f9b4 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\345\206\260.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\345\215\225\346\211\213\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\345\215\225\346\211\213\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..c8c5a98b5ba86ce399048b055c96965d3f082f8e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\345\215\225\346\211\213\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\345\244\247\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\345\244\247\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..c7e5c40cb6f7caf46ed22e0bc51b56606f716688 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\345\244\247\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\345\262\251.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\345\262\251.png" new file mode 100644 index 0000000000000000000000000000000000000000..4327bf52883a030ba9e5818f791571784fa7a0e9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\345\262\251.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\345\274\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\345\274\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..eea80354d598570a1ff8702435c9600aca23566c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\345\274\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\230\237\345\260\230\347\264\253.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\230\237\345\260\230\347\264\253.png" new file mode 100644 index 0000000000000000000000000000000000000000..6f3c1599a7439607c02254ccddb4251925b6b082 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\230\237\345\260\230\347\264\253.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\230\237\345\260\230\351\207\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\230\237\345\260\230\351\207\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..a072056e7c910caa3fe9c37600ef4978ea67a9ee Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\230\237\345\260\230\351\207\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\230\237\350\276\21110.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\230\237\350\276\21110.png" new file mode 100644 index 0000000000000000000000000000000000000000..f2aed07861b158a6d66a57b2152551f4ab05d909 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\230\237\350\276\21110.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\230\237\350\276\2112.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\230\237\350\276\2112.png" new file mode 100644 index 0000000000000000000000000000000000000000..cab911ccdf14726cbb0244fb422e2297d3ab1f30 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\230\237\350\276\2112.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\236\252.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\236\252.png" new file mode 100644 index 0000000000000000000000000000000000000000..ef1a856c4d1d878b443ca4846a7c9149eab6d207 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\236\252.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\260\264.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\260\264.png" new file mode 100644 index 0000000000000000000000000000000000000000..ec186aaef007f4cd1e6efc78740e4fc646165b3b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\260\264.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\263\225\345\231\250.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\263\225\345\231\250.png" new file mode 100644 index 0000000000000000000000000000000000000000..a554953971420809852e5b80102507a6b5d7187e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\346\263\225\345\231\250.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\347\201\253.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\347\201\253.png" new file mode 100644 index 0000000000000000000000000000000000000000..3a220210c4af98998f68abbaac1800fe5084c748 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\347\201\253.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\350\215\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\350\215\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..18f718c8af4f1273b15718c831f8aa99f96acbf3 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\350\215\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\351\233\267.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\351\233\267.png" new file mode 100644 index 0000000000000000000000000000000000000000..5681cffb670c37989b68d092f1371509814c483a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\351\233\267.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\351\243\216.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\351\243\216.png" new file mode 100644 index 0000000000000000000000000000000000000000..d4fc77d7eee1e5e873d02d7966633a0d5330220f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/items/\351\243\216.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\344\270\215\347\201\255\346\234\210\345\215\216.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\344\270\215\347\201\255\346\234\210\345\215\216.png" new file mode 100644 index 0000000000000000000000000000000000000000..6dbf621268812e3d27991a79e7444779b24e0e4c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\344\270\215\347\201\255\346\234\210\345\215\216.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\344\273\245\347\220\206\346\234\215\344\272\272.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\344\273\245\347\220\206\346\234\215\344\272\272.png" new file mode 100644 index 0000000000000000000000000000000000000000..1bbe299b3e245e5f77a396bcf15d169b8bb19db9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\344\273\245\347\220\206\346\234\215\344\272\272.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\206\254\346\236\201\347\231\275\346\230\237.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\206\254\346\236\201\347\231\275\346\230\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..648df20054530d8f1dd6c922a27dfe8271d08d45 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\206\254\346\236\201\347\231\275\346\230\237.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\206\267\345\210\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\206\267\345\210\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..ddb1b1b8568cacb164c756ee9199d4be137975fb Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\206\267\345\210\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\214\243\351\207\214\347\201\255\350\276\260.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\214\243\351\207\214\347\201\255\350\276\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..5b9b4d3e54eda0e1643db396d03375285c07c767 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\214\243\351\207\214\347\201\255\350\276\260.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\214\243\351\207\214\351\276\231\345\220\237.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\214\243\351\207\214\351\276\231\345\220\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..042d2c7074de1891e51b9e0147a553b1809a753a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\214\243\351\207\214\351\276\231\345\220\237.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\215\203\345\244\234\346\265\256\346\242\246.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\215\203\345\244\234\346\265\256\346\242\246.png" new file mode 100644 index 0000000000000000000000000000000000000000..f9668d27bb81c04aa9d2f09b1b6da537be8a725d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\215\203\345\244\234\346\265\256\346\242\246.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\215\203\345\262\251\345\217\244\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\215\203\345\262\251\345\217\244\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..0d5b1158f4083771f2b26276a6c1b1fe04e36af2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\215\203\345\262\251\345\217\244\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\215\203\345\262\251\351\225\277\346\236\252.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\215\203\345\262\251\351\225\277\346\236\252.png" new file mode 100644 index 0000000000000000000000000000000000000000..7ddaca8c735c5cadc32a6310682c61c47b84fcbc Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\215\203\345\262\251\351\225\277\346\236\252.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\222\214\347\222\236\351\270\242.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\222\214\347\222\236\351\270\242.png" new file mode 100644 index 0000000000000000000000000000000000000000..52d883825212ecf027d2b0e35a1bef240aa5989a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\222\214\347\222\236\351\270\242.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\233\233\351\243\216\345\216\237\345\205\270.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\233\233\351\243\216\345\216\237\345\205\270.png" new file mode 100644 index 0000000000000000000000000000000000000000..07579120ad249303270614538d2e36b763d80414 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\233\233\351\243\216\345\216\237\345\205\270.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\233\276\350\216\261\346\235\234\346\213\211\347\232\204\345\233\236\345\277\206.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\233\276\350\216\261\346\235\234\346\213\211\347\232\204\345\233\236\345\277\206.png" new file mode 100644 index 0000000000000000000000000000000000000000..2cb1400daa1848d225972b42c8e805c688444c10 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\233\276\350\216\261\346\235\234\346\213\211\347\232\204\345\233\236\345\277\206.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\234\243\346\230\276\344\271\213\351\222\245.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\234\243\346\230\276\344\271\213\351\222\245.png" new file mode 100644 index 0000000000000000000000000000000000000000..029dc12d40e101c86d23be8d99f7311d816dd9e9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\234\243\346\230\276\344\271\213\351\222\245.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\244\251\347\251\272\344\271\213\345\202\262.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\244\251\347\251\272\344\271\213\345\202\262.png" new file mode 100644 index 0000000000000000000000000000000000000000..31273122be3633004a87810164ddb0cf3695ab14 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\244\251\347\251\272\344\271\213\345\202\262.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\244\251\347\251\272\344\271\213\345\210\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\244\251\347\251\272\344\271\213\345\210\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..b26c0e709ac6d7e9acf8659a0c334da6704c6c9e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\244\251\347\251\272\344\271\213\345\210\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\244\251\347\251\272\344\271\213\345\215\267.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\244\251\347\251\272\344\271\213\345\215\267.png" new file mode 100644 index 0000000000000000000000000000000000000000..967abf1992a3f68a97cf6c24f8960abd34491312 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\244\251\347\251\272\344\271\213\345\215\267.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\244\251\347\251\272\344\271\213\347\277\274.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\244\251\347\251\272\344\271\213\347\277\274.png" new file mode 100644 index 0000000000000000000000000000000000000000..dfe2b0be9e205d15c31d0dafae96200b0574b4ba Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\244\251\347\251\272\344\271\213\347\277\274.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\244\251\347\251\272\344\271\213\350\204\212.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\244\251\347\251\272\344\271\213\350\204\212.png" new file mode 100644 index 0000000000000000000000000000000000000000..ac4ad8eea84815a5b3a2c701401867d9db22009e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\244\251\347\251\272\344\271\213\350\204\212.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\260\230\344\270\226\344\271\213\351\224\201.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\260\230\344\270\226\344\271\213\351\224\201.png" new file mode 100644 index 0000000000000000000000000000000000000000..6b97ad95d0ec18b970263c62d3a8a8b29f81086f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\260\230\344\270\226\344\271\213\351\224\201.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\271\275\345\244\234\345\215\216\345\260\224\345\205\271.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\271\275\345\244\234\345\215\216\345\260\224\345\205\271.png" new file mode 100644 index 0000000000000000000000000000000000000000..af30791751a798f106d8dd73310b6f9ba51ada06 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\271\275\345\244\234\345\215\216\345\260\224\345\205\271.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\274\223\350\227\217.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\274\223\350\227\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..4ed36aaecfe47be0cda43ad394aa145a8a9cd0ed Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\274\223\350\227\217.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\274\271\345\274\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\274\271\345\274\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..4f13a9dbfba80541b436d09f63cd198520a5b93e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\345\274\271\345\274\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\201\257\347\201\276.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\201\257\347\201\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..9dd81e06b11ebbee82a2e21d7649a94027ac3b41 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\201\257\347\201\276.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\201\266\347\216\213\344\270\270.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\201\266\347\216\213\344\270\270.png" new file mode 100644 index 0000000000000000000000000000000000000000..b29e6d762fa4e136d63c9a321ceea8075611c955 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\201\266\347\216\213\344\270\270.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\212\244\346\221\251\344\271\213\346\235\226.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\212\244\346\221\251\344\271\213\346\235\226.png" new file mode 100644 index 0000000000000000000000000000000000000000..5c5975acabf46494c88f884d71692abf422d17a5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\212\244\346\221\251\344\271\213\346\235\226.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\226\253\345\263\260\344\271\213\345\210\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\226\253\345\263\260\344\271\213\345\210\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..dc37e32a6f4f34bf7953cc9037dcae7bd26fc6fa Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\226\253\345\263\260\344\271\213\345\210\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\226\255\346\265\252\351\225\277\351\263\215.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\226\255\346\265\252\351\225\277\351\263\215.png" new file mode 100644 index 0000000000000000000000000000000000000000..b74cacce8f5a207a5b923d3b3fcb3839d108d76c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\226\255\346\265\252\351\225\277\351\263\215.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\227\240\345\267\245\344\271\213\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\227\240\345\267\245\344\271\213\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..949a7f933245af9f6eeb92a7eb37aac60eec7e07 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\227\240\345\267\245\344\271\213\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\230\255\345\277\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\230\255\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..f24644b2db1865b5ff0e4b2638e389c5cff2fe93 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\230\255\345\277\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\232\227\345\267\267\347\214\216\346\211\213.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\232\227\345\267\267\347\214\216\346\211\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..da1c9c653f1cd369c5631a6579ce437b2b74e924 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\232\227\345\267\267\347\214\216\346\211\213.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\232\227\345\267\267\347\232\204\351\205\222\344\270\216\350\257\227.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\232\227\345\267\267\347\232\204\351\205\222\344\270\216\350\257\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..50b5c407b70b1627f186dfd20dbbf81bcba3704b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\232\227\345\267\267\347\232\204\351\205\222\344\270\216\350\257\227.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\232\227\345\267\267\351\227\252\345\205\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\232\227\345\267\267\351\227\252\345\205\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..46268ce7c4daa551e1c8cb88e554aab6fea33f66 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\232\227\345\267\267\351\227\252\345\205\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\233\232\344\272\221\344\271\213\346\234\210.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\233\232\344\272\221\344\271\213\346\234\210.png" new file mode 100644 index 0000000000000000000000000000000000000000..438e79d35519999727704ea87c6b133a942f4138 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\233\232\344\272\221\344\271\213\346\234\210.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\235\276\347\261\201\345\223\215\350\265\267\344\271\213\346\227\266.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\235\276\347\261\201\345\223\215\350\265\267\344\271\213\346\227\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..c63fbbf6f205b6f4d6a30f9cec40130a0c56c519 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\235\276\347\261\201\345\223\215\350\265\267\344\271\213\346\227\266.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\262\220\346\265\264\351\276\231\350\241\200\347\232\204\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\262\220\346\265\264\351\276\231\350\241\200\347\232\204\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..92dc6dcd16243273d8f64db35728db1709d8179a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\262\220\346\265\264\351\276\231\350\241\200\347\232\204\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\263\242\344\271\261\346\234\210\347\231\275\347\273\217\346\264\245.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\263\242\344\271\261\346\234\210\347\231\275\347\273\217\346\264\245.png" new file mode 100644 index 0000000000000000000000000000000000000000..74e9bc893f18d2884f8d204d9ca994ae3fa08284 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\263\242\344\271\261\346\234\210\347\231\275\347\273\217\346\264\245.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\265\201\346\265\252\344\271\220\347\253\240.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\265\201\346\265\252\344\271\220\347\253\240.png" new file mode 100644 index 0000000000000000000000000000000000000000..0ea6759bf69af57ef7f5ab673109432f1db4f920 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\265\201\346\265\252\344\271\220\347\253\240.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\265\201\346\265\252\347\232\204\346\231\232\346\230\237.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\265\201\346\265\252\347\232\204\346\231\232\346\230\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..3c0885c71b02b41729720ee2be20bac337a6181b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\346\265\201\346\265\252\347\232\204\346\231\232\346\230\237.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\213\274\347\232\204\346\234\253\350\267\257.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\213\274\347\232\204\346\234\253\350\267\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..fa5dff2d18727c7f6f3cfa60e5e27e60309da083 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\213\274\347\232\204\346\234\253\350\267\257.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\214\216\344\272\272\344\271\213\345\276\204.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\214\216\344\272\272\344\271\213\345\276\204.png" new file mode 100644 index 0000000000000000000000000000000000000000..af3c7e029b4ff2145f395834431813a7903954bf Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\214\216\344\272\272\344\271\213\345\276\204.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\216\233\346\265\267\350\217\210\347\232\204\346\260\264\350\211\262.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\216\233\346\265\267\350\217\210\347\232\204\346\260\264\350\211\262.png" new file mode 100644 index 0000000000000000000000000000000000000000..11d508e415c78074b04c6addf94fc3460a8da758 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\216\233\346\265\267\350\217\210\347\232\204\346\260\264\350\211\262.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\243\220\345\262\251\347\273\223\347\273\277.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\243\220\345\262\251\347\273\223\347\273\277.png" new file mode 100644 index 0000000000000000000000000000000000000000..28cd3b7bff8ee27a4a15ace6b6c8d53a3d4414ef Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\243\220\345\262\251\347\273\223\347\273\277.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\236\344\271\220\344\271\213\347\234\237\346\204\217.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\236\344\271\220\344\271\213\347\234\237\346\204\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..6dd884d88836a3d212c43a561c1061b05ff7a9f0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\236\344\271\220\344\271\213\347\234\237\346\204\217.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\236\345\260\204\346\211\213\344\271\213\350\252\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\236\345\260\204\346\211\213\344\271\213\350\252\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..8079e6bf05abb31813f1a611cea509944b337b57 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\236\345\260\204\346\211\213\344\271\213\350\252\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\255\347\244\274\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\255\347\244\274\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..6fa596f85c9cc69fe5571cc7545fffa6ff9fd11b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\255\347\244\274\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\255\347\244\274\345\244\247\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\255\347\244\274\345\244\247\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..b201f46442ca9bc5f22de4a5d2e24bee91fbe5e6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\255\347\244\274\345\244\247\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\255\347\244\274\345\274\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\255\347\244\274\345\274\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..d8ca9f81916bf1bd07fcd5ec83062a15802d06f4 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\255\347\244\274\345\274\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\255\347\244\274\346\256\213\347\253\240.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\255\347\244\274\346\256\213\347\253\240.png" new file mode 100644 index 0000000000000000000000000000000000000000..5ce79b45e7ff7f0595b8a0d86ed940e2bc9cb9c2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\245\255\347\244\274\346\256\213\347\253\240.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\254\233\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\254\233\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..426e584674637ec4bcf521e5e1b8cebd6c51c9f1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\254\233\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\273\210\346\234\253\345\227\237\345\217\271\344\271\213\350\257\227.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\273\210\346\234\253\345\227\237\345\217\271\344\271\213\350\257\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..47e7bc050d872d5fcddcb69775d6ed96d99d18b8 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\273\210\346\234\253\345\227\237\345\217\271\344\271\213\350\257\227.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\273\235\345\274\246.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\273\235\345\274\246.png" new file mode 100644 index 0000000000000000000000000000000000000000..b1c9606c7c177bcb975fe04ce365539eb6076d78 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\273\235\345\274\246.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\277\241\347\216\211\346\263\225\347\220\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\277\241\347\216\211\346\263\225\347\220\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..6186fe5f8d147330f480d9748c35813905fafa88 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\347\277\241\347\216\211\346\263\225\347\220\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\213\215\345\217\244\350\207\252\347\224\261\344\271\213\350\252\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\213\215\345\217\244\350\207\252\347\224\261\344\271\213\350\252\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..99cc9afb62cc840a27cf5e7c8f20f2058a7197f6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\213\215\345\217\244\350\207\252\347\224\261\344\271\213\350\252\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\213\245\346\260\264.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\213\245\346\260\264.png" new file mode 100644 index 0000000000000000000000000000000000000000..96d04815b5ecee019fbf999cae5b4a9c124d6d0c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\213\245\346\260\264.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\226\231\350\215\211\344\271\213\347\250\273\345\205\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\226\231\350\215\211\344\271\213\347\250\273\345\205\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..870fe423d2c50b88e141984186578bfadec25a22 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\226\231\350\215\211\344\271\213\347\250\273\345\205\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\243\201\345\217\266\350\220\203\345\205\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\243\201\345\217\266\350\220\203\345\205\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..8e9df5332c231185cc44a1b23b8b9d85be26f75a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\243\201\345\217\266\350\220\203\345\205\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\347\246\217\346\226\257\347\232\204\346\234\210\345\205\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\347\246\217\346\226\257\347\232\204\346\234\210\345\205\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..9f7342757b31f9969db7ebb95a12132ac960b5f5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\347\246\217\346\226\257\347\232\204\346\234\210\345\205\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\351\243\216\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\351\243\216\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..bb9b886fa3ccd30d7c84f2feb37a413ac7d7e666 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\351\243\216\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\351\243\216\345\244\247\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\351\243\216\345\244\247\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..eb38ae72c28556bd4e8c105b029f14713683be56 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\351\243\216\345\244\247\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\351\243\216\347\214\216\345\274\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\351\243\216\347\214\216\345\274\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..1f605a67387cbfba72a22f881ad2afc4ef13df93 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\351\243\216\347\214\216\345\274\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\351\243\216\347\247\230\345\205\270.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\351\243\216\347\247\230\345\205\270.png" new file mode 100644 index 0000000000000000000000000000000000000000..bb8239dbd871b870f4b603d5bc8090411d1c823d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\351\243\216\347\247\230\345\205\270.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\351\243\216\351\225\277\346\236\252.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\351\243\216\351\225\277\346\236\252.png" new file mode 100644 index 0000000000000000000000000000000000000000..1e67180b5e659c1ad9ac7e0768a493d6885a24ac Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\245\277\351\243\216\351\225\277\346\236\252.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\256\250\351\276\231\350\213\261\346\235\260\350\260\255.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\256\250\351\276\231\350\213\261\346\235\260\350\260\255.png" new file mode 100644 index 0000000000000000000000000000000000000000..be43ebdc25b6992e2e7ed41badbed316a464af3a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\256\250\351\276\231\350\213\261\346\235\260\350\260\255.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\264\257\350\231\271\344\271\213\346\247\212.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\264\257\350\231\271\344\271\213\346\247\212.png" new file mode 100644 index 0000000000000000000000000000000000000000..e0731a6e4793b36a3b3209fcee535ddc381b8c3f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\264\257\350\231\271\344\271\213\346\247\212.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\265\244\346\262\231\344\271\213\346\235\226.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\265\244\346\262\231\344\271\213\346\235\226.png" new file mode 100644 index 0000000000000000000000000000000000000000..83a3b436132ae3d3c0e40c4e6ae7e5b00773f39d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\265\244\346\262\231\344\271\213\346\235\226.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\265\244\350\247\222\347\237\263\346\272\203\346\235\265.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\265\244\350\247\222\347\237\263\346\272\203\346\235\265.png" new file mode 100644 index 0000000000000000000000000000000000000000..2a24fe7650787646c38da9efb7662bae7f9bea84 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\350\265\244\350\247\222\347\237\263\346\272\203\346\235\265.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\222\237\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\222\237\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..6a8d377e6eaa24bad1bad28aba1374613d35c241 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\222\237\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\223\201\345\275\261\351\230\224\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\223\201\345\275\261\351\230\224\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..6dc2f6556ab2d8afedcd22d7679b0d8d37dec911 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\223\201\345\275\261\351\230\224\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\230\277\350\216\253\346\226\257\344\271\213\345\274\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\230\277\350\216\253\346\226\257\344\271\213\345\274\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..83df33c9648ac45f4a044d8fa2b3a661710cd0e4 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\230\277\350\216\253\346\226\257\344\271\213\345\274\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\233\250\350\243\201.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\233\250\350\243\201.png" new file mode 100644 index 0000000000000000000000000000000000000000..df0637a5b84ac6ef3900a13f16162b6f5ebf353e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\233\250\350\243\201.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\233\276\345\210\207\344\271\213\345\233\236\345\205\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\233\276\345\210\207\344\271\213\345\233\236\345\205\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..58a6a259ef04521f39f78faf7cb1c681bbe7d0ae Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\233\276\345\210\207\344\271\213\345\233\236\345\205\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\243\216\351\271\260\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\243\216\351\271\260\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..50e0c1f84e23c721db549e58b8003ec8be5dada6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\243\216\351\271\260\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\243\236\345\244\251\345\276\241\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\243\236\345\244\251\345\276\241\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..fd8e938487611ed21a4fae3d379d245209ec3a8a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\243\236\345\244\251\345\276\241\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\243\236\351\233\267\344\271\213\345\274\246\346\214\257.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\243\236\351\233\267\344\271\213\345\274\246\346\214\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..7c6d713156049027268aa874d83dc20974cda31b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\243\236\351\233\267\344\271\213\345\274\246\346\214\257.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\255\224\345\257\274\347\273\252\350\256\272.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\255\224\345\257\274\347\273\252\350\256\272.png" new file mode 100644 index 0000000000000000000000000000000000000000..12ea3e5e12a4c98e2b2da3fe08d93de7b9b275ae Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\255\224\345\257\274\347\273\252\350\256\272.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\270\246\347\276\275\345\274\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\270\246\347\276\275\345\274\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..c1eed0eb58e4220082af6428fafec3d9d424211d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\270\246\347\276\275\345\274\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\273\216\346\230\216\347\245\236\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\273\216\346\230\216\347\245\236\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..8ab5d91cf0563362a0ba7c5d38c8ecdaafebe33a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\273\216\346\230\216\347\245\236\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\273\221\347\274\250\346\236\252.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\273\221\347\274\250\346\236\252.png" new file mode 100644 index 0000000000000000000000000000000000000000..da5c46e2d528795ef8d7ff73b12e6d6c84b11fd1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/gacha/weapon/\351\273\221\347\274\250\346\236\252.png" differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/abyss.png b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/abyss.png new file mode 100644 index 0000000000000000000000000000000000000000..a6603203577f11032cb0f1a69d5a24bb1e54a9cc Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/abyss.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/excel.png b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/excel.png new file mode 100644 index 0000000000000000000000000000000000000000..73e5cfc882e5999f70b01d65051685ba3431c7a5 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/excel.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/ledger.png b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/ledger.png new file mode 100644 index 0000000000000000000000000000000000000000..72d2a5a1c308076950d0a99b76af2364f5af9804 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/ledger.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/moster.png b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/moster.png new file mode 100644 index 0000000000000000000000000000000000000000..17ce10296d5fdd491e7d5d46dc84b3607b22da3c Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/moster.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/paimon.png b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/paimon.png new file mode 100644 index 0000000000000000000000000000000000000000..2f52222d38d034819f52f4fe09dea6f5b3198291 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/paimon.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/role.png b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/role.png new file mode 100644 index 0000000000000000000000000000000000000000..6c26e1456f82f1204e8de9c6cd2d29b6b7a50b8c Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/role.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/sign.png b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/sign.png new file mode 100644 index 0000000000000000000000000000000000000000..d4e9571d121b1673ae31895f664a652c8401586c Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/sign.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/team.png b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/team.png new file mode 100644 index 0000000000000000000000000000000000000000..3bdeb09df3386a1dd8b5d4ca232d944cc67dc228 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/team.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/weapon.png b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/weapon.png new file mode 100644 index 0000000000000000000000000000000000000000..c32f24176577518721f562691fb3e00e095fbde5 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/weapon.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/wiki.png b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/wiki.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6f583620da32a371cea450bc1098232b35218f Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/wiki.png differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\344\270\203\345\234\243\345\217\254\345\224\244.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\344\270\203\345\234\243\345\217\254\345\224\244.png" new file mode 100644 index 0000000000000000000000000000000000000000..151bfdad4f0c598bb24a31c12664a4160c33fc35 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\344\270\203\345\234\243\345\217\254\345\224\244.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\345\205\273\346\210\220\350\256\241\347\256\227.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\345\205\273\346\210\220\350\256\241\347\256\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..f70ae3acb0216fc58c54b9d8c67aee73205b5cc7 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\345\205\273\346\210\220\350\256\241\347\256\227.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\345\210\273\346\231\264.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\345\210\273\346\231\264.png" new file mode 100644 index 0000000000000000000000000000000000000000..f169f377b5bd49dd5380626749f18ddaa2f6fa6d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\345\210\273\346\231\264.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\345\216\237\347\237\263.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\345\216\237\347\237\263.png" new file mode 100644 index 0000000000000000000000000000000000000000..b4f29e10375502d204ca485efcb881e14be02abe Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\345\216\237\347\237\263.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\345\217\262\350\216\261\345\247\206.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\345\217\262\350\216\261\345\247\206.png" new file mode 100644 index 0000000000000000000000000000000000000000..3aaa0dd399d200c71e0a871346883890107cdf84 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\345\217\262\350\216\261\345\247\206.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\346\211\223\345\215\241.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\346\211\223\345\215\241.png" new file mode 100644 index 0000000000000000000000000000000000000000..40f5a5378f03ceb9e371b0c886338c5bafcd7c5a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\346\211\223\345\215\241.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\346\224\273\347\225\245.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\346\224\273\347\225\245.png" new file mode 100644 index 0000000000000000000000000000000000000000..1af552863cac57b19d2e8b1c4f8f66d0b211bcff Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\346\224\273\347\225\245.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\346\230\237\350\276\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\346\230\237\350\276\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..8dea2d52fb825babbb975d0d45772324be6e28b3 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\346\230\237\350\276\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\346\240\221\350\204\202.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\346\240\221\350\204\202.png" new file mode 100644 index 0000000000000000000000000000000000000000..83badce21bcaaeac4369d29991657b6fe9a4091d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\346\240\221\350\204\202.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\346\265\256\344\270\226.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\346\265\256\344\270\226.png" new file mode 100644 index 0000000000000000000000000000000000000000..768fe548078717c2b8e6e2c3bd54f5076f9f9728 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\346\265\256\344\270\226.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\347\261\263\346\270\270\347\244\276.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\347\261\263\346\270\270\347\244\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..464c5ee5609de4be35fb858bcf8b27cad672b0c9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\347\261\263\346\270\270\347\244\276.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\347\272\240\347\274\240\344\271\213\347\274\230.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\347\272\240\347\274\240\344\271\213\347\274\230.png" new file mode 100644 index 0000000000000000000000000000000000000000..240a234177453f019d52a6cd2490406ef1f1ccb9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\347\272\240\347\274\240\344\271\213\347\274\230.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\347\273\221\345\256\232\350\264\246\345\217\267.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\347\273\221\345\256\232\350\264\246\345\217\267.png" new file mode 100644 index 0000000000000000000000000000000000000000..d088116e995e06b1f3d45c419dce310ea3f4350a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\347\273\221\345\256\232\350\264\246\345\217\267.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\347\273\237\350\256\241.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\347\273\237\350\256\241.png" new file mode 100644 index 0000000000000000000000000000000000000000..0250629edce3d7c0891bed4feba7542028b49713 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\347\273\237\350\256\241.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\350\256\260\345\275\225.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\350\256\260\345\275\225.png" new file mode 100644 index 0000000000000000000000000000000000000000..7b38468c5d915526b01d1f8480ecae3aea017bef Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\350\256\260\345\275\225.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\351\227\256\345\217\267.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\351\227\256\345\217\267.png" new file mode 100644 index 0000000000000000000000000000000000000000..d1509df9ff4bc9c29e7646dcfb0a7ed73770cb7a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/icon/\351\227\256\345\217\267.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\345\205\253\351\207\215\347\245\236\345\255\220.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\345\205\253\351\207\215\347\245\236\345\255\220.png" new file mode 100644 index 0000000000000000000000000000000000000000..d0fe98f8fc53dc8866717bd5c94fea2522c23e4b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\345\205\253\351\207\215\347\245\236\345\255\220.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\345\217\257\350\216\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\345\217\257\350\216\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..670f91ad913ed8907effc655600df2a7fe31a5f5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\345\217\257\350\216\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\345\244\234\345\205\260.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\345\244\234\345\205\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..120cb091914ea9bb498e16753cfb128a5c21ed48 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\345\244\234\345\205\260.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\345\246\256\351\234\262.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\345\246\256\351\234\262.png" new file mode 100644 index 0000000000000000000000000000000000000000..363b5ed59c427a10d04fe32e2c712ad531d904d7 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\345\246\256\351\234\262.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\346\217\220\347\272\263\351\207\214.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\346\217\220\347\272\263\351\207\214.png" new file mode 100644 index 0000000000000000000000000000000000000000..fb923acba960da288c7370e3f7c4a1e3db807e1b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\346\217\220\347\272\263\351\207\214.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\346\237\257\350\216\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\346\237\257\350\216\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..ff00cb4f2b5f9a1eaca9bad14689b996cd60e386 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\346\237\257\350\216\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\347\224\230\351\233\250.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\347\224\230\351\233\250.png" new file mode 100644 index 0000000000000000000000000000000000000000..2c018684ee99287be8e991c4948d139a8b1fbdc6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\347\224\230\351\233\250.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\347\272\263\350\245\277\345\246\262.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\347\272\263\350\245\277\345\246\262.png" new file mode 100644 index 0000000000000000000000000000000000000000..57ae37fc33588cf6e11df35653e8ad96e432c02b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\347\272\263\350\245\277\345\246\262.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\350\265\233\350\257\272.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\350\265\233\350\257\272.png" new file mode 100644 index 0000000000000000000000000000000000000000..3cd5595ee0c3ceaccd25c400f0e36cea479110d0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/namecard/\350\265\233\350\257\272.png" differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/other/bg.webp b/src/Yunzai-Bot/plugins/genshin/resources/img/other/bg.webp new file mode 100644 index 0000000000000000000000000000000000000000..61106bf0d0b058bee6d904391260d6ce12ba091f Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/other/bg.webp differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/other/bg105.png b/src/Yunzai-Bot/plugins/genshin/resources/img/other/bg105.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc8059ac5354a25ea8fad7bf3ee9c634b5723e7 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/other/bg105.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/other/bg3.png b/src/Yunzai-Bot/plugins/genshin/resources/img/other/bg3.png new file mode 100644 index 0000000000000000000000000000000000000000..44aa8c36e8375f484c25c68a89add878d5b7ec9b Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/other/bg3.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/other/bg4.png b/src/Yunzai-Bot/plugins/genshin/resources/img/other/bg4.png new file mode 100644 index 0000000000000000000000000000000000000000..807954714cb3069fa7e5cee0c285baaed187fcac Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/other/bg4.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/other/bg5.png b/src/Yunzai-Bot/plugins/genshin/resources/img/other/bg5.png new file mode 100644 index 0000000000000000000000000000000000000000..2630db5bc3f80f014aef47a3299d65395220444c Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/other/bg5.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/other/chart.png b/src/Yunzai-Bot/plugins/genshin/resources/img/other/chart.png new file mode 100644 index 0000000000000000000000000000000000000000..c0eaf85770ca2c896c95c7161076b8b65b46706a Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/other/chart.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/other/fetter10.png b/src/Yunzai-Bot/plugins/genshin/resources/img/other/fetter10.png new file mode 100644 index 0000000000000000000000000000000000000000..e27796fbe7a87cdc085a6a7e4d8a62d05616680b Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/other/fetter10.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/other/fill.png b/src/Yunzai-Bot/plugins/genshin/resources/img/other/fill.png new file mode 100644 index 0000000000000000000000000000000000000000..83ba232b3f09398a41f9998d2b12604a8a5468b7 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/other/fill.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/other/world-exploration-frame.png b/src/Yunzai-Bot/plugins/genshin/resources/img/other/world-exploration-frame.png new file mode 100644 index 0000000000000000000000000000000000000000..02ccd2f48a3f6eadbefefb89c5327873b64dd162 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/other/world-exploration-frame.png differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/other/\345\216\237\347\245\236.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\345\216\237\347\245\236.png" new file mode 100644 index 0000000000000000000000000000000000000000..a8cb922f6a995d0c9bff6229bae057ffcf6b7168 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\345\216\237\347\245\236.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/other/\345\261\202\345\262\251\345\267\250\346\270\212.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\345\261\202\345\262\251\345\267\250\346\270\212.png" new file mode 100644 index 0000000000000000000000000000000000000000..b8c8dba5aaeab7bfa117cde62d25fcc16cb791a6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\345\261\202\345\262\251\345\267\250\346\270\212.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/other/\346\270\212\344\270\213\345\256\253.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\346\270\212\344\270\213\345\256\253.png" new file mode 100644 index 0000000000000000000000000000000000000000..ae9f1b3a6896682109a84079d836c296d604d634 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\346\270\212\344\270\213\345\256\253.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/other/\347\222\203\346\234\210.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\347\222\203\346\234\210.png" new file mode 100644 index 0000000000000000000000000000000000000000..fc2754b8737f878cc75134d92869499aa77aca8c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\347\222\203\346\234\210.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/other/\347\250\273\345\246\273.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\347\250\273\345\246\273.png" new file mode 100644 index 0000000000000000000000000000000000000000..086a720fc1280e0260f6d55b7bad6007a4b2fef5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\347\250\273\345\246\273.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/other/\350\222\231\345\276\267.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\350\222\231\345\276\267.png" new file mode 100644 index 0000000000000000000000000000000000000000..0272b710399a36785a4329ec176e08092b6c9a48 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\350\222\231\345\276\267.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/other/\351\233\252\345\261\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\351\233\252\345\261\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..77e5afeb189ba4e5ae5c1db70bdbb05fb28b9d52 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\351\233\252\345\261\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/other/\351\241\273\345\274\245.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\351\241\273\345\274\245.png" new file mode 100644 index 0000000000000000000000000000000000000000..9b36aeb212061cb32704ebab5771d203c07af641 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/other/\351\241\273\345\274\245.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\344\270\215\345\212\250\347\216\204\347\237\263\344\271\213\347\233\270.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\344\270\215\345\212\250\347\216\204\347\237\263\344\271\213\347\233\270.png" new file mode 100644 index 0000000000000000000000000000000000000000..18e256cbf58f9d832f74ae7ea6768e0c114bbaea Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\344\270\215\345\212\250\347\216\204\347\237\263\344\271\213\347\233\270.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\344\271\220\345\233\242\347\232\204\346\231\250\345\205\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\344\271\220\345\233\242\347\232\204\346\231\250\345\205\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..a2063882fea91fb256c686c30494d165460d1b5d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\344\271\220\345\233\242\347\232\204\346\231\250\345\205\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\344\274\227\347\216\213\344\271\213\351\203\275\347\232\204\345\274\200\347\253\257.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\344\274\227\347\216\213\344\271\213\351\203\275\347\232\204\345\274\200\347\253\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..fc5250e8e873564b7d90e654d6be2cf7863ae9e6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\344\274\227\347\216\213\344\271\213\351\203\275\347\232\204\345\274\200\347\253\257.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\344\274\227\347\224\237\344\271\213\350\260\243.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\344\274\227\347\224\237\344\271\213\350\260\243.png" new file mode 100644 index 0000000000000000000000000000000000000000..3c468abb83d769896b357bd7ff16ad9340d26bd3 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\344\274\227\347\224\237\344\271\213\350\260\243.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\201\234\346\221\206\344\271\213\345\210\273.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\201\234\346\221\206\344\271\213\345\210\273.png" new file mode 100644 index 0000000000000000000000000000000000000000..5c5abd2b508abd33bd2ca98d183db31a11107318 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\201\234\346\221\206\344\271\213\345\210\273.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\222\351\231\251\345\256\266\344\271\213\350\212\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\222\351\231\251\345\256\266\344\271\213\350\212\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..d11f36cae9a4a5a9ca3b1c73b63ae18783b27101 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\222\351\231\251\345\256\266\344\271\213\350\212\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\222\351\231\251\345\256\266\345\244\264\345\270\246.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\222\351\231\251\345\256\266\345\244\264\345\270\246.png" new file mode 100644 index 0000000000000000000000000000000000000000..2a4612edd863efb48e7a20e283aa78243173ba92 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\222\351\231\251\345\256\266\345\244\264\345\270\246.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\222\351\231\251\345\256\266\345\260\276\347\276\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\222\351\231\251\345\256\266\345\260\276\347\276\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..86b7b8be41d35dcfbcbf4c05f2d8bfc3258dd27d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\222\351\231\251\345\256\266\345\260\276\347\276\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\222\351\231\251\345\256\266\346\200\200\350\241\250.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\222\351\231\251\345\256\266\346\200\200\350\241\250.png" new file mode 100644 index 0000000000000000000000000000000000000000..f2fd5547cb7f9c275e87562aa9d728790b9ff749 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\222\351\231\251\345\256\266\346\200\200\350\241\250.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\222\351\231\251\345\256\266\351\207\221\346\235\257.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\222\351\231\251\345\256\266\351\207\221\346\235\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..fab193a6d7b69ecd4061026c62ce8b6fbcd0f413 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\222\351\231\251\345\256\266\351\207\221\346\235\257.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\260\351\233\252\346\225\205\345\233\255\347\232\204\347\273\210\346\234\237.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\260\351\233\252\346\225\205\345\233\255\347\232\204\347\273\210\346\234\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..c70258d8581a7e6196fea46606bf834cbb2a3ee6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\206\260\351\233\252\346\225\205\345\233\255\347\232\204\347\273\210\346\234\237.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\207\235\347\273\223\347\232\204\346\227\266\345\210\273.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\207\235\347\273\223\347\232\204\346\227\266\345\210\273.png" new file mode 100644 index 0000000000000000000000000000000000000000..97324d0a79ad51eb6265591d769c51cc37dbc707 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\207\235\347\273\223\347\232\204\346\227\266\345\210\273.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\210\207\350\220\275\344\271\213\347\276\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\210\207\350\220\275\344\271\213\347\276\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..6f71182efa693a8d4410181e4c1941094a80fc04 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\210\207\350\220\275\344\271\213\347\276\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\210\235\345\255\246\350\200\205\344\271\213\347\276\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\210\235\345\255\246\350\200\205\344\271\213\347\276\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..8430d41589ac435c62a057fcf91690cd408c935c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\210\235\345\255\246\350\200\205\344\271\213\347\276\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\207\345\243\253\347\232\204\345\206\240\345\206\225.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\207\345\243\253\347\232\204\345\206\240\345\206\225.png" new file mode 100644 index 0000000000000000000000000000000000000000..aa049be996c860b909c5a9b1df7446397b5259f1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\207\345\243\253\347\232\204\345\206\240\345\206\225.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\207\345\243\253\347\232\204\345\213\213\347\253\240.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\207\345\243\253\347\232\204\345\213\213\347\253\240.png" new file mode 100644 index 0000000000000000000000000000000000000000..715ab4adefa6ddfd5b658069267834f043fd38a2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\207\345\243\253\347\232\204\345\213\213\347\253\240.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\207\345\243\253\347\232\204\345\235\232\346\257\205.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\207\345\243\253\347\232\204\345\235\232\346\257\205.png" new file mode 100644 index 0000000000000000000000000000000000000000..5a96aa7e8ce286bb8b2fc5d919409d6b3053eb01 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\207\345\243\253\347\232\204\345\235\232\346\257\205.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\207\345\243\253\347\232\204\345\243\256\350\241\214.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\207\345\243\253\347\232\204\345\243\256\350\241\214.png" new file mode 100644 index 0000000000000000000000000000000000000000..2588ae2b6df9f08d59137a9a5e37c7354708ebad Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\207\345\243\253\347\232\204\345\243\256\350\241\214.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\207\345\243\253\347\232\204\346\234\237\350\256\270.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\207\345\243\253\347\232\204\346\234\237\350\256\270.png" new file mode 100644 index 0000000000000000000000000000000000000000..abd091952b53300fccc449222d2a4fa8a4078b96 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\207\345\243\253\347\232\204\346\234\237\350\256\270.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\213\347\273\251\344\271\213\350\212\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\213\347\273\251\344\271\213\350\212\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..d1b023bd9392c5f58f9e2ba52e076590cf631d94 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\213\213\347\273\251\344\271\213\350\212\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\215\216\351\245\260\344\271\213\345\205\234.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\215\216\351\245\260\344\271\213\345\205\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..0aedce64adfc7495894cdd83edfbf05d9f28fd65 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\215\216\351\245\260\344\271\213\345\205\234.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\215\216\351\246\206\344\271\213\347\276\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\215\216\351\246\206\344\271\213\347\276\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..fa5eec95b6eaf74a96b9cff4845c6697fef610e5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\215\216\351\246\206\344\271\213\347\276\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\216\206\347\273\217\351\243\216\351\233\252\347\232\204\346\200\235\345\277\265.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\216\206\347\273\217\351\243\216\351\233\252\347\232\204\346\200\235\345\277\265.png" new file mode 100644 index 0000000000000000000000000000000000000000..b7e33ba3cf678b30a08e5b934e6b44cbd20da09a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\216\206\347\273\217\351\243\216\351\233\252\347\232\204\346\200\235\345\277\265.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\220\237\346\270\270\350\200\205\344\271\213\345\243\266.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\220\237\346\270\270\350\200\205\344\271\213\345\243\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..de9ad91e76e537b973f48ed75d17a57a49bae617 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\220\237\346\270\270\350\200\205\344\271\213\345\243\266.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\224\244\351\233\267\347\232\204\345\244\264\345\206\240.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\224\244\351\233\267\347\232\204\345\244\264\345\206\240.png" new file mode 100644 index 0000000000000000000000000000000000000000..b7ac3048e93ed8e07e0fed4df8e88c36c6093d9a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\224\244\351\233\267\347\232\204\345\244\264\345\206\240.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\227\244\347\254\221\344\271\213\351\235\242.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\227\244\347\254\221\344\271\213\351\235\242.png" new file mode 100644 index 0000000000000000000000000000000000000000..748e12f42111f34fa478d32349b7138c9fb6f0c0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\227\244\347\254\221\344\271\213\351\235\242.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\235\232\351\223\234\347\275\227\347\233\230.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\235\232\351\223\234\347\275\227\347\233\230.png" new file mode 100644 index 0000000000000000000000000000000000000000..e17ecd201b59b35bb0b42f0082cb8b6bdb682aa5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\235\232\351\223\234\347\275\227\347\233\230.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\236\202\347\216\211\344\271\213\345\217\266.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\236\202\347\216\211\344\271\213\345\217\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..3c99e73bd9d57f411a43ecd1fc9b63c03c86ec68 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\236\202\347\216\211\344\271\213\345\217\266.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\217\347\245\255\344\271\213\345\210\273.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\217\347\245\255\344\271\213\345\210\273.png" new file mode 100644 index 0000000000000000000000000000000000000000..f46934410acbea178d8627ed637363d9bff7de23 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\217\347\245\255\344\271\213\345\210\273.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\217\347\245\255\344\271\213\350\212\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\217\347\245\255\344\271\213\350\212\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..25cc34993015f4958199fe6e39d7b26f7bb4dfb8 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\217\347\245\255\344\271\213\350\212\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\217\347\245\255\344\271\213\351\235\242.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\217\347\245\255\344\271\213\351\235\242.png" new file mode 100644 index 0000000000000000000000000000000000000000..ac428de6e48948ab8e52b5fe7d7add6d9d44f16f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\217\347\245\255\344\271\213\351\235\242.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\217\347\245\255\346\260\264\347\216\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\217\347\245\255\346\260\264\347\216\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..cf76afda8ec3197595325ec3c70465211fc63346 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\217\347\245\255\346\260\264\347\216\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\217\347\245\255\347\273\210\346\234\253.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\217\347\245\255\347\273\210\346\234\253.png" new file mode 100644 index 0000000000000000000000000000000000000000..7f7ac2fbbe8eaacdd824ba6bfbe51cfefef354dd Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\217\347\245\255\347\273\210\346\234\253.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\261\350\220\275\350\277\267\351\200\224\347\232\204\346\234\272\350\212\257.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\261\350\220\275\350\277\267\351\200\224\347\232\204\346\234\272\350\212\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..d295898c98b7d2bd49c3c8f1d1ce403dc974c9bf Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\244\261\350\220\275\350\277\267\351\200\224\347\232\204\346\234\272\350\212\257.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\245\207\350\277\271\344\271\213\346\235\257.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\245\207\350\277\271\344\271\213\346\235\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..212fc193fce3f04ddb0e3eda34f1950178ae26bc Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\245\207\350\277\271\344\271\213\346\235\257.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\245\207\350\277\271\344\271\213\346\262\231.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\245\207\350\277\271\344\271\213\346\262\231.png" new file mode 100644 index 0000000000000000000000000000000000000000..629cd5a45a98cb280f8c060d7130f401f4f260e2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\245\207\350\277\271\344\271\213\346\262\231.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\245\207\350\277\271\344\271\213\347\276\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\245\207\350\277\271\344\271\213\347\276\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..c01559d93cadfa26888d3faba574d058f35e8522 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\245\207\350\277\271\344\271\213\347\276\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\245\207\350\277\271\344\271\213\350\212\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\245\207\350\277\271\344\271\213\350\212\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..488a035b263dea1c0174e99d1cb051c0ffd5c20d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\245\207\350\277\271\344\271\213\350\212\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\245\207\350\277\271\350\200\263\345\235\240.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\245\207\350\277\271\350\200\263\345\235\240.png" new file mode 100644 index 0000000000000000000000000000000000000000..f8986bd284e5c32917320dcd633f4296e79811cc Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\245\207\350\277\271\350\200\263\345\235\240.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\246\202\350\234\234\347\232\204\347\273\210\345\256\264.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\246\202\350\234\234\347\232\204\347\273\210\345\256\264.png" new file mode 100644 index 0000000000000000000000000000000000000000..75f3ed872e274e07ecbe5ae3c8f312df0c71b2c1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\246\202\350\234\234\347\232\204\347\273\210\345\256\264.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\255\246\345\243\253\347\232\204\344\271\246\347\255\276.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\255\246\345\243\253\347\232\204\344\271\246\347\255\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..0a4eba6cbc2e0af5b9fdad67a3d44d770681d921 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\255\246\345\243\253\347\232\204\344\271\246\347\255\276.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\255\246\345\243\253\347\232\204\345\242\250\346\235\257.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\255\246\345\243\253\347\232\204\345\242\250\346\235\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..4ea3d7064789d34281ee272f44b0915d0b5ae8af Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\255\246\345\243\253\347\232\204\345\242\250\346\235\257.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\255\246\345\243\253\347\232\204\346\227\266\351\222\237.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\255\246\345\243\253\347\232\204\346\227\266\351\222\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..f7b9a432dfe0a98a90f5435f4dd79171bf25eb53 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\255\246\345\243\253\347\232\204\346\227\266\351\222\237.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\255\246\345\243\253\347\232\204\347\276\275\347\254\224.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\255\246\345\243\253\347\232\204\347\276\275\347\254\224.png" new file mode 100644 index 0000000000000000000000000000000000000000..be034c8cdf83b436ef9fab301b7cfd8a7c89905e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\255\246\345\243\253\347\232\204\347\276\275\347\254\224.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\255\246\345\243\253\347\232\204\351\225\234\347\211\207.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\255\246\345\243\253\347\232\204\351\225\234\347\211\207.png" new file mode 100644 index 0000000000000000000000000000000000000000..2e0e0fa9cbab4fd1f8ab8cd095ef310bb56708e6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\255\246\345\243\253\347\232\204\351\225\234\347\211\207.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\346\212\244\344\271\213\347\232\277.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\346\212\244\344\271\213\347\232\277.png" new file mode 100644 index 0000000000000000000000000000000000000000..31f6119c457dfe25e58a8df6c118cc396f195b8b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\346\212\244\344\271\213\347\232\277.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\346\212\244\344\271\213\350\212\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\346\212\244\344\271\213\350\212\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..f067dd2d46deca08c916caa7f0378f6b3d1fcd1f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\346\212\244\344\271\213\350\212\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\346\212\244\345\272\247\351\222\237.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\346\212\244\345\272\247\351\222\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..198fe1934d36006580a370d4c55df2d9d1f39df9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\346\212\244\345\272\247\351\222\237.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\346\212\244\345\276\275\345\215\260.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\346\212\244\345\276\275\345\215\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..7c360d567cf96ab7b1951eb2bf5e5575dbccb350 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\346\212\244\345\276\275\345\215\260.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\346\212\244\346\235\237\345\270\246.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\346\212\244\346\235\237\345\270\246.png" new file mode 100644 index 0000000000000000000000000000000000000000..134f49cbd77b14412947dc7649d493ac6cb1f627 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\346\212\244\346\235\237\345\270\246.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\347\247\230\347\232\204\351\255\224\347\223\266.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\347\247\230\347\232\204\351\255\224\347\223\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..da70d51e84475065e3ac10c284203514828d2ceb Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\210\347\247\230\347\232\204\351\255\224\347\223\266.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\227\345\256\244\344\271\213\347\277\216.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\227\345\256\244\344\271\213\347\277\216.png" new file mode 100644 index 0000000000000000000000000000000000000000..8475931705ef64990c206d40c262741ee34f29c6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\227\345\256\244\344\271\213\347\277\216.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\227\345\256\244\344\271\213\350\212\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\227\345\256\244\344\271\213\350\212\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..fbd3b917873abe9afe36fd424bc47ce005b59cbd Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\227\345\256\244\344\271\213\350\212\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\227\345\256\244\346\227\266\350\256\241.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\227\345\256\244\346\227\266\350\256\241.png" new file mode 100644 index 0000000000000000000000000000000000000000..d12ff9449a66b698380b6601f3f805bc3f3d3e04 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\227\345\256\244\346\227\266\350\256\241.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\227\345\256\244\351\223\266\347\223\256.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\227\345\256\244\351\223\266\347\223\256.png" new file mode 100644 index 0000000000000000000000000000000000000000..0f8bc98ec5690274fbddace1d761d19867ee5a89 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\227\345\256\244\351\223\266\347\223\256.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\227\345\256\244\351\235\242\345\205\267.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\227\345\256\244\351\235\242\345\205\267.png" new file mode 100644 index 0000000000000000000000000000000000000000..0528a84f702a5f793bc2261d63b312333ace4b58 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\256\227\345\256\244\351\235\242\345\205\267.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\260\206\345\270\205\345\205\234\351\215\252.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\260\206\345\270\205\345\205\234\351\215\252.png" new file mode 100644 index 0000000000000000000000000000000000000000..f6b2fe841053810ae534653075e3a6eb2c0f0ac2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\260\206\345\270\205\345\205\234\351\215\252.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\260\221\345\245\263\346\230\223\351\200\235\347\232\204\350\212\263\351\242\234.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\260\221\345\245\263\346\230\223\351\200\235\347\232\204\350\212\263\351\242\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..7dc45b1a3e3370afa6361081eed0421de1bdd986 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\260\221\345\245\263\346\230\223\351\200\235\347\232\204\350\212\263\351\242\234.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\260\221\345\245\263\347\211\207\345\210\273\347\232\204\351\227\262\346\232\207.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\260\221\345\245\263\347\211\207\345\210\273\347\232\204\351\227\262\346\232\207.png" new file mode 100644 index 0000000000000000000000000000000000000000..13a621d087e7f82debb87d21f48cd0d779218b1f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\260\221\345\245\263\347\211\207\345\210\273\347\232\204\351\227\262\346\232\207.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\260\221\345\245\263\350\213\246\347\237\255\347\232\204\350\211\257\350\276\260.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\260\221\345\245\263\350\213\246\347\237\255\347\232\204\350\211\257\350\276\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..36e5e5644dbc6d4e9f19554424bc1869ef3db677 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\260\221\345\245\263\350\213\246\347\237\255\347\232\204\350\211\257\350\276\260.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\260\221\345\245\263\351\243\230\346\221\207\347\232\204\346\200\235\345\277\265.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\260\221\345\245\263\351\243\230\346\221\207\347\232\204\346\200\235\345\277\265.png" new file mode 100644 index 0000000000000000000000000000000000000000..08134b1ee43dc846512dace58404823946faff25 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\260\221\345\245\263\351\243\230\346\221\207\347\232\204\346\200\235\345\277\265.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\265\257\345\263\250\347\276\244\345\263\260\344\271\213\347\277\274.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\265\257\345\263\250\347\276\244\345\263\260\344\271\213\347\277\274.png" new file mode 100644 index 0000000000000000000000000000000000000000..9e28be88084a586c3edfd856f09211bd15a53c1d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\265\257\345\263\250\347\276\244\345\263\260\344\271\213\347\277\274.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\267\211\345\262\251\347\220\242\345\241\221\344\271\213\346\250\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\267\211\345\262\251\347\220\242\345\241\221\344\271\213\346\250\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..3a7c33f5141dd37cba98dbdb3d0c4e537a9897a1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\267\211\345\262\251\347\220\242\345\241\221\344\271\213\346\250\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\263\351\233\267\344\271\213\345\206\240.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\263\351\233\267\344\271\213\345\206\240.png" new file mode 100644 index 0000000000000000000000000000000000000000..b5d0675367e8e1f8fbbf9e7b7fd3833905aeca57 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\263\351\233\267\344\271\213\345\206\240.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\263\351\233\267\344\271\213\345\210\273.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\263\351\233\267\344\271\213\345\210\273.png" new file mode 100644 index 0000000000000000000000000000000000000000..e727514d1215f3f3c8172e5619899ce88121ff70 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\263\351\233\267\344\271\213\345\210\273.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\263\351\233\267\344\271\213\345\231\250.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\263\351\233\267\344\271\213\345\231\250.png" new file mode 100644 index 0000000000000000000000000000000000000000..5359429f6c2fbbe7cc5922b364583c93c0e6fc70 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\263\351\233\267\344\271\213\345\231\250.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\263\351\233\267\344\271\213\345\277\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\263\351\233\267\344\271\213\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..627cd55eb469a3bed09884c67145fc676db28145 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\263\351\233\267\344\271\213\345\277\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\263\351\233\267\344\271\213\347\276\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\263\351\233\267\344\271\213\347\276\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..fec4ef2b79638596fae0af742c1cd56bc443c64e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\263\351\233\267\344\271\213\347\276\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\270\350\277\220\345\204\277\344\271\213\346\235\257.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\270\350\277\220\345\204\277\344\271\213\346\235\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..a232cab4e32441bd8e1829bef553697cb92bc36a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\270\350\277\220\345\204\277\344\271\213\346\235\257.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\270\350\277\220\345\204\277\346\262\231\346\274\217.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\270\350\277\220\345\204\277\346\262\231\346\274\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..28d8ddf3c6ba9aa7df5f7fcb7728c85e68e246ad Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\270\350\277\220\345\204\277\346\262\231\346\274\217.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\270\350\277\220\345\204\277\347\273\277\350\212\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\270\350\277\220\345\204\277\347\273\277\350\212\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..ae0356707fd0f538b482b803eee297ad6665153c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\270\350\277\220\345\204\277\347\273\277\350\212\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\270\350\277\220\345\204\277\351\223\266\345\206\240.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\270\350\277\220\345\204\277\351\223\266\345\206\240.png" new file mode 100644 index 0000000000000000000000000000000000000000..515a8b0784b482d44520fe1787374f906df8b145 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\270\350\277\220\345\204\277\351\223\266\345\206\240.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\270\350\277\220\345\204\277\351\271\260\347\276\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\270\350\277\220\345\204\277\351\271\260\347\276\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..b27cce69c4cfc1c27edb786a64f464ffca8c9259 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\271\270\350\277\220\345\204\277\351\271\260\347\276\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\274\202\345\233\275\344\271\213\347\233\217.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\274\202\345\233\275\344\271\213\347\233\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..8f8d3dd734b13e1bc6e0fc4a7fa2c756e2822fac Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\274\202\345\233\275\344\271\213\347\233\217.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\275\222\344\271\241\344\271\213\347\276\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\275\222\344\271\241\344\271\213\347\276\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..72e4354a43bd6322338829b3f6f56c26737270f3 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\275\222\344\271\241\344\271\213\347\276\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\275\242\351\252\270\344\271\213\347\254\240.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\275\242\351\252\270\344\271\213\347\254\240.png" new file mode 100644 index 0000000000000000000000000000000000000000..a315c9b1f5234341848aeb8965a18ecdaa6e1401 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\345\275\242\351\252\270\344\271\213\347\254\240.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\200\235\345\277\206\344\271\213\347\237\242.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\200\235\345\277\206\344\271\213\347\237\242.png" new file mode 100644 index 0000000000000000000000000000000000000000..4412858eef7874cccbe17c07ff58a6a6d52baaaa Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\200\235\345\277\206\344\271\213\347\237\242.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\204\237\345\210\253\344\271\213\345\206\240.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\204\237\345\210\253\344\271\213\345\206\240.png" new file mode 100644 index 0000000000000000000000000000000000000000..d8c4880c637d66de8ead8a34c891934c34b4d540 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\204\237\345\210\253\344\271\213\345\206\240.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\210\230\347\213\202\347\232\204\346\227\266\350\256\241.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\210\230\347\213\202\347\232\204\346\227\266\350\256\241.png" new file mode 100644 index 0000000000000000000000000000000000000000..660663476f8a689b69306bb0a68d1b45a3b5b624 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\210\230\347\213\202\347\232\204\346\227\266\350\256\241.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\210\230\347\213\202\347\232\204\347\277\216\347\276\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\210\230\347\213\202\347\232\204\347\277\216\347\276\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..72c5667e6e3ffd66ad05ea3b50f4df5cdd979a9a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\210\230\347\213\202\347\232\204\347\277\216\347\276\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\210\230\347\213\202\347\232\204\350\224\267\350\226\207.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\210\230\347\213\202\347\232\204\350\224\267\350\226\207.png" new file mode 100644 index 0000000000000000000000000000000000000000..93ea0ced299a9e27147374f4bcc66170e1486bf1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\210\230\347\213\202\347\232\204\350\224\267\350\226\207.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\210\230\347\213\202\347\232\204\351\252\250\346\235\257.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\210\230\347\213\202\347\232\204\351\252\250\346\235\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..8b734f08e336415ac68ba84462eb9248867c5df8 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\210\230\347\213\202\347\232\204\351\252\250\346\235\257.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\210\230\347\213\202\347\232\204\351\254\274\351\235\242.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\210\230\347\213\202\347\232\204\351\254\274\351\235\242.png" new file mode 100644 index 0000000000000000000000000000000000000000..6fd69b55bb1bf926cd2756bde62baa8005fa20c5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\210\230\347\213\202\347\232\204\351\254\274\351\235\242.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\214\207\346\214\245\347\232\204\347\244\274\345\270\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\214\207\346\214\245\347\232\204\347\244\274\345\270\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..ff6fd80174f462b4ce7e21b17c52ca425709d3f0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\214\207\346\214\245\347\232\204\347\244\274\345\270\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\221\247\345\206\260\350\200\214\350\241\214\347\232\204\346\211\247\346\234\233.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\221\247\345\206\260\350\200\214\350\241\214\347\232\204\346\211\247\346\234\233.png" new file mode 100644 index 0000000000000000000000000000000000000000..300f1941d6ae90cbe16fcd6a68a88f69a8df73aa Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\221\247\345\206\260\350\200\214\350\241\214\347\232\204\346\211\247\346\234\233.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\205\344\272\272\344\271\213\345\277\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\205\344\272\272\344\271\213\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..c810f61885a9b4a4931d701fc0b76454790693fc Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\205\344\272\272\344\271\213\345\277\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\231\345\256\230\347\232\204\345\270\275\345\255\220.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\231\345\256\230\347\232\204\345\270\275\345\255\220.png" new file mode 100644 index 0000000000000000000000000000000000000000..fd2a63e9b01f9f5fb45d3834ee71eb83e46b427d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\231\345\256\230\347\232\204\345\270\275\345\255\220.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\231\345\256\230\347\232\204\346\200\200\350\241\250.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\231\345\256\230\347\232\204\346\200\200\350\241\250.png" new file mode 100644 index 0000000000000000000000000000000000000000..aa97a5a3d7ea3d5f6b5f4ed8de087b591520e882 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\231\345\256\230\347\232\204\346\200\200\350\241\250.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\231\345\256\230\347\232\204\347\276\275\351\245\260.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\231\345\256\230\347\232\204\347\276\275\351\245\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..57a387cba6fd83a533a169b35db4919221295d95 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\231\345\256\230\347\232\204\347\276\275\351\245\260.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\231\345\256\230\347\232\204\350\203\270\350\212\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\231\345\256\230\347\232\204\350\203\270\350\212\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..6710b8e366b9b7fc78a644102fe3aee37111a1ce Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\231\345\256\230\347\232\204\350\203\270\350\212\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\231\345\256\230\347\232\204\350\214\266\346\235\257.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\231\345\256\230\347\232\204\350\214\266\346\235\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..de308d791470c9b304e66b980a1e194a0d51fd98 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\225\231\345\256\230\347\232\204\350\214\266\346\235\257.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\227\240\345\236\242\344\271\213\350\212\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\227\240\345\236\242\344\271\213\350\212\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..c104d3fda10c87928dda0aace74bcf29667bad0f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\227\240\345\236\242\344\271\213\350\212\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\227\240\345\270\270\344\271\213\351\235\242.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\227\240\345\270\270\344\271\213\351\235\242.png" new file mode 100644 index 0000000000000000000000000000000000000000..26f75ff286c5b37cd8be181caee4d0c8ad52343e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\227\240\345\270\270\344\271\213\351\235\242.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\230\216\345\250\201\344\271\213\351\225\241.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\230\216\345\250\201\344\271\213\351\225\241.png" new file mode 100644 index 0000000000000000000000000000000000000000..0d3a4b19fac61d76a50e2fa15d6161084e58d5d6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\230\216\345\250\201\344\271\213\351\225\241.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\230\237\347\275\227\345\234\255\347\222\247\344\271\213\346\231\267.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\230\237\347\275\227\345\234\255\347\222\247\344\271\213\346\231\267.png" new file mode 100644 index 0000000000000000000000000000000000000000..994a7fe4375f2faeb777779d3f81be30b15a828d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\230\237\347\275\227\345\234\255\347\222\247\344\271\213\346\231\267.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\230\255\346\255\246\347\277\216\347\276\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\230\255\346\255\246\347\277\216\347\276\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..64d9ebb40b2217cb29db7654b00ace369dc7c45a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\230\255\346\255\246\347\277\216\347\276\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\234\210\345\245\263\347\232\204\345\215\216\345\275\251.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\234\210\345\245\263\347\232\204\345\215\216\345\275\251.png" new file mode 100644 index 0000000000000000000000000000000000000000..33290fee59007ccb19a32e7f26c3f359da1113e1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\234\210\345\245\263\347\232\204\345\215\216\345\275\251.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\234\210\346\241\202\347\232\204\345\256\235\345\206\240.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\234\210\346\241\202\347\232\204\345\256\235\345\206\240.png" new file mode 100644 index 0000000000000000000000000000000000000000..cb96d0e2654325f1a338e89227df9c785c5cdfcb Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\234\210\346\241\202\347\232\204\345\256\235\345\206\240.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\234\235\351\234\262\344\271\213\346\227\266.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\234\235\351\234\262\344\271\213\346\227\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..01c0d016b225a3c586c8e5d0cc3255aa85dd9ef4 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\234\235\351\234\262\344\271\213\346\227\266.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\237\223\350\241\200\347\232\204\351\223\201\344\271\213\345\277\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\237\223\350\241\200\347\232\204\351\223\201\344\271\213\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..108248650495b25ef391608d0f43e19390257652 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/reliquaries/\346\237\223\350\241\200\347\232\204\351\223\201\344\271\213\345\277\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\270\203\344\270\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\270\203\344\270\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..64dd1a3b33f776343a01f7d22d0285f5954acdc6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\270\203\344\270\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\270\275\350\216\216.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\270\275\350\216\216.png" new file mode 100644 index 0000000000000000000000000000000000000000..2d5b35762fac393eff2fd159f05d583bf7e14d0e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\270\275\350\216\216.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\271\205\345\262\220\345\277\215.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\271\205\345\262\220\345\277\215.png" new file mode 100644 index 0000000000000000000000000000000000000000..6b22ebfbb190f02aade344a744722795f0403e56 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\271\205\345\262\220\345\277\215.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\271\235\346\235\241\350\243\237\347\275\227.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\271\235\346\235\241\350\243\237\347\275\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..d7d1d5776af1297b34e6d1654e19899a5fff43c2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\271\235\346\235\241\350\243\237\347\275\227.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\272\221\345\240\207.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\272\221\345\240\207.png" new file mode 100644 index 0000000000000000000000000000000000000000..5486fd9479c665e645323a9700fdf79cf1aced96 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\272\221\345\240\207.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\272\224\351\203\216.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\272\224\351\203\216.png" new file mode 100644 index 0000000000000000000000000000000000000000..2c12b71a4b3b582acec1d5959521268f1553b359 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\272\224\351\203\216.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\274\230\350\217\210.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\274\230\350\217\210.png" new file mode 100644 index 0000000000000000000000000000000000000000..027409817d8ae9fb9a9f1e761bcd424276315cc5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\344\274\230\350\217\210.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\205\253\351\207\215\347\245\236\345\255\220.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\205\253\351\207\215\347\245\236\345\255\220.png" new file mode 100644 index 0000000000000000000000000000000000000000..fd4fe6cac5b59f382d0f0f4b8cb1a9cafc7ff86f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\205\253\351\207\215\347\245\236\345\255\220.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\207\235\345\205\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\207\235\345\205\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..4f85cbc1093c1bdf0c0afd5a139222bbe365497a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\207\235\345\205\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\207\235\345\205\2112.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\207\235\345\205\2112.png" new file mode 100644 index 0000000000000000000000000000000000000000..8b25c04c8f7b82f583bb206ecbd4b4c6ad81ca41 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\207\235\345\205\2112.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\207\257\344\272\232.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\207\257\344\272\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..e82fc5b42ebe2a64dd4d7c0a2b5716a4bcfcac78 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\207\257\344\272\232.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\210\273\346\231\264.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\210\273\346\231\264.png" new file mode 100644 index 0000000000000000000000000000000000000000..00b37d4010661d7a0468aaa4cd66d652980e7e8b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\210\273\346\231\264.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\210\273\346\231\2642.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\210\273\346\231\2642.png" new file mode 100644 index 0000000000000000000000000000000000000000..35893fb34ce3ed51e8e7cda1e17fd5da268d1fec Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\210\273\346\231\2642.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\214\227\346\226\227.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\214\227\346\226\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..879ecc5eeadf08eb8d92023a8d5ccd671266f08b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\214\227\346\226\227.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\217\257\350\216\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\217\257\350\216\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..456e61af599d0e11d97d1d933d2d43e87e5302b6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\217\257\350\216\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\235\216\350\222\202\344\270\235.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\235\216\350\222\202\344\270\235.png" new file mode 100644 index 0000000000000000000000000000000000000000..219327b96e622ac9d2b25c6e3f4a75798c72c622 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\235\216\350\222\202\344\270\235.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\237\203\346\264\233\344\274\212.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\237\203\346\264\233\344\274\212.png" new file mode 100644 index 0000000000000000000000000000000000000000..b4ccc102f1a545d98cd57c120137e850fd28e8d1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\237\203\346\264\233\344\274\212.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\244\232\350\216\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\244\232\350\216\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..8c71e37eabbfa2fd2d4d2cbe004f4e7e72f513c6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\244\232\350\216\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\244\234\345\205\260.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\244\234\345\205\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..ceaa25bf6000408ee1d657ba3d4687d3064b02e1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\244\234\345\205\260.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\246\256\351\234\262.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\246\256\351\234\262.png" new file mode 100644 index 0000000000000000000000000000000000000000..dfb544b97eeadd1200129af934aa19516cf90d9d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\246\256\351\234\262.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\256\211\346\237\217.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\256\211\346\237\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..794b2fd19edafbfb22e257876258c9d2e77c3df1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\256\211\346\237\217.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\256\265\345\256\253.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\256\265\345\256\253.png" new file mode 100644 index 0000000000000000000000000000000000000000..667267dae7fe8d3bbd2a0b385ec7619f7f2b7a49 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\345\256\265\345\256\253.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\211\230\351\251\254.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\211\230\351\251\254.png" new file mode 100644 index 0000000000000000000000000000000000000000..49776e5f7168aa5b6507fed81f01562c6161ffc0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\211\230\351\251\254.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\217\220\347\272\263\351\207\214.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\217\220\347\272\263\351\207\214.png" new file mode 100644 index 0000000000000000000000000000000000000000..59041c5d817c24f5a0d45b15e7fd2a7e766aa1bd Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\217\220\347\272\263\351\207\214.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\227\251\346\237\232.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\227\251\346\237\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..01e0ea2b0e05ca1df22bb9e6d5d23883ec22ac58 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\227\251\346\237\232.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\234\252\347\237\245.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\234\252\347\237\245.png" new file mode 100644 index 0000000000000000000000000000000000000000..7df64fe8e2a2d91514c5a064605d2a50822bfc6e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\234\252\347\237\245.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\236\253\345\216\237\344\270\207\345\217\266.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\236\253\345\216\237\344\270\207\345\217\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..539ce5116e8ff7402b882f9a9b96220fc4269d93 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\236\253\345\216\237\344\270\207\345\217\266.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\237\257\350\216\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\237\257\350\216\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..cfdd40a181df057130a1e81aed80ed5cfc77898e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\237\257\350\216\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\265\201\346\265\252\350\200\205.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\265\201\346\265\252\350\200\205.png" new file mode 100644 index 0000000000000000000000000000000000000000..1070c9d6a8424e7304eb0cdd04ebaa84abe3feb7 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\265\201\346\265\252\350\200\205.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\270\251\350\277\252.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\270\251\350\277\252.png" new file mode 100644 index 0000000000000000000000000000000000000000..35cf238b2ab0392770a81a6edb04c6e5d2828880 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\346\270\251\350\277\252.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\203\237\347\273\257.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\203\237\347\273\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..783b28d9a1ce53ed3bc77027603234ac2da62904 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\203\237\347\273\257.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\217\212\347\221\232\345\256\253\345\277\203\346\265\267.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\217\212\347\221\232\345\256\253\345\277\203\346\265\267.png" new file mode 100644 index 0000000000000000000000000000000000000000..c8a726e3292f28b7ff7033f4a4330ced3b088645 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\217\212\347\221\232\345\256\253\345\277\203\346\265\267.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\217\220\351\234\262\347\217\212.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\217\220\351\234\262\347\217\212.png" new file mode 100644 index 0000000000000000000000000000000000000000..3029a408a785aadc439ee7fe7a2ba9ff7cebf1ee Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\217\220\351\234\262\347\217\212.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\217\255\345\260\274\347\211\271.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\217\255\345\260\274\347\211\271.png" new file mode 100644 index 0000000000000000000000000000000000000000..2d01365f9ac57753cfebcaead7e14f0eeabfcb58 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\217\255\345\260\274\347\211\271.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\220\264.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\220\264.png" new file mode 100644 index 0000000000000000000000000000000000000000..762425a76966de8beb3a472729a3e9fb92f39265 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\220\264.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\220\2642.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\220\2642.png" new file mode 100644 index 0000000000000000000000000000000000000000..81619b491912c6f0dacd53aa2f0d18fc09c67601 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\220\2642.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\221\266\347\221\266.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\221\266\347\221\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..0f3bbd3575990320592998da7f87cebc103e882c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\221\266\347\221\266.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\224\230\351\233\250.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\224\230\351\233\250.png" new file mode 100644 index 0000000000000000000000000000000000000000..a56f8ebc831fd4091d2195cbf0c81e8b958e4366 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\224\230\351\233\250.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\224\263\351\271\244.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\224\263\351\271\244.png" new file mode 100644 index 0000000000000000000000000000000000000000..0ea3ef4324d823dfab9f1cf8ad2c2741ca96f616 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\224\263\351\271\244.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\240\202\347\263\226.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\240\202\347\263\226.png" new file mode 100644 index 0000000000000000000000000000000000000000..9c3f0d3a6184edd6575fbf1c1ada29106c6e1094 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\240\202\347\263\226.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\245\236\351\207\214\347\273\253\344\272\272.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\245\236\351\207\214\347\273\253\344\272\272.png" new file mode 100644 index 0000000000000000000000000000000000000000..cc37183d318255ec530a1526ad70adacaa7be0d1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\245\236\351\207\214\347\273\253\344\272\272.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\245\236\351\207\214\347\273\253\345\215\216.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\245\236\351\207\214\347\273\253\345\215\216.png" new file mode 100644 index 0000000000000000000000000000000000000000..17ebbda95604184e6ab54eb0fa369697d3183289 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\245\236\351\207\214\347\273\253\345\215\216.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\251\272.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\251\272.png" new file mode 100644 index 0000000000000000000000000000000000000000..25aa3f0510a081732c7fbb005285c5d4d10396ab Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\251\272.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\261\263\345\215\241.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\261\263\345\215\241.png" new file mode 100644 index 0000000000000000000000000000000000000000..7c6dcc3f51c68f4c909424e9cd426b52b1f59b0d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\261\263\345\215\241.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\272\263\350\245\277\345\246\262.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\272\263\350\245\277\345\246\262.png" new file mode 100644 index 0000000000000000000000000000000000000000..b375db5d293d724582bbc257add23fb303841057 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\272\263\350\245\277\345\246\262.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\275\227\350\216\216\350\216\211\344\272\232.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\275\227\350\216\216\350\216\211\344\272\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..832442671b5022dcee941b818dbdf5673d147d77 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\347\275\227\350\216\216\350\216\211\344\272\232.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\203\241\346\241\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\203\241\346\241\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..712c707801b9d381c7e10214720afb5eecff1ff6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\203\241\346\241\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\211\276\345\260\224\346\265\267\346\243\256.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\211\276\345\260\224\346\265\267\346\243\256.png" new file mode 100644 index 0000000000000000000000000000000000000000..8b3d66c4f6f5b3e073b31db627d4ce7613fe9b2c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\211\276\345\260\224\346\265\267\346\243\256.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\212\255\350\212\255\346\213\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\212\255\350\212\255\346\213\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..66dc0c38b6d06dd77f6e8a77a5911405bb0ebfe6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\212\255\350\212\255\346\213\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\212\255\350\212\255\346\213\2112.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\212\255\350\212\255\346\213\2112.png" new file mode 100644 index 0000000000000000000000000000000000000000..d029580e5853285bc473459da1e32fb9a2a94266 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\212\255\350\212\255\346\213\2112.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\215\222\346\263\267\344\270\200\346\226\227.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\215\222\346\263\267\344\270\200\346\226\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..a6ed6c1f9d502213b381e67a6cc411b595bf2ad1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\215\222\346\263\267\344\270\200\346\226\227.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\215\247.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\215\247.png" new file mode 100644 index 0000000000000000000000000000000000000000..7df64fe8e2a2d91514c5a064605d2a50822bfc6e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\215\247.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\216\253\345\250\234.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\216\253\345\250\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..2d5361535c4123d807c391c9b2950c4b79aee952 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\216\253\345\250\234.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\216\261\344\276\235\346\213\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\216\261\344\276\235\346\213\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..1d6b5cf49b4eb63821e110d71973085c24cfdede Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\216\261\344\276\235\346\213\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\217\262\350\260\242\345\260\224.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\217\262\350\260\242\345\260\224.png" new file mode 100644 index 0000000000000000000000000000000000000000..d955462d7fe23000ed698386bbf4c8ea5f309c77 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\217\262\350\260\242\345\260\224.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\217\262\350\260\242\345\260\2242.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\217\262\350\260\242\345\260\2242.png" new file mode 100644 index 0000000000000000000000000000000000000000..66501c15e4e2f49812b793c7da0b07a7a05b6321 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\217\262\350\260\242\345\260\2242.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\241\214\347\247\213.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\241\214\347\247\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..ad0e3d217413eb0d5027508cd94fb3e1dbdebb28 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\241\214\347\247\213.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\257\272\350\211\276\345\260\224.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\257\272\350\211\276\345\260\224.png" new file mode 100644 index 0000000000000000000000000000000000000000..f7c2a7ea4365c6e5262e70f307d1175ef7c38de4 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\257\272\350\211\276\345\260\224.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\265\233\350\257\272.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\265\233\350\257\272.png" new file mode 100644 index 0000000000000000000000000000000000000000..3ccfdc210c7a1d1804478a4accb7bff06a0d4cc7 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\265\233\350\257\272.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\276\233\347\204\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\276\233\347\204\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..c65ddd1a78f901eec6ccf8c59802a1cade1c3db3 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\276\233\347\204\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\276\276\350\276\276\345\210\251\344\272\232.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\276\276\350\276\276\345\210\251\344\272\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..db4d838930c69b7bf56c3f5159f42289ef2e4967 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\276\276\350\276\276\345\210\251\344\272\232.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\277\252\345\215\242\345\205\213.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\277\252\345\215\242\345\205\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..2c850397811e8cc8740b42fd64cbcaf3d80684da Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\277\252\345\215\242\345\205\213.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\277\252\345\215\242\345\205\2132.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\277\252\345\215\242\345\205\2132.png" new file mode 100644 index 0000000000000000000000000000000000000000..045db9c45112f3807d8aae44cb1d0d3074d0c73b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\277\252\345\215\242\345\205\2132.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\277\252\345\245\245\345\250\234.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\277\252\345\245\245\345\250\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..21bd86d1c64ef3682a6dc264165b54086ef1625a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\277\252\345\245\245\345\250\234.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\277\252\345\270\214\351\233\205.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\277\252\345\270\214\351\233\205.png" new file mode 100644 index 0000000000000000000000000000000000000000..42725a1076abb068d7b782c7925d5bdc0b05e8df Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\350\277\252\345\270\214\351\233\205.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\207\215\344\272\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\207\215\344\272\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..cdfdfcddce6d0a6aaae78a0bb175bbca4612b959 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\207\215\344\272\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\222\237\347\246\273.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\222\237\347\246\273.png" new file mode 100644 index 0000000000000000000000000000000000000000..1c1f8db1b7bb92220fa93363715ca77efbe4d2cc Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\222\237\347\246\273.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\230\277\350\264\235\345\244\232.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\230\277\350\264\235\345\244\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..5ff42d98e7e396ad53d154269a8fde9233dd87fd Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\230\277\350\264\235\345\244\232.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\233\267\346\263\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\233\267\346\263\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..3318beaaef07d348bb4201fd5fd51d1c5e3940bc Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\233\267\346\263\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\233\267\347\224\265\345\260\206\345\206\233.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\233\267\347\224\265\345\260\206\345\206\233.png" new file mode 100644 index 0000000000000000000000000000000000000000..6dfcc53f2e8384ebffb7587baf579ea916641718 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\233\267\347\224\265\345\260\206\345\206\233.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\246\231\350\217\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\246\231\350\217\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..4463e7da01e814237ececb7e1321d6f43ba13cc1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\246\231\350\217\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\255\210.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\255\210.png" new file mode 100644 index 0000000000000000000000000000000000000000..206daf8f5c4db0be5939f830fcb3cf7b1ad464c8 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\255\210.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\271\277\351\207\216\351\231\242\345\271\263\350\227\217.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\271\277\351\207\216\351\231\242\345\271\263\350\227\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..9da5ae38cdda60e48fb170941462690c5552adca Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/role/\351\271\277\351\207\216\351\231\242\345\271\263\350\227\217.png" differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/roleCard/bg1.jpg b/src/Yunzai-Bot/plugins/genshin/resources/img/roleCard/bg1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b7decf8ea2666b2ba158e9db10c5c5251df174e Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/roleCard/bg1.jpg differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/roleCard/bg2.jpg b/src/Yunzai-Bot/plugins/genshin/resources/img/roleCard/bg2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f785757f60abe9b9470c542eb003a0764ec1f4d1 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/roleCard/bg2.jpg differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/roleCard/bg3.jpg b/src/Yunzai-Bot/plugins/genshin/resources/img/roleCard/bg3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d674501e193c03691f106e1ec5f1a9f9d5dce13 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/roleCard/bg3.jpg differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/1.png b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/1.png new file mode 100644 index 0000000000000000000000000000000000000000..e5112bd177db9de9bca21117009bb01e46545df5 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/1.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/2.png b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/2.png new file mode 100644 index 0000000000000000000000000000000000000000..19994e9845d5177ffd9a67000924b2e0932e2a02 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/2.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/3.png b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/3.png new file mode 100644 index 0000000000000000000000000000000000000000..8fd741343b419934bee2d8c968746d3b4beff485 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/3.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/4.png b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/4.png new file mode 100644 index 0000000000000000000000000000000000000000..dcbbde15458cf207e8530814d15f934bc7bbf040 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/4.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/5.png b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/5.png new file mode 100644 index 0000000000000000000000000000000000000000..9607dad153f9e8192753d640a466d19f1750aaf2 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/5.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/6.png b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/6.png new file mode 100644 index 0000000000000000000000000000000000000000..46fb5b6bc6ce1d8bdb5b8f9e995260572c26f591 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/6.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/7.png b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/7.png new file mode 100644 index 0000000000000000000000000000000000000000..7d72f1e3dd11778d1e68276362c28f59259be52d Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/7.png differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/8.png b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/8.png new file mode 100644 index 0000000000000000000000000000000000000000..bc193f43cdc873702f43a538c86f1d7914aa30ff Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/roleIndex/namecard/8.png differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\270\203\344\270\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\270\203\344\270\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..42ef9a30d9d0db29499318f142d5e0f62dabddeb Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\270\203\344\270\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\270\275\350\216\216.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\270\275\350\216\216.png" new file mode 100644 index 0000000000000000000000000000000000000000..1516812dad67a3f924a773049de4d23f9ebbe221 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\270\275\350\216\216.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\271\205\345\262\220\345\277\215.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\271\205\345\262\220\345\277\215.png" new file mode 100644 index 0000000000000000000000000000000000000000..66d6c15783c98d2967ffb876f5c8b07247453b65 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\271\205\345\262\220\345\277\215.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\271\235\346\235\241\350\243\237\347\275\227.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\271\235\346\235\241\350\243\237\347\275\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..9f4b34945ed3b5817bfc5e1bd0b2f86e1431333d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\271\235\346\235\241\350\243\237\347\275\227.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\272\221\345\240\207.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\272\221\345\240\207.png" new file mode 100644 index 0000000000000000000000000000000000000000..4ea235501bf360d6437b252112b72e6d5c2821f0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\272\221\345\240\207.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\272\224\351\203\216.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\272\224\351\203\216.png" new file mode 100644 index 0000000000000000000000000000000000000000..713ce9ae40a0b8490506e335a76e83fc0b250c62 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\272\224\351\203\216.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\274\230\350\217\210.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\274\230\350\217\210.png" new file mode 100644 index 0000000000000000000000000000000000000000..529f4e845d70da75ad42f8f813a669326645045f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\344\274\230\350\217\210.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\205\253\351\207\215\347\245\236\345\255\220.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\205\253\351\207\215\347\245\236\345\255\220.png" new file mode 100644 index 0000000000000000000000000000000000000000..258d48d281e0a6e0b1e5efa18b1f99d400eb6edd Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\205\253\351\207\215\347\245\236\345\255\220.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\207\235\345\205\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\207\235\345\205\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..e57178b8aed30904edf49c0b13025ad55e9f7176 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\207\235\345\205\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\207\257\344\272\232.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\207\257\344\272\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..de01f15f42c49d89ace0e6ce2fcbd7ab330b5d26 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\207\257\344\272\232.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\210\273\346\231\264.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\210\273\346\231\264.png" new file mode 100644 index 0000000000000000000000000000000000000000..e171d62efc33ae81a10eba2d95d917ecf78d0957 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\210\273\346\231\264.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\214\227\346\226\227.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\214\227\346\226\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..ae888267949902ec3895b3d66722073a7c7b3123 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\214\227\346\226\227.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\217\257\350\216\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\217\257\350\216\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..e53c579ba61ecee13a29e36a6f9e8f049c25ea3c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\217\257\350\216\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\235\216\350\222\202\344\270\235.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\235\216\350\222\202\344\270\235.png" new file mode 100644 index 0000000000000000000000000000000000000000..45117fbd57d2007626fab282e73383bd0cb631ea Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\235\216\350\222\202\344\270\235.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\237\203\346\264\233\344\274\212.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\237\203\346\264\233\344\274\212.png" new file mode 100644 index 0000000000000000000000000000000000000000..11463dd73e46a758a60339531731edf86437d459 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\237\203\346\264\233\344\274\212.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\244\232\350\216\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\244\232\350\216\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..0467b7e5169f2aca5842bbbf525d5c067e32f666 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\244\232\350\216\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\244\234\345\205\260.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\244\234\345\205\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..b29ca1777905c04bd00aca9c51337314a6e5d5e5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\244\234\345\205\260.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\246\256\351\234\262.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\246\256\351\234\262.png" new file mode 100644 index 0000000000000000000000000000000000000000..4d4d99eb9ba9e4f0bd21769ccdda99fa3b22f5fa Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\246\256\351\234\262.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\256\211\346\237\217.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\256\211\346\237\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..e72414046d5d7c4bc9e4101b152ec1bbc1f2afbb Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\256\211\346\237\217.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\256\265\345\256\253.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\256\265\345\256\253.png" new file mode 100644 index 0000000000000000000000000000000000000000..afbf414f784ccdb8f11532943d4bcf00c361b0f4 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\345\256\265\345\256\253.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\211\230\351\251\254.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\211\230\351\251\254.png" new file mode 100644 index 0000000000000000000000000000000000000000..5d0b04204146f5b4b26cd34322c0f30ce1ad6918 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\211\230\351\251\254.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\217\220\347\272\263\351\207\214.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\217\220\347\272\263\351\207\214.png" new file mode 100644 index 0000000000000000000000000000000000000000..368a27b33b9eb2721ebbb67c68319c9549192222 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\217\220\347\272\263\351\207\214.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\227\205\350\241\214\350\200\205.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\227\205\350\241\214\350\200\205.png" new file mode 100644 index 0000000000000000000000000000000000000000..4c8517a4076d22e5199e3bc2d23b7b454b2dd497 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\227\205\350\241\214\350\200\205.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\227\251\346\237\232.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\227\251\346\237\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..c2b1fe92a6fd84a1af82eafa7bba6c383f7dbb67 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\227\251\346\237\232.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\236\253\345\216\237\344\270\207\345\217\266.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\236\253\345\216\237\344\270\207\345\217\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..ac7327ba50fb1d55e37da460c004af3cd2370601 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\236\253\345\216\237\344\270\207\345\217\266.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\237\257\350\216\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\237\257\350\216\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..334315d812aee5a673d415cc5c22ff4fb07c9458 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\237\257\350\216\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\265\201\346\265\252\350\200\205.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\265\201\346\265\252\350\200\205.png" new file mode 100644 index 0000000000000000000000000000000000000000..ce0431a1c6bc14e67538a68e69ddb49a15a0c871 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\265\201\346\265\252\350\200\205.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\270\251\350\277\252.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\270\251\350\277\252.png" new file mode 100644 index 0000000000000000000000000000000000000000..70328b98f7ddcc83a6791295dbd56ee8b525a78c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\346\270\251\350\277\252.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\203\237\347\273\257.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\203\237\347\273\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..36c37825790ed03a2c8ddb5eb7b965720d2ebf63 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\203\237\347\273\257.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\217\212\347\221\232\345\256\253\345\277\203\346\265\267.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\217\212\347\221\232\345\256\253\345\277\203\346\265\267.png" new file mode 100644 index 0000000000000000000000000000000000000000..b5393c1cb1c48ae04b71af6c7a2c1189a3ead74f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\217\212\347\221\232\345\256\253\345\277\203\346\265\267.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\217\220\351\234\262\347\217\212.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\217\220\351\234\262\347\217\212.png" new file mode 100644 index 0000000000000000000000000000000000000000..3282156c514ef1c4147d5269c9437eb30e757181 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\217\220\351\234\262\347\217\212.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\217\255\345\260\274\347\211\271.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\217\255\345\260\274\347\211\271.png" new file mode 100644 index 0000000000000000000000000000000000000000..b51b20a548c3fbb7066d3bb19b7e1acfe6c0b2e9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\217\255\345\260\274\347\211\271.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\220\264.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\220\264.png" new file mode 100644 index 0000000000000000000000000000000000000000..1db02f47f4db14a1ce20cd482d5746a001280ced Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\220\264.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\224\230\351\233\250.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\224\230\351\233\250.png" new file mode 100644 index 0000000000000000000000000000000000000000..82f9d180e95d5ea30abfdde2d6268bc32162055f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\224\230\351\233\250.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\224\263\351\271\244.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\224\263\351\271\244.png" new file mode 100644 index 0000000000000000000000000000000000000000..8a712e6fccd6035f6a0c1d6b11047f6cd32e27be Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\224\263\351\271\244.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\240\202\347\263\226.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\240\202\347\263\226.png" new file mode 100644 index 0000000000000000000000000000000000000000..eb4d4cdf1f991e081a4708ea89e538cc55abe594 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\240\202\347\263\226.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\245\236\351\207\214\347\273\253\344\272\272.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\245\236\351\207\214\347\273\253\344\272\272.png" new file mode 100644 index 0000000000000000000000000000000000000000..01ac3f3e796d024d52347220675c682d4d68273d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\245\236\351\207\214\347\273\253\344\272\272.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\245\236\351\207\214\347\273\253\345\215\216.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\245\236\351\207\214\347\273\253\345\215\216.png" new file mode 100644 index 0000000000000000000000000000000000000000..7dae501d9de04379b950e81a69686d30a359e59c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\245\236\351\207\214\347\273\253\345\215\216.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\251\272.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\251\272.png" new file mode 100644 index 0000000000000000000000000000000000000000..62cdea257f7736c06c40b96fc4880a678b4f3881 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\251\272.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\272\263\350\245\277\345\246\262.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\272\263\350\245\277\345\246\262.png" new file mode 100644 index 0000000000000000000000000000000000000000..d0b19b7b469252139b1d1eeb2c85a0de4313fa76 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\272\263\350\245\277\345\246\262.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\275\227\350\216\216\350\216\211\344\272\232.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\275\227\350\216\216\350\216\211\344\272\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..a28635c26b9fc02f486c382a4686945b88ca4c6a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\347\275\227\350\216\216\350\216\211\344\272\232.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\203\241\346\241\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\203\241\346\241\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..086f97150335e5a423215c90a2be0b9aabea18e4 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\203\241\346\241\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\212\255\350\212\255\346\213\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\212\255\350\212\255\346\213\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..0a6ebb7d654a894378571ac035f9ea0eb1e2720f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\212\255\350\212\255\346\213\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\215\222\346\263\267\344\270\200\346\226\227.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\215\222\346\263\267\344\270\200\346\226\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..2c1f7550891b829da94d5cfa2e3d0abc3c3c414e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\215\222\346\263\267\344\270\200\346\226\227.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\215\247.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\215\247.png" new file mode 100644 index 0000000000000000000000000000000000000000..4c8517a4076d22e5199e3bc2d23b7b454b2dd497 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\215\247.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\216\253\345\250\234.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\216\253\345\250\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..71e192de45f6f701f28032f38a77dd84eb766a7d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\216\253\345\250\234.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\216\261\344\276\235\346\213\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\216\261\344\276\235\346\213\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..36d89d0a367c22d9c5fca82347772053841d7aba Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\216\261\344\276\235\346\213\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\217\262\350\260\242\345\260\224.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\217\262\350\260\242\345\260\224.png" new file mode 100644 index 0000000000000000000000000000000000000000..be3c661c44d550b39eb8d5f786440df6dcbde8b2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\217\262\350\260\242\345\260\224.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\241\214\347\247\213.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\241\214\347\247\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..407dc40fd31e5935900798244c99607d878ac8e5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\241\214\347\247\213.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\257\272\350\211\276\345\260\224.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\257\272\350\211\276\345\260\224.png" new file mode 100644 index 0000000000000000000000000000000000000000..69c4bab6ec8374671c9e467a54c63a8a40299906 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\257\272\350\211\276\345\260\224.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\265\233\350\257\272.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\265\233\350\257\272.png" new file mode 100644 index 0000000000000000000000000000000000000000..a085e94cd17e73ce9dfe691b6295dc6fe74a6f1e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\265\233\350\257\272.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\276\233\347\204\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\276\233\347\204\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..8e066c5b091b034a6b147b1df6c4f1d50b7245a5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\276\233\347\204\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\276\276\350\276\276\345\210\251\344\272\232.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\276\276\350\276\276\345\210\251\344\272\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..7178e5a3bb49bf59d2e34a9bfb9d862a7f7bd872 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\276\276\350\276\276\345\210\251\344\272\232.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\277\252\345\215\242\345\205\213.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\277\252\345\215\242\345\205\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..43133221387406519641d459535fccddc018a3f0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\277\252\345\215\242\345\205\213.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\277\252\345\245\245\345\250\234.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\277\252\345\245\245\345\250\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..ffb2c578faaf385033332f7ea013c1dcd8eba58c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\350\277\252\345\245\245\345\250\234.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\207\215\344\272\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\207\215\344\272\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..e6baed5450b311d247b4d0f2edbeb789f58f4868 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\207\215\344\272\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\222\237\347\246\273.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\222\237\347\246\273.png" new file mode 100644 index 0000000000000000000000000000000000000000..8d3161029b42cb5d5fcc523536f72f1e63b9248f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\222\237\347\246\273.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\230\277\350\264\235\345\244\232.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\230\277\350\264\235\345\244\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..2ba026a0cdedfa560ad60d61a82d3811744f0293 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\230\277\350\264\235\345\244\232.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\233\267\346\263\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\233\267\346\263\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..fd7675a536d60e9b6c122324339f58dc979f2cd1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\233\267\346\263\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\233\267\347\224\265\345\260\206\345\206\233.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\233\267\347\224\265\345\260\206\345\206\233.png" new file mode 100644 index 0000000000000000000000000000000000000000..b67842ad9bcd949b8b2a55a75a65589cdd8fe6e8 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\233\267\347\224\265\345\260\206\345\206\233.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\246\231\350\217\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\246\231\350\217\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..64d61b0391fd2fba85f7ada221054602e930c62f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\246\231\350\217\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\255\210.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\255\210.png" new file mode 100644 index 0000000000000000000000000000000000000000..414cc2c592e05654a91397099684c82542e63098 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\255\210.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\271\277\351\207\216\351\231\242\345\271\263\350\227\217.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\271\277\351\207\216\351\231\242\345\271\263\350\227\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..4e1530e43f76c695acec4da808c5669c90126a37 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/side/\351\271\277\351\207\216\351\231\242\345\271\263\350\227\217.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\344\273\212\346\230\224\345\211\247\347\224\273_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\344\273\212\346\230\224\345\211\247\347\224\273_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..78cc2d896502c7af6f21468f6402fecb3959843a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\344\273\212\346\230\224\345\211\247\347\224\273_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\344\273\212\346\230\224\345\211\247\347\224\273_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\344\273\212\346\230\224\345\211\247\347\224\273_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..43d40db860078283ae99f3f501fb7221fec5da87 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\344\273\212\346\230\224\345\211\247\347\224\273_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\344\273\212\346\230\224\345\211\247\347\224\273_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\344\273\212\346\230\224\345\211\247\347\224\273_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..2d68d1f2804f3bdd307720baeb705c9aa9f7e3aa Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\344\273\212\346\230\224\345\211\247\347\224\273_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\207\233\351\243\216\345\245\224\347\213\274_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\207\233\351\243\216\345\245\224\347\213\274_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..23a94c324f3f64eea957bc527b364e5ccaf6c981 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\207\233\351\243\216\345\245\224\347\213\274_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\207\233\351\243\216\345\245\224\347\213\274_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\207\233\351\243\216\345\245\224\347\213\274_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..e8ed20e3897c7305f79998e9ec4f032ed6117869 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\207\233\351\243\216\345\245\224\347\213\274_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\207\233\351\243\216\345\245\224\347\213\274_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\207\233\351\243\216\345\245\224\347\213\274_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..c03f2bd98301d766fb2b95481dc739160bd7d15a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\207\233\351\243\216\345\245\224\347\213\274_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\213\244\345\212\263_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\213\244\345\212\263_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..e6303abfb56e1136e4edd76836248b4a3d14cfcf Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\213\244\345\212\263_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\213\244\345\212\263_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\213\244\345\212\263_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..1aa09fdc1fd384956165d7f873976c46e507e2b3 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\213\244\345\212\263_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\213\244\345\212\263_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\213\244\345\212\263_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..34d54e6b802d0d729fdfa3720c9d2fb39f95f2a0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\213\244\345\212\263_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\244\251\345\205\211_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\244\251\345\205\211_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..7be65173a23d53effc36bc3105baaca533224e4b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\244\251\345\205\211_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\244\251\345\205\211_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\244\251\345\205\211_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..4028deeda5df683265079cd1abd926b72ab764f3 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\244\251\345\205\211_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\244\251\345\205\211_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\244\251\345\205\211_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..5bb5eedb5a1c37ee87fa67c5924b02d4d58fc901 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\244\251\345\205\211_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\255\244\344\272\221\345\257\222\346\236\227_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\255\244\344\272\221\345\257\222\346\236\227_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..0ad50ae82ba511b0065631b12b7cfa83e4b762c4 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\255\244\344\272\221\345\257\222\346\236\227_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\255\244\344\272\221\345\257\222\346\236\227_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\255\244\344\272\221\345\257\222\346\236\227_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..e4a09ab855f6994d00b2e4e7e5241f1220b5abe3 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\255\244\344\272\221\345\257\222\346\236\227_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\255\244\344\272\221\345\257\222\346\236\227_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\255\244\344\272\221\345\257\222\346\236\227_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..7c2c219d2d65747d0b7517b223fb412a858a4310 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\255\244\344\272\221\345\257\222\346\236\227_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\267\247\346\200\235_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\267\247\346\200\235_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..ae9812b770db76f469f3a045446b23b5732eb690 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\267\247\346\200\235_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\267\247\346\200\235_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\267\247\346\200\235_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..bba4f276ef88d5300d469084776a3938ed9daa88 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\267\247\346\200\235_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\267\247\346\200\235_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\267\247\346\200\235_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..8ecc0e75d2d6f6d0413d75bced5b9e213848dad2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\345\267\247\346\200\235_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\212\227\344\272\211_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\212\227\344\272\211_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..7adf55b731041bfec37eaad42d41c685c5592648 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\212\227\344\272\211_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\212\227\344\272\211_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\212\227\344\272\211_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..6ee040d1ec42a06dfa2df122c75f9eeb0ee40a57 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\212\227\344\272\211_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\212\227\344\272\211_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\212\227\344\272\211_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..3f7560164563fb0382f45c96390bd537e9e39f29 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\212\227\344\272\211_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\265\256\344\270\226_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\265\256\344\270\226_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..3f9e35042af976e7b47d0ab241d6b1a405e7386a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\265\256\344\270\226_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\265\256\344\270\226_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\265\256\344\270\226_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..e5a4c76608ec0e0f2c416b9f134069d7c4e30c8d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\265\256\344\270\226_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\265\256\344\270\226_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\265\256\344\270\226_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..ea301e2d55199a6a605f979e8ccaed500d4866b6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\265\256\344\270\226_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\274\206\351\273\221\351\231\250\351\223\201_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\274\206\351\273\221\351\231\250\351\223\201_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..13eb8d94a59f30b0c9f94bdccdb3f32c4c0a78f9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\274\206\351\273\221\351\231\250\351\223\201_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\274\206\351\273\221\351\231\250\351\223\201_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\274\206\351\273\221\351\231\250\351\223\201_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..a07f6aa610d0fd19694b93239b0ccb6b75b9d449 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\274\206\351\273\221\351\231\250\351\223\201_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\274\206\351\273\221\351\231\250\351\223\201_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\274\206\351\273\221\351\231\250\351\223\201_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..9f77472be574a87c8c8534095446aeafd7cb3972 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\346\274\206\351\273\221\351\231\250\351\223\201_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\203\210\346\227\245\345\250\201\346\235\203_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\203\210\346\227\245\345\250\201\346\235\203_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..0cae78c3ab8220d76c96575fb46accd3f3cffc65 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\203\210\346\227\245\345\250\201\346\235\203_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\203\210\346\227\245\345\250\201\346\235\203_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\203\210\346\227\245\345\250\201\346\235\203_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..7144aecd0124a7d7a9bf9e5c126e80549a4ae016 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\203\210\346\227\245\345\250\201\346\235\203_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\203\210\346\227\245\345\250\201\346\235\203_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\203\210\346\227\245\345\250\201\346\235\203_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..208d834681f4d680ff938558d1d96b9b597b294c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\203\210\346\227\245\345\250\201\346\235\203_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\213\256\347\211\231\346\226\227\345\243\253_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\213\256\347\211\231\346\226\227\345\243\253_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..a52a9e0f604efd27c1243d90981d3799f03ebe35 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\213\256\347\211\231\346\226\227\345\243\253_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\213\256\347\211\231\346\226\227\345\243\253_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\213\256\347\211\231\346\226\227\345\243\253_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..dc67c9f094bcc5fa31edf3c67c83133921c8bf90 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\213\256\347\211\231\346\226\227\345\243\253_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\213\256\347\211\231\346\226\227\345\243\253_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\213\256\347\211\231\346\226\227\345\243\253_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..4cccfbcf7ec2b0ba8092be297993c18bb28e6d56 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\213\256\347\211\231\346\226\227\345\243\253_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\254\203\350\241\214_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\254\203\350\241\214_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..e1d2af9eb029dcd23a20cabd4a2a0e235d848341 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\254\203\350\241\214_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\254\203\350\241\214_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\254\203\350\241\214_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..d706b80b515d7ac2d77d4979b9897afa7eb7dbb4 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\254\203\350\241\214_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\254\203\350\241\214_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\254\203\350\241\214_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..77ad0157ead28889bd5bc12a89d3c8a043ea06a0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\254\203\350\241\214_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\271\201\350\215\243_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\271\201\350\215\243_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..48f7faa96746037017496c42e342fb03aa6d3b71 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\271\201\350\215\243_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\271\201\350\215\243_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\271\201\350\215\243_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..4bb58fc305afa60e5eb7e29e1cf15ea730b44b95 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\271\201\350\215\243_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\271\201\350\215\243_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\271\201\350\215\243_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..b5b486d070ccf7c5b710c9c960bf47b8a57e0447 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\271\201\350\215\243_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\273\277\346\264\262\350\212\261\345\233\255_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\273\277\346\264\262\350\212\261\345\233\255_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..870422e75c11c73d01a753650121cfca17a0a1a5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\273\277\346\264\262\350\212\261\345\233\255_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\273\277\346\264\262\350\212\261\345\233\255_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\273\277\346\264\262\350\212\261\345\233\255_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..2a7c8f65a3ff886e19347fd5d5dd936de21d9c52 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\273\277\346\264\262\350\212\261\345\233\255_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\273\277\346\264\262\350\212\261\345\233\255_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\273\277\346\264\262\350\212\261\345\233\255_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..cc6a9496982038f3d0407909cb8145ffc6af447e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\347\273\277\346\264\262\350\212\261\345\233\255_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\207\252\347\224\261_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\207\252\347\224\261_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..e9600ed68acf4d4b0eb5f6d90910365ea5f5219e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\207\252\347\224\261_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\207\252\347\224\261_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\207\252\347\224\261_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..d44d6b12e57d7f93a91d7dabb92ae6fe55631818 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\207\252\347\224\261_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\207\252\347\224\261_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\207\252\347\224\261_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..02d71853a71e350c8585a3c0c0efcb95798731df Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\207\252\347\224\261_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\227\346\226\207_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\227\346\226\207_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..1077c5f3a23367e90e937d244c5e08d60bcf40f0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\227\346\226\207_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\227\346\226\207_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\227\346\226\207_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..ff1635344d9f9c94f895a70646f9b09a3ce01e5c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\227\346\226\207_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\227\346\226\207_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\227\346\226\207_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..e697118a9f613171cf00f59dda2a90d8471471df Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\227\346\226\207_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\244\350\250\200_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\244\350\250\200_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..da6639d3e360f184ffceb75b7d7b54f94f61fe2b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\244\350\250\200_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\244\350\250\200_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\244\350\250\200_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..175468befd7884803b34f33caddb7982c4d0a1ca Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\244\350\250\200_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\244\350\250\200_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\244\350\250\200_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..17982fa98ee7e47cc96cc12f2d0b7bb5132c017d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\257\244\350\250\200_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\260\247\346\236\227\346\266\223\351\234\262_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\260\247\346\236\227\346\266\223\351\234\262_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..b3b274a7ce2f980d7f9ba0ae70cb20fb1e4f0ec2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\260\247\346\236\227\346\266\223\351\234\262_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\260\247\346\236\227\346\266\223\351\234\262_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\260\247\346\236\227\346\266\223\351\234\262_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..0adb94138f5751d8ee8f8fd3dd2276d3bd8ceacb Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\260\247\346\236\227\346\266\223\351\234\262_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\260\247\346\236\227\346\266\223\351\234\262_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\260\247\346\236\227\346\266\223\351\234\262_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..cb774a025753a9b342b7583f0508f92427d345ce Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\260\247\346\236\227\346\266\223\351\234\262_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\277\234\346\265\267\345\244\267\345\234\260_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\277\234\346\265\267\345\244\267\345\234\260_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..9e1992fa3ebd9dbfd9f0877c322797e934c6e038 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\277\234\346\265\267\345\244\267\345\234\260_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\277\234\346\265\267\345\244\267\345\234\260_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\277\234\346\265\267\345\244\267\345\234\260_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..4d805c12e0352d2c6cf4a59a7737e30f8cbce858 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\277\234\346\265\267\345\244\267\345\234\260_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\277\234\346\265\267\345\244\267\345\234\260_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\277\234\346\265\267\345\244\267\345\234\260_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..a86d2f635bf599de47abdda2ac1753f47adc1970 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\350\277\234\346\265\267\345\244\267\345\234\260_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\233\276\346\265\267\344\272\221\351\227\264_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\233\276\346\265\267\344\272\221\351\227\264_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..f584cc25f728c1afa991adfba2f846ce2910571f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\233\276\346\265\267\344\272\221\351\227\264_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\233\276\346\265\267\344\272\221\351\227\264_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\233\276\346\265\267\344\272\221\351\227\264_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..434d832589ab22496bb1f5a6c52599380c73f8f0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\233\276\346\265\267\344\272\221\351\227\264_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\233\276\346\265\267\344\272\221\351\227\264_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\233\276\346\265\267\344\272\221\351\227\264_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..6533a7a3e9d45808335597c21fdd056ebc58101e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\233\276\346\265\267\344\272\221\351\227\264_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\243\216\351\233\205_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\243\216\351\233\205_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..fc3ca8ae5a1c19e1993c679cebd73226f8db9fb2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\243\216\351\233\205_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\243\216\351\233\205_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\243\216\351\233\205_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..861de03f908c19c3edd61ebc4f577b77a4e7e8ce Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\243\216\351\233\205_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\243\216\351\233\205_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\243\216\351\233\205_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..7e4b2f2073017c22926963b7f61ce4f5e4b71aa8 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\243\216\351\233\205_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\253\230\345\241\224\345\255\244\347\216\213_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\253\230\345\241\224\345\255\244\347\216\213_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..792c0febd15159bc937069b2c43e8215ebd35e1b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\253\230\345\241\224\345\255\244\347\216\213_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\253\230\345\241\224\345\255\244\347\216\213_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\253\230\345\241\224\345\255\244\347\216\213_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..e97a1c37124a6182952011fb1c4e6e7494147317 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\253\230\345\241\224\345\255\244\347\216\213_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\253\230\345\241\224\345\255\244\347\216\213_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\253\230\345\241\224\345\255\244\347\216\213_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..f4235f9c3857aaccd2dc4725dc77f91cc0b2e722 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\253\230\345\241\224\345\255\244\347\216\213_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\270\243\347\245\236\345\276\241\347\201\265_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\270\243\347\245\236\345\276\241\347\201\265_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..f14068d174263a76f5d97ba5a11ee328d9130310 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\270\243\347\245\236\345\276\241\347\201\265_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\270\243\347\245\236\345\276\241\347\201\265_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\270\243\347\245\236\345\276\241\347\201\265_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..164ae4fe43fe4f311bf62a6f21c7c122cce09854 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\270\243\347\245\236\345\276\241\347\201\265_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\270\243\347\245\236\345\276\241\347\201\265_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\270\243\347\245\236\345\276\241\347\201\265_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..d82485e3cf8c23d49fb1e08f1ce8b053c91dada0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\270\243\347\245\236\345\276\241\347\201\265_4.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\273\204\351\207\221_2.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\273\204\351\207\221_2.png" new file mode 100644 index 0000000000000000000000000000000000000000..bd81863cb34c434e24531508756f9232e4dfdea2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\273\204\351\207\221_2.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\273\204\351\207\221_3.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\273\204\351\207\221_3.png" new file mode 100644 index 0000000000000000000000000000000000000000..6236c4e7130dbace1416006f5230da4511d5b68e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\273\204\351\207\221_3.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\273\204\351\207\221_4.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\273\204\351\207\221_4.png" new file mode 100644 index 0000000000000000000000000000000000000000..adfef34bad08255d9490396e3606f0b163c3e58f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/talent/\351\273\204\351\207\221_4.png" differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/userAdmin/bg.jpg b/src/Yunzai-Bot/plugins/genshin/resources/img/userAdmin/bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..27be4f6b29b0d10e3bfae199bc8d3e744c299da4 Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/userAdmin/bg.jpg differ diff --git a/src/Yunzai-Bot/plugins/genshin/resources/img/userAdmin/footer.png b/src/Yunzai-Bot/plugins/genshin/resources/img/userAdmin/footer.png new file mode 100644 index 0000000000000000000000000000000000000000..6a2e96330423854596b472a9a2061622d4dbcffe Binary files /dev/null and b/src/Yunzai-Bot/plugins/genshin/resources/img/userAdmin/footer.png differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\343\200\214\346\270\224\350\216\267\343\200\215.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\343\200\214\346\270\224\350\216\267\343\200\215.png" new file mode 100644 index 0000000000000000000000000000000000000000..2f3916b396383683724f8083af18b32f52421988 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\343\200\214\346\270\224\350\216\267\343\200\215.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\270\207\345\233\275\350\257\270\346\265\267\345\233\276\350\260\261.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\270\207\345\233\275\350\257\270\346\265\267\345\233\276\350\260\261.png" new file mode 100644 index 0000000000000000000000000000000000000000..956c6e63c8fe48287cfcb6d0dc202101ac54ea22 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\270\207\345\233\275\350\257\270\346\265\267\345\233\276\350\260\261.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\270\215\347\201\255\346\234\210\345\215\216.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\270\215\347\201\255\346\234\210\345\215\216.png" new file mode 100644 index 0000000000000000000000000000000000000000..4e8b19e21a640dd66b38eac7a8c4bb4fa9b4c348 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\270\215\347\201\255\346\234\210\345\215\216.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\270\234\350\212\261\345\235\212\346\227\266\351\233\250.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\270\234\350\212\261\345\235\212\346\227\266\351\233\250.png" new file mode 100644 index 0000000000000000000000000000000000000000..56fcdf0519bfd2f050ee47e8467dfa6ebf578159 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\270\234\350\212\261\345\235\212\346\227\266\351\233\250.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\273\245\347\220\206\346\234\215\344\272\272.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\273\245\347\220\206\346\234\215\344\272\272.png" new file mode 100644 index 0000000000000000000000000000000000000000..7512f450d82530665659e54aed38bc768148da6a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\273\245\347\220\206\346\234\215\344\272\272.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\275\243\345\205\265\351\207\215\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\275\243\345\205\265\351\207\215\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..823bce9c1422a4b956e93206347d4099e52920ed Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\275\243\345\205\265\351\207\215\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\277\241\344\275\277.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\277\241\344\275\277.png" new file mode 100644 index 0000000000000000000000000000000000000000..eaf24fa45dcfc75ee27799c46ae6b29065541476 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\344\277\241\344\275\277.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\206\254\346\236\201\347\231\275\346\230\237.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\206\254\346\236\201\347\231\275\346\230\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..472f36f12ccb79013d313865ca70feee1fdf70dc Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\206\254\346\236\201\347\231\275\346\230\237.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\206\263\346\226\227\344\271\213\346\236\252.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\206\263\346\226\227\344\271\213\346\236\252.png" new file mode 100644 index 0000000000000000000000000000000000000000..dea6388729a42383e23bb216a0483e08554380f6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\206\263\346\226\227\344\271\213\346\236\252.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\206\267\345\210\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\206\267\345\210\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..2db56be571c6472127f30a4741da92e851ef7baf Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\206\267\345\210\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\214\243\351\207\214\346\227\245\346\234\210.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\214\243\351\207\214\346\227\245\346\234\210.png" new file mode 100644 index 0000000000000000000000000000000000000000..1be4270e5bf8662daa23d92c52ec8b74174ea0ba Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\214\243\351\207\214\346\227\245\346\234\210.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\214\243\351\207\214\347\201\255\350\276\260.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\214\243\351\207\214\347\201\255\350\276\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..a9356d52878ad55865494223ed13c84029ef3d0f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\214\243\351\207\214\347\201\255\350\276\260.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\214\243\351\207\214\351\276\231\345\220\237.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\214\243\351\207\214\351\276\231\345\220\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..a74f74a883e287831853bf3b928204578a44cf10 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\214\243\351\207\214\351\276\231\345\220\237.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\215\203\345\244\234\346\265\256\346\242\246.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\215\203\345\244\234\346\265\256\346\242\246.png" new file mode 100644 index 0000000000000000000000000000000000000000..c89fb5247a12af83bc5f2637744543d61f5db1b5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\215\203\345\244\234\346\265\256\346\242\246.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\215\203\345\262\251\345\217\244\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\215\203\345\262\251\345\217\244\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..3618058ba0f3482ad18cf9961e304c2c287fd881 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\215\203\345\262\251\345\217\244\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\215\203\345\262\251\351\225\277\346\236\252.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\215\203\345\262\251\351\225\277\346\236\252.png" new file mode 100644 index 0000000000000000000000000000000000000000..d4bc8a6bb0b38e3cf5066638b87e09910f2f40dd Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\215\203\345\262\251\351\225\277\346\236\252.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\216\206\347\273\203\347\232\204\347\214\216\345\274\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\216\206\347\273\203\347\232\204\347\214\216\345\274\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..a67a53ec6dfd42cc080421046740b884b38ce7d3 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\216\206\347\273\203\347\232\204\347\214\216\345\274\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\216\237\346\234\250\345\210\200.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\216\237\346\234\250\345\210\200.png" new file mode 100644 index 0000000000000000000000000000000000000000..867464b5739b9c458a364b3873e62a5d8e11fbd6 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\216\237\346\234\250\345\210\200.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\217\215\346\233\262\345\274\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\217\215\346\233\262\345\274\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..cf7c4ea3964fec80259c6303706abd3a6deccd27 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\217\215\346\233\262\345\274\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\217\243\350\242\213\351\255\224\345\257\274\344\271\246.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\217\243\350\242\213\351\255\224\345\257\274\344\271\246.png" new file mode 100644 index 0000000000000000000000000000000000000000..33a1ffadf50d600675000c7ac6616cb9c5a2831c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\217\243\350\242\213\351\255\224\345\257\274\344\271\246.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\220\203\350\231\216\351\261\274\345\210\200.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\220\203\350\231\216\351\261\274\345\210\200.png" new file mode 100644 index 0000000000000000000000000000000000000000..f7d84bfb3097d97a0c37bee5d19b0b473ef36dd1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\220\203\350\231\216\351\261\274\345\210\200.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\222\214\347\222\236\351\270\242.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\222\214\347\222\236\351\270\242.png" new file mode 100644 index 0000000000000000000000000000000000000000..5e5fc946c7c20b8a78fc142c2974ef3f3ea3fae9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\222\214\347\222\236\351\270\242.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\226\234\345\244\232\351\231\242\345\215\201\346\226\207\345\255\227.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\226\234\345\244\232\351\231\242\345\215\201\346\226\207\345\255\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..0e3c169a78408ebfbb105216218423d3bffc831c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\226\234\345\244\232\351\231\242\345\215\201\346\226\207\345\255\227.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\230\237\345\230\237\345\217\257\346\225\205\344\272\213\351\233\206.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\230\237\345\230\237\345\217\257\346\225\205\344\272\213\351\233\206.png" new file mode 100644 index 0000000000000000000000000000000000000000..9d4240a7c7dc0fc3ddca6b2086e7e6e033ec4f8d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\230\237\345\230\237\345\217\257\346\225\205\344\272\213\351\233\206.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\233\233\351\243\216\345\216\237\345\205\270.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\233\233\351\243\216\345\216\237\345\205\270.png" new file mode 100644 index 0000000000000000000000000000000000000000..8cb65ec136b25a75e7dd4666c7459c3399e1402a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\233\233\351\243\216\345\216\237\345\205\270.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\233\276\350\216\261\346\235\234\346\213\211\347\232\204\345\233\236\345\277\206.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\233\276\350\216\261\346\235\234\346\213\211\347\232\204\345\233\236\345\277\206.png" new file mode 100644 index 0000000000000000000000000000000000000000..1c7595a3ad0eaa66ae1178cd8381a433cfeaa3ed Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\233\276\350\216\261\346\235\234\346\213\211\347\232\204\345\233\236\345\277\206.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\234\243\346\230\276\344\271\213\351\222\245.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\234\243\346\230\276\344\271\213\351\222\245.png" new file mode 100644 index 0000000000000000000000000000000000000000..9f0615bf49df1e904019fce3d07f3b4e133da905 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\234\243\346\230\276\344\271\213\351\222\245.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\233\256\345\275\261\346\211\223\345\210\200.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\233\256\345\275\261\346\211\223\345\210\200.png" new file mode 100644 index 0000000000000000000000000000000000000000..1f255bf555267846c7e93d3330d4de6566b5c330 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\233\256\345\275\261\346\211\223\345\210\200.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\251\272\344\271\213\345\202\262.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\251\272\344\271\213\345\202\262.png" new file mode 100644 index 0000000000000000000000000000000000000000..cd96eeedbc27cad6533c6de15055d911585738c2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\251\272\344\271\213\345\202\262.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\251\272\344\271\213\345\210\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\251\272\344\271\213\345\210\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..23bc802ba9fdd8614abf54b3e4db84ba45b71246 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\251\272\344\271\213\345\210\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\251\272\344\271\213\345\215\267.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\251\272\344\271\213\345\215\267.png" new file mode 100644 index 0000000000000000000000000000000000000000..ee0d4d60f0927a8e87b01e35b2609e2fa78b4e09 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\251\272\344\271\213\345\215\267.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\251\272\344\271\213\347\277\274.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\251\272\344\271\213\347\277\274.png" new file mode 100644 index 0000000000000000000000000000000000000000..e76059ddfa1bdeedb85cbe0e88554d894e9b3989 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\251\272\344\271\213\347\277\274.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\251\272\344\271\213\350\204\212.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\251\272\344\271\213\350\204\212.png" new file mode 100644 index 0000000000000000000000000000000000000000..260bcb3d594a6fd943d24199952180e130c0a454 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\244\251\347\251\272\344\271\213\350\204\212.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\255\246\345\276\222\347\254\224\350\256\260.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\255\246\345\276\222\347\254\224\350\256\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..08a7e39647c1d660ba9096403183758617541e8a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\255\246\345\276\222\347\254\224\350\256\260.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\256\227\345\256\244\345\244\247\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\256\227\345\256\244\345\244\247\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..bd24209049d381d296e7af8c7a95c67b7927bd64 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\256\227\345\256\244\345\244\247\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\256\227\345\256\244\347\214\216\346\236\252.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\256\227\345\256\244\347\214\216\346\236\252.png" new file mode 100644 index 0000000000000000000000000000000000000000..99a60ba82a77fd9a027b64d9bdbc3253ce707b87 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\256\227\345\256\244\347\214\216\346\236\252.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\256\227\345\256\244\347\247\230\346\263\225\345\275\225.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\256\227\345\256\244\347\247\230\346\263\225\345\275\225.png" new file mode 100644 index 0000000000000000000000000000000000000000..d0796b4e1b54fe2d6bf7c9aac398519ebb5e41fb Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\256\227\345\256\244\347\247\230\346\263\225\345\275\225.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\256\227\345\256\244\351\225\277\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\256\227\345\256\244\351\225\277\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..9bb88375a4f8f359e5df55d3e6772fa17fe8b9da Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\256\227\345\256\244\351\225\277\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\256\227\345\256\244\351\225\277\345\274\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\256\227\345\256\244\351\225\277\345\274\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..07a997318acf72584c7424b957110c1ac357e7a8 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\256\227\345\256\244\351\225\277\345\274\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\260\230\344\270\226\344\271\213\351\224\201.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\260\230\344\270\226\344\271\213\351\224\201.png" new file mode 100644 index 0000000000000000000000000000000000000000..58f7a72c597e630a522968ed5230e3b682071274 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\260\230\344\270\226\344\271\213\351\224\201.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\271\275\345\244\234\345\215\216\345\260\224\345\205\271.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\271\275\345\244\234\345\215\216\345\260\224\345\205\271.png" new file mode 100644 index 0000000000000000000000000000000000000000..fea9d3a11dbb0ccad9349c8eabbaff1c5b7171f8 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\271\275\345\244\234\345\215\216\345\260\224\345\205\271.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\274\202\344\270\226\347\225\214\350\241\214\350\256\260.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\274\202\344\270\226\347\225\214\350\241\214\350\256\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..2ee4fef5dbbca1fb8be8147c3ac4510de7104d70 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\274\202\344\270\226\347\225\214\350\241\214\350\256\260.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\274\223\350\227\217.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\274\223\350\227\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..407a1410da93bec5a4372e08bf19fa7be5581a80 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\274\223\350\227\217.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\274\271\345\274\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\274\271\345\274\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..07b081ceb257fc477084386d60f211f9b3f81299 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\274\271\345\274\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\277\215\345\206\254\344\271\213\346\236\234.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\277\215\345\206\254\344\271\213\346\236\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..91d28cbf4770b1d8df8b86a3f59677dbce7697f0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\345\277\215\345\206\254\344\271\213\346\236\234.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\201\257\347\201\276.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\201\257\347\201\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..4d62559dfb6d554f6430f3c4d87cfaa798406bc0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\201\257\347\201\276.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\201\266\347\216\213\344\270\270.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\201\266\347\216\213\344\270\270.png" new file mode 100644 index 0000000000000000000000000000000000000000..2667e6cb2881a8f9c8d2a2f308ada6665d960c98 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\201\266\347\216\213\344\270\270.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\212\244\346\221\251\344\271\213\346\235\226.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\212\244\346\221\251\344\271\213\346\235\226.png" new file mode 100644 index 0000000000000000000000000000000000000000..e7f7cdd3645a45b6422a836901fdbc2e8adaa645 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\212\244\346\221\251\344\271\213\346\235\226.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\216\240\351\243\237\350\200\205.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\216\240\351\243\237\350\200\205.png" new file mode 100644 index 0000000000000000000000000000000000000000..784c9f25d99d56d9d8ece88839da5d81e3f07827 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\216\240\351\243\237\350\200\205.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\226\253\345\263\260\344\271\213\345\210\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\226\253\345\263\260\344\271\213\345\210\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..bee3075c4501d8b1e188e8c9b84a498d2277967a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\226\253\345\263\260\344\271\213\345\210\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\226\255\346\265\252\351\225\277\351\263\215.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\226\255\346\265\252\351\225\277\351\263\215.png" new file mode 100644 index 0000000000000000000000000000000000000000..721525dc562c30add6a161b4a923dd9faf732c06 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\226\255\346\265\252\351\225\277\351\263\215.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\226\260\346\211\213\351\225\277\346\236\252.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\226\260\346\211\213\351\225\277\346\236\252.png" new file mode 100644 index 0000000000000000000000000000000000000000..4738d262892e655d818bfff23987cfac1251d749 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\226\260\346\211\213\351\225\277\346\236\252.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\227\205\350\241\214\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\227\205\350\241\214\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..dc3b0fdc433fee12bce1789686b40d0e4c82c885 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\227\205\350\241\214\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\227\240\345\267\245\344\271\213\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\227\240\345\267\245\344\271\213\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..d8e5463ebb30595a31ac66d30013885528a419ab Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\227\240\345\267\245\344\271\213\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\227\240\351\224\213\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\227\240\351\224\213\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..e96bcedbab9e5020359b6a80cc1e6f76855c4726 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\227\240\351\224\213\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\230\255\345\277\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\230\255\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..48323e500d8591b07aefe071e2313ab09e7f667f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\230\255\345\277\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\232\227\345\267\267\347\214\216\346\211\213.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\232\227\345\267\267\347\214\216\346\211\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..e5847f3212c15b7da51df2ebf354fd31238dfc7c Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\232\227\345\267\267\347\214\216\346\211\213.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\232\227\345\267\267\347\232\204\351\205\222\344\270\216\350\257\227.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\232\227\345\267\267\347\232\204\351\205\222\344\270\216\350\257\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..5c54c1a7be16f5e10065da9793ccb9032ebabae0 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\232\227\345\267\267\347\232\204\351\205\222\344\270\216\350\257\227.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\232\227\345\267\267\351\227\252\345\205\211.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\232\227\345\267\267\351\227\252\345\205\211.png" new file mode 100644 index 0000000000000000000000000000000000000000..a7d7910711ff90730472b57b42eea0309b73021b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\232\227\345\267\267\351\227\252\345\205\211.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\232\227\351\223\201\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\232\227\351\223\201\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..505c55fcf42c94981ae69f1fdb0567d94cc9d0e9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\232\227\351\223\201\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\233\232\344\272\221\344\271\213\346\234\210.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\233\232\344\272\221\344\271\213\346\234\210.png" new file mode 100644 index 0000000000000000000000000000000000000000..b74847fdc1230e7e6c68fd9342fb182c29f46272 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\233\232\344\272\221\344\271\213\346\234\210.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\235\276\347\261\201\345\223\215\350\265\267\344\271\213\346\227\266.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\235\276\347\261\201\345\223\215\350\265\267\344\271\213\346\227\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..e2f1798409f2d180d63aaa8b4bef60d027a89c52 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\235\276\347\261\201\345\223\215\350\265\267\344\271\213\346\227\266.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\241\202\346\234\250\346\226\251\351\225\277\346\255\243.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\241\202\346\234\250\346\226\251\351\225\277\346\255\243.png" new file mode 100644 index 0000000000000000000000000000000000000000..b7657418e32048046bbf0414172ee865483615d3 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\241\202\346\234\250\346\226\251\351\225\277\346\255\243.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\243\256\346\236\227\347\216\213\345\231\250.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\243\256\346\236\227\347\216\213\345\231\250.png" new file mode 100644 index 0000000000000000000000000000000000000000..c3dd22b06f238226f8df1c523c9ed0039429d9fc Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\243\256\346\236\227\347\216\213\345\231\250.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\262\220\346\265\264\351\276\231\350\241\200\347\232\204\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\262\220\346\265\264\351\276\231\350\241\200\347\232\204\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..020dbcbfa2da32271482e6f10ab00794441308c2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\262\220\346\265\264\351\276\231\350\241\200\347\232\204\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\263\242\344\271\261\346\234\210\347\231\275\347\273\217\346\264\245.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\263\242\344\271\261\346\234\210\347\231\275\347\273\217\346\264\245.png" new file mode 100644 index 0000000000000000000000000000000000000000..86c7c1c1f3b8a37bcccb01649c2b0e947f1ac3dc Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\263\242\344\271\261\346\234\210\347\231\275\347\273\217\346\264\245.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\265\201\346\234\210\351\222\210.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\265\201\346\234\210\351\222\210.png" new file mode 100644 index 0000000000000000000000000000000000000000..d0096a09117473bbe654117b4ffc58b43e7b70f1 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\265\201\346\234\210\351\222\210.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\265\201\346\265\252\344\271\220\347\253\240.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\265\201\346\265\252\344\271\220\347\253\240.png" new file mode 100644 index 0000000000000000000000000000000000000000..bd24aa6caf9c0ce4082699d812bf88589d43830d Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\265\201\346\265\252\344\271\220\347\253\240.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\265\201\346\265\252\347\232\204\346\231\232\346\230\237.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\265\201\346\265\252\347\232\204\346\231\232\346\230\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..cbcd00187fb2a076fb89c923fb4f9e80f0b1fa98 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\346\265\201\346\265\252\347\232\204\346\231\232\346\230\237.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\213\274\347\232\204\346\234\253\350\267\257.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\213\274\347\232\204\346\234\253\350\267\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..851fef731696ec6e2ede9bbc7f77b5ddee701072 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\213\274\347\232\204\346\234\253\350\267\257.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\214\216\344\272\272\344\271\213\345\276\204.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\214\216\344\272\272\344\271\213\345\276\204.png" new file mode 100644 index 0000000000000000000000000000000000000000..c2d224d9a2efc8170fee86fcb667a1d3f1de7dae Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\214\216\344\272\272\344\271\213\345\276\204.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\214\216\345\274\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\214\216\345\274\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..5547bb9550a67c6932ff00e4296369c766441c92 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\214\216\345\274\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\216\213\344\270\213\350\277\221\344\276\215.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\216\213\344\270\213\350\277\221\344\276\215.png" new file mode 100644 index 0000000000000000000000000000000000000000..23bae9346ab6efaaaa85640017fe1f1bef26ade8 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\216\213\344\270\213\350\277\221\344\276\215.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\216\233\346\265\267\350\217\210\347\232\204\346\260\264\350\211\262.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\216\233\346\265\267\350\217\210\347\232\204\346\260\264\350\211\262.png" new file mode 100644 index 0000000000000000000000000000000000000000..508c149b5249ff1b8ee6779cbb528cc53516118f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\216\233\346\265\267\350\217\210\347\232\204\346\260\264\350\211\262.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\224\262\347\272\247\345\256\235\347\217\217.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\224\262\347\272\247\345\256\235\347\217\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..ce5b44d694e37da363ff57b4da3a4d7bddb95e2b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\224\262\347\272\247\345\256\235\347\217\217.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\231\275\345\275\261\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\231\275\345\275\261\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..083a2e242977f67e7825ebf323c84b6ec462d685 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\231\275\345\275\261\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\231\275\347\274\250\346\236\252.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\231\275\347\274\250\346\236\252.png" new file mode 100644 index 0000000000000000000000000000000000000000..5ae5c740251cd853dbd7d8c36683ef5f3a0bfcc8 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\231\275\347\274\250\346\236\252.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\231\275\350\276\260\344\271\213\347\216\257.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\231\275\350\276\260\344\271\213\347\216\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..bc6261f34d9eb5e257038a4b9bcc2fac2783460a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\231\275\350\276\260\344\271\213\347\216\257.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\231\275\351\223\201\345\244\247\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\231\275\351\223\201\345\244\247\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..e82cd73339b2f60c7caa156a752667cf2ab1c84a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\231\275\351\223\201\345\244\247\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\233\210\346\273\241\344\271\213\345\256\236.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\233\210\346\273\241\344\271\213\345\256\236.png" new file mode 100644 index 0000000000000000000000000000000000000000..362c79b5066c950f58f1a7fbd6f9751cb263acf7 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\233\210\346\273\241\344\271\213\345\256\236.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\240\264\351\255\224\344\271\213\345\274\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\240\264\351\255\224\344\271\213\345\274\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..3cea01c3097cd03d7f381de0933f33e7f8197028 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\240\264\351\255\224\344\271\213\345\274\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\243\220\345\262\251\347\273\223\347\273\277.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\243\220\345\262\251\347\273\223\347\273\277.png" new file mode 100644 index 0000000000000000000000000000000000000000..01d06f47475b0823a7276964a45842b4211b47f9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\243\220\345\262\251\347\273\223\347\273\277.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\236\344\271\220\344\271\213\347\234\237\346\204\217.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\236\344\271\220\344\271\213\347\234\237\346\204\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..0d5bdb7afabf33eaadef330ab9722e990e03b49e Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\236\344\271\220\344\271\213\347\234\237\346\204\217.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\236\345\260\204\346\211\213\344\271\213\350\252\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\236\345\260\204\346\211\213\344\271\213\350\252\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..328f2e09b4cf3d293109ecbf9f377b5f45652e60 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\236\345\260\204\346\211\213\344\271\213\350\252\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\255\347\244\274\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\255\347\244\274\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..b3c803a2485324ac2a4718f06360f8aba852f016 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\255\347\244\274\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\255\347\244\274\345\244\247\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\255\347\244\274\345\244\247\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..c0686192e97ea7a14c1259a8951421c117c7e585 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\255\347\244\274\345\244\247\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\255\347\244\274\345\274\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\255\347\244\274\345\274\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..6233e239b774fbee57cfbddb8043aee5bf42f355 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\255\347\244\274\345\274\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\255\347\244\274\346\256\213\347\253\240.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\255\347\244\274\346\256\213\347\253\240.png" new file mode 100644 index 0000000000000000000000000000000000000000..f6e6a60e381ddb71814576d8a360d45e9aaa445a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\245\255\347\244\274\346\256\213\347\253\240.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\253\255\346\263\275.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\253\255\346\263\275.png" new file mode 100644 index 0000000000000000000000000000000000000000..0f29725b0efaf94ca64bcd5fcd2d5f57dc5fcf21 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\253\255\346\263\275.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\254\233\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\254\233\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..dc0aca5783d47f619d9d98c717743c060e6a0cc7 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\254\233\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\254\274\351\222\223\347\223\266\344\270\200\345\277\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\254\274\351\222\223\347\223\266\344\270\200\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..73640ffd4bf039a385946c01c19160cb689b17ee Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\254\274\351\222\223\347\223\266\344\270\200\345\277\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\273\210\346\234\253\345\227\237\345\217\271\344\271\213\350\257\227.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\273\210\346\234\253\345\227\237\345\217\271\344\271\213\350\257\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..3202a2259e938b26f7fb6c5b0954f1a7210c3ca3 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\273\210\346\234\253\345\227\237\345\217\271\344\271\213\350\257\227.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\273\235\345\274\246.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\273\235\345\274\246.png" new file mode 100644 index 0000000000000000000000000000000000000000..f85f7be6358d20f23ae03951c99a896c6e8fe056 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\273\235\345\274\246.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\277\241\347\216\211\346\263\225\347\220\203.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\277\241\347\216\211\346\263\225\347\220\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..d7e1d74c3695e41b0294eb72d908840fed1ce0b5 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\347\277\241\347\216\211\346\263\225\347\220\203.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\205\220\346\256\226\344\271\213\345\211\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\205\220\346\256\226\344\271\213\345\211\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..e3ac216ff6ac2ef56ac94262a47fa85bb38c1d94 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\205\220\346\256\226\344\271\213\345\211\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\213\207\346\265\267\344\277\241\346\240\207.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\213\207\346\265\267\344\277\241\346\240\207.png" new file mode 100644 index 0000000000000000000000000000000000000000..481741466d520d1964f14265706083e643ed66ae Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\213\207\346\265\267\344\277\241\346\240\207.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\213\215\345\217\244\350\207\252\347\224\261\344\271\213\350\252\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\213\215\345\217\244\350\207\252\347\224\261\344\271\213\350\252\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..75395f7ef8ecd41e87f652b5cc8113fabdfa3515 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\213\215\345\217\244\350\207\252\347\224\261\344\271\213\350\252\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\213\215\347\277\240\347\214\216\345\274\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\213\215\347\277\240\347\214\216\345\274\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..85d2ce19ace195e9649282c77665175d7a2bc11b Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\213\215\347\277\240\347\214\216\345\274\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\213\245\346\260\264.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\213\245\346\260\264.png" new file mode 100644 index 0000000000000000000000000000000000000000..95cafd886dc7a129f5bfba4d36c4caefaa42fe4a Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\213\245\346\260\264.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\220\275\351\234\236.png" "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\220\275\351\234\236.png" new file mode 100644 index 0000000000000000000000000000000000000000..ddfb983aeb9448caa16a1064e94c8c672b9ffafa Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/img/weapon/\350\220\275\351\234\236.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/logHelp/\350\256\260\345\275\225\345\270\256\345\212\251-\345\256\211\345\215\223.png" "b/src/Yunzai-Bot/plugins/genshin/resources/logHelp/\350\256\260\345\275\225\345\270\256\345\212\251-\345\256\211\345\215\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..35061b94dee133a661b28ec7e5a4de1bbfacf7b2 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/logHelp/\350\256\260\345\275\225\345\270\256\345\212\251-\345\256\211\345\215\223.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/logHelp/\350\256\260\345\275\225\345\270\256\345\212\251-\347\224\265\350\204\221.png" "b/src/Yunzai-Bot/plugins/genshin/resources/logHelp/\350\256\260\345\275\225\345\270\256\345\212\251-\347\224\265\350\204\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..3c699fad78ff8025b6526565849359c9ae18062f Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/logHelp/\350\256\260\345\275\225\345\270\256\345\212\251-\347\224\265\350\204\221.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/logHelp/\350\256\260\345\275\225\345\270\256\345\212\251-\350\213\271\346\236\234.png" "b/src/Yunzai-Bot/plugins/genshin/resources/logHelp/\350\256\260\345\275\225\345\270\256\345\212\251-\350\213\271\346\236\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..b55827c8cd9598480fb1bffad878a32ab1515faa Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/logHelp/\350\256\260\345\275\225\345\270\256\345\212\251-\350\213\271\346\236\234.png" differ diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/logHelp/\350\256\260\345\275\225\345\270\256\345\212\251.md" "b/src/Yunzai-Bot/plugins/genshin/resources/logHelp/\350\256\260\345\275\225\345\270\256\345\212\251.md" new file mode 100644 index 0000000000000000000000000000000000000000..c23d335131607999801105bcf167de6792b722f3 --- /dev/null +++ "b/src/Yunzai-Bot/plugins/genshin/resources/logHelp/\350\256\260\345\275\225\345\270\256\345\212\251.md" @@ -0,0 +1,39 @@ +## 祈愿记录统计-帮助 +- 查询统计祈愿数据,五星平均抽数,角色抽数等等 +- 该功能需要将抽卡**历史记录**页面链接**私聊**发送给机器人 +- 如何获取请发送命令 **安卓帮助**、**电脑帮助**、**苹果帮助**查看 +- 查看记录命令,**#角色记录**,**#武器记录**,**#常驻记录** + +#### 其他说明 +- 链接发送失败的,请**删除域名**后再发送,或者添加机器人为好友 +- 数据存在**一小时**左右延迟,最多只能获取**最近六个月**的 +- 需要**更新**数据的,请重新获取链接**私聊**发给机器人 +- 复制链接不完整,链接过长输入法复制长度限制,**换个输入法**就能解决 + +#### 记录帮助-安卓 +- 打开游戏-祈愿-打开历史记录页面 +- 断开**wifi**或者**数据连接**,点击右上角**刷新**按钮 +- 此时页面会无法打开,显示一个链接 +- 然后长按**全选**,复制页面所有内容,**私聊**发送给机器人 +- 复制链接不完整,链接过长输入法复制长度限制,**换个输入法**就能解决 + +#### 记录帮助-电脑 +- 打开游戏祈愿-**历史记录页面**,生成日志文件(自动生成) +- 快捷键 `win+R` 打开**运行**,然后输入下面命令,打开日志文件夹 +`%userprofile%\AppData\LocalLow\miHoYo\原神` +- 最后添加机器人好友,将日志文件`output_log.txt`私聊发送给机器人 +- 提示日志被**其他程序占用**,无法发送的,可以将日志复制粘贴一份副本,将副本发送 +- 或者打开日志文件,找到链接**私聊**发送给机器人 +- 日志文件是`output_log.txt`,不是**last**那个 + +#### 记录帮助-苹果 +- 苹果手机需要用捉包获取**历史记录页面链接** +- 应用商店搜索抓包工具**Stream**,下载安装 +- 打开**Stream**,允许**添加VPN配置**,安装**CA证书** +- 点左上角**开始捉包**按钮 +- 打开游戏-祈愿-**历史记录页面**,或者点右上角刷新这个页面 +- 回到**Stream**,点左上角**停止抓包**按钮停止 +- 点右边**抓包历史**按钮,选择最上面一条 +- 选择**按域名**,选择域名为 **hk4e-api.mihoyo.com** 那一条 +- 点最上面一条,选择**请求**,点击**请求信息** +- **复制请求连接**,最后**私聊**发送给机器人 \ No newline at end of file diff --git "a/src/Yunzai-Bot/plugins/genshin/resources/logHelp/\350\256\260\345\275\225\345\270\256\345\212\251.png" "b/src/Yunzai-Bot/plugins/genshin/resources/logHelp/\350\256\260\345\275\225\345\270\256\345\212\251.png" new file mode 100644 index 0000000000000000000000000000000000000000..42da7f60e70f77039bcb1ba9cfff913978f96bb9 Binary files /dev/null and "b/src/Yunzai-Bot/plugins/genshin/resources/logHelp/\350\256\260\345\275\225\345\270\256\345\212\251.png" differ diff --git a/src/Yunzai-Bot/plugins/other/restart.js b/src/Yunzai-Bot/plugins/other/restart.js new file mode 100644 index 0000000000000000000000000000000000000000..b8a11b55ec0c0f868a8e330b59b0f4b1e6bd8b81 --- /dev/null +++ b/src/Yunzai-Bot/plugins/other/restart.js @@ -0,0 +1,126 @@ +import plugin from '../../lib/plugins/plugin.js' +import { createRequire } from 'module' + +const require = createRequire(import.meta.url) +const { exec } = require('child_process') + +export class Restart extends plugin { + constructor (e = '') { + super({ + name: '重启', + dsc: '#重启', + event: 'message', + priority: 10, + rule: [ + { + reg: '^#重启$', + fnc: 'restart', + permission: 'master' + }, + { + reg: '^#(停机|关机)$', + fnc: 'stop', + permission: 'master' + } + ] + }) + + if (e) this.e = e + + this.key = 'Yz:restart' + } + + async init () { + let restart = await redis.get(this.key) + if (restart && process.argv[1].includes('pm2')) { + restart = JSON.parse(restart) + let time = restart.time || new Date().getTime() + time = (new Date().getTime() - time) / 1000 + + let msg = `重启成功:耗时${time.toFixed(2)}秒` + + if (restart.isGroup) { + Bot.pickGroup(restart.id).sendMsg(msg) + } else { + Bot.pickUser(restart.id).sendMsg(msg) + } + redis.del(this.key) + } + } + + async restart () { + await this.e.reply('开始执行重启,请稍等...') + logger.mark(`${this.e.logFnc} 开始执行重启,请稍等...`) + + let data = JSON.stringify({ + isGroup: !!this.e.isGroup, + id: this.e.isGroup ? this.e.group_id : this.e.user_id, + time: new Date().getTime() + }) + + let npm = await this.checkPnpm() + + try { + await redis.set(this.key, data, { EX: 120 }) + let cm = `${npm} start` + if (process.argv[1].includes('pm2')) { + cm = `${npm} run restart` + } else { + await this.e.reply('当前为前台运行,重启将转为后台...') + } + + exec(cm, { windowsHide: true }, (error, stdout, stderr) => { + if (error) { + redis.del(this.key) + this.e.reply(`操作失败!\n${error.stack}`) + logger.error(`重启失败\n${error.stack}`) + } else if (stdout) { + logger.mark('重启成功,运行已由前台转为后台') + logger.mark(`查看日志请用命令:${npm} run log`) + logger.mark(`停止后台运行命令:${npm} stop`) + process.exit() + } + }) + } catch (error) { + redis.del(this.key) + let e = error.stack ?? error + this.e.reply(`操作失败!\n${e}`) + } + + return true + } + + async checkPnpm () { + let npm = 'npm' + let ret = await this.execSync('pnpm -v') + if (ret.stdout) npm = 'pnpm' + return npm + } + + async execSync (cmd) { + return new Promise((resolve, reject) => { + exec(cmd, { windowsHide: true }, (error, stdout, stderr) => { + resolve({ error, stdout, stderr }) + }) + }) + } + + async stop () { + if (!process.argv[1].includes('pm2')) { + logger.mark('关机成功,已停止运行') + await this.e.reply('关机成功,已停止运行') + process.exit() + } + + logger.mark('关机成功,已停止运行') + await this.e.reply('关机成功,已停止运行') + + let npm = await this.checkPnpm() + exec(`${npm} stop`, { windowsHide: true }, (error, stdout, stderr) => { + if (error) { + this.e.reply(`操作失败!\n${error.stack}`) + logger.error(`关机失败\n${error.stack}`) + } + }) + } +} diff --git a/src/Yunzai-Bot/plugins/other/sendLog.js b/src/Yunzai-Bot/plugins/other/sendLog.js new file mode 100644 index 0000000000000000000000000000000000000000..3f74424d6c7fb0eb3f03a4138aa23c6088c8e8ba --- /dev/null +++ b/src/Yunzai-Bot/plugins/other/sendLog.js @@ -0,0 +1,119 @@ +import plugin from '../../lib/plugins/plugin.js' +import fs from 'node:fs' +import lodash from 'lodash' +import moment from 'moment' + +export class sendLog extends plugin { + constructor () { + super({ + name: '发送日志', + dsc: '发送最近100条运行日志', + event: 'message', + rule: [ + { + reg: '^#(运行|错误)*日志[0-9]*(.*)', + fnc: 'sendLog', + permission: 'master' + } + ] + }) + + this.lineNum = 50 + this.maxNum = 800 + + this.logFile = `./logs/command.${moment().format('YYYY-MM-DD')}.log` + this.errFile = './logs/error.log' + } + + async sendLog () { + let lineNum = this.e.msg.match(/\d+/g) + if (lineNum) { + this.lineNum = lineNum[0] + } else { + this.keyWord = this.e.msg.replace(/#|运行|错误|日志|\d/g, '') + } + + let logFile = this.logFile + let type = '运行' + if (this.e.msg.includes('错误')) { + logFile = this.errFile + type = '错误' + } + + if (this.keyWord) type = this.keyWord + + let log = this.getLog(logFile) + + if (lodash.isEmpty(log)) { + this.reply(`暂无相关日志:${type}`) + return + } + + let forwardMsg = await this.makeForwardMsg(`最近${log.length}条${type}日志`, log) + + await this.reply(forwardMsg) + } + + getLog (logFile) { + let log = fs.readFileSync(logFile, { encoding: 'utf-8' }) + log = log.split('\n') + + if (this.keyWord) { + for (let i in log) { + if (!log[i].includes(this.keyWord)) delete log[i] + } + } else { + log = lodash.slice(log, (Number(this.lineNum) + 1) * -1) + } + log = log.reverse() + let tmp = [] + log.forEach(v => { + if (!v) return + if (this.keyWord && tmp.length >= this.maxNum) return + /* eslint-disable no-control-regex */ + v = v.replace(/\x1b[[0-9;]*m/g, '') + v = v.replace(/\r|\n/, '') + '\n\n' + tmp.push(v) + }) + + return tmp + } + + async makeForwardMsg (title, msg) { + let nickname = Bot.nickname + if (this.e.isGroup) { + let info = await Bot.getGroupMemberInfo(this.e.group_id, Bot.uin) + nickname = info.card ?? info.nickname + } + let userInfo = { + user_id: Bot.uin, + nickname + } + + let forwardMsg = [ + { + ...userInfo, + message: title + }, + { + ...userInfo, + message: msg + } + ] + + /** 制作转发内容 */ + if (this.e.isGroup) { + forwardMsg = await this.e.group.makeForwardMsg(forwardMsg) + } else { + forwardMsg = await this.e.friend.makeForwardMsg(forwardMsg) + } + + /** 处理描述 */ + forwardMsg.data = forwardMsg.data + .replace(/\n/g, '') + .replace(/(.+?)<\/title>/g, '___') + .replace(/___+/, `<title color="#777777" size="26">${title}`) + + return forwardMsg + } +} diff --git a/src/Yunzai-Bot/plugins/other/setPubCk.js b/src/Yunzai-Bot/plugins/other/setPubCk.js new file mode 100644 index 0000000000000000000000000000000000000000..d4be99e8065f3c4b3cfad158912c928ad3816218 --- /dev/null +++ b/src/Yunzai-Bot/plugins/other/setPubCk.js @@ -0,0 +1,164 @@ +import plugin from '../../lib/plugins/plugin.js' +import GsCfg from '../genshin/model/gsCfg.js' +import fs from 'node:fs' +import lodash from 'lodash' +import fetch from 'node-fetch' +import YAML from 'yaml' +import MysInfo from '../genshin/model/mys/mysInfo.js' +import common from '../../lib/common/common.js' + +export class setPubCk extends plugin { + constructor (e) { + super({ + name: '配置', + dsc: '#配置ck', + event: 'message', + priority: 700, + rule: [ + { + reg: '^#配置(ck|cookie)$|^#*配置公共查询ck$', + fnc: 'setPubCk', + permission: 'master' + }, + { + reg: '^#使用(全部|用户)ck$', + fnc: 'setUserCk', + permission: 'master' + } + ] + }) + + this.file = './plugins/genshin/config/mys.pubCk.yaml' + } + + /** 配置公共ck */ + async setPubCk () { + /** 设置上下文,后续接收到内容会执行doRep方法 */ + this.setContext('pubCk') + /** 回复 */ + await this.reply('请发送米游社cookie......\n配置后该ck将会加入公共查询池') + } + + async pubCk () { + let msg = this.e.msg + + if (!(/(ltoken|ltoken_v2)/.test(this.e.msg) && /(ltuid|ltmid_v2|account_mid_v2)/.test(this.e.msg))) { + this.e.reply('cookie错误,请发送正确的cookie') + return true + } + + this.finish('pubCk') + + let ck = msg.replace(/#|'|"/g, '') + let param = {} + ck.split(';').forEach((v) => { + let tmp = lodash.trim(v).split('=') + param[tmp[0]] = tmp[1] + }) + + this.ck = '' + lodash.forEach(param, (v, k) => { + if (['ltoken', 'ltuid', 'cookie_token', 'account_id', 'cookie_token_v2', 'account_mid_v2', 'ltmid_v2', 'ltoken_v2'].includes(k)) { + this.ck += `${k}=${v};` + } + }) + + /** 检查ck是否失效 */ + if (!await this.checkCk()) { + logger.mark(`配置公共cookie错误:${this.checkMsg || 'cookie错误'}`) + await this.e.reply(`配置公共cookie错误:${this.checkMsg || 'cookie错误'}`) + return + } + + this.ltuid = param.ltuid + // 判断是否是v2版ck + if (param.cookie_token_v2 && (param.account_mid_v2 || param.ltoken_v2) && !(/(\d{4,9})/g).test(this.ltuid)) { + // 获取米游社通行证id + let userFullInfo = await this.getUserInfo() + if (userFullInfo?.data?.user_info) { + let userInfo = userFullInfo?.data?.user_info + this.ltuid = userInfo.uid + this.ck = `${this.ck}ltuid=${this.ltuid};` + } else { + logger.mark(`配置公共cookie错误:${userFullInfo.message || 'cookie错误'}`) + await this.e.reply(`配置公共cookie错误:${userFullInfo.message || 'cookie错误'}`) + return + } + } + + let ckArr = GsCfg.getConfig('mys', 'pubCk') || [] + + /** 判断是否重复 */ + for (let ck of ckArr) { + if (ck.includes(this.ltuid)) { + await this.e.reply('配置公共cookie错误:该ck已配置') + return + } + } + + ckArr.push(this.ck) + this.save(ckArr) + GsCfg.change_myspubCk() + + await this.e.reply(`配置公共ck成功:第${ckArr.length}个`) + } + + /** 检查ck是否可用 */ + async checkCk () { + let url = 'https://api-takumi.mihoyo.com/binding/api/getUserGameRolesByCookie?game_biz=hk4e_cn' + let res = await fetch(url, { method: 'get', headers: { Cookie: this.ck } }) + if (!res.ok) return false + res = await res.json() + if (res.retcode != 0) { + this.checkMsg = res.message + return false + } + + return true + } + + // 获取米游社通行证id + async getUserInfo (server = 'mys') { + try { + const that = this + let url = { + mys: 'https://bbs-api.mihoyo.com/user/wapi/getUserFullInfo?gids=2', + hoyolab: '' + } + let res = await fetch(url[server], { + method: 'get', + headers: { + Cookie: that.ck, + Accept: 'application/json, text/plain, */*', + Connection: 'keep-alive', + Host: 'bbs-api.mihoyo.com', + Origin: 'https://m.bbs.mihoyo.com', + Referer: ' https://m.bbs.mihoyo.com/' + } + }) + if (!res.ok) return res + res = await res.json() + return res + } catch (e) { + return null + } + } + + save (data) { + data = YAML.stringify(data) + fs.writeFileSync(this.file, data) + } + + async setUserCk () { + let set = './plugins/genshin/config/mys.set.yaml' + + let config = fs.readFileSync(set, 'utf8') + config = config.replace(/allowUseCookie: [0-1]/g, 'allowUseCookie: 1') + fs.writeFileSync(set, config, 'utf8') + + await common.sleep(500) + await MysInfo.initCache(true) + + await this.reply('开启成功,用户ck已加入公共查询ck池') + } +} diff --git a/src/Yunzai-Bot/plugins/other/update.js b/src/Yunzai-Bot/plugins/other/update.js new file mode 100644 index 0000000000000000000000000000000000000000..9d4d5e273d70f458fa14b4aa953771be0cdca3c9 --- /dev/null +++ b/src/Yunzai-Bot/plugins/other/update.js @@ -0,0 +1,316 @@ +import plugin from '../../lib/plugins/plugin.js' +import { createRequire } from 'module' +import lodash from 'lodash' +import fs from 'node:fs' +import { Restart } from './restart.js' +import common from '../../lib/common/common.js' + +const require = createRequire(import.meta.url) +const { exec, execSync } = require('child_process') + +let uping = false + +export class update extends plugin { + constructor () { + super({ + name: '更新', + dsc: '#更新 #强制更新', + event: 'message', + priority: 4000, + rule: [ + { + reg: '^#更新日志$', + fnc: 'updateLog' + }, + { + reg: '^#(强制)*更新(.*)', + fnc: 'update' + }, + { + reg: '^#全部更新$', + fnc: 'updateAll', + permission: 'master' + } + ] + }) + + this.typeName = 'Yunzai-Bot' + } + + async update () { + if (!this.e.isMaster) return false + if (uping) { + await this.reply('已有命令更新中..请勿重复操作') + return + } + + if (/详细|详情|面板|面版/.test(this.e.msg)) return false + + /** 获取插件 */ + let plugin = this.getPlugin() + + if (plugin === false) return false + + /** 检查git安装 */ + if (!await this.checkGit()) return + + /** 执行更新 */ + await this.runUpdate(plugin) + + /** 是否需要重启 */ + if (this.isUp) { + // await this.reply('即将执行重启,以应用更新') + setTimeout(() => this.restart(), 2000) + } + } + + async checkGit () { + let ret = await execSync('git --version', { encoding: 'utf-8' }) + if (!ret || !ret.includes('git version')) { + await this.reply('请先安装git') + return false + } + + return true + } + + getPlugin (plugin = '') { + if (!plugin) { + plugin = this.e.msg.replace(/#|更新|强制/g, '') + if (!plugin) return '' + } + + let path = `./plugins/${plugin}/.git` + + if (!fs.existsSync(path)) return false + + this.typeName = plugin + return plugin + } + + async execSync (cmd) { + return new Promise((resolve, reject) => { + exec(cmd, { windowsHide: true }, (error, stdout, stderr) => { + resolve({ error, stdout, stderr }) + }) + }) + } + + async runUpdate (plugin = '') { + this.isNowUp = false + + let cm = 'git pull --no-rebase' + + let type = '更新' + if (this.e.msg.includes('强制')) { + type = '强制更新' + cm = `git reset --hard origin/main && ${cm}` + } + + if (plugin) { + cm = `git -C ./plugins/${plugin}/ pull --no-rebase` + } + + this.oldCommitId = await this.getcommitId(plugin) + + logger.mark(`${this.e.logFnc} 开始${type}:${this.typeName}`) + + await this.reply(`开始#${type}${this.typeName}`) + uping = true + let ret = await this.execSync(cm) + uping = false + + if (ret.error) { + logger.mark(`${this.e.logFnc} 更新失败:${this.typeName}`) + this.gitErr(ret.error, ret.stdout) + return false + } + + let time = await this.getTime(plugin) + + if (/Already up|已经是最新/g.test(ret.stdout)) { + await this.reply(`${this.typeName}已经是最新\n最后更新时间:${time}`) + } else { + await this.reply(`${this.typeName}更新成功\n更新时间:${time}`) + this.isUp = true + let log = await this.getLog(plugin) + await this.reply(log) + } + + logger.mark(`${this.e.logFnc} 最后更新时间:${time}`) + + return true + } + + async getcommitId (plugin = '') { + let cm = 'git rev-parse --short HEAD' + if (plugin) { + cm = `git -C ./plugins/${plugin}/ rev-parse --short HEAD` + } + + let commitId = await execSync(cm, { encoding: 'utf-8' }) + commitId = lodash.trim(commitId) + + return commitId + } + + async getTime (plugin = '') { + let cm = 'git log -1 --oneline --pretty=format:"%cd" --date=format:"%m-%d %H:%M"' + if (plugin) { + cm = `cd ./plugins/${plugin}/ && git log -1 --oneline --pretty=format:"%cd" --date=format:"%m-%d %H:%M"` + } + + let time = '' + try { + time = await execSync(cm, { encoding: 'utf-8' }) + time = lodash.trim(time) + } catch (error) { + logger.error(error.toString()) + time = '获取时间失败' + } + + return time + } + + async gitErr (err, stdout) { + let msg = '更新失败!' + let errMsg = err.toString() + stdout = stdout.toString() + + if (errMsg.includes('Timed out')) { + let remote = errMsg.match(/'(.+?)'/g)[0].replace(/'/g, '') + await this.reply(msg + `\n连接超时:${remote}`) + return + } + + if (/Failed to connect|unable to access/g.test(errMsg)) { + let remote = errMsg.match(/'(.+?)'/g)[0].replace(/'/g, '') + await this.reply(msg + `\n连接失败:${remote}`) + return + } + + if (errMsg.includes('be overwritten by merge')) { + await this.reply(msg + `存在冲突:\n${errMsg}\n` + '请解决冲突后再更新,或者执行#强制更新,放弃本地修改') + return + } + + if (stdout.includes('CONFLICT')) { + await this.reply([msg + '存在冲突\n', errMsg, stdout, '\n请解决冲突后再更新,或者执行#强制更新,放弃本地修改']) + return + } + + await this.reply([errMsg, stdout]) + } + + async updateAll () { + let dirs = fs.readdirSync('./plugins/') + + await this.runUpdate() + + for (let plu of dirs) { + plu = this.getPlugin(plu) + if (plu === false) continue + await common.sleep(1500) + await this.runUpdate(plu) + } + + if (this.isUp) { + // await this.reply('即将执行重启,以应用更新') + setTimeout(() => this.restart(), 2000) + } + } + + restart () { + new Restart(this.e).restart() + } + + async getLog (plugin = '') { + let cm = 'git log -20 --oneline --pretty=format:"%h||[%cd] %s" --date=format:"%m-%d %H:%M"' + if (plugin) { + cm = `cd ./plugins/${plugin}/ && ${cm}` + } + + let logAll + try { + logAll = await execSync(cm, { encoding: 'utf-8' }) + } catch (error) { + logger.error(error.toString()) + this.reply(error.toString()) + } + + if (!logAll) return false + + logAll = logAll.split('\n') + + let log = [] + for (let str of logAll) { + str = str.split('||') + if (str[0] == this.oldCommitId) break + if (str[1].includes('Merge branch')) continue + log.push(str[1]) + } + let line = log.length + log = log.join('\n\n') + + if (log.length <= 0) return '' + + let end = '' + if (!plugin) { + end = '更多详细信息,请前往github查看\nhttps://github.com/Le-niao/Yunzai-Bot/commits/main' + } + + log = await this.makeForwardMsg(`${plugin || 'Yunzai-Bot'}更新日志,共${line}条`, log, end) + + return log + } + + async makeForwardMsg (title, msg, end) { + let nickname = Bot.nickname + if (this.e.isGroup) { + let info = await Bot.getGroupMemberInfo(this.e.group_id, Bot.uin) + nickname = info.card ?? info.nickname + } + let userInfo = { + user_id: Bot.uin, + nickname + } + + let forwardMsg = [ + { + ...userInfo, + message: title + }, + { + ...userInfo, + message: msg + } + ] + + if (end) { + forwardMsg.push({ + ...userInfo, + message: end + }) + } + + /** 制作转发内容 */ + if (this.e.isGroup) { + forwardMsg = await this.e.group.makeForwardMsg(forwardMsg) + } else { + forwardMsg = await this.e.friend.makeForwardMsg(forwardMsg) + } + + /** 处理描述 */ + forwardMsg.data = forwardMsg.data + .replace(/\n/g, '') + .replace(/(.+?)<\/title>/g, '___') + .replace(/___+/, `<title color="#777777" size="26">${title}`) + + return forwardMsg + } + + async updateLog () { + let log = await this.getLog() + await this.reply(log) + } +} diff --git a/src/Yunzai-Bot/plugins/system/add.js b/src/Yunzai-Bot/plugins/system/add.js new file mode 100644 index 0000000000000000000000000000000000000000..58b1b1f8f50cc7d6beb366fcfda40896f0dc5ee8 --- /dev/null +++ b/src/Yunzai-Bot/plugins/system/add.js @@ -0,0 +1,826 @@ + +import cfg from '../../lib/config/config.js' +import plugin from '../../lib/plugins/plugin.js' +import fs from 'node:fs' +import lodash from 'lodash' +import { segment } from 'oicq' +import { pipeline } from 'stream' +import { promisify } from 'util' +import fetch from 'node-fetch' +import moment from 'moment' + +let textArr = {} + +export class add extends plugin { + constructor () { + super({ + name: '添加表情', + dsc: '添加表情,文字等', + event: 'message', + priority: 50000, + rule: [ + { + reg: '^#(全局)?添加(.*)', + fnc: 'add' + }, + { + reg: '^#(全局)?删除(.*)', + fnc: 'del' + }, + { + reg: '(.*)', + fnc: 'getText', + log: false + }, + { + reg: '#(全局)?(表情|词条)(.*)', + fnc: 'list' + } + ] + }) + + this.path = './data/textJson/' + this.facePath = './data/face/' + /** 全局表情标记 */ + this.isGlobal = false + } + + async init () { + if (!fs.existsSync(this.path)) { + fs.mkdirSync(this.path) + } + if (!fs.existsSync(this.facePath)) { + fs.mkdirSync(this.facePath) + } + } + + async accept () { + /** 处理消息 */ + if (this.e.atBot && this.e.msg && this.e?.msg.includes('添加') && !this.e?.msg.includes('#')) { + this.e.msg = '#' + this.e.msg + } + } + + /** 群号key */ + get grpKey () { + return `Yz:group_id:${this.e.user_id}` + } + + /** #添加 */ + async add () { + this.isGlobal = this.e?.msg.includes("全局"); + await this.getGroupId() + + if (!this.group_id) { + this.e.reply('请先在群内触发表情,确定添加的群') + return + } + + this.initTextArr() + + if (!this.checkAuth()) return + if (!this.checkKeyWord()) return + if (await this.singleAdd()) return + /** 获取关键词 */ + this.getKeyWord() + + if (!this.keyWord) { + this.e.reply('添加错误:没有关键词') + return + } + + this.setContext('addContext') + + await this.e.reply('请发送添加内容', false, { at: true }) + } + + /** 获取群号 */ + async getGroupId () { + + /** 添加全局表情,存入到机器人qq文件中 */ + if (this.isGlobal) { + this.group_id = Bot.uin; + return Bot.uin; + } + + if (this.e.isGroup) { + this.group_id = this.e.group_id + redis.setEx(this.grpKey, 3600 * 24 * 30, String(this.group_id)) + return this.group_id + } + + // redis获取 + let groupId = await redis.get(this.grpKey) + if (groupId) { + this.group_id = groupId + return this.group_id + } + + return false + } + + checkAuth () { + if (this.e.isMaster) return true + + let groupCfg = cfg.getGroup(this.group_id) + if (groupCfg.imgAddLimit == 2) { + this.e.reply('暂无权限,只有主人才能操作') + return false + } + if (groupCfg.imgAddLimit == 1) { + if (!Bot.gml.has(this.group_id)) { + return false + } + if (!Bot.gml.get(this.group_id).get(this.e.user_id)) { + return false + } + if (!this.e.member.is_admin) { + this.e.reply('暂无权限,只有管理员才能操作') + return false + } + } + + if (!this.e.isGroup && groupCfg.addPrivate != 1) { + this.e.reply('禁止私聊添加') + return false + } + + return true + } + + checkKeyWord () { + if (this.e.img && this.e.img.length > 1) { + this.e.reply('添加错误:只能发送一个表情当关键词') + return false + } + + if (this.e.at) { + let at = lodash.filter(this.e.message, (o) => { return o.type == 'at' && o.qq != Bot.uin }) + if (at.length > 1) { + this.e.reply('添加错误:只能@一个人当关键词') + return false + } + } + + if (this.e.img && this.e.at) { + this.e.reply('添加错误:没有关键词') + return false + } + + return true + } + + /** 单独添加 */ + async singleAdd () { + if (this.e.message.length != 2) return false + let msg = lodash.keyBy(this.e.message, 'type') + if (!this.e.msg || !msg.image) return false + + let keyWord = this.e.msg.replace(/#|#|图片|表情|添加|全局/g, '').trim() + if (!keyWord) return false + + this.keyWord = this.trimAlias(keyWord) + this.e.keyWord = this.keyWord + + if (this.e.msg.includes('添加图片')) { + this.e.addImg = true + } + this.e.message = [msg.image] + await this.addContext() + + return true + } + + /** 获取添加关键词 */ + getKeyWord () { + this.e.isGlobal = this.e.msg.includes("全局"); + + this.keyWord = this.e.toString() + .trim() + /** 过滤#添加 */ + .replace(/#|#|图片|表情|添加|删除|全局/g, '') + /** 过滤@ */ + .replace(new RegExp('{at:' + Bot.uin + '}', 'g'), '') + .trim() + + this.keyWord = this.trimAlias(this.keyWord) + this.e.keyWord = this.keyWord + + if (this.e.msg.includes('添加图片')) { + this.e.addImg = true + } + } + + /** 过滤别名 */ + trimAlias (msg) { + let groupCfg = cfg.getGroup(this.group_id) + let alias = groupCfg.botAlias + if (!Array.isArray(alias)) { + alias = [alias] + } + for (let name of alias) { + if (msg.startsWith(name)) { + msg = lodash.trimStart(msg, name).trim() + } + } + + return msg + } + + /** 添加内容 */ + async addContext () { + this.isGlobal = this.e.isGlobal || this.getContext()?.addContext?.isGlobal; + await this.getGroupId() + /** 关键词 */ + let keyWord = this.keyWord || this.getContext()?.addContext?.keyWord + let addImg = this.e.addImg || this.getContext()?.addContext?.addImg + + /** 添加内容 */ + let message = this.e.message + + let retMsg = this.getRetMsg() + this.finish('addContext') + + for (let i in message) { + if (message[i].type == 'at') { + if (message[i].qq == Bot.uin) { + this.e.reply('添加内容不能@机器人!') + return + } + } + if (message[i].type == 'file') { + this.e.reply('添加错误:禁止添加文件') + return + } + } + + if (message.length == 1 && message[0].type == 'image') { + let local = await this.saveImg(message[0].url, keyWord) + if (!local) return + message[0].local = local + message[0].asface = true + if (addImg) message[0].asface = false + } + + if (!textArr[this.group_id]) textArr[this.group_id] = new Map() + + /** 支持单个关键词添加多个 */ + let text = textArr[this.group_id].get(keyWord) + if (text) { + text.push(message) + textArr[this.group_id].set(keyWord, text) + } else { + text = [message] + textArr[this.group_id].set(keyWord, text) + } + + if (text.length > 1 && retMsg[0].type != 'image') { + retMsg.push(String(text.length)) + } + + retMsg.unshift('添加成功:') + + this.saveJson() + this.e.reply(retMsg) + } + + /** 添加成功回复消息 */ + getRetMsg () { + let retMsg = this.getContext() + let msg = '' + if (retMsg?.addContext?.message) { + msg = retMsg.addContext.message + + for (let i in msg) { + if (msg[i].type == 'text' && msg[i].text.includes('添加')) { + msg[i].text = this.trimAlias(msg[i].text) + msg[i].text = msg[i].text.trim().replace(/#|#|图片|表情|添加|全局/g, '') + if (!msg[i].text) delete msg[i] + continue + } + if (msg[i].type == 'at') { + if (msg[i].qq == Bot.uin) { + delete msg[i] + continue + } else { + msg[i].text = '' + } + } + } + } + if (!msg && this.keyWord) { + msg = [this.keyWord] + } + return lodash.compact(msg) + } + + saveJson () { + let obj = {} + for (let [k, v] of textArr[this.group_id]) { + obj[k] = v + } + + fs.writeFileSync(`${this.path}${this.group_id}.json`, JSON.stringify(obj, '', '\t')) + } + + saveGlobalJson() { + let obj = {}; + for (let [k, v] of textArr[Bot.uin]) { + obj[k] = v; + } + + fs.writeFileSync( + `${this.path}${Bot.uin}.json`, + JSON.stringify(obj, "", "\t") + ); + } + + async saveImg (url, keyWord) { + let groupCfg = cfg.getGroup(this.group_id) + let savePath = `${this.facePath}${this.group_id}/` + + if (!fs.existsSync(savePath)) { + fs.mkdirSync(savePath) + } + + const response = await fetch(url) + + keyWord = keyWord.replace(/\.|\\|\/|:|\*|\?|<|>|\|"/g, '_') + + if (!response.ok) { + this.e.reply('添加图片下载失败。。') + return false + } + + let imgSize = (response.headers.get('size') / 1024 / 1024).toFixed(2) + if (imgSize > 1024 * 1024 * groupCfg.imgMaxSize) { + this.e.reply(`添加失败:表情太大了,${imgSize}m`) + return false + } + + let type = response.headers.get('content-type').split('/')[1] + if (type == 'jpeg') type = 'jpg' + + if (fs.existsSync(`${savePath}${keyWord}.${type}`)) { + keyWord = `${keyWord}_${moment().format('X')}` + } + + savePath = `${savePath}${keyWord}.${type}` + + const streamPipeline = promisify(pipeline) + await streamPipeline(response.body, fs.createWriteStream(savePath)) + + return savePath + } + + async getText () { + if (!this.e.message) return false + + this.isGlobal = false + + await this.getGroupId() + + if (!this.group_id) return false + + this.initTextArr() + + this.initGlobalTextArr() + + let keyWord = this.e.toString() + .replace(/#|#/g, '') + .replace(`{at:${Bot.uin}}`, '') + .trim() + + keyWord = this.trimAlias(keyWord) + + let num = 0 + if (isNaN(keyWord)) { + num = keyWord.charAt(keyWord.length - 1) + + if (!isNaN(num) && !textArr[this.group_id].has(keyWord) && !textArr[Bot.uin].has(keyWord)) { + keyWord = lodash.trimEnd(keyWord, num).trim() + num-- + } + } + + let msg = textArr[this.group_id].get(keyWord) || [] + let globalMsg = textArr[Bot.uin].get(keyWord) || [] + if (lodash.isEmpty(msg) && lodash.isEmpty(globalMsg)) return false + + msg = [...msg, ...globalMsg] + + if (num >= 0 && num < msg.length) { + msg = msg[num] + } else { + /** 随机获取一个 */ + num = lodash.random(0, msg.length - 1) + msg = msg[num] + } + + if (msg[0] && msg[0].local) { + if (fs.existsSync(msg[0].local)) { + let tmp = segment.image(msg[0].local) + tmp.asface = msg[0].asface + msg = tmp + } else { + // this.e.reply(`表情已删除:${keyWord}`) + return + } + } + + if (Array.isArray(msg)) { + msg.forEach(m => { + /** 去除回复@@ */ + if (m?.type == 'at') { delete m.text } + }) + } + + logger.mark(`[发送表情]${this.e.logText} ${keyWord}`) + let ret = await this.e.reply(msg) + if (!ret) { + this.expiredMsg(keyWord, num) + } + + return true + } + + expiredMsg (keyWord, num) { + logger.mark(`[发送表情]${this.e.logText} ${keyWord} 表情已过期失效`) + + let arr = textArr[this.group_id].get(keyWord) + arr.splice(num, 1) + + if (arr.length <= 0) { + textArr[this.group_id].delete(keyWord) + } else { + textArr[this.group_id].set(keyWord, arr) + } + + this.saveJson() + } + + /** 初始化已添加内容 */ + initTextArr () { + if (textArr[this.group_id]) return + + textArr[this.group_id] = new Map() + + let path = `${this.path}${this.group_id}.json` + if (!fs.existsSync(path)) { + return + } + + try { + let text = JSON.parse(fs.readFileSync(path, 'utf8')) + for (let i in text) { + if (text[i][0] && !Array.isArray(text[i][0])) { + text[i] = [text[i]] + } + + textArr[this.group_id].set(String(i), text[i]) + } + } catch (error) { + logger.error(`json格式错误:${path}`) + delete textArr[this.group_id] + return false + } + + /** 加载表情 */ + let facePath = `${this.facePath}${this.group_id}` + + if (fs.existsSync(facePath)) { + const files = fs.readdirSync(`${this.facePath}${this.group_id}`).filter(file => /\.(jpeg|jpg|png|gif)$/g.test(file)) + for (let val of files) { + let tmp = val.split('.') + tmp[0] = tmp[0].replace(/_[0-9]{10}$/, '') + if (/at|image/g.test(val)) continue + + if (textArr[this.group_id].has(tmp[0])) continue + + textArr[this.group_id].set(tmp[0], [[{ + local: `${facePath}/${val}`, + asface: true + }]]) + } + + this.saveJson() + } else { + fs.mkdirSync(facePath) + } + } + + /** 初始化全局已添加内容 */ + initGlobalTextArr() { + if (textArr[Bot.uin]) return; + + textArr[Bot.uin] = new Map(); + + let globalPath = `${this.path}${Bot.uin}.json`; + if (!fs.existsSync(globalPath)) { + return; + } + + try { + let text = JSON.parse(fs.readFileSync(globalPath, "utf8")); + + for (let i in text) { + if (text[i][0] && !Array.isArray(text[i][0])) { + text[i] = [text[i]]; + } + textArr[Bot.uin].set(String(i), text[i]); + } + } catch (error) { + logger.error(`json格式错误:${globalPath}`); + delete textArr[Bot.uin]; + return false; + } + + /** 加载表情 */ + let globalFacePath = `${this.facePath}${Bot.uin}`; + + if (fs.existsSync(globalFacePath)) { + const files = fs + .readdirSync(`${this.facePath}${Bot.uin}`) + .filter((file) => /\.(jpeg|jpg|png|gif)$/g.test(file)); + + for (let val of files) { + let tmp = val.split("."); + tmp[0] = tmp[0].replace(/_[0-9]{10}$/, ""); + if (/at|image/g.test(val)) continue; + + if (textArr[Bot.uin].has(tmp[0])) continue; + + textArr[Bot.uin].set(tmp[0], [ + [ + { + local: `${globalFacePath}/${val}`, + asface: true, + }, + ], + ]); + } + + this.saveGlobalJson(); + } else { + fs.mkdirSync(globalFacePath); + } + } + + async del () { + this.isGlobal = this.e?.msg.includes("全局"); + await this.getGroupId() + if (!this.group_id) return false + if (!this.checkAuth()) return + + this.initTextArr() + + let keyWord = this.e.toString().replace(/#|#|图片|表情|删除|全部|全局/g, '') + + keyWord = this.trimAlias(keyWord) + + let num = false + let index = 0 + if (isNaN(keyWord)) { + num = keyWord.charAt(keyWord.length - 1) + + if (!isNaN(num) && !textArr[this.group_id].has(keyWord)) { + keyWord = lodash.trimEnd(keyWord, num).trim() + index = num - 1 + } else { + num = false + } + } + + let arr = textArr[this.group_id].get(keyWord) + if (!arr) { + // await this.e.reply(`暂无此表情:${keyWord}`) + return false + } + + let tmp = [] + if (num) { + if (!arr[index]) { + // await this.e.reply(`暂无此表情:${keyWord}${num}`) + return false + } + + tmp = arr[index] + arr.splice(index, 1) + + if (arr.length <= 0) { + textArr[this.group_id].delete(keyWord) + } else { + textArr[this.group_id].set(keyWord, arr) + } + } else { + if (this.e.msg.includes('删除全部')) { + tmp = arr + arr = [] + } else { + tmp = arr.pop() + } + + if (arr.length <= 0) { + textArr[this.group_id].delete(keyWord) + } else { + textArr[this.group_id].set(keyWord, arr) + } + } + if (!num) num = '' + + let retMsg = [{ type: 'text', text: '删除成功:' }] + for (let msg of this.e.message) { + if (msg.type == 'text') { + msg.text = msg.text.replace(/#|#|图片|表情|删除|全部|全局/g, '') + + if (!msg.text) continue + } + retMsg.push(msg) + } + if (num > 0) { + retMsg.push({ type: 'text', text: num }) + } + + await this.e.reply(retMsg) + + /** 删除图片 */ + tmp.forEach(item => { + let img = item + if (Array.isArray(item)) { + img = item[0] + } + if (img.local) { + fs.unlink(img.local, () => {}) + } + }) + + this.saveJson() + } + + async list () { + this.isGlobal = this.e?.msg.includes("全局"); + + let page = 1 + let pageSize = 100 + let type = 'list' + + await this.getGroupId() + if (!this.group_id) return false + + this.initTextArr() + + let search = this.e.msg.replace(/#|#|表情|词条|全局/g, '') + + if (search.includes('列表')) { + page = search.replace(/列表/g, '') || 1 + } else { + type = 'search' + } + + let list = textArr[this.group_id] + + if (lodash.isEmpty(list)) { + await this.e.reply('暂无表情') + return + } + + let arr = [] + for (let [k, v] of textArr[this.group_id]) { + if (type == 'list') { + arr.push({ key: k, val: v, num: arr.length + 1 }) + } else if (k.includes(search)) { + /** 搜索表情 */ + arr.push({ key: k, val: v, num: arr.length + 1 }) + } + } + + let count = arr.length + arr = arr.reverse() + + if (type == 'list') { + arr = this.pagination(page, pageSize, arr) + } + + if (lodash.isEmpty(arr)) { + return + } + + let msg = [] + let num = 0 + for (let i in arr) { + if (num >= page * pageSize) break + + let keyWord = await this.keyWordTran(arr[i].key) + if (!keyWord) continue + + if (Array.isArray(keyWord)) { + keyWord.unshift(`${arr[i].num}、`) + keyWord.push('\n') + keyWord.forEach(v => msg.push(v)) + } else if (keyWord.type) { + msg.push(`\n${arr[i].num}、`, keyWord, '\n\n') + } else { + msg.push(`${arr[i].num}、${keyWord}\n`) + } + num++ + } + + let end = '' + if (type == 'list' && count > 100) { + end = `更多内容请翻页查看\n如:#表情列表${Number(page) + 1}` + } + + let title = `表情列表,第${page}页,共${count}条` + if (type == 'search') { + title = `表情${search},${count}条` + } + + let forwardMsg = await this.makeForwardMsg(Bot.uin, title, msg, end) + + this.e.reply(forwardMsg) + } + + async makeForwardMsg (qq, title, msg, end = '') { + let nickname = Bot.nickname + if (this.e.isGroup) { + let info = await Bot.getGroupMemberInfo(this.e.group_id, qq) + nickname = info.card ?? info.nickname + } + let userInfo = { + user_id: Bot.uin, + nickname + } + + let forwardMsg = [ + { + ...userInfo, + message: title + } + ] + + let msgArr = lodash.chunk(msg, 40) + msgArr.forEach(v => { + v[v.length - 1] = lodash.trim(v[v.length - 1], '\n') + forwardMsg.push({ ...userInfo, message: v }) + }) + + if (end) { + forwardMsg.push({ ...userInfo, message: end }) + } + + /** 制作转发内容 */ + if (this.e.isGroup) { + forwardMsg = await this.e.group.makeForwardMsg(forwardMsg) + } else { + forwardMsg = await this.e.friend.makeForwardMsg(forwardMsg) + } + + /** 处理描述 */ + forwardMsg.data = forwardMsg.data + .replace(/\n/g, '') + .replace(/(.+?)<\/title>/g, '___') + .replace(/___+/, `<title color="#777777" size="26">${title}`) + + return forwardMsg + } + + /** 分页 */ + pagination (pageNo, pageSize, array) { + let offset = (pageNo - 1) * pageSize + return offset + pageSize >= array.length ? array.slice(offset, array.length) : array.slice(offset, offset + pageSize) + } + + /** 关键词转换成可发送消息 */ + async keyWordTran (msg) { + /** 图片 */ + if (msg.includes('{image')) { + let tmp = msg.split('{image') + if (tmp.length > 2) return false + + let md5 = tmp[1].replace(/}|_|:/g, '') + + msg = segment.image(`http://gchat.qpic.cn/gchatpic_new/0/0-0-${md5}/0`) + msg.asface = true + } else if (msg.includes('{at:')) { + let tmp = msg.match(/{at:(.+?)}/g) + + for (let qq of tmp) { + qq = qq.match(/[1-9][0-9]{4,14}/g)[0] + let member = await await Bot.getGroupMemberInfo(this.group_id, Number(qq)).catch(() => { }) + let name = member?.card ?? member?.nickname + if (!name) continue + msg = msg.replace(`{at:${qq}}`, `@${name}`) + } + } else if (msg.includes('{face')) { + let tmp = msg.match(/{face(:|_)(.+?)}/g) + if (!tmp) return msg + msg = [] + for (let face of tmp) { + let id = face.match(/\d+/g) + msg.push(segment.face(id)) + } + } + + return msg + } +} diff --git a/src/Yunzai-Bot/plugins/system/disablePrivate.js b/src/Yunzai-Bot/plugins/system/disablePrivate.js new file mode 100644 index 0000000000000000000000000000000000000000..b029557a6f8623b0e08489e45e6b20104d752c75 --- /dev/null +++ b/src/Yunzai-Bot/plugins/system/disablePrivate.js @@ -0,0 +1,75 @@ +import cfg from '../../lib/config/config.js' +import plugin from '../../lib/plugins/plugin.js' + +export class disPri extends plugin { + constructor () { + super({ + name: '禁止私聊', + dsc: '对私聊禁用做处理当开启私聊禁用时只接收cookie以及抽卡链接', + event: 'message.private' + }) + this.priority = 0 + } + + async accept () { + if (!cfg.other?.disablePrivate) return + + if (this.e.isMaster) return + + /** 发送日志文件,xlsx,json */ + if (this.e.file) { + if (!/(.*)\.txt|xlsx|json/ig.test(this.e.file?.name)) { + this.sendTips() + return 'return' + } else { + return false + } + } + + /** 绑定ck,抽卡链接 */ + let wordReg = /(.*)(ltoken|_MHYUUID|authkey=)(.*)|导出记录(json)*|(记录|安卓|苹果|ck|cookie|体力)帮助|^帮助$|^#*(删除|我的)ck$|^#(我的)?(uid|UID)[0-9]{0,2}$/g + /** 自定义通行字符 */ + let disableReg = `(.*)(${cfg.other?.disableAdopt?.join('|')})(.*)` + if (this.e.raw_message) { + if (!new RegExp(wordReg).test(this.e.raw_message) && (!new RegExp(disableReg).test(this.e.raw_message))) { + this.sendTips() + return 'return' + } + } + } + + async sendTips () { + /** 冷却cd 10s */ + let cd = 10 + + if (this.e.user_id == cfg.qq) return + + /** cd */ + let key = `Yz:disablePrivate:${this.e.user_id}` + if (await redis.get(key)) return + + this.e.reply(cfg.other.disableMsg) + + redis.setEx(key, cd, '1') + } +} + +export class disFriPoke extends plugin { + constructor () { + super({ + name: '禁止私聊', + dsc: '对私聊禁用做处理当开启私聊禁用时只接收cookie以及抽卡链接', + event: 'notice.friend.poke' + }) + this.priority = 0 + } + + async accept () { + if (!cfg.other?.disablePrivate) return + + if (this.e.isMaster) return + + this.e.reply(cfg.other.disableMsg) + return 'return' + } +} diff --git a/src/Yunzai-Bot/plugins/system/friend.js b/src/Yunzai-Bot/plugins/system/friend.js new file mode 100644 index 0000000000000000000000000000000000000000..c25dd0739f7cdd45fca2f05497f7c4323f0e11a7 --- /dev/null +++ b/src/Yunzai-Bot/plugins/system/friend.js @@ -0,0 +1,22 @@ +import cfg from '../../lib/config/config.js' +import common from '../../lib/common/common.js' + +export class friend extends plugin { + constructor () { + super({ + name: 'autoFriend', + dsc: '自动同意好友', + event: 'request.friend' + }) + } + + async accept () { + if (this.e.sub_type == 'add' || this.e.sub_type == 'single') { + if (cfg.other.autoFriend == 1) { + logger.mark(`[自动同意][添加好友] ${this.e.user_id}`) + await common.sleep(2000) + this.e.approve(true) + } + } + } +} diff --git a/src/Yunzai-Bot/plugins/system/invite.js b/src/Yunzai-Bot/plugins/system/invite.js new file mode 100644 index 0000000000000000000000000000000000000000..1f7afef496dd197989916770bcb090c8990114ac --- /dev/null +++ b/src/Yunzai-Bot/plugins/system/invite.js @@ -0,0 +1,23 @@ +import cfg from '../../lib/config/config.js' + +export class invite extends plugin { + constructor () { + super({ + name: 'invite', + dsc: '主人邀请自动进群', + event: 'request.group.invite' + }) + } + + async accept () { + if (!cfg.masterQQ || !cfg.masterQQ.includes(Number(this.e.user_id))) { + logger.mark(`[邀请加群]:${this.e.group_name}:${this.e.group_id}`) + return + } + Bot.logger.mark(`[主人邀请加群]:${this.e.group_name}:${this.e.group_id}`) + this.e.approve(true) + Bot.sendPrivateMsg(this.e.user_id, `已同意加群:${this.e.group_name}`).catch((err) => { + logger.error(err) + }) + } +} diff --git a/src/Yunzai-Bot/plugins/system/quit.js b/src/Yunzai-Bot/plugins/system/quit.js new file mode 100644 index 0000000000000000000000000000000000000000..87a7e3f82c2e906479d5ba383aa234ed7f5edf1f --- /dev/null +++ b/src/Yunzai-Bot/plugins/system/quit.js @@ -0,0 +1,36 @@ +import cfg from '../../lib/config/config.js' + +export class quit extends plugin { + constructor () { + super({ + name: 'notice', + dsc: '自动退群', + event: 'notice.group.increase' + }) + } + + async accept () { + if (this.e.user_id != Bot.uin) return + + let other = cfg.other + if (other.autoQuit <= 0) return + + /** 判断主人,主人邀请不退群 */ + let gl = await this.e.group.getMemberMap() + for (let qq of cfg.masterQQ) { + if (gl.has(Number(qq))) { + logger.mark(`[主人拉群] ${this.e.group_id}`) + return + } + } + + /** 自动退群 */ + if (Array.from(gl).length <= other.autoQuit && !this.e.group.is_owner) { + await this.e.reply('禁止拉群,已自动退出') + logger.mark(`[自动退群] ${this.e.group_id}`) + setTimeout(() => { + this.e.group.quit() + }, 2000) + } + } +} diff --git a/src/Yunzai-Bot/plugins/system/status.js b/src/Yunzai-Bot/plugins/system/status.js new file mode 100644 index 0000000000000000000000000000000000000000..8672fd979ad21b639937f9d1409ed90ed9e87c71 --- /dev/null +++ b/src/Yunzai-Bot/plugins/system/status.js @@ -0,0 +1,131 @@ +import cfg from '../../lib/config/config.js' +import moment from 'moment' + +export class status extends plugin { + constructor () { + super({ + name: '其他功能', + dsc: '#状态', + event: 'message', + rule: [ + { + reg: '^#状态$', + fnc: 'status' + } + ] + }) + } + + async status () { + if (this.e.isMaster) return this.statusMaster() + + if (!this.e.isGroup) { + this.reply('请群聊查看') + return + } + + return this.statusGroup() + } + + async statusMaster () { + let runTime = moment().diff(moment.unix(Bot.stat.start_time), 'seconds') + let Day = Math.floor(runTime / 3600 / 24) + let Hour = Math.floor((runTime / 3600) % 24) + let Min = Math.floor((runTime / 60) % 60) + if (Day > 0) { + runTime = `${Day}天${Hour}小时${Min}分钟` + } else { + runTime = `${Hour}小时${Min}分钟` + } + + let format = (bytes) => { + return (bytes / 1024 / 1024).toFixed(2) + 'MB' + } + + let msg = '-------状态-------' + msg += `\n运行时间:${runTime}` + msg += `\n内存使用:${format(process.memoryUsage().rss)}` + msg += `\n当前版本:v${cfg.package.version}` + msg += '\n-------累计-------' + msg += await this.getCount() + + await this.reply(msg) + } + + async statusGroup () { + let msg = '-------状态-------' + msg += await this.getCount(this.e.group_id) + + await this.reply(msg) + } + + async getCount (groupId = '') { + this.date = moment().format('MMDD') + this.month = Number(moment().month()) + 1 + + this.key = 'Yz:count:' + + if (groupId) { + this.key += `group:${groupId}:` + } + + this.msgKey = { + day: `${this.key}sendMsg:day:`, + month: `${this.key}sendMsg:month:` + } + + this.screenshotKey = { + day: `${this.key}screenshot:day:`, + month: `${this.key}screenshot:month:` + } + + let week = { + msg: 0, + screenshot: 0 + } + for (let i = 0; i <= 6; i++) { + let date = moment().startOf('week').add(i, 'days').format('MMDD') + + week.msg += Number(await redis.get(`${this.msgKey.day}${date}`)) ?? 0 + week.screenshot += Number(await redis.get(`${this.screenshotKey.day}${date}`)) ?? 0 + } + + let count = { + total: { + msg: await redis.get(`${this.key}sendMsg:total`) || 0, + screenshot: await redis.get(`${this.key}screenshot:total`) || 0 + }, + today: { + msg: await redis.get(`${this.msgKey.day}${this.date}`) || 0, + screenshot: await redis.get(`${this.screenshotKey.day}${this.date}`) || 0 + }, + week, + month: { + msg: await redis.get(`${this.msgKey.month}${this.month}`) || 0, + screenshot: await redis.get(`${this.screenshotKey.month}${this.month}`) || 0 + } + } + + let msg = '' + if (groupId) { + msg = `\n发送消息:${count.today.msg}条` + msg += `\n生成图片:${count.today.screenshot}次` + } else { + msg = `\n发送消息:${count.total.msg}条` + msg += `\n生成图片:${count.total.screenshot}次` + } + + if (count.month.msg > 200) { + msg += '\n-------本周-------' + msg += `\n发送消息:${count.week.msg}条` + msg += `\n生成图片:${count.week.screenshot}次` + } + if (moment().format('D') >= 8 && count.month.msg > 400) { + msg += '\n-------本月-------' + msg += `\n发送消息:${count.month.msg}条` + msg += `\n生成图片:${count.month.screenshot}次` + } + + return msg + } +} diff --git a/src/Yunzai-Bot/pnpm-lock.yaml b/src/Yunzai-Bot/pnpm-lock.yaml new file mode 100644 index 0000000000000000000000000000000000000000..bd487c33976d53312cc95e2faa8b678603cad1f8 --- /dev/null +++ b/src/Yunzai-Bot/pnpm-lock.yaml @@ -0,0 +1,3557 @@ +lockfileVersion: 5.4 + +patchedDependencies: + oicq@2.3.1: + hash: yxoebqbnnwotwbrdlrfgidvncy + path: patches/oicq@2.3.1.patch + +importers: + + .: + specifiers: + art-template: ^4.13.2 + chalk: ^5.0.1 + chokidar: ^3.5.3 + eslint: ^8.18.0 + eslint-config-standard: ^17.0.0 + eslint-plugin-import: ^2.26.0 + eslint-plugin-n: ^15.2.3 + eslint-plugin-promise: ^6.0.0 + express: ^4.18.1 + express-art-template: ^1.0.1 + https-proxy-agent: 5.0.1 + inquirer: ^8.2.4 + lodash: ^4.17.21 + log4js: ^6.5.2 + md5: ^2.3.0 + moment: ^2.29.3 + node-fetch: ^3.2.6 + node-schedule: ^2.1.0 + node-xlsx: ^0.21.0 + oicq: ^2.3.1 + patch-package: ^6.5.0 + pm2: ^5.2.0 + puppeteer: ^13.7.0 + redis: ^4.1.0 + yaml: ^2.1.1 + dependencies: + art-template: 4.13.2 + chalk: 5.0.1 + chokidar: 3.5.3 + https-proxy-agent: 5.0.1 + inquirer: 8.2.4 + lodash: 4.17.21 + log4js: 6.5.2 + md5: 2.3.0 + moment: 2.29.3 + node-fetch: 3.2.6 + node-schedule: 2.1.0 + node-xlsx: 0.21.0 + oicq: 2.3.1_yxoebqbnnwotwbrdlrfgidvncy + patch-package: 6.5.0 + pm2: 5.2.0 + puppeteer: 13.7.0 + redis: 4.1.0 + yaml: 2.1.1 + devDependencies: + eslint: 8.18.0 + eslint-config-standard: 17.0.0_73zqogbxxwb3ijehtqwxiag47y + eslint-plugin-import: 2.26.0_eslint@8.18.0 + eslint-plugin-n: 15.2.3_eslint@8.18.0 + eslint-plugin-promise: 6.0.0_eslint@8.18.0 + express: 4.18.1 + express-art-template: 1.0.1_art-template@4.13.2 + +packages: + + /@eslint/eslintrc/1.3.0: + resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.3.2 + globals: 13.15.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/config-array/0.9.5: + resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@opencensus/core/0.0.8: + resolution: {integrity: sha512-yUFT59SFhGMYQgX0PhoTR0LBff2BEhPrD9io1jWfF/VDbakRfs6Pq60rjv0Z7iaTav5gQlttJCX2+VPxFWCuoQ==} + engines: {node: '>=6.0'} + dependencies: + continuation-local-storage: 3.2.1 + log-driver: 1.2.7 + semver: 5.7.1 + shimmer: 1.2.1 + uuid: 3.4.0 + dev: false + + /@opencensus/core/0.0.9: + resolution: {integrity: sha512-31Q4VWtbzXpVUd2m9JS6HEaPjlKvNMOiF7lWKNmXF84yUcgfAFL5re7/hjDmdyQbOp32oGc+RFV78jXIldVz6Q==} + engines: {node: '>=6.0'} + dependencies: + continuation-local-storage: 3.2.1 + log-driver: 1.2.7 + semver: 5.7.1 + shimmer: 1.2.1 + uuid: 3.4.0 + dev: false + + /@opencensus/propagation-b3/0.0.8: + resolution: {integrity: sha512-PffXX2AL8Sh0VHQ52jJC4u3T0H6wDK6N/4bg7xh4ngMYOIi13aR1kzVvX1sVDBgfGwDOkMbl4c54Xm3tlPx/+A==} + engines: {node: '>=6.0'} + dependencies: + '@opencensus/core': 0.0.8 + uuid: 3.4.0 + dev: false + + /@pm2/agent/2.0.1: + resolution: {integrity: sha512-QKHMm6yexcvdDfcNE7PL9D6uEjoQPGRi+8dh+rc4Hwtbpsbh5IAvZbz3BVGjcd4HaX6pt2xGpOohG7/Y2L4QLw==} + dependencies: + async: 3.2.4 + chalk: 3.0.0 + dayjs: 1.8.36 + debug: 4.3.4 + eventemitter2: 5.0.1 + fast-json-patch: 3.1.1 + fclone: 1.0.11 + nssocket: 0.6.0 + pm2-axon: 4.0.1 + pm2-axon-rpc: 0.7.1 + proxy-agent: 5.0.0 + semver: 7.2.3 + ws: 7.4.6 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /@pm2/io/5.0.0: + resolution: {integrity: sha512-3rToDVJaRoob5Lq8+7Q2TZFruoEkdORxwzFpZaqF4bmH6Bkd7kAbdPrI/z8X6k1Meq5rTtScM7MmDgppH6aLlw==} + engines: {node: '>=6.0'} + dependencies: + '@opencensus/core': 0.0.9 + '@opencensus/propagation-b3': 0.0.8 + async: 2.6.4 + debug: 4.3.4 + eventemitter2: 6.4.5 + require-in-the-middle: 5.1.0 + semver: 6.3.0 + shimmer: 1.2.1 + signal-exit: 3.0.7 + tslib: 1.9.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@pm2/js-api/0.6.7: + resolution: {integrity: sha512-jiJUhbdsK+5C4zhPZNnyA3wRI01dEc6a2GhcQ9qI38DyIk+S+C8iC3fGjcjUbt/viLYKPjlAaE+hcT2/JMQPXw==} + engines: {node: '>=4.0'} + dependencies: + async: 2.6.4 + axios: 0.21.4_debug@4.3.4 + debug: 4.3.4 + eventemitter2: 6.4.5 + ws: 7.5.8 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /@pm2/pm2-version-check/1.0.4: + resolution: {integrity: sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@redis/bloom/1.0.2_@redis+client@1.1.0: + resolution: {integrity: sha512-EBw7Ag1hPgFzdznK2PBblc1kdlj5B5Cw3XwI9/oG7tSn85/HKy3X9xHy/8tm/eNXJYHLXHJL/pkwBpFMVVefkw==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.1.0 + dev: false + + /@redis/client/1.1.0: + resolution: {integrity: sha512-xO9JDIgzsZYDl3EvFhl6LC52DP3q3GCMUer8zHgKV6qSYsq1zB+pZs9+T80VgcRogrlRYhi4ZlfX6A+bHiBAgA==} + engines: {node: '>=14'} + dependencies: + cluster-key-slot: 1.1.0 + generic-pool: 3.8.2 + yallist: 4.0.0 + dev: false + + /@redis/graph/1.0.1_@redis+client@1.1.0: + resolution: {integrity: sha512-oDE4myMCJOCVKYMygEMWuriBgqlS5FqdWerikMoJxzmmTUErnTRRgmIDa2VcgytACZMFqpAOWDzops4DOlnkfQ==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.1.0 + dev: false + + /@redis/json/1.0.3_@redis+client@1.1.0: + resolution: {integrity: sha512-4X0Qv0BzD9Zlb0edkUoau5c1bInWSICqXAGrpwEltkncUwcxJIGEcVryZhLgb0p/3PkKaLIWkjhHRtLe9yiA7Q==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.1.0 + dev: false + + /@redis/search/1.0.6_@redis+client@1.1.0: + resolution: {integrity: sha512-pP+ZQRis5P21SD6fjyCeLcQdps+LuTzp2wdUbzxEmNhleighDDTD5ck8+cYof+WLec4csZX7ks+BuoMw0RaZrA==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.1.0 + dev: false + + /@redis/time-series/1.0.3_@redis+client@1.1.0: + resolution: {integrity: sha512-OFp0q4SGrTH0Mruf6oFsHGea58u8vS/iI5+NpYdicaM+7BgqBZH8FFvNZ8rYYLrUO/QRqMq72NpXmxLVNcdmjA==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.1.0 + dev: false + + /@tootallnate/once/1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: false + + /@types/json5/0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/node/18.0.0: + resolution: {integrity: sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==} + dev: false + optional: true + + /@types/yauzl/2.10.0: + resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} + requiresBuild: true + dependencies: + '@types/node': 18.0.0 + dev: false + optional: true + + /@yarnpkg/lockfile/1.1.0: + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + dev: false + + /accepts/1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: true + + /acorn-jsx/5.3.2_acorn@8.7.1: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.7.1 + dev: true + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn/5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} + engines: {node: '>=0.4.0'} + hasBin: true + + /acorn/8.7.1: + resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} + engines: {node: '>=0.4.0'} + hasBin: true + + /adler-32/1.2.0: + resolution: {integrity: sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==} + engines: {node: '>=0.8'} + hasBin: true + dependencies: + exit-on-epipe: 1.0.1 + printj: 1.1.2 + dev: false + + /adler-32/1.3.1: + resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} + engines: {node: '>=0.8'} + dev: false + + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /amp-message/0.1.2: + resolution: {integrity: sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg==} + dependencies: + amp: 0.3.1 + dev: false + + /amp/0.3.1: + resolution: {integrity: sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw==} + dev: false + + /ansi-colors/4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: false + + /ansi-escapes/4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: false + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /argparse/1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-flatten/1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true + + /array-includes/3.1.5: + resolution: {integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + get-intrinsic: 1.1.2 + is-string: 1.0.7 + dev: true + + /array.prototype.flat/1.3.0: + resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + es-shim-unscopables: 1.0.0 + dev: true + + /art-template/4.13.2: + resolution: {integrity: sha512-04ws5k+ndA5DghfheY4c8F1304XJKeTcaXqZCLpxFkNMSkaR3ChW1pX2i9d3sEEOZuLy7de8lFriRaik1jEeOQ==} + engines: {node: '>= 1.0.0'} + dependencies: + acorn: 5.7.4 + escodegen: 1.14.3 + estraverse: 4.3.0 + html-minifier: 3.5.21 + is-keyword-js: 1.0.3 + js-tokens: 3.0.2 + merge-source-map: 1.1.0 + source-map: 0.5.7 + + /ast-types/0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + dependencies: + tslib: 2.4.0 + dev: false + + /async-listener/0.6.10: + resolution: {integrity: sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==} + engines: {node: <=0.11.8 || >0.11.10} + dependencies: + semver: 5.7.1 + shimmer: 1.2.1 + dev: false + + /async/2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + dependencies: + lodash: 4.17.21 + dev: false + + /async/3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + dev: false + + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /axios/0.21.4_debug@4.3.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.1_debug@4.3.4 + transitivePeerDependencies: + - debug + dev: false + + /axios/0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + dependencies: + follow-redirects: 1.15.1_debug@4.3.4 + form-data: 4.0.0 + transitivePeerDependencies: + - debug + dev: false + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: false + + /bl/4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + + /blessed/0.1.81: + resolution: {integrity: sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==} + engines: {node: '>= 0.8.0'} + hasBin: true + dev: false + + /bodec/0.1.0: + resolution: {integrity: sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==} + dev: false + + /body-parser/1.20.0: + resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + 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.10.3 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: false + + /buffer-crc32/0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: false + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: false + + /buffer/5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /builtins/5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.3.7 + dev: true + + /bytes/3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.2 + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camel-case/3.0.0: + resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + + /cfb/1.2.2: + resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} + engines: {node: '>=0.8'} + dependencies: + adler-32: 1.3.1 + crc-32: 1.2.2 + dev: false + + /chalk/3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk/5.0.1: + resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /chardet/0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: false + + /charenc/0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: false + + /charm/0.1.2: + resolution: {integrity: sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==} + dev: false + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: false + + /chownr/1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /ci-info/2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + dev: false + + /clean-css/4.2.4: + resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} + engines: {node: '>= 4.0'} + dependencies: + source-map: 0.6.1 + + /cli-cursor/3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: false + + /cli-spinners/2.6.1: + resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} + engines: {node: '>=6'} + dev: false + + /cli-tableau/2.0.1: + resolution: {integrity: sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==} + engines: {node: '>=8.10.0'} + dependencies: + chalk: 3.0.0 + dev: false + + /cli-width/3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: false + + /clone/1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: false + + /cluster-key-slot/1.1.0: + resolution: {integrity: sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==} + engines: {node: '>=0.10.0'} + dev: false + + /codepage/1.15.0: + resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==} + engines: {node: '>=0.8'} + dev: false + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander/2.15.1: + resolution: {integrity: sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==} + dev: false + + /commander/2.17.1: + resolution: {integrity: sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==} + + /commander/2.19.0: + resolution: {integrity: sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==} + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /content-disposition/0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /content-type/1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} + dev: true + + /continuation-local-storage/3.2.1: + resolution: {integrity: sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==} + dependencies: + async-listener: 0.6.10 + emitter-listener: 1.1.2 + dev: false + + /cookie-signature/1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true + + /cookie/0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /crc-32/1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: false + + /cron-parser/3.5.0: + resolution: {integrity: sha512-wyVZtbRs6qDfFd8ap457w3XVntdvqcwBGxBoTvJQH9KGVKL/fB+h2k3C8AqiVxvUQKN1Ps/Ns46CNViOpVDhfQ==} + engines: {node: '>=0.8'} + dependencies: + is-nan: 1.3.2 + luxon: 1.28.0 + dev: false + + /croner/4.1.97: + resolution: {integrity: sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==} + dev: false + + /cross-fetch/3.1.5: + resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} + dependencies: + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: false + + /cross-spawn/6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.1 + shebang-command: 1.2.0 + which: 1.3.1 + dev: false + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypt/0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: false + + /culvert/0.1.2: + resolution: {integrity: sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==} + dev: false + + /data-uri-to-buffer/3.0.1: + resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} + engines: {node: '>= 6'} + dev: false + + /data-uri-to-buffer/4.0.0: + resolution: {integrity: sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==} + engines: {node: '>= 12'} + dev: false + + /date-format/4.0.11: + resolution: {integrity: sha512-VS20KRyorrbMCQmpdl2hg5KaOUsda1RbnsJg461FfrcyCUg+pkd0b40BSW4niQyTheww4DBXQnS7HwSrKkipLw==} + engines: {node: '>=4.0'} + dev: false + + /dayjs/1.8.36: + resolution: {integrity: sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==} + dev: false + + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + /defaults/1.0.3: + resolution: {integrity: sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==} + dependencies: + clone: 1.0.4 + dev: false + + /define-properties/1.1.4: + resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + + /degenerator/3.0.2: + resolution: {integrity: sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==} + engines: {node: '>= 6'} + dependencies: + ast-types: 0.13.4 + escodegen: 1.14.3 + esprima: 4.0.1 + vm2: 3.9.9 + dev: false + + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /depd/2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + /destroy/1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true + + /devtools-protocol/0.0.981744: + resolution: {integrity: sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==} + dev: false + + /doctrine/2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /ee-first/1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: true + + /emitter-listener/1.1.2: + resolution: {integrity: sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==} + dependencies: + shimmer: 1.2.1 + dev: false + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /encodeurl/1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + + /end-of-stream/1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /enquirer/2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + dev: false + + /es-abstract/1.20.1: + resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.1.2 + get-symbol-description: 1.0.0 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-symbols: 1.0.3 + internal-slot: 1.0.3 + is-callable: 1.2.4 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-weakref: 1.0.2 + object-inspect: 1.12.2 + object-keys: 1.1.1 + object.assign: 4.1.2 + regexp.prototype.flags: 1.4.3 + string.prototype.trimend: 1.0.5 + string.prototype.trimstart: 1.0.5 + unbox-primitive: 1.0.2 + dev: true + + /es-shim-unscopables/1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.4 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /escape-html/1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escodegen/1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + + /eslint-config-standard/17.0.0_73zqogbxxwb3ijehtqwxiag47y: + resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} + peerDependencies: + eslint: ^8.0.1 + eslint-plugin-import: ^2.25.2 + eslint-plugin-n: ^15.0.0 + eslint-plugin-promise: ^6.0.0 + dependencies: + eslint: 8.18.0 + eslint-plugin-import: 2.26.0_eslint@8.18.0 + eslint-plugin-n: 15.2.3_eslint@8.18.0 + eslint-plugin-promise: 6.0.0_eslint@8.18.0 + dev: true + + /eslint-import-resolver-node/0.3.6: + resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} + dependencies: + debug: 3.2.7 + resolve: 1.22.1 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils/2.7.3_ulu2225r2ychl26a37c6o2rfje: + resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + debug: 3.2.7 + eslint-import-resolver-node: 0.3.6 + find-up: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-es/4.1.0_eslint@8.18.0: + resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + eslint: 8.18.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + dev: true + + /eslint-plugin-import/2.26.0_eslint@8.18.0: + resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + array-includes: 3.1.5 + array.prototype.flat: 1.3.0 + debug: 2.6.9 + doctrine: 2.1.0 + eslint: 8.18.0 + eslint-import-resolver-node: 0.3.6 + eslint-module-utils: 2.7.3_ulu2225r2ychl26a37c6o2rfje + has: 1.0.3 + is-core-module: 2.9.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.5 + resolve: 1.22.1 + tsconfig-paths: 3.14.1 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-n/15.2.3_eslint@8.18.0: + resolution: {integrity: sha512-H+KC7U5R+3IWTeRnACm/4wlqLvS1Q7M6t7BGhn89qXDkZan8HTAEv3ouIONA0ifDwc2YzPFmyPzHuNLddNK4jw==} + engines: {node: '>=12.22.0'} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + builtins: 5.0.1 + eslint: 8.18.0 + eslint-plugin-es: 4.1.0_eslint@8.18.0 + eslint-utils: 3.0.0_eslint@8.18.0 + ignore: 5.2.0 + is-core-module: 2.9.0 + minimatch: 3.1.2 + resolve: 1.22.1 + semver: 7.3.7 + dev: true + + /eslint-plugin-promise/6.0.0_eslint@8.18.0: + resolution: {integrity: sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.18.0 + dev: true + + /eslint-scope/7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils/2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-utils/3.0.0_eslint@8.18.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.18.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys/1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys/3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint/8.18.0: + resolution: {integrity: sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.3.0 + '@humanwhocodes/config-array': 0.9.5 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0_eslint@8.18.0 + eslint-visitor-keys: 3.3.0 + espree: 9.3.2 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 6.0.2 + globals: 13.15.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.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.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree/9.3.2: + resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.7.1 + acorn-jsx: 5.3.2_acorn@8.7.1 + eslint-visitor-keys: 3.3.0 + dev: true + + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + /esquery/1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /etag/1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /eventemitter2/0.4.14: + resolution: {integrity: sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==} + dev: false + + /eventemitter2/5.0.1: + resolution: {integrity: sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==} + dev: false + + /eventemitter2/6.4.5: + resolution: {integrity: sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw==} + dev: false + + /exit-on-epipe/1.0.1: + resolution: {integrity: sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==} + engines: {node: '>=0.8'} + dev: false + + /express-art-template/1.0.1_art-template@4.13.2: + resolution: {integrity: sha512-uHzOOO2uNHelEI520KBvGw0c7Lu4opa7iczkYgHe5AcN1MYEh1ovmis7BMwjyRiJIv2Zt3ovTMko5FiDb/ydWg==} + engines: {node: '>= 4.0.0'} + peerDependencies: + art-template: '>=4.1.0' + dependencies: + art-template: 4.13.2 + dev: true + + /express/4.18.1: + resolution: {integrity: sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.0 + 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.10.3 + 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 + transitivePeerDependencies: + - supports-color + dev: true + + /external-editor/3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: false + + /extract-zip/2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.4 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.0 + transitivePeerDependencies: + - supports-color + dev: false + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-json-patch/3.1.1: + resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} + dev: false + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + /fclone/1.0.11: + resolution: {integrity: sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==} + dev: false + + /fd-slicer/1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: false + + /fetch-blob/3.1.5: + resolution: {integrity: sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: false + + /figures/3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: false + + /file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /file-uri-to-path/2.0.0: + resolution: {integrity: sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==} + engines: {node: '>= 6'} + dev: false + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /finalhandler/1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + 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 + transitivePeerDependencies: + - supports-color + dev: true + + /find-up/2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: false + + /find-yarn-workspace-root/2.0.0: + resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} + dependencies: + micromatch: 4.0.5 + dev: false + + /flat-cache/3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.5 + rimraf: 3.0.2 + dev: true + + /flatted/3.2.5: + resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} + + /follow-redirects/1.15.1_debug@4.3.4: + resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.4 + dev: false + + /form-data/4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /formdata-polyfill/4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.1.5 + dev: false + + /forwarded/0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + + /frac/1.1.2: + resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} + engines: {node: '>=0.8'} + dev: false + + /fresh/0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + + /fs-constants/1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fs-extra/10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /fs-extra/7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + + /fs-extra/8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /ftp/0.3.10: + resolution: {integrity: sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==} + engines: {node: '>=0.8.0'} + dependencies: + readable-stream: 1.1.14 + xregexp: 2.0.0 + dev: false + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /function.prototype.name/1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + functions-have-names: 1.2.3 + dev: true + + /functional-red-black-tree/1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: true + + /functions-have-names/1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /generic-pool/3.8.2: + resolution: {integrity: sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==} + engines: {node: '>= 4'} + dev: false + + /get-intrinsic/1.1.2: + resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + + /get-stream/5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: false + + /get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.2 + dev: true + + /get-uri/3.0.2: + resolution: {integrity: sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + data-uri-to-buffer: 3.0.1 + debug: 4.3.4 + file-uri-to-path: 2.0.0 + fs-extra: 8.1.0 + ftp: 0.3.10 + transitivePeerDependencies: + - supports-color + dev: false + + /git-node-fs/1.0.0_js-git@0.7.8: + resolution: {integrity: sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ==} + peerDependencies: + js-git: ^0.7.8 + peerDependenciesMeta: + js-git: + optional: true + dependencies: + js-git: 0.7.8 + dev: false + + /git-sha1/0.1.2: + resolution: {integrity: sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==} + dev: false + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /globals/13.15.0: + resolution: {integrity: sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: false + + /has-bigints/1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors/1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.1.2 + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /he/1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + /html-minifier/3.5.21: + resolution: {integrity: sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==} + engines: {node: '>=4'} + hasBin: true + dependencies: + camel-case: 3.0.0 + clean-css: 4.2.4 + commander: 2.17.1 + he: 1.2.0 + param-case: 2.1.1 + relateurl: 0.2.7 + uglify-js: 3.4.10 + + /http-errors/2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + /http-proxy-agent/4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /https-proxy-agent/5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ignore/5.2.0: + resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} + engines: {node: '>= 4'} + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /inquirer/8.2.4: + resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.5.5 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: false + + /internal-slot/1.0.3: + resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.1.2 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /ip/1.1.8: + resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} + dev: false + + /ipaddr.js/1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + + /is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-buffer/1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: false + + /is-callable/1.2.4: + resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} + engines: {node: '>= 0.4'} + dev: true + + /is-ci/2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + dependencies: + ci-info: 2.0.0 + dev: false + + /is-core-module/2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + + /is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-docker/2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: false + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-interactive/1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: false + + /is-keyword-js/1.0.3: + resolution: {integrity: sha512-EW8wNCNvomPa/jsH1g0DmLfPakkRCRTcTML1v1fZMLiVCvQ/1YB+tKsRzShBiWQhqrYCi5a+WsepA4Z8TA9iaA==} + engines: {node: '>=0.10.0'} + + /is-nan/1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + dev: false + + /is-negative-zero/2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object/1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-shared-array-buffer/1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-unicode-supported/0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: false + + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-wsl/2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: false + + /isarray/0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /js-git/0.7.8: + resolution: {integrity: sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==} + dependencies: + bodec: 0.1.0 + culvert: 0.1.2 + git-sha1: 0.1.2 + pako: 0.2.9 + dev: false + + /js-tokens/3.0.2: + resolution: {integrity: sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==} + + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stringify-safe/5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: false + optional: true + + /json5/1.0.1: + resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} + hasBin: true + dependencies: + minimist: 1.2.6 + dev: true + + /jsonfile/4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.10 + dev: false + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.10 + dev: false + + /klaw-sync/6.0.0: + resolution: {integrity: sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==} + dependencies: + graceful-fs: 4.2.10 + dev: false + + /lazy/1.0.11: + resolution: {integrity: sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA==} + engines: {node: '>=0.2.0'} + dev: false + + /levn/0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + /levn/0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /locate-path/2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: false + + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + + /log-driver/1.2.7: + resolution: {integrity: sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==} + engines: {node: '>=0.8.6'} + dev: false + + /log-symbols/4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: false + + /log4js/6.5.2: + resolution: {integrity: sha512-DXtpNtt+KDOMT7RHUDIur/WsSA3rntlUh9Zg4XCdV42wUuMmbFkl38+LZ92Z5QvQA7mD5kAVkLiBSEH/tvUB8A==} + engines: {node: '>=8.0'} + dependencies: + date-format: 4.0.11 + debug: 4.3.4 + flatted: 3.2.5 + rfdc: 1.3.0 + streamroller: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /long-timeout/0.1.1: + resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} + dev: false + + /long/4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /lower-case/1.1.4: + resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} + + /lru-cache/5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: false + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /luxon/1.28.0: + resolution: {integrity: sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==} + dev: false + + /md5/2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + dev: false + + /media-typer/0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: true + + /merge-descriptors/1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true + + /merge-source-map/1.1.0: + resolution: {integrity: sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==} + dependencies: + source-map: 0.6.1 + + /methods/1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimist/1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + + /mkdirp-classic/0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mkdirp/1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /module-details-from-path/1.0.3: + resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + dev: false + + /moment/2.29.3: + resolution: {integrity: sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==} + dev: false + + /ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /mute-stream/0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: false + + /natural-compare/1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /needle/2.4.0: + resolution: {integrity: sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==} + engines: {node: '>= 4.4.x'} + hasBin: true + dependencies: + debug: 3.2.7 + iconv-lite: 0.4.24 + sax: 1.2.4 + transitivePeerDependencies: + - supports-color + dev: false + + /needle/2.9.1: + resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + dependencies: + debug: 3.2.7 + iconv-lite: 0.4.24 + sax: 1.2.4 + transitivePeerDependencies: + - supports-color + dev: false + + /negotiator/0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + + /netmask/2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + dev: false + + /nice-try/1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: false + + /no-case/2.3.2: + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + dependencies: + lower-case: 1.1.4 + + /node-domexception/1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + + /node-fetch/2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-fetch/3.2.6: + resolution: {integrity: sha512-LAy/HZnLADOVkVPubaxHDft29booGglPFDr2Hw0J1AercRh01UiVFm++KMDnJeH9sHgNB4hsXPii7Sgym/sTbw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.0 + fetch-blob: 3.1.5 + formdata-polyfill: 4.0.10 + dev: false + + /node-schedule/2.1.0: + resolution: {integrity: sha512-nl4JTiZ7ZQDc97MmpTq9BQjYhq7gOtoh7SiPH069gBFBj0PzD8HI7zyFs6rzqL8Y5tTiEEYLxgtbx034YPrbyQ==} + engines: {node: '>=6'} + dependencies: + cron-parser: 3.5.0 + long-timeout: 0.1.1 + sorted-array-functions: 1.3.0 + dev: false + + /node-xlsx/0.21.0: + resolution: {integrity: sha512-MB+KcNCuRzwjgr17scpKiVTPd4Vbj3V+7QwKpqACGyJzhvC67xCQUbw2vYEIKtNfMfcLxgB2q2kEuRS8rmak9g==} + engines: {node: '>=10.0.0'} + hasBin: true + dependencies: + xlsx: 0.17.5 + dev: false + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /nssocket/0.6.0: + resolution: {integrity: sha512-a9GSOIql5IqgWJR3F/JXG4KpJTA3Z53Cj0MeMvGpglytB1nxE4PdFNC0jINe27CS7cGivoynwc054EzCcT3M3w==} + engines: {node: '>= 0.10.x'} + dependencies: + eventemitter2: 0.4.14 + lazy: 1.0.11 + dev: false + + /object-inspect/1.12.2: + resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + dev: true + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object.assign/4.1.2: + resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.values/1.1.5: + resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + dev: true + + /oicq/2.3.1_yxoebqbnnwotwbrdlrfgidvncy: + resolution: {integrity: sha512-mRw/GgdRKFMylnrlnnywzCIwvad6fF5E4WZfIlval070wEc3w9yMV49i9epFltWkU/JGNMDS4t5wWdZEYzW0EQ==} + engines: {node: '>= v14'} + dependencies: + axios: 0.27.2 + log4js: 6.5.2 + long: 4.0.0 + pngjs: 6.0.0 + probe-image-size: 7.2.3 + transitivePeerDependencies: + - debug + - supports-color + dev: false + patched: true + + /on-finished/2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /open/7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: false + + /optionator/0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + 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.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + + /ora/5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: false + + /os-tmpdir/1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: false + + /p-limit/1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: false + + /p-locate/2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: false + + /p-try/1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + + /p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: false + + /pac-proxy-agent/5.0.0: + resolution: {integrity: sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==} + engines: {node: '>= 8'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4 + get-uri: 3.0.2 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + pac-resolver: 5.0.1 + raw-body: 2.5.1 + socks-proxy-agent: 5.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /pac-resolver/5.0.1: + resolution: {integrity: sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==} + engines: {node: '>= 8'} + dependencies: + degenerator: 3.0.2 + ip: 1.1.8 + netmask: 2.0.2 + dev: false + + /pako/0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + dev: false + + /param-case/2.1.1: + resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + dependencies: + no-case: 2.3.2 + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parseurl/1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + + /patch-package/6.5.0: + resolution: {integrity: sha512-tC3EqJmo74yKqfsMzELaFwxOAu6FH6t+FzFOsnWAuARm7/n2xB5AOeOueE221eM9gtMuIKMKpF9tBy/X2mNP0Q==} + engines: {node: '>=10', npm: '>5'} + hasBin: true + dependencies: + '@yarnpkg/lockfile': 1.1.0 + chalk: 4.1.2 + cross-spawn: 6.0.5 + find-yarn-workspace-root: 2.0.0 + fs-extra: 7.0.1 + is-ci: 2.0.0 + klaw-sync: 6.0.0 + minimist: 1.2.6 + open: 7.4.2 + rimraf: 2.7.1 + semver: 5.7.1 + slash: 2.0.0 + tmp: 0.0.33 + yaml: 1.10.2 + dev: false + + /path-exists/3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: false + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key/2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: false + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-to-regexp/0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true + + /pend/1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: false + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /pidusage/2.0.21: + resolution: {integrity: sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==} + engines: {node: '>=8'} + dependencies: + safe-buffer: 5.2.1 + dev: false + optional: true + + /pidusage/3.0.0: + resolution: {integrity: sha512-8VJLToXhj+RYZGNVw8oxc7dS54iCQXUJ+MDFHezQ/fwF5B8W4OWodAMboc1wb08S/4LiHwAmkT4ohf/d3YPPsw==} + engines: {node: '>=10'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /pkg-dir/4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: false + + /pm2-axon-rpc/0.7.1: + resolution: {integrity: sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==} + engines: {node: '>=5'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /pm2-axon/4.0.1: + resolution: {integrity: sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==} + engines: {node: '>=5'} + dependencies: + amp: 0.3.1 + amp-message: 0.1.2 + debug: 4.3.4 + escape-string-regexp: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /pm2-deploy/1.0.2: + resolution: {integrity: sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==} + engines: {node: '>=4.0.0'} + dependencies: + run-series: 1.1.9 + tv4: 1.3.0 + dev: false + + /pm2-multimeter/0.1.2: + resolution: {integrity: sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA==} + dependencies: + charm: 0.1.2 + dev: false + + /pm2-sysmonit/1.2.8: + resolution: {integrity: sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==} + requiresBuild: true + dependencies: + async: 3.2.4 + debug: 4.3.4 + pidusage: 2.0.21 + systeminformation: 5.11.21 + tx2: 1.0.5 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /pm2/5.2.0: + resolution: {integrity: sha512-PO5hMVhQ85cTszFM++6v07Me9hPJMkFbHjkFigtMMk+La8ty2wCi2dlBTeZYJDhPUSjK8Ccltpq2buNRcyMOTw==} + engines: {node: '>=10.0.0'} + hasBin: true + dependencies: + '@pm2/agent': 2.0.1 + '@pm2/io': 5.0.0 + '@pm2/js-api': 0.6.7 + '@pm2/pm2-version-check': 1.0.4 + async: 3.2.4 + blessed: 0.1.81 + chalk: 3.0.0 + chokidar: 3.5.3 + cli-tableau: 2.0.1 + commander: 2.15.1 + croner: 4.1.97 + dayjs: 1.8.36 + debug: 4.3.4 + enquirer: 2.3.6 + eventemitter2: 5.0.1 + fclone: 1.0.11 + mkdirp: 1.0.4 + needle: 2.4.0 + pidusage: 3.0.0 + pm2-axon: 4.0.1 + pm2-axon-rpc: 0.7.1 + pm2-deploy: 1.0.2 + pm2-multimeter: 0.1.2 + promptly: 2.2.0 + semver: 7.3.7 + source-map-support: 0.5.19 + sprintf-js: 1.1.2 + vizion: 2.2.1 + yamljs: 0.3.0 + optionalDependencies: + pm2-sysmonit: 1.2.8 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /pngjs/6.0.0: + resolution: {integrity: sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==} + engines: {node: '>=12.13.0'} + dev: false + + /prelude-ls/1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + /prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /printj/1.1.2: + resolution: {integrity: sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: false + + /probe-image-size/7.2.3: + resolution: {integrity: sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==} + dependencies: + lodash.merge: 4.6.2 + needle: 2.9.1 + stream-parser: 0.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /progress/2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: false + + /promptly/2.2.0: + resolution: {integrity: sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==} + dependencies: + read: 1.0.7 + dev: false + + /proxy-addr/2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + + /proxy-agent/5.0.0: + resolution: {integrity: sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==} + engines: {node: '>= 8'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + lru-cache: 5.1.1 + pac-proxy-agent: 5.0.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 5.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /proxy-from-env/1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /pump/3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /punycode/2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + dev: true + + /puppeteer/13.7.0: + resolution: {integrity: sha512-U1uufzBjz3+PkpCxFrWzh4OrMIdIb2ztzCu0YEPfRHjHswcSwHZswnK+WdsOQJsRV8WeTg3jLhJR4D867+fjsA==} + engines: {node: '>=10.18.1'} + requiresBuild: true + dependencies: + cross-fetch: 3.1.5 + debug: 4.3.4 + devtools-protocol: 0.0.981744 + extract-zip: 2.0.1 + https-proxy-agent: 5.0.1 + pkg-dir: 4.2.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + rimraf: 3.0.2 + tar-fs: 2.1.1 + unbzip2-stream: 1.4.3 + ws: 8.5.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /qs/6.10.3: + resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /range-parser/1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body/2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + /read/1.0.7: + resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==} + engines: {node: '>=0.8'} + dependencies: + mute-stream: 0.0.8 + dev: false + + /readable-stream/1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + + /readable-stream/3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /redis/4.1.0: + resolution: {integrity: sha512-5hvJ8wbzpCCiuN1ges6tx2SAh2XXCY0ayresBmu40/SGusWHFW86TAlIPpbimMX2DFHOX7RN34G2XlPA1Z43zg==} + dependencies: + '@redis/bloom': 1.0.2_@redis+client@1.1.0 + '@redis/client': 1.1.0 + '@redis/graph': 1.0.1_@redis+client@1.1.0 + '@redis/json': 1.0.3_@redis+client@1.1.0 + '@redis/search': 1.0.6_@redis+client@1.1.0 + '@redis/time-series': 1.0.3_@redis+client@1.1.0 + dev: false + + /regexp.prototype.flags/1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + functions-have-names: 1.2.3 + dev: true + + /regexpp/3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /relateurl/0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + /require-in-the-middle/5.1.0: + resolution: {integrity: sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==} + dependencies: + debug: 4.3.4 + module-details-from-path: 1.0.3 + resolve: 1.22.1 + transitivePeerDependencies: + - supports-color + dev: false + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.9.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /restore-cursor/3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /rfdc/1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: false + + /rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /run-async/2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: false + + /run-series/1.1.9: + resolution: {integrity: sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==} + dev: false + + /rxjs/7.5.5: + resolution: {integrity: sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==} + dependencies: + tslib: 2.4.0 + dev: false + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /sax/1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: false + + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: false + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: false + + /semver/7.2.3: + resolution: {integrity: sha512-utbW9Z7ZxVvwiIWkdOMLOR9G/NFXh2aRucghkVrEMJWuC++r3lCkBC3LwqBinyHzGMAJxY5tn6VakZGHObq5ig==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /semver/7.3.7: + resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /send/0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + 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 + transitivePeerDependencies: + - supports-color + dev: true + + /serve-static/1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + /setprototypeof/1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + /shebang-command/1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: false + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: false + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shimmer/1.2.1: + resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} + dev: false + + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.2 + object-inspect: 1.12.2 + dev: true + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /slash/2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + dev: false + + /smart-buffer/4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: false + + /socks-proxy-agent/5.0.1: + resolution: {integrity: sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + socks: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: false + + /socks/2.6.2: + resolution: {integrity: sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 1.1.8 + smart-buffer: 4.2.0 + dev: false + + /sorted-array-functions/1.3.0: + resolution: {integrity: sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==} + dev: false + + /source-map-support/0.5.19: + resolution: {integrity: sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: false + + /source-map/0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /sprintf-js/1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + + /sprintf-js/1.1.2: + resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} + dev: false + + /ssf/0.11.2: + resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} + engines: {node: '>=0.8'} + dependencies: + frac: 1.1.2 + dev: false + + /statuses/2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + /stream-parser/0.3.1: + resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==} + dependencies: + debug: 2.6.9 + transitivePeerDependencies: + - supports-color + dev: false + + /streamroller/3.1.1: + resolution: {integrity: sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ==} + engines: {node: '>=8.0'} + dependencies: + date-format: 4.0.11 + debug: 4.3.4 + fs-extra: 10.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string.prototype.trimend/1.0.5: + resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + dev: true + + /string.prototype.trimstart/1.0.5: + resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + dev: true + + /string_decoder/0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /systeminformation/5.11.21: + resolution: {integrity: sha512-aYuoelPUEItkeFi9d2EgGYZur6CgGaPAOUv9K5h1rJn5EyAYIXtonxJN3Dn58zQ3BFbj9FggaxaVBGg/pNRngA==} + engines: {node: '>=8.0.0'} + os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] + hasBin: true + dev: false + optional: true + + /tar-fs/2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream/2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + + /text-table/0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /through/2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: false + + /tmp/0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: false + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /toidentifier/1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + /tr46/0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /tsconfig-paths/3.14.1: + resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.1 + minimist: 1.2.6 + strip-bom: 3.0.0 + dev: true + + /tslib/1.9.3: + resolution: {integrity: sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==} + dev: false + + /tslib/2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + dev: false + + /tv4/1.3.0: + resolution: {integrity: sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==} + engines: {node: '>= 0.8.0'} + dev: false + + /tx2/1.0.5: + resolution: {integrity: sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==} + dependencies: + json-stringify-safe: 5.0.1 + dev: false + optional: true + + /type-check/0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + + /type-check/0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest/0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest/0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: false + + /type-is/1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: true + + /uglify-js/3.4.10: + resolution: {integrity: sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==} + engines: {node: '>=0.8.0'} + hasBin: true + dependencies: + commander: 2.19.0 + source-map: 0.6.1 + + /unbox-primitive/1.0.2: + resolution: {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 + dev: true + + /unbzip2-stream/1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + dependencies: + buffer: 5.7.1 + through: 2.3.8 + dev: false + + /universalify/0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: false + + /unpipe/1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + /upper-case/1.1.3: + resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.1.1 + dev: true + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /utils-merge/1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: true + + /uuid/3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: false + + /v8-compile-cache/2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + dev: true + + /vary/1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + + /vizion/2.2.1: + resolution: {integrity: sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==} + engines: {node: '>=4.0'} + dependencies: + async: 2.6.4 + git-node-fs: 1.0.0_js-git@0.7.8 + ini: 1.3.8 + js-git: 0.7.8 + dev: false + + /vm2/3.9.9: + resolution: {integrity: sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + acorn: 8.7.1 + acorn-walk: 8.2.0 + dev: false + + /wcwidth/1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.3 + dev: false + + /web-streams-polyfill/3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} + dev: false + + /webidl-conversions/3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-url/5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wmf/1.0.2: + resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} + engines: {node: '>=0.8'} + dev: false + + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + + /word/0.3.0: + resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} + engines: {node: '>=0.8'} + dev: false + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /ws/7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + 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 + dev: false + + /ws/7.5.8: + resolution: {integrity: sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==} + 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 + dev: false + + /ws/8.5.0: + resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} + 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 + dev: false + + /xlsx/0.17.5: + resolution: {integrity: sha512-lXNU0TuYsvElzvtI6O7WIVb9Zar1XYw7Xb3VAx2wn8N/n0whBYrCnHMxtFyIiUU1Wjf09WzmLALDfBO5PqTb1g==} + engines: {node: '>=0.8'} + hasBin: true + dependencies: + adler-32: 1.2.0 + cfb: 1.2.2 + codepage: 1.15.0 + crc-32: 1.2.2 + ssf: 0.11.2 + wmf: 1.0.2 + word: 0.3.0 + dev: false + + /xregexp/2.0.0: + resolution: {integrity: sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==} + dev: false + + /yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: false + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false + + /yaml/2.1.1: + resolution: {integrity: sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==} + engines: {node: '>= 14'} + dev: false + + /yamljs/0.3.0: + resolution: {integrity: sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==} + hasBin: true + dependencies: + argparse: 1.0.10 + glob: 7.2.3 + dev: false + + /yauzl/2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: false diff --git a/src/Yunzai-Bot/pnpm-workspace.yaml b/src/Yunzai-Bot/pnpm-workspace.yaml new file mode 100644 index 0000000000000000000000000000000000000000..19826ecded71990b3c788bd3133b96263a1128c4 --- /dev/null +++ b/src/Yunzai-Bot/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - 'plugins/**' diff --git a/src/Yunzai-Bot/resources/font/HYWenHei-55W.ttf b/src/Yunzai-Bot/resources/font/HYWenHei-55W.ttf new file mode 100644 index 0000000000000000000000000000000000000000..23d3843b9c19a7c5680ec2a80a8f851197a923bf --- /dev/null +++ b/src/Yunzai-Bot/resources/font/HYWenHei-55W.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29e982b71514c7000f9e726cf354c5dabc686a1ceae5961713d0b07e9528a60c +size 3243096 diff --git a/src/Yunzai-Bot/resources/font/tttgbnumber.ttf b/src/Yunzai-Bot/resources/font/tttgbnumber.ttf new file mode 100644 index 0000000000000000000000000000000000000000..89a392f7d123ec88caebb16e95ce0f35cfdf83bc Binary files /dev/null and b/src/Yunzai-Bot/resources/font/tttgbnumber.ttf differ diff --git "a/src/Yunzai-Bot/resources/font/\345\215\216\346\226\207\344\270\255\345\256\213.TTF" "b/src/Yunzai-Bot/resources/font/\345\215\216\346\226\207\344\270\255\345\256\213.TTF" new file mode 100644 index 0000000000000000000000000000000000000000..a27816514635b3a264000956f449b32d5d1791fe --- /dev/null +++ "b/src/Yunzai-Bot/resources/font/\345\215\216\346\226\207\344\270\255\345\256\213.TTF" @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d0e8ba436f803236fa10c27903327284c39186a6e7d859e0fae423d11c44583 +size 12128500 diff --git a/src/yunzai-web-fe/.commitlintrc.json b/src/yunzai-web-fe/.commitlintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..c30e5a970ba051b106b77267503f6c3eca8e12d0 --- /dev/null +++ b/src/yunzai-web-fe/.commitlintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["@commitlint/config-conventional"] +} diff --git a/src/yunzai-web-fe/.dockerignore b/src/yunzai-web-fe/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..5078fcdfc680fb6360bf7c087e17b2de8b2c60fc --- /dev/null +++ b/src/yunzai-web-fe/.dockerignore @@ -0,0 +1,6 @@ +node_modules +Dockerfile +.git +.husky +.github +.vscode diff --git a/src/yunzai-web-fe/.editorconfig b/src/yunzai-web-fe/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..02bb57fb6c0cccf050b57492c67d6d02faae9b65 --- /dev/null +++ b/src/yunzai-web-fe/.editorconfig @@ -0,0 +1,11 @@ +# Editor configuration, see http://editorconfig.org + +root = true + +[*] +charset = utf-8 +indent_style = tab +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/src/yunzai-web-fe/.eslintrc.cjs b/src/yunzai-web-fe/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..d83f5c445909ea72761eab6371a69fc186a0411e --- /dev/null +++ b/src/yunzai-web-fe/.eslintrc.cjs @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['@antfu'], +} diff --git a/src/yunzai-web-fe/.gitattributes b/src/yunzai-web-fe/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..9a9f3867dd7ecb4f00c11a18d73aed352de8cd34 --- /dev/null +++ b/src/yunzai-web-fe/.gitattributes @@ -0,0 +1,17 @@ +"*.vue" eol=lf +"*.js" eol=lf +"*.ts" eol=lf +"*.jsx" eol=lf +"*.tsx" eol=lf +"*.cjs" eol=lf +"*.cts" eol=lf +"*.mjs" eol=lf +"*.mts" eol=lf +"*.json" eol=lf +"*.html" eol=lf +"*.css" eol=lf +"*.less" eol=lf +"*.scss" eol=lf +"*.sass" eol=lf +"*.styl" eol=lf +"*.md" eol=lf diff --git a/src/yunzai-web-fe/.github/workflows/build_docker.yml b/src/yunzai-web-fe/.github/workflows/build_docker.yml new file mode 100644 index 0000000000000000000000000000000000000000..d4b1bb525c0b4e4aacb7107a0c85bd5c86c9b896 --- /dev/null +++ b/src/yunzai-web-fe/.github/workflows/build_docker.yml @@ -0,0 +1,41 @@ +name: build_docker + +on: + push: + branches: [main] + release: + types: [created] # 表示在创建新的 Release 时触发 + +jobs: + build_docker: + name: Build docker + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - run: | + echo "本次构建的版本为:${GITHUB_REF_NAME} (但是这个变量目前上下文中无法获取到)" + echo 本次构建的版本为:${{ github.ref_name }} + env + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + id: docker_build + uses: docker/build-push-action@v4 + with: + context: . + push: true + labels: ${{ steps.meta.outputs.labels }} + platforms: linux/amd64,linux/arm64 + tags: | + ${{ secrets.DOCKERHUB_USERNAME }}/chatgpt-web:${{ github.ref_name }} + ${{ secrets.DOCKERHUB_USERNAME }}/chatgpt-web:latest diff --git a/src/yunzai-web-fe/.github/workflows/ci.yml b/src/yunzai-web-fe/.github/workflows/ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..24f58aec525d936fcceca321275413e3e2a823b5 --- /dev/null +++ b/src/yunzai-web-fe/.github/workflows/ci.yml @@ -0,0 +1,47 @@ +name: CI + +on: + push: + branches: + - main + + pull_request: + branches: + - main + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set node + uses: actions/setup-node@v3 + with: + node-version: 18.x + + - name: Setup + run: npm i -g @antfu/ni + + - name: Install + run: nci + + - name: Lint + run: nr lint:fix + + typecheck: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set node + uses: actions/setup-node@v3 + with: + node-version: 18.x + + - name: Setup + run: npm i -g @antfu/ni + + - name: Install + run: nci + + - name: Typecheck + run: nr type-check diff --git a/src/yunzai-web-fe/.gitignore b/src/yunzai-web-fe/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..5119246ca995275a6315472b791e4258db3b8725 --- /dev/null +++ b/src/yunzai-web-fe/.gitignore @@ -0,0 +1,29 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/settings.json +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/yunzai-web-fe/.husky/commit-msg b/src/yunzai-web-fe/.husky/commit-msg new file mode 100644 index 0000000000000000000000000000000000000000..4002db7175f9f914b0c868913a95ce84f396f403 --- /dev/null +++ b/src/yunzai-web-fe/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx --no -- commitlint --edit diff --git a/src/yunzai-web-fe/.husky/pre-commit b/src/yunzai-web-fe/.husky/pre-commit new file mode 100644 index 0000000000000000000000000000000000000000..d24fdfc601b9ffe8ccc3fca5d3b873109dc56c4a --- /dev/null +++ b/src/yunzai-web-fe/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx lint-staged diff --git a/src/yunzai-web-fe/.npmrc b/src/yunzai-web-fe/.npmrc new file mode 100644 index 0000000000000000000000000000000000000000..319e41e69dc9814508dd664b4162dc4a599cac1c --- /dev/null +++ b/src/yunzai-web-fe/.npmrc @@ -0,0 +1 @@ +strict-peer-dependencies=false diff --git a/src/yunzai-web-fe/.vscode/extensions.json b/src/yunzai-web-fe/.vscode/extensions.json new file mode 100644 index 0000000000000000000000000000000000000000..269dc29a68ecacb12b3999770bc65c53620bab84 --- /dev/null +++ b/src/yunzai-web-fe/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar", "dbaeumer.vscode-eslint"] +} diff --git a/src/yunzai-web-fe/.vscode/settings.json b/src/yunzai-web-fe/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..2cc6c1103d6832792dea239252c786c927d331cb --- /dev/null +++ b/src/yunzai-web-fe/.vscode/settings.json @@ -0,0 +1,49 @@ +{ + "prettier.enable": false, + "editor.formatOnSave": false, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact", + "vue", + "html", + "json", + "jsonc", + "json5", + "yaml", + "yml", + "markdown" + ], + "cSpell.words": [ + "antfu", + "axios", + "bumpp", + "chatgpt", + "chenzhaoyu", + "commitlint", + "davinci", + "dockerhub", + "esno", + "GPTAPI", + "hljs", + "iconify", + "logprobs", + "nodata", + "OPENAI", + "pinia", + "Popconfirm", + "rushstack", + "Sider", + "tailwindcss", + "tsup", + "Typecheck", + "unplugin", + "VITE", + "vueuse", + "Zhao" + ] +} diff --git a/src/yunzai-web-fe/CHANGELOG.md b/src/yunzai-web-fe/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..a233b4ffb0d975cf1511544d43e73261e65d8906 --- /dev/null +++ b/src/yunzai-web-fe/CHANGELOG.md @@ -0,0 +1,271 @@ +## v2.8.3 + +`2023-03-01` + +### Feature +- 消息已输出内容不会因为中断而消失[#167] +- 添加复制消息按钮[#133] + +### Other +- `README` 添加声明内容 + +## v2.8.2 + +`2023-02-28` +### Enhancement +- 代码主题调整为 `One Dark - light|dark` 适配深色模式 +### BugFix +- 修复普通文本代码渲染和深色模式下的问题[#139][#154] + +## v2.8.1 + +`2023-02-27` + +### BugFix +- 修复 `API` 版本不是 `Markdown` 时,普通 `HTML` 代码会被渲染的问题 [#146] + +## v2.8.0 + +`2023-02-27` + +- 感谢 [puppywang](https://github.com/Chanzhaoyu/chatgpt-web/commit/628187f5c3348bda0d0518f90699a86525d19018) 修复了 `2.7.0` 版本中关于流输出数据的问题(使用 `nginx` 需要自行配置 `octet-stream` 相关内容) + +- 关于为什么使用 `octet-stream` 而不是 `sse`,是因为更好的兼容之前的模式。 + +- 建议更新到此版本获得比较完整的体验 + +### Enhancement +- 优化了部份代码和类型提示 +- 输入框添加换行提示 +- 移动端输入框现在回车为换行,而不是直接提交 +- 移动端双击标题返回顶部,箭头返回底部 + +### BugFix +- 流输出数据下的问题[#122] +- 修复了 `API Key` 下部份代码不换行的问题 +- 修复移动端深色模式部份样式问题[#123][#126] +- 修复主题模式图标不一致的问题[#126] + +## v2.7.3 + +`2023-02-25` + +### Feature +- 适配系统深色模式 [#118](https://github.com/Chanzhaoyu/chatgpt-web/issues/103) +### BugFix +- 修复用户消息能被渲染为 `HTML` 问题 [#117](https://github.com/Chanzhaoyu/chatgpt-web/issues/117) + +## v2.7.2 + +`2023-02-24` +### Enhancement +- 消息使用 [github-markdown-css](https://www.npmjs.com/package/github-markdown-css) 进行美化,现在支持全语法 +- 移除测试无用函数 + +## v2.7.1 + +`2023-02-23` + +因为消息流在 `accessToken` 中存在解析失败和消息不完整等一系列的问题,调整回正常消息形式 + +### Feature +- 现在可以中断请求过长没有答复的消息 +- 现在可以删除单条消息 +- 设置中显示当前版本信息 + +### BugFix +- 回退 `2.7.0` 的消息不稳定的问题 + +## v2.7.0 + +`2023-02-23` + +### Feature +- 使用消息流返回信息,反应更迅速 + +### Enhancement +- 样式的一点小改动 + +## v2.6.2 + +`2023-02-22` +### BugFix +- 还原修改代理导致的异常问题 + +## v2.6.1 + +`2023-02-22` + +### Feature +- 新增 `Railway` 部署模版 + +### BugFix +- 手动打包 `Proxy` 问题 + +## v2.6.0 + +`2023-02-21` +### Feature +- 新增对 `网页 accessToken` 调用 `ChatGPT`,更智能不过不太稳定 [#51](https://github.com/Chanzhaoyu/chatgpt-web/issues/51) +- 前端页面设置按钮显示查看当前后端服务配置 + +### Enhancement +- 新增 `TIMEOUT_MS` 环境变量设定后端超时时常(单位:毫秒)[#62](https://github.com/Chanzhaoyu/chatgpt-web/issues/62) + +## v2.5.2 + +`2023-02-21` +### Feature +- 增加对 `markdown` 格式的支持 [Demo](https://github.com/Chanzhaoyu/chatgpt-web/pull/77) +### BugFix +- 重载会话时滚动条保持 + +## v2.5.1 + +`2023-02-21` + +### Enhancement +- 调整路由模式为 `hash` +- 调整新增会话添加到 +- 调整移动端样式 + + +## v2.5.0 + +`2023-02-20` + +### Feature +- 会话 `loading` 现在显示为光标动画 +- 会话现在可以再次生成回复 +- 会话异常可以再次进行请求 +- 所有删除选项添加确认操作 + +### Enhancement +- 调整 `chat` 为路由页面而不是组件形式 +- 更新依赖至最新 +- 调整移动端体验 + +### BugFix +- 修复移动端左侧菜单显示不完整的问题 + +## v2.4.1 + +`2023-02-18` + +### Enhancement +- 调整部份移动端上的样式 +- 输入框支持换行 + +## v2.4.0 + +`2023-02-17` + +### Feature +- 响应式支持移动端 +### Enhancement +- 修改部份描述错误 + +## v2.3.3 + +`2023-02-16` + +### Feature +- 添加 `README` 部份说明和贡献列表 +- 添加 `docker` 镜像 +- 添加 `GitHub Action` 自动化构建 + +### BugFix +- 回退依赖更新导致的 [Eslint 报错](https://github.com/eslint/eslint/issues/16896) + +## v2.3.2 + +`2023-02-16` + +### Enhancement +- 更新依赖至最新 +- 优化部份内容 + +## v2.3.1 + +`2023-02-15` + +### BugFix +- 修复多会话状态下一些意想不到的问题 + +## v2.3.0 + +`2023-02-15` +### Feature +- 代码类型信息高亮显示 +- 支持 `node ^16` 版本 +- 移动端响应式初步支持 +- `vite` 中 `proxy` 代理 + +### Enhancement +- 调整超时处理范围 + +### BugFix +- 修复取消请求错误提示会添加到信息中 +- 修复部份情况下提交请求不可用 +- 修复侧边栏宽度变化闪烁的问题 + +## v2.2.0 + +`2023-02-14` +### Feature +- 会话和上下文本地储存 +- 侧边栏本地储存 + +## v2.1.0 + +`2023-02-14` +### Enhancement +- 更新依赖至最新 +- 联想功能移动至前端提交,后端只做转发 + +### BugFix +- 修复部份项目检测有关 `Bug` +- 修复清除上下文按钮失效 + +## v2.0.0 + +`2023-02-13` +### Refactor +重构并优化大部分内容 + +## v1.0.5 + +`2023-02-12` + +### Enhancement +- 输入框焦点,连续提交 + +### BugFix +- 修复信息框样式问题 +- 修复中文输入法提交问题 + +## v1.0.4 + +`2023-02-11` + +### Feature +- 支持上下文联想 + +## v1.0.3 + +`2023-02-11` + +### Enhancement +- 拆分 `service` 文件以便扩展 +- 调整 `Eslint` 相关验证 + +### BugFix +- 修复部份控制台报错 + +## v1.0.2 + +`2023-02-10` + +### BugFix +- 修复新增信息容器不会自动滚动到问题 +- 修复文本过长不换行到问题 [#1](https://github.com/Chanzhaoyu/chatgpt-web/issues/1) diff --git a/src/yunzai-web-fe/CONTRIBUTING.md b/src/yunzai-web-fe/CONTRIBUTING.md new file mode 100644 index 0000000000000000000000000000000000000000..2a7b0ca82162ee9d1fe43a3b1ddf1282871e1cf7 --- /dev/null +++ b/src/yunzai-web-fe/CONTRIBUTING.md @@ -0,0 +1,49 @@ +# 贡献指南 +感谢你的宝贵时间。你的贡献将使这个项目变得更好!在提交贡献之前,请务必花点时间阅读下面的入门指南。 + +## 语义化版本 +该项目遵循语义化版本。我们对重要的漏洞修复发布修订号,对新特性或不重要的变更发布次版本号,对重大且不兼容的变更发布主版本号。 + +每个重大更改都将记录在 `changelog` 中。 + +## 提交 Pull Request +1. Fork [此仓库](https://github.com/Chanzhaoyu/chatgpt-web),从 `main` 创建分支。新功能实现请发 pull request 到 `feature` 分支。其他更改发到 `main` 分支。 +2. 使用 `npm install pnpm -g` 安装 `pnpm` 工具。 +3. `vscode` 安装了 `Eslint` 插件,其它编辑器如 `webStorm` 打开了 `eslint` 功能。 +4. 根目录下执行 `pnpm bootstrap`。 +5. `/service/` 目录下执行 `pnpm install`。 +6. 对代码库进行更改。如果适用的话,请确保进行了相应的测试。 +7. 请在根目录下执行 `pnpm lint:fix` 进行代码格式检查。 +8. 请在根目录下执行 `pnpm type-check` 进行类型检查。 +9. 提交 git commit, 请同时遵守 [Commit 规范](#commit-指南) +10. 提交 `pull request`, 如果有对应的 `issue`,请进行[关联](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword)。 + +## Commit 指南 + +Commit messages 请遵循[conventional-changelog 标准](https://www.conventionalcommits.org/en/v1.0.0/): + +```bash +<类型>[可选 范围]: <描述> + +[可选 正文] + +[可选 脚注] +``` + +### Commit 类型 + +以下是 commit 类型列表: + +- feat: 新特性或功能 +- fix: 缺陷修复 +- docs: 文档更新 +- style: 代码风格或者组件样式更新 +- refactor: 代码重构,不引入新功能和缺陷修复 +- perf: 性能优化 +- test: 单元测试 +- chore: 其他不修改 src 或测试文件的提交 + + +## License + +[MIT](./license) diff --git a/src/yunzai-web-fe/Dockerfile b/src/yunzai-web-fe/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..f0b6f228213692102b44b172fee40206636c42f8 --- /dev/null +++ b/src/yunzai-web-fe/Dockerfile @@ -0,0 +1,20 @@ +# build front-end +FROM node:lts-alpine AS builder + +COPY ./ /app +WORKDIR /app + +RUN npm install pnpm -g && pnpm install && pnpm run build + +# service +FROM node:lts-alpine + +COPY /service /app +COPY --from=builder /app/dist /app/public + +WORKDIR /app +RUN npm install pnpm -g && pnpm install + +EXPOSE 3002 + +CMD ["pnpm", "run", "start"] \ No newline at end of file diff --git a/src/yunzai-web-fe/README.md b/src/yunzai-web-fe/README.md new file mode 100644 index 0000000000000000000000000000000000000000..55e70fdf017e0fc928941d17ac095619b5691d36 --- /dev/null +++ b/src/yunzai-web-fe/README.md @@ -0,0 +1,277 @@ +# ChatGPT Web + +> 声明:此项目只发布于 Github,基于 MIT 协议,免费且作为开源学习使用。并且不会有任何形式的卖号、付费服务、讨论群、讨论组等行为。谨防受骗。 + +![cover](./docs/c1-2.8.0.png) +![cover2](./docs/c2-2.8.0.png) + +- [ChatGPT Web](#chatgpt-web) + - [介绍](#介绍) + - [待实现路线](#待实现路线) + - [前置要求](#前置要求) + - [Node](#node) + - [PNPM](#pnpm) + - [填写密钥](#填写密钥) + - [安装依赖](#安装依赖) + - [后端](#后端) + - [前端](#前端) + - [测试环境运行](#测试环境运行) + - [后端服务](#后端服务) + - [前端网页](#前端网页) + - [打包](#打包) + - [使用 Docker](#使用-docker) + - [Docker 参数示例](#docker-参数示例) + - [Docker build \& Run](#docker-build--run) + - [Docker compose](#docker-compose) + - [使用 Railway 部署](#使用-railway-部署) + - [Railway 环境变量](#railway-环境变量) + - [手动打包](#手动打包) + - [后端服务](#后端服务-1) + - [前端网页](#前端网页-1) + - [常见问题](#常见问题) + - [参与贡献](#参与贡献) + - [赞助](#赞助) + - [License](#license) +## 介绍 + +支持双模型,提供了两种非官方 `ChatGPT API` 方法 + +| 方式 | 免费? | 可靠性 | 质量 | +| ---- | ---- | ---- | ---- | +| `ChatGPTAPI(GPT-3)` | 否 | 可靠 | 较笨 | +| `ChatGPTUnofficialProxyAPI(网页 accessToken)` | 是 | 相对不可靠 | 聪明 | + +对比: +1. `ChatGPTAPI` 使用 `text-davinci-003` 通过官方`OpenAI`补全`API`模拟`ChatGPT`(最稳健的方法,但它不是免费的,并且没有使用针对聊天进行微调的模型) +2. `ChatGPTUnofficialProxyAPI` 使用非官方代理服务器访问 `ChatGPT` 的后端`API`,绕过`Cloudflare`(使用真实的的`ChatGPT`,非常轻量级,但依赖于第三方服务器,并且有速率限制) + +[查看详情](https://github.com/Chanzhaoyu/chatgpt-web/issues/138) + +切换方式: +1. 进入 `service/.env` 文件 +2. 使用 `OpenAI API Key` 请填写 `OPENAI_API_KEY` 字段 [(获取 apiKey)](https://platform.openai.com/overview) +3. 使用 `Web API` 请填写 `OPENAI_ACCESS_TOKEN` 字段 [(获取 accessToken)](https://chat.openai.com/api/auth/session) +4. 同时存在时以 `OpenAI API Key` 优先 + +反向代理: + +`ChatGPTUnofficialProxyAPI`时可用 [详情](https://github.com/transitive-bullshit/chatgpt-api#reverse-proxy) + +```shell +# service/.env +API_REVERSE_PROXY= +``` + +## 待实现路线 +[✓] 双模型 + +[✓] 多会话储存和上下文逻辑 + +[✓] 对代码等消息类型的格式化美化处理 + +[✗] 界面多语言 + +[✗] 界面主题 + +[✗] More... + +## 前置要求 + +### Node + +`node` 需要 `^16 || ^18` 版本(`node >= 14` 需要安装 [fetch polyfill](https://github.com/developit/unfetch#usage-as-a-polyfill)),使用 [nvm](https://github.com/nvm-sh/nvm) 可管理本地多个 `node` 版本 + +```shell +node -v +``` + +### PNPM +如果你没有安装过 `pnpm` +```shell +npm install pnpm -g +``` + +### 填写密钥 +获取 `Openai Api Key` 或 `accessToken` 并填写本地环境变量 [跳转](#介绍) + +``` +# service/.env 文件 + +# OpenAI API Key - https://platform.openai.com/overview +OPENAI_API_KEY= + +# change this to an `accessToken` extracted from the ChatGPT site's `https://chat.openai.com/api/auth/session` response +OPENAI_ACCESS_TOKEN= +``` + +## 安装依赖 + +> 为了简便 `后端开发人员` 的了解负担,所以并没有采用前端 `workspace` 模式,而是分文件夹存放。如果只需要前端页面做二次开发,删除 `service` 文件夹即可。 + +### 后端 + +进入文件夹 `/service` 运行以下命令 + +```shell +pnpm install +``` + +### 前端 +根目录下运行以下命令 +```shell +pnpm bootstrap +``` + +## 测试环境运行 +### 后端服务 + +进入文件夹 `/service` 运行以下命令 + +```shell +pnpm start +``` + +### 前端网页 +根目录下运行以下命令 +```shell +pnpm dev +``` + +## 打包 + +### 使用 Docker + +#### Docker 参数示例 + +- `OPENAI_API_KEY` 二选一 +- `OPENAI_ACCESS_TOKEN` 二选一,同时存在时,`OPENAI_API_KEY` 优先 +- `API_REVERSE_PROXY` 可选,设置 `OPENAI_ACCESS_TOKEN` 时可用 [参考](#介绍) +- `TIMEOUT_MS` 超时,单位毫秒,可选 + +![docker](./docs/docker.png) + +#### Docker build & Run + +```bash +docker build -t chatgpt-web . + +# 前台运行 +docker run --name chatgpt-web --rm -it -p 3002:3002 --env OPENAI_API_KEY=your_api_key chatgpt-web + +# 后台运行 +docker run --name chatgpt-web -d -p 3002:3002 --env OPENAI_API_KEY=your_api_key chatgpt-web + +# 运行地址 +http://localhost:3002/ +``` + +#### Docker compose + +[Hub 地址](https://hub.docker.com/repository/docker/chenzhaoyu94/chatgpt-web/general) + +```yml +version: '3' + +services: + app: + image: chenzhaoyu94/chatgpt-web # 总是使用latest,更新时重新pull该tag镜像即可 + ports: + - 3002:3002 + environment: + # 二选一 + OPENAI_API_KEY: xxxxxx + # 二选一 + OPENAI_ACCESS_TOKEN: xxxxxx + # 反向代理,可选 + API_REVERSE_PROXY: xxx + # 超时,单位毫秒,可选 + TIMEOUT_MS: 60000 +``` + +### 使用 Railway 部署 + +[![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/new/template/yytmgc) + +#### Railway 环境变量 + +| 环境变量名称 | 必填 | 备注 | +| --------------------------- | ---- | ----------------------- | +| `PORT` | 必填 | 默认 `3002` | +| `TIMEOUT_MS` | 可选 | 超时时间,单位毫秒, | +| `OPENAI_API_KEY` | `OpenAI API` 二选一 | 使用 `OpenAI API` 所需的 `apiKey` [(获取 apiKey)](https://platform.openai.com/overview) | +| `OPENAI_ACCESS_TOKEN` | `Web API` 二选一 | 使用 `Web API` 所需的 `accessToken` [(获取 accessToken)](https://chat.openai.com/api/auth/session) | +| `API_REVERSE_PROXY` | 可选,`Web API` 时可用 | `Web API` 反向代理地址 [详情](https://github.com/transitive-bullshit/chatgpt-api#reverse-proxy) | + +> 注意: `Railway` 修改环境变量会重新 `Deploy` + +### 手动打包 +#### 后端服务 +> 如果你不需要本项目的 `node` 接口,可以省略如下操作 + +复制 `service` 文件夹到你有 `node` 服务环境的服务器上。 + +```shell +# 安装 +pnpm install + +# 打包 +pnpm build + +# 运行 +pnpm prod +``` + +PS: 不进行打包,直接在服务器上运行 `pnpm start` 也可 + +#### 前端网页 + +1、修改根目录下 `.env` 内 `VITE_APP_API_BASE_URL` 为你的实际后端接口地址 + +2、根目录下运行以下命令,然后将 `dist` 文件夹内的文件复制到你网站服务的根目录下 + +[参考信息](https://cn.vitejs.dev/guide/static-deploy.html#building-the-app) + +```shell +pnpm build +``` + +## 常见问题 +Q: 为什么 `Git` 提交总是报错? + +A: 因为有提交信息验证,请遵循 [Commit 指南](./CONTRIBUTING.md) + +Q: 如果只使用前端页面,在哪里改请求接口? + +A: 根目录下 `.env` 文件中的 `VITE_GLOB_API_URL` 字段。 + +Q: 文件保存时全部爆红? + +A: `vscode` 请安装项目推荐插件,或手动安装 `Eslint` 插件。 + +## 参与贡献 + +贡献之前请先阅读 [贡献指南](./CONTRIBUTING.md) + +感谢所有做过贡献的人! + + + + + +## 赞助 + +如果你觉得这个项目对你有帮助,并且情况允许的话,可以给我一点点支持,总之非常感谢支持~ + +
+
+ 微信 +

WeChat Pay

+
+
+ 支付宝 +

Alipay

+
+
+ +## License +MIT © [ChenZhaoYu](./license) diff --git a/src/yunzai-web-fe/config/index.ts b/src/yunzai-web-fe/config/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..e739ac85628835db30e67aa401bfea63b1005f1a --- /dev/null +++ b/src/yunzai-web-fe/config/index.ts @@ -0,0 +1 @@ +export * from './proxy' diff --git a/src/yunzai-web-fe/config/proxy.ts b/src/yunzai-web-fe/config/proxy.ts new file mode 100644 index 0000000000000000000000000000000000000000..73922d51da2c000174e40109cf7e49c81c142f05 --- /dev/null +++ b/src/yunzai-web-fe/config/proxy.ts @@ -0,0 +1,16 @@ +import type { ProxyOptions } from 'vite' + +export function createViteProxy(isOpenProxy: boolean, viteEnv: ImportMetaEnv) { + if (!isOpenProxy) + return + + const proxy: Record = { + // '/api': { + // target: viteEnv.VITE_APP_API_BASE_URL, + // changeOrigin: true, + // rewrite: path => path.replace('/api/', '/'), + // }, + } + + return proxy +} diff --git a/src/yunzai-web-fe/docs/alipay.png b/src/yunzai-web-fe/docs/alipay.png new file mode 100644 index 0000000000000000000000000000000000000000..fa85805af972c25867f18e5971caa82b54ec72b7 Binary files /dev/null and b/src/yunzai-web-fe/docs/alipay.png differ diff --git a/src/yunzai-web-fe/docs/c1-2.8.0.png b/src/yunzai-web-fe/docs/c1-2.8.0.png new file mode 100644 index 0000000000000000000000000000000000000000..6ffd9773671673c9d6e87ab8bbe76fb59fe9c753 Binary files /dev/null and b/src/yunzai-web-fe/docs/c1-2.8.0.png differ diff --git a/src/yunzai-web-fe/docs/c1.png b/src/yunzai-web-fe/docs/c1.png new file mode 100644 index 0000000000000000000000000000000000000000..4eefc1a2dbc3fa4cfc9662545fe919843359426a Binary files /dev/null and b/src/yunzai-web-fe/docs/c1.png differ diff --git a/src/yunzai-web-fe/docs/c2-2.8.0.png b/src/yunzai-web-fe/docs/c2-2.8.0.png new file mode 100644 index 0000000000000000000000000000000000000000..f2993d9a39ac3c3104cdb0105d64c52f9b10e76d Binary files /dev/null and b/src/yunzai-web-fe/docs/c2-2.8.0.png differ diff --git a/src/yunzai-web-fe/docs/c2.png b/src/yunzai-web-fe/docs/c2.png new file mode 100644 index 0000000000000000000000000000000000000000..779ffba6881746c7ddd71990f2edfb3ad11b84b3 --- /dev/null +++ b/src/yunzai-web-fe/docs/c2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5dc3f7c61029e057de47b469d6e3dff679c6d339df7b9424171f6e60cb60b02d +size 1139968 diff --git a/src/yunzai-web-fe/docs/cover.png b/src/yunzai-web-fe/docs/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..19602eb201eda53b69123f5d791310e6441f423c Binary files /dev/null and b/src/yunzai-web-fe/docs/cover.png differ diff --git a/src/yunzai-web-fe/docs/cover2.png b/src/yunzai-web-fe/docs/cover2.png new file mode 100644 index 0000000000000000000000000000000000000000..9d801d43db0a3b68201fc8daba1aadf089f8ba11 Binary files /dev/null and b/src/yunzai-web-fe/docs/cover2.png differ diff --git a/src/yunzai-web-fe/docs/docker.png b/src/yunzai-web-fe/docs/docker.png new file mode 100644 index 0000000000000000000000000000000000000000..660c05de27da8b15dd44fad57609553c2d320b49 Binary files /dev/null and b/src/yunzai-web-fe/docs/docker.png differ diff --git a/src/yunzai-web-fe/docs/wechat.png b/src/yunzai-web-fe/docs/wechat.png new file mode 100644 index 0000000000000000000000000000000000000000..28f6a59f2136a57b0668b16ee7f150ad2ea647da Binary files /dev/null and b/src/yunzai-web-fe/docs/wechat.png differ diff --git a/src/yunzai-web-fe/index.html b/src/yunzai-web-fe/index.html new file mode 100644 index 0000000000000000000000000000000000000000..85ee62d1d3262afdcb4a5cb45c4fb5c9f845003b --- /dev/null +++ b/src/yunzai-web-fe/index.html @@ -0,0 +1,81 @@ + + + + + + + YunZai Bot Web + + + +
+ +
+
+
+
+
+
+
+
+ + + + diff --git a/src/yunzai-web-fe/license b/src/yunzai-web-fe/license new file mode 100644 index 0000000000000000000000000000000000000000..0cb7b2a09bffde6d54c0ad521a0127280d965711 --- /dev/null +++ b/src/yunzai-web-fe/license @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 ChenZhaoYu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/yunzai-web-fe/package.json b/src/yunzai-web-fe/package.json new file mode 100644 index 0000000000000000000000000000000000000000..ac0c6094eb003101f6e18e82db949fcff9f6e932 --- /dev/null +++ b/src/yunzai-web-fe/package.json @@ -0,0 +1,64 @@ +{ + "name": "chatgpt-web", + "version": "2.8.3", + "private": false, + "description": "ChatGPT Web", + "author": "ChenZhaoYu ", + "keywords": [ + "chatgpt-web", + "chatgpt", + "chatbot", + "vue" + ], + "scripts": { + "dev": "vite", + "build": "run-p type-check build-only", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --noEmit", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "bootstrap": "pnpm install && pnpm run common:prepare", + "common:cleanup": "rimraf node_modules && rimraf pnpm-lock.yaml", + "common:prepare": "husky install" + }, + "dependencies": { + "@vueuse/core": "^9.13.0", + "highlight.js": "^11.7.0", + "marked": "^4.2.12", + "naive-ui": "^2.34.3", + "pinia": "^2.0.30", + "vue": "^3.2.47", + "vue-router": "^4.1.6" + }, + "devDependencies": { + "@antfu/eslint-config": "^0.35.2", + "@commitlint/cli": "^17.4.4", + "@commitlint/config-conventional": "^17.4.4", + "@iconify/vue": "^4.1.0", + "@types/crypto-js": "^4.1.1", + "@types/marked": "^4.0.8", + "@types/node": "^18.14.0", + "@types/web-bluetooth": "^0.0.16", + "@vitejs/plugin-vue": "^4.0.0", + "autoprefixer": "^10.4.13", + "axios": "^1.3.3", + "crypto-js": "^4.1.1", + "eslint": "^8.34.0", + "husky": "^8.0.3", + "less": "^4.1.3", + "lint-staged": "^13.1.2", + "npm-run-all": "^4.1.5", + "postcss": "^8.4.21", + "rimraf": "^4.1.2", + "tailwindcss": "^3.2.7", + "typescript": "~4.9.5", + "vite": "^4.1.2", + "vue-tsc": "^1.1.4" + }, + "lint-staged": { + "*.{ts,tsx,vue}": [ + "pnpm lint:fix" + ] + } +} diff --git a/src/yunzai-web-fe/pnpm-lock.yaml b/src/yunzai-web-fe/pnpm-lock.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f9191da7a1f5559cf138e3d573da4a27f9e4d419 --- /dev/null +++ b/src/yunzai-web-fe/pnpm-lock.yaml @@ -0,0 +1,4805 @@ +lockfileVersion: 5.4 + +specifiers: + '@antfu/eslint-config': ^0.35.2 + '@commitlint/cli': ^17.4.4 + '@commitlint/config-conventional': ^17.4.4 + '@iconify/vue': ^4.1.0 + '@types/crypto-js': ^4.1.1 + '@types/marked': ^4.0.8 + '@types/node': ^18.14.0 + '@types/web-bluetooth': ^0.0.16 + '@vitejs/plugin-vue': ^4.0.0 + '@vueuse/core': ^9.13.0 + autoprefixer: ^10.4.13 + axios: ^1.3.3 + crypto-js: ^4.1.1 + eslint: ^8.34.0 + highlight.js: ^11.7.0 + husky: ^8.0.3 + less: ^4.1.3 + lint-staged: ^13.1.2 + marked: ^4.2.12 + naive-ui: ^2.34.3 + npm-run-all: ^4.1.5 + pinia: ^2.0.30 + postcss: ^8.4.21 + rimraf: ^4.1.2 + tailwindcss: ^3.2.7 + typescript: ~4.9.5 + vite: ^4.1.2 + vue: ^3.2.47 + vue-router: ^4.1.6 + vue-tsc: ^1.1.4 + +dependencies: + '@vueuse/core': 9.13.0_vue@3.2.47 + highlight.js: 11.7.0 + marked: 4.2.12 + naive-ui: 2.34.3_vue@3.2.47 + pinia: 2.0.30_hmuptsblhheur2tugfgucj7gc4 + vue: 3.2.47 + vue-router: 4.1.6_vue@3.2.47 + +devDependencies: + '@antfu/eslint-config': 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm + '@commitlint/cli': 17.4.4 + '@commitlint/config-conventional': 17.4.4 + '@iconify/vue': 4.1.0_vue@3.2.47 + '@types/crypto-js': 4.1.1 + '@types/marked': 4.0.8 + '@types/node': 18.14.0 + '@types/web-bluetooth': 0.0.16 + '@vitejs/plugin-vue': 4.0.0_vite@4.1.2+vue@3.2.47 + autoprefixer: 10.4.13_postcss@8.4.21 + axios: 1.3.3 + crypto-js: 4.1.1 + eslint: 8.34.0 + husky: 8.0.3 + less: 4.1.3 + lint-staged: 13.1.2 + npm-run-all: 4.1.5 + postcss: 8.4.21 + rimraf: 4.1.2 + tailwindcss: 3.2.7_postcss@8.4.21 + typescript: 4.9.5 + vite: 4.1.2_lxiyzdpogvsuukhx3wcpsdczbq + vue-tsc: 1.1.4_typescript@4.9.5 + +packages: + + /@antfu/eslint-config-basic/0.35.2_khyrr7my4aaa3ssgqabkfgcc24: + resolution: {integrity: sha512-2k7Ovkd8U/q0sgfjuT9KzAUV0q187yGxP7JzD2D4YifuJwL5Bh3JC49KpCv9PXMTeRUMJX2y/kOtGYPetocOug==} + peerDependencies: + eslint: '>=7.4.0' + dependencies: + eslint: 8.34.0 + eslint-plugin-antfu: 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm + eslint-plugin-eslint-comments: 3.2.0_eslint@8.34.0 + eslint-plugin-html: 7.1.0 + eslint-plugin-import: 2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4 + eslint-plugin-jsonc: 2.6.0_eslint@8.34.0 + eslint-plugin-markdown: 3.0.0_eslint@8.34.0 + eslint-plugin-n: 15.6.1_eslint@8.34.0 + eslint-plugin-no-only-tests: 3.1.0 + eslint-plugin-promise: 6.1.1_eslint@8.34.0 + eslint-plugin-unicorn: 45.0.2_eslint@8.34.0 + eslint-plugin-unused-imports: 2.0.0_vqeavzxdzk2atb75l6fx3anzpi + eslint-plugin-yml: 1.5.0_eslint@8.34.0 + jsonc-eslint-parser: 2.1.0 + yaml-eslint-parser: 1.1.0 + transitivePeerDependencies: + - '@typescript-eslint/eslint-plugin' + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + - typescript + dev: true + + /@antfu/eslint-config-ts/0.35.2_7kw3g6rralp5ps6mg3uyzz6azm: + resolution: {integrity: sha512-GiJtTCQ83L/vMkJlWWg2l0buH/LIOXl5szrsqtr8/Hl6ssjAMXnug8sDZMCqCIZtztzQCewBPx8ufp/MpzA2cQ==} + peerDependencies: + eslint: '>=7.4.0' + typescript: '>=3.9' + dependencies: + '@antfu/eslint-config-basic': 0.35.2_khyrr7my4aaa3ssgqabkfgcc24 + '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza + '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + eslint: 8.34.0 + eslint-plugin-jest: 27.2.1_7hfwvekd5cgjoxqyvesymwuacm + typescript: 4.9.5 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + dev: true + + /@antfu/eslint-config-vue/0.35.2_khyrr7my4aaa3ssgqabkfgcc24: + resolution: {integrity: sha512-98k9D+n0bgr/9OqedAEOsflIWbXz4D92pejXqkUAtnRnB2Nq5dWrrFMJ59oJwTDKnEslpwANlgIXM11qdiTF0Q==} + peerDependencies: + eslint: '>=7.4.0' + dependencies: + '@antfu/eslint-config-basic': 0.35.2_khyrr7my4aaa3ssgqabkfgcc24 + '@antfu/eslint-config-ts': 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm + eslint: 8.34.0 + eslint-plugin-vue: 9.9.0_eslint@8.34.0 + local-pkg: 0.4.3 + transitivePeerDependencies: + - '@typescript-eslint/eslint-plugin' + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + - typescript + dev: true + + /@antfu/eslint-config/0.35.2_7kw3g6rralp5ps6mg3uyzz6azm: + resolution: {integrity: sha512-bbm7Yh7VgNI9ZaYs/L1oSTQwPMIdvlRtqxPfaBLpYdEvnsOuT4yX84TO0YaZ4RFjE4jqxQCSE/eioxydmWnl4w==} + peerDependencies: + eslint: '>=7.4.0' + dependencies: + '@antfu/eslint-config-vue': 0.35.2_khyrr7my4aaa3ssgqabkfgcc24 + '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza + '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + eslint: 8.34.0 + eslint-plugin-eslint-comments: 3.2.0_eslint@8.34.0 + eslint-plugin-html: 7.1.0 + eslint-plugin-import: 2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4 + eslint-plugin-jsonc: 2.6.0_eslint@8.34.0 + eslint-plugin-n: 15.6.1_eslint@8.34.0 + eslint-plugin-promise: 6.1.1_eslint@8.34.0 + eslint-plugin-unicorn: 45.0.2_eslint@8.34.0 + eslint-plugin-vue: 9.9.0_eslint@8.34.0 + eslint-plugin-yml: 1.5.0_eslint@8.34.0 + jsonc-eslint-parser: 2.1.0 + yaml-eslint-parser: 1.1.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + - typescript + dev: true + + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser/7.20.15: + resolution: {integrity: sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.20.7 + + /@babel/types/7.20.7: + resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + + /@commitlint/cli/17.4.4: + resolution: {integrity: sha512-HwKlD7CPVMVGTAeFZylVNy14Vm5POVY0WxPkZr7EXLC/os0LH/obs6z4HRvJtH/nHCMYBvUBQhGwnufKfTjd5g==} + engines: {node: '>=v14'} + hasBin: true + dependencies: + '@commitlint/format': 17.4.4 + '@commitlint/lint': 17.4.4 + '@commitlint/load': 17.4.4 + '@commitlint/read': 17.4.4 + '@commitlint/types': 17.4.4 + execa: 5.1.1 + lodash.isfunction: 3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.6.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/config-conventional/17.4.4: + resolution: {integrity: sha512-u6ztvxqzi6NuhrcEDR7a+z0yrh11elY66nRrQIpqsqW6sZmpxYkDLtpRH8jRML+mmxYQ8s4qqF06Q/IQx5aJeQ==} + engines: {node: '>=v14'} + dependencies: + conventional-changelog-conventionalcommits: 5.0.0 + dev: true + + /@commitlint/config-validator/17.4.4: + resolution: {integrity: sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + ajv: 8.12.0 + dev: true + + /@commitlint/ensure/17.4.4: + resolution: {integrity: sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + dev: true + + /@commitlint/execute-rule/17.4.0: + resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/format/17.4.4: + resolution: {integrity: sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored/17.4.4: + resolution: {integrity: sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + semver: 7.3.8 + dev: true + + /@commitlint/lint/17.4.4: + resolution: {integrity: sha512-qgkCRRFjyhbMDWsti/5jRYVJkgYZj4r+ZmweZObnbYqPUl5UKLWMf9a/ZZisOI4JfiPmRktYRZ2JmqlSvg+ccw==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/is-ignored': 17.4.4 + '@commitlint/parse': 17.4.4 + '@commitlint/rules': 17.4.4 + '@commitlint/types': 17.4.4 + dev: true + + /@commitlint/load/17.4.4: + resolution: {integrity: sha512-z6uFIQ7wfKX5FGBe1AkOF4l/ShOQsaa1ml/nLMkbW7R/xF8galGS7Zh0yHvzVp/srtfS0brC+0bUfQfmpMPFVQ==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.4.4 + '@commitlint/execute-rule': 17.4.0 + '@commitlint/resolve-extends': 17.4.4 + '@commitlint/types': 17.4.4 + '@types/node': 18.14.0 + chalk: 4.1.2 + cosmiconfig: 8.0.0 + cosmiconfig-typescript-loader: 4.3.0_ipkhww4xc5z2tt2x53vp2mt2be + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + ts-node: 10.9.1_tncu2ai53lzgmizdedur7lbibe + typescript: 4.9.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/message/17.4.2: + resolution: {integrity: sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/parse/17.4.4: + resolution: {integrity: sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + dev: true + + /@commitlint/read/17.4.4: + resolution: {integrity: sha512-B2TvUMJKK+Svzs6eji23WXsRJ8PAD+orI44lVuVNsm5zmI7O8RSGJMvdEZEikiA4Vohfb+HevaPoWZ7PiFZ3zA==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/top-level': 17.4.0 + '@commitlint/types': 17.4.4 + fs-extra: 11.1.0 + git-raw-commits: 2.0.11 + minimist: 1.2.8 + dev: true + + /@commitlint/resolve-extends/17.4.4: + resolution: {integrity: sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.4.4 + '@commitlint/types': 17.4.4 + import-fresh: 3.3.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules/17.4.4: + resolution: {integrity: sha512-0tgvXnHi/mVcyR8Y8mjTFZIa/FEQXA4uEutXS/imH2v1UNkYDSEMsK/68wiXRpfW1euSgEdwRkvE1z23+yhNrQ==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/ensure': 17.4.4 + '@commitlint/message': 17.4.2 + '@commitlint/to-lines': 17.4.0 + '@commitlint/types': 17.4.4 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines/17.4.0: + resolution: {integrity: sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/top-level/17.4.0: + resolution: {integrity: sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==} + engines: {node: '>=v14'} + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types/17.4.4: + resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==} + engines: {node: '>=v14'} + dependencies: + chalk: 4.1.2 + dev: true + + /@cspotcode/source-map-support/0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@css-render/plugin-bem/0.15.12_css-render@0.15.12: + resolution: {integrity: sha512-Lq2jSOZn+wYQtsyaFj6QRz2EzAnd3iW5fZeHO1WSXQdVYwvwGX0ZiH3X2JQgtgYLT1yeGtrwrqJdNdMEUD2xTw==} + peerDependencies: + css-render: ~0.15.12 + dependencies: + css-render: 0.15.12 + dev: false + + /@css-render/vue3-ssr/0.15.12_vue@3.2.47: + resolution: {integrity: sha512-AQLGhhaE0F+rwybRCkKUdzBdTEM/5PZBYy+fSYe1T9z9+yxMuV/k7ZRqa4M69X+EI1W8pa4kc9Iq2VjQkZx4rg==} + peerDependencies: + vue: ^3.0.11 + dependencies: + vue: 3.2.47 + dev: false + + /@emotion/hash/0.8.0: + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + dev: false + + /@esbuild/android-arm/0.16.17: + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.16.17: + resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.16.17: + resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.16.17: + resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.16.17: + resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.16.17: + resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.16.17: + resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.16.17: + resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.16.17: + resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.16.17: + resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.16.17: + resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.16.17: + resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.16.17: + resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.16.17: + resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.16.17: + resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.16.17: + resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.16.17: + resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.16.17: + resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.16.17: + resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.16.17: + resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.16.17: + resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.16.17: + resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils/4.1.2_eslint@8.34.0: + resolution: {integrity: sha512-7qELuQWWjVDdVsFQ5+beUl+KPczrEDA7S3zM4QUd/bJl7oXgsmpXaEVqrRTnOBqenOV4rWf2kVZk2Ot085zPWA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.34.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@eslint/eslintrc/1.4.1: + resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.4.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/config-array/0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer/1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@iconify/types/2.0.0: + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + dev: true + + /@iconify/vue/4.1.0_vue@3.2.47: + resolution: {integrity: sha512-rBQVxNoSDooqgWkQg2MqkIHkH/huNuvXGqui5wijc1zLnU7TKzbBHW9VGmbnV4asNTmIHmqV4Nvt0M2rZ/9nHA==} + peerDependencies: + vue: '>=3' + dependencies: + '@iconify/types': 2.0.0 + vue: 3.2.47 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@juggle/resize-observer/3.4.0: + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + dev: false + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@tsconfig/node10/1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12/1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14/1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16/1.0.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/crypto-js/4.1.1: + resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==} + dev: true + + /@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/json5/0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/katex/0.14.0: + resolution: {integrity: sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==} + dev: false + + /@types/lodash-es/4.17.6: + resolution: {integrity: sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==} + dependencies: + '@types/lodash': 4.14.191 + dev: false + + /@types/lodash/4.14.191: + resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==} + dev: false + + /@types/marked/4.0.8: + resolution: {integrity: sha512-HVNzMT5QlWCOdeuBsgXP8EZzKUf0+AXzN+sLmjvaB3ZlLqO+e4u0uXrdw9ub69wBKFs+c6/pA4r9sy6cCDvImw==} + dev: true + + /@types/mdast/3.0.10: + resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} + dependencies: + '@types/unist': 2.0.6 + dev: true + + /@types/minimist/1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/node/18.14.0: + resolution: {integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==} + dev: true + + /@types/normalize-package-data/2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /@types/semver/7.3.13: + resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + dev: true + + /@types/unist/2.0.6: + resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + dev: true + + /@types/web-bluetooth/0.0.16: + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + + /@typescript-eslint/eslint-plugin/5.52.0_6cfvjsbua5ptj65675bqcn6oza: + resolution: {integrity: sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/scope-manager': 5.52.0 + '@typescript-eslint/type-utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + debug: 4.3.4 + eslint: 8.34.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm: + resolution: {integrity: sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.52.0 + '@typescript-eslint/types': 5.52.0 + '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5 + debug: 4.3.4 + eslint: 8.34.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager/5.52.0: + resolution: {integrity: sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.52.0 + '@typescript-eslint/visitor-keys': 5.52.0 + dev: true + + /@typescript-eslint/type-utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm: + resolution: {integrity: sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5 + '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + debug: 4.3.4 + eslint: 8.34.0 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types/5.52.0: + resolution: {integrity: sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree/5.52.0_typescript@4.9.5: + resolution: {integrity: sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.52.0 + '@typescript-eslint/visitor-keys': 5.52.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm: + resolution: {integrity: sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.52.0 + '@typescript-eslint/types': 5.52.0 + '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5 + eslint: 8.34.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.34.0 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys/5.52.0: + resolution: {integrity: sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.52.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@vitejs/plugin-vue/4.0.0_vite@4.1.2+vue@3.2.47: + resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.2.25 + dependencies: + vite: 4.1.2_lxiyzdpogvsuukhx3wcpsdczbq + vue: 3.2.47 + dev: true + + /@volar/language-core/1.2.0-alpha.16: + resolution: {integrity: sha512-aIktWe9Zg0M+u/RIXHCuL+IoLRHTrpsbTib8olrg4etlurHDXahoVhoEnH9wmlliray0iigIo2z5vwueYInp3g==} + dependencies: + '@volar/source-map': 1.2.0-alpha.16 + dev: true + + /@volar/source-map/1.2.0-alpha.16: + resolution: {integrity: sha512-/AK3VqnFqONd221COI2ZnEvfgBulfoQkjA/ZjPOXpsOkWri99TLcfZY/NTQRytp7Hx6EP/1p1DDeyGuMCUYjgA==} + dependencies: + muggle-string: 0.2.2 + dev: true + + /@volar/typescript/1.2.0-alpha.16: + resolution: {integrity: sha512-ltlTLHIkLxgmTVBZmOnhmnlNzEj2lpvlBmmaV2GWYTrBUMt0z1OgeCq0Utlj9HjjrGPhwWxZNkv86ZABgrMA3Q==} + dependencies: + '@volar/language-core': 1.2.0-alpha.16 + dev: true + + /@volar/vue-language-core/1.1.4: + resolution: {integrity: sha512-2C2CwHvaT5AzNzDbYZQ85lNr4jACZARoZMZBLuU5+JyIwhWeAfxvyAeoE3VbgfgycN5t6X4uBqx/Wzh1QLgD8Q==} + dependencies: + '@volar/language-core': 1.2.0-alpha.16 + '@volar/source-map': 1.2.0-alpha.16 + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-sfc': 3.2.47 + '@vue/reactivity': 3.2.47 + '@vue/shared': 3.2.47 + minimatch: 6.2.0 + muggle-string: 0.2.2 + vue-template-compiler: 2.7.14 + dev: true + + /@volar/vue-typescript/1.1.4: + resolution: {integrity: sha512-x5i5TUUXb1PM0rM80Y8XUeMBUcoS3/TjR3WTxvvEUIol9uEOPp6uxxQQ67uSv7ocN6vB0LugJqS6FA7Z93oL0Q==} + dependencies: + '@volar/typescript': 1.2.0-alpha.16 + '@volar/vue-language-core': 1.1.4 + dev: true + + /@vue/compiler-core/3.2.47: + resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} + dependencies: + '@babel/parser': 7.20.15 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + source-map: 0.6.1 + + /@vue/compiler-dom/3.2.47: + resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} + dependencies: + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + + /@vue/compiler-sfc/3.2.47: + resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} + dependencies: + '@babel/parser': 7.20.15 + '@vue/compiler-core': 3.2.47 + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-ssr': 3.2.47 + '@vue/reactivity-transform': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + postcss: 8.4.21 + source-map: 0.6.1 + + /@vue/compiler-ssr/3.2.47: + resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/shared': 3.2.47 + + /@vue/devtools-api/6.5.0: + resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} + dev: false + + /@vue/reactivity-transform/3.2.47: + resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} + dependencies: + '@babel/parser': 7.20.15 + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + + /@vue/reactivity/3.2.47: + resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==} + dependencies: + '@vue/shared': 3.2.47 + + /@vue/runtime-core/3.2.47: + resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==} + dependencies: + '@vue/reactivity': 3.2.47 + '@vue/shared': 3.2.47 + + /@vue/runtime-dom/3.2.47: + resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==} + dependencies: + '@vue/runtime-core': 3.2.47 + '@vue/shared': 3.2.47 + csstype: 2.6.21 + + /@vue/server-renderer/3.2.47_vue@3.2.47: + resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==} + peerDependencies: + vue: 3.2.47 + dependencies: + '@vue/compiler-ssr': 3.2.47 + '@vue/shared': 3.2.47 + vue: 3.2.47 + + /@vue/shared/3.2.47: + resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} + + /@vueuse/core/9.13.0_vue@3.2.47: + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0_vue@3.2.47 + vue-demi: 0.13.11_vue@3.2.47 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/metadata/9.13.0: + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + dev: false + + /@vueuse/shared/9.13.0_vue@3.2.47: + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + dependencies: + vue-demi: 0.13.11_vue@3.2.47 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /JSONStream/1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /acorn-jsx/5.3.2_acorn@8.8.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.2 + dev: true + + /acorn-node/1.8.2: + resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + xtend: 4.0.2 + dev: true + + /acorn-walk/7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn/8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /aggregate-error/3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv/8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-escapes/4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex/6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles/6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /arg/5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-ify/1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + + /array-includes/3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + get-intrinsic: 1.2.0 + is-string: 1.0.7 + dev: true + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.flat/1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flatmap/1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + es-shim-unscopables: 1.0.0 + dev: true + + /arrify/1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /astral-regex/2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /async-validator/4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + dev: false + + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /autoprefixer/10.4.13_postcss@8.4.21: + resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.5 + caniuse-lite: 1.0.30001452 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /available-typed-arrays/1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /axios/1.3.3: + resolution: {integrity: sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /boolbase/1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist/4.21.5: + resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001452 + electron-to-chromium: 1.4.296 + node-releases: 2.0.10 + update-browserslist-db: 1.0.10_browserslist@4.21.5 + dev: true + + /builtin-modules/3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /builtins/5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.3.8 + dev: true + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.0 + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-css/2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /camelcase-keys/6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase/5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /caniuse-lite/1.0.30001452: + resolution: {integrity: sha512-Lkp0vFjMkBB3GTpLR8zk4NwW5EdRdnitwYJHDOOKIU85x4ckYCPQ+9WlVvSVClHxVReefkUMtWZH2l9KGlD51w==} + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /character-entities-legacy/1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + dev: true + + /character-entities/1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + dev: true + + /character-reference-invalid/1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /ci-info/3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: true + + /clean-regexp/1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /clean-stack/2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-cursor/3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-truncate/2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: true + + /cli-truncate/3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /cliui/8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /colorette/2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + dev: true + + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commander/9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: true + + /compare-func/2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /conventional-changelog-angular/5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-conventionalcommits/5.0.0: + resolution: {integrity: sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + dev: true + + /conventional-commits-parser/3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /copy-anything/2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + dependencies: + is-what: 3.14.1 + dev: true + + /cosmiconfig-typescript-loader/4.3.0_ipkhww4xc5z2tt2x53vp2mt2be: + resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=7' + ts-node: '>=10' + typescript: '>=3' + dependencies: + '@types/node': 18.14.0 + cosmiconfig: 8.0.0 + ts-node: 10.9.1_tncu2ai53lzgmizdedur7lbibe + typescript: 4.9.5 + dev: true + + /cosmiconfig/8.0.0: + resolution: {integrity: sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-spawn/6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.1 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypto-js/4.1.1: + resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} + dev: true + + /css-render/0.15.12: + resolution: {integrity: sha512-eWzS66patiGkTTik+ipO9qNGZ+uNuGyTmnz6/+EJIiFg8+3yZRpnMwgFo8YdXhQRsiePzehnusrxVvugNjXzbw==} + dependencies: + '@emotion/hash': 0.8.0 + csstype: 3.0.11 + dev: false + + /cssesc/3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /csstype/2.6.21: + resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} + + /csstype/3.0.11: + resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} + dev: false + + /dargs/7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + + /date-fns-tz/1.3.8_date-fns@2.29.3: + resolution: {integrity: sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==} + peerDependencies: + date-fns: '>=2.0.0' + dependencies: + date-fns: 2.29.3 + dev: false + + /date-fns/2.29.3: + resolution: {integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==} + engines: {node: '>=0.11'} + dev: false + + /de-indent/1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + dev: true + + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decamelize-keys/1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize/1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /define-properties/1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /defined/1.0.1: + resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + dev: true + + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + + /detective/5.2.1: + resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} + engines: {node: '>=0.8.0'} + hasBin: true + dependencies: + acorn-node: 1.8.2 + defined: 1.0.1 + minimist: 1.2.8 + dev: true + + /didyoumean/1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /dlv/1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + + /doctrine/2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-serializer/2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.4.0 + dev: true + + /domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler/5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils/3.0.1: + resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + + /dot-prop/5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + + /eastasianwidth/0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /electron-to-chromium/1.4.296: + resolution: {integrity: sha512-i/6Q+Y9bluDa2a0NbMvdtG5TuS/1Fr3TKK8L+7UUL9QjRS5iFJzCC3r70xjyOnLiYG8qGV4/mMpe6HuAbdJW4w==} + dev: true + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex/9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /entities/4.4.0: + resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} + engines: {node: '>=0.12'} + dev: true + + /errno/0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + requiresBuild: true + dependencies: + prr: 1.0.1 + dev: true + optional: true + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract/1.21.1: + resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.0 + 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.1 + 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.10 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + safe-regex-test: 1.0.0 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.9 + dev: true + + /es-set-tostringtag/2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + + /es-shim-unscopables/1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild/0.16.17: + resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.16.17 + '@esbuild/android-arm64': 0.16.17 + '@esbuild/android-x64': 0.16.17 + '@esbuild/darwin-arm64': 0.16.17 + '@esbuild/darwin-x64': 0.16.17 + '@esbuild/freebsd-arm64': 0.16.17 + '@esbuild/freebsd-x64': 0.16.17 + '@esbuild/linux-arm': 0.16.17 + '@esbuild/linux-arm64': 0.16.17 + '@esbuild/linux-ia32': 0.16.17 + '@esbuild/linux-loong64': 0.16.17 + '@esbuild/linux-mips64el': 0.16.17 + '@esbuild/linux-ppc64': 0.16.17 + '@esbuild/linux-riscv64': 0.16.17 + '@esbuild/linux-s390x': 0.16.17 + '@esbuild/linux-x64': 0.16.17 + '@esbuild/netbsd-x64': 0.16.17 + '@esbuild/openbsd-x64': 0.16.17 + '@esbuild/sunos-x64': 0.16.17 + '@esbuild/win32-arm64': 0.16.17 + '@esbuild/win32-ia32': 0.16.17 + '@esbuild/win32-x64': 0.16.17 + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-import-resolver-node/0.3.7: + resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + dependencies: + debug: 3.2.7 + is-core-module: 2.11.0 + resolve: 1.22.1 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils/2.7.4_npjqex3ey3rgd34fjcuucz7la4: + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + debug: 3.2.7 + eslint: 8.34.0 + eslint-import-resolver-node: 0.3.7 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-antfu/0.35.2_7kw3g6rralp5ps6mg3uyzz6azm: + resolution: {integrity: sha512-Q6FOcOakafU49PDRlq7jkrWmlTJ4u3AW7aGX+FqeQNaMgjXq0RzPGvS0Vyp7q/XDRLLoe0BjbGkamTeZXg8waw==} + dependencies: + '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + transitivePeerDependencies: + - eslint + - supports-color + - typescript + dev: true + + /eslint-plugin-es/4.1.0_eslint@8.34.0: + resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + eslint: 8.34.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + dev: true + + /eslint-plugin-eslint-comments/3.2.0_eslint@8.34.0: + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + escape-string-regexp: 1.0.5 + eslint: 8.34.0 + ignore: 5.2.4 + dev: true + + /eslint-plugin-html/7.1.0: + resolution: {integrity: sha512-fNLRraV/e6j8e3XYOC9xgND4j+U7b1Rq+OygMlLcMg+wI/IpVbF+ubQa3R78EjKB9njT6TQOlcK5rFKBVVtdfg==} + dependencies: + htmlparser2: 8.0.1 + dev: true + + /eslint-plugin-import/2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4: + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.34.0 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.7.4_npjqex3ey3rgd34fjcuucz7la4 + has: 1.0.3 + is-core-module: 2.11.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.1 + semver: 6.3.0 + tsconfig-paths: 3.14.1 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jest/27.2.1_7hfwvekd5cgjoxqyvesymwuacm: + resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza + '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + eslint: 8.34.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-jsonc/2.6.0_eslint@8.34.0: + resolution: {integrity: sha512-4bA9YTx58QaWalua1Q1b82zt7eZMB7i+ed8q8cKkbKP75ofOA2SXbtFyCSok7RY6jIXeCqQnKjN9If8zCgv6PA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + eslint: 8.34.0 + eslint-utils: 3.0.0_eslint@8.34.0 + jsonc-eslint-parser: 2.1.0 + natural-compare: 1.4.0 + dev: true + + /eslint-plugin-markdown/3.0.0_eslint@8.34.0: + resolution: {integrity: sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.34.0 + mdast-util-from-markdown: 0.8.5 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-n/15.6.1_eslint@8.34.0: + resolution: {integrity: sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==} + engines: {node: '>=12.22.0'} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + builtins: 5.0.1 + eslint: 8.34.0 + eslint-plugin-es: 4.1.0_eslint@8.34.0 + eslint-utils: 3.0.0_eslint@8.34.0 + ignore: 5.2.4 + is-core-module: 2.11.0 + minimatch: 3.1.2 + resolve: 1.22.1 + semver: 7.3.8 + dev: true + + /eslint-plugin-no-only-tests/3.1.0: + resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} + engines: {node: '>=5.0.0'} + dev: true + + /eslint-plugin-promise/6.1.1_eslint@8.34.0: + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.34.0 + dev: true + + /eslint-plugin-unicorn/45.0.2_eslint@8.34.0: + resolution: {integrity: sha512-Y0WUDXRyGDMcKLiwgL3zSMpHrXI00xmdyixEGIg90gHnj0PcHY4moNv3Ppje/kDivdAy5vUeUr7z211ImPv2gw==} + engines: {node: '>=14.18'} + peerDependencies: + eslint: '>=8.28.0' + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + '@eslint-community/eslint-utils': 4.1.2_eslint@8.34.0 + ci-info: 3.8.0 + clean-regexp: 1.0.0 + eslint: 8.34.0 + esquery: 1.4.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.0.2 + lodash: 4.17.21 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.24 + regjsparser: 0.9.1 + safe-regex: 2.1.1 + semver: 7.3.8 + strip-indent: 3.0.0 + dev: true + + /eslint-plugin-unused-imports/2.0.0_vqeavzxdzk2atb75l6fx3anzpi: + resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 + eslint: ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza + eslint: 8.34.0 + eslint-rule-composer: 0.3.0 + dev: true + + /eslint-plugin-vue/9.9.0_eslint@8.34.0: + resolution: {integrity: sha512-YbubS7eK0J7DCf0U2LxvVP7LMfs6rC6UltihIgval3azO3gyDwEGVgsCMe1TmDiEkl6GdMKfRpaME6QxIYtzDQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.34.0 + eslint-utils: 3.0.0_eslint@8.34.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.0.11 + semver: 7.3.8 + vue-eslint-parser: 9.1.0_eslint@8.34.0 + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-yml/1.5.0_eslint@8.34.0: + resolution: {integrity: sha512-iygN054g+ZrnYmtOXMnT+sx9iDNXt89/m0+506cQHeG0+5jJN8hY5iOPQLd3yfd50AfK/mSasajBWruf1SoHpQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: 4.3.4 + eslint: 8.34.0 + lodash: 4.17.21 + natural-compare: 1.4.0 + yaml-eslint-parser: 1.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-rule-composer/0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + dev: true + + /eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope/7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils/2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-utils/3.0.0_eslint@8.34.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.34.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys/1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys/3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint/8.34.0: + resolution: {integrity: sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.4.1 + '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0_eslint@8.34.0 + eslint-visitor-keys: 3.3.0 + espree: 9.4.1 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.3.0 + 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.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree/9.4.1: + resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.2 + acorn-jsx: 5.3.2_acorn@8.8.2 + eslint-visitor-keys: 3.3.0 + dev: true + + /esquery/1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker/2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /evtd/0.2.4: + resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==} + dev: false + + /execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa/6.1.0: + resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 3.0.1 + 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 + dev: true + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq/1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache/3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flatted/3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /follow-redirects/1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + + /for-each/0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /form-data/4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /fraction.js/4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + dev: true + + /fs-extra/11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /function.prototype.name/1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names/1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic/1.2.0: + resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + dev: true + + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + dev: true + + /git-raw-commits/2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-dirs/0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: true + + /globals/13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis/1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + dev: true + + /globby/11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /gopd/1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.0 + dev: true + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /grapheme-splitter/1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /hard-rejection/2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-bigints/1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors/1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.0 + dev: true + + /has-proto/1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /he/1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /highlight.js/11.7.0: + resolution: {integrity: sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==} + engines: {node: '>=12.0.0'} + dev: false + + /hosted-git-info/2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info/4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /htmlparser2/8.0.1: + resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.0.1 + entities: 4.4.0 + dev: true + + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals/3.0.1: + resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} + engines: {node: '>=12.20.0'} + dev: true + + /husky/8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + optional: true + + /ignore/5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /image-size/0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string/4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /internal-slot/1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /is-alphabetical/1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + dev: true + + /is-alphanumerical/1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + dev: true + + /is-array-buffer/3.0.1: + resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-typed-array: 1.1.10 + dev: true + + /is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-builtin-module/3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + + /is-callable/1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + dev: true + + /is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-decimal/1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-fullwidth-code-point/4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-hexadecimal/1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + dev: true + + /is-negative-zero/2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object/1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-obj/2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-path-inside/3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj/1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-shared-array-buffer/1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream/3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-text-path/1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: true + + /is-typed-array/1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + engines: {node: '>= 0.4'} + 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 + dev: true + + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-what/3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /js-sdsl/4.3.0: + resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} + dev: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc/0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc/3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /json-parse-better-errors/1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse/1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5/1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /jsonc-eslint-parser/2.1.0: + resolution: {integrity: sha512-qCRJWlbP2v6HbmKW7R3lFbeiVWHo+oMJ0j+MizwvauqnCV/EvtAeEeuCgoc/ErtsuoKgYB8U4Ih8AxJbXoE6/g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.2 + eslint-visitor-keys: 3.3.0 + espree: 9.4.1 + semver: 7.3.8 + dev: true + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.10 + dev: true + + /jsonparse/1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + + /kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /less/4.1.3: + resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.5.0 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.10 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /levn/0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lilconfig/2.0.6: + resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lint-staged/13.1.2: + resolution: {integrity: sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + cli-truncate: 3.1.0 + colorette: 2.0.19 + commander: 9.5.0 + debug: 4.3.4 + execa: 6.1.0 + lilconfig: 2.0.6 + listr2: 5.0.7 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-inspect: 1.12.3 + pidtree: 0.6.0 + string-argv: 0.3.1 + yaml: 2.2.1 + transitivePeerDependencies: + - enquirer + - supports-color + dev: true + + /listr2/5.0.7: + resolution: {integrity: sha512-MD+qXHPmtivrHIDRwPYdfNkrzqDiuaKU/rfBcec3WMyMF3xylQj3jMq344OtvQxz7zaCFViRAeqlr2AFhPvXHw==} + engines: {node: ^14.13.1 || >=16.0.0} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.19 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.0 + rxjs: 7.8.0 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /load-json-file/4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.10 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /local-pkg/0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash-es/4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false + + /lodash.camelcase/4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + + /lodash.isfunction/3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + dev: true + + /lodash.isplainobject/4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.kebabcase/4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.mergewith/4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true + + /lodash.snakecase/4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true + + /lodash.startcase/4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash.uniq/4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash.upperfirst/4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-update/4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + dev: true + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string/0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + + /make-dir/2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + pify: 4.0.1 + semver: 5.7.1 + dev: true + optional: true + + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /map-obj/1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj/4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /marked/4.2.12: + resolution: {integrity: sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==} + engines: {node: '>= 12'} + hasBin: true + dev: false + + /mdast-util-from-markdown/0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-to-string: 2.0.0 + micromark: 2.11.4 + parse-entities: 2.0.0 + unist-util-stringify-position: 2.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-to-string/2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + dev: true + + /memorystream/0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + dev: true + + /meow/8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromark/2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + dependencies: + debug: 4.3.4 + parse-entities: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn/4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch/6.2.0: + resolution: {integrity: sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist-options/4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist/1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /muggle-string/0.2.2: + resolution: {integrity: sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==} + dev: true + + /naive-ui/2.34.3_vue@3.2.47: + resolution: {integrity: sha512-fUMr0dzb/iGsOTWgoblPVobY5X5dihQ1eam5dA+H74oyLYAvgX4pL96xQFPBLIYqvyRFBAsN85kHN5pLqdtpxA==} + peerDependencies: + vue: ^3.0.0 + dependencies: + '@css-render/plugin-bem': 0.15.12_css-render@0.15.12 + '@css-render/vue3-ssr': 0.15.12_vue@3.2.47 + '@types/katex': 0.14.0 + '@types/lodash': 4.14.191 + '@types/lodash-es': 4.17.6 + async-validator: 4.2.5 + css-render: 0.15.12 + date-fns: 2.29.3 + date-fns-tz: 1.3.8_date-fns@2.29.3 + evtd: 0.2.4 + highlight.js: 11.7.0 + lodash: 4.17.21 + lodash-es: 4.17.21 + seemly: 0.3.6 + treemate: 0.3.11 + vdirs: 0.1.8_vue@3.2.47 + vooks: 0.2.12_vue@3.2.47 + vue: 3.2.47 + vueuc: 0.4.51_vue@3.2.47 + dev: false + + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /natural-compare-lite/1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare/1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /needle/3.2.0: + resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + requiresBuild: true + dependencies: + debug: 3.2.7 + iconv-lite: 0.6.3 + sax: 1.2.4 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + + /nice-try/1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true + + /node-releases/2.0.10: + resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} + dev: true + + /normalize-package-data/2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.1 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data/3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.11.0 + semver: 7.3.8 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range/0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-all/4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.5 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.0 + string.prototype.padend: 3.1.4 + dev: true + + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path/5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /nth-check/2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /object-hash/3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true + + /object-inspect/1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: true + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign/4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.values/1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + dev: true + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime/6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /optionator/0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + + /p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map/4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-entities/2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + dev: true + + /parse-json/4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.18.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-node-version/1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + dev: true + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key/2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key/4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type/3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pidtree/0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pidtree/0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify/2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pify/3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /pify/4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + optional: true + + /pinia/2.0.30_hmuptsblhheur2tugfgucj7gc4: + resolution: {integrity: sha512-q6DUmxWwe/mQgg+55QQjykpKC+aGeGdaJV3niminl19V08dE+LRTvSEuqi6/NLSGCKHI49KGL6tMNEOssFiMyA==} + peerDependencies: + '@vue/composition-api': ^1.4.0 + typescript: '>=4.4.4' + vue: ^2.6.14 || ^3.2.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + typescript: + optional: true + dependencies: + '@vue/devtools-api': 6.5.0 + typescript: 4.9.5 + vue: 3.2.47 + vue-demi: 0.13.11_vue@3.2.47 + dev: false + + /pluralize/8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + + /postcss-import/14.1.0_postcss@8.4.21: + resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.1 + dev: true + + /postcss-js/4.0.1_postcss@8.4.21: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.21 + dev: true + + /postcss-load-config/3.1.4_postcss@8.4.21: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.0.6 + postcss: 8.4.21 + yaml: 1.10.2 + dev: true + + /postcss-nested/6.0.0_postcss@8.4.21: + resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /postcss-selector-parser/6.0.11: + resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser/4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss/8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /proxy-from-env/1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + + /prr/1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + dev: true + optional: true + + /punycode/2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + + /q/1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru/4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /quick-lru/5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /read-cache/1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /read-pkg-up/7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg/3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg/5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readable-stream/3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /redent/3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /regexp-tree/0.1.24: + resolution: {integrity: sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==} + hasBin: true + dev: true + + /regexp.prototype.flags/1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: true + + /regexpp/3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /regjsparser/0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string/2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-global/1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: true + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor/3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rfdc/1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: true + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf/4.1.2: + resolution: {integrity: sha512-BlIbgFryTbw3Dz6hyoWFhKk+unCcHMSkZGrTFVAx2WmttdBSonsdtRlwiuTbDqTKr+UlXIUqJVS4QT5tUzGENQ==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /rollup/3.15.0: + resolution: {integrity: sha512-F9hrCAhnp5/zx/7HYmftvsNBkMfLfk/dXUh73hPSM2E3CRgap65orDNJbLetoiUFwSAk6iHPLvBrZ5iHYvzqsg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs/7.8.0: + resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} + dependencies: + tslib: 2.5.0 + dev: true + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-regex-test/1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-regex: 1.1.4 + dev: true + + /safe-regex/2.1.1: + resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + dependencies: + regexp-tree: 0.1.24 + dev: true + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + optional: true + + /sax/1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: true + optional: true + + /seemly/0.3.6: + resolution: {integrity: sha512-lEV5VB8BUKTo/AfktXJcy+JeXns26ylbMkIUco8CYREsQijuz4mrXres2Q+vMLdwkuLxJdIPQ8IlCIxLYm71Yw==} + dev: false + + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver/7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /shebang-command/1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-quote/1.8.0: + resolution: {integrity: sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==} + dev: true + + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + object-inspect: 1.12.3 + dev: true + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi/3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi/4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi/5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + /spdx-correct/3.1.1: + resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.12 + dev: true + + /spdx-exceptions/2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse/3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.12 + dev: true + + /spdx-license-ids/3.0.12: + resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} + dev: true + + /split2/3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.0 + dev: true + + /string-argv/0.3.1: + resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} + engines: {node: '>=0.6.19'} + dev: true + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width/5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.0.1 + dev: true + + /string.prototype.padend/3.1.4: + resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + dev: true + + /string.prototype.trimend/1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + dev: true + + /string.prototype.trimstart/1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + dev: true + + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi/7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline/3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /tailwindcss/3.2.7_postcss@8.4.21: + resolution: {integrity: sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==} + engines: {node: '>=12.13.0'} + hasBin: true + peerDependencies: + postcss: ^8.0.9 + dependencies: + arg: 5.0.2 + chokidar: 3.5.3 + color-name: 1.1.4 + detective: 5.2.1 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.2.12 + glob-parent: 6.0.2 + is-glob: 4.0.3 + lilconfig: 2.0.6 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.21 + postcss-import: 14.1.0_postcss@8.4.21 + postcss-js: 4.0.1_postcss@8.4.21 + postcss-load-config: 3.1.4_postcss@8.4.21 + postcss-nested: 6.0.0_postcss@8.4.21 + postcss-selector-parser: 6.0.11 + postcss-value-parser: 4.2.0 + quick-lru: 5.1.1 + resolve: 1.22.1 + transitivePeerDependencies: + - ts-node + dev: true + + /text-extensions/1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: true + + /text-table/0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /through/2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /through2/4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.0 + dev: true + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /treemate/0.3.11: + resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} + dev: false + + /trim-newlines/3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /ts-node/10.9.1_tncu2ai53lzgmizdedur7lbibe: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 18.14.0 + acorn: 8.8.2 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfig-paths/3.14.1: + resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib/2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: true + + /tsutils/3.21.0_typescript@4.9.5: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.9.5 + dev: true + + /type-check/0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest/0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest/0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest/0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest/0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest/0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /typed-array-length/1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.10 + dev: true + + /typescript/4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + /unbox-primitive/1.0.2: + resolution: {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 + dev: true + + /unist-util-stringify-position/2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + dependencies: + '@types/unist': 2.0.6 + dev: true + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /update-browserslist-db/1.0.10_browserslist@4.21.5: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.5 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: true + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /validate-npm-package-license/3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.1.1 + spdx-expression-parse: 3.0.1 + dev: true + + /vdirs/0.1.8_vue@3.2.47: + resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==} + peerDependencies: + vue: ^3.0.11 + dependencies: + evtd: 0.2.4 + vue: 3.2.47 + dev: false + + /vite/4.1.2_lxiyzdpogvsuukhx3wcpsdczbq: + resolution: {integrity: sha512-MWDb9Rfy3DI8omDQySbMK93nQqStwbsQWejXRY2EBzEWKmLAXWb1mkI9Yw2IJrc+oCvPCI1Os5xSSIBYY6DEAw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.14.0 + esbuild: 0.16.17 + less: 4.1.3 + postcss: 8.4.21 + resolve: 1.22.1 + rollup: 3.15.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vooks/0.2.12_vue@3.2.47: + resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==} + peerDependencies: + vue: ^3.0.0 + dependencies: + evtd: 0.2.4 + vue: 3.2.47 + dev: false + + /vue-demi/0.13.11_vue@3.2.47: + resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.2.47 + dev: false + + /vue-eslint-parser/9.1.0_eslint@8.34.0: + resolution: {integrity: sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: 4.3.4 + eslint: 8.34.0 + eslint-scope: 7.1.1 + eslint-visitor-keys: 3.3.0 + espree: 9.4.1 + esquery: 1.4.0 + lodash: 4.17.21 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + dev: true + + /vue-router/4.1.6_vue@3.2.47: + resolution: {integrity: sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==} + peerDependencies: + vue: ^3.2.0 + dependencies: + '@vue/devtools-api': 6.5.0 + vue: 3.2.47 + dev: false + + /vue-template-compiler/2.7.14: + resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + dev: true + + /vue-tsc/1.1.4_typescript@4.9.5: + resolution: {integrity: sha512-CMG8KZsBBPyulYie05XxJCfq/yAPiB/uMMeHmog09aLm2Kml82C6tUSRgQz8ujM4JoCrpDqVCd9G0NuM9aLt1g==} + hasBin: true + peerDependencies: + typescript: '*' + dependencies: + '@volar/vue-language-core': 1.1.4 + '@volar/vue-typescript': 1.1.4 + typescript: 4.9.5 + dev: true + + /vue/3.2.47: + resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-sfc': 3.2.47 + '@vue/runtime-dom': 3.2.47 + '@vue/server-renderer': 3.2.47_vue@3.2.47 + '@vue/shared': 3.2.47 + + /vueuc/0.4.51_vue@3.2.47: + resolution: {integrity: sha512-pLiMChM4f+W8czlIClGvGBYo656lc2Y0/mXFSCydcSmnCR1izlKPGMgiYBGjbY9FDkFG8a2HEVz7t0DNzBWbDw==} + peerDependencies: + vue: ^3.0.11 + dependencies: + '@css-render/vue3-ssr': 0.15.12_vue@3.2.47 + '@juggle/resize-observer': 3.4.0 + css-render: 0.15.12 + evtd: 0.2.4 + seemly: 0.3.6 + vdirs: 0.1.8_vue@3.2.47 + vooks: 0.2.12_vue@3.2.47 + vue: 3.2.47 + dev: false + + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-typed-array/1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + engines: {node: '>= 0.4'} + 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 + is-typed-array: 1.1.10 + dev: true + + /which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + + /wrap-ansi/6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /xml-name-validator/4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true + + /xtend/4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml-eslint-parser/1.1.0: + resolution: {integrity: sha512-b464Q1fYiX1oYx2kE8k4mEp6S9Prk+tfDsY/IPxQ0FCjEuj3AKko5Skf3/yQJeYTTDyjDE+aWIJemnv29HvEWQ==} + engines: {node: ^14.17.0 || >=16.0.0} + dependencies: + eslint-visitor-keys: 3.3.0 + lodash: 4.17.21 + yaml: 2.2.1 + dev: true + + /yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yaml/2.2.1: + resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} + engines: {node: '>= 14'} + dev: true + + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser/21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs/17.6.2: + resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/src/yunzai-web-fe/postcss.config.js b/src/yunzai-web-fe/postcss.config.js new file mode 100644 index 0000000000000000000000000000000000000000..33ad091d26d8a9dc95ebdf616e217d985ec215b8 --- /dev/null +++ b/src/yunzai-web-fe/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/src/yunzai-web-fe/public/favicon.jpg b/src/yunzai-web-fe/public/favicon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7f09604e7684d43a035d77859555525e6f6b41ce Binary files /dev/null and b/src/yunzai-web-fe/public/favicon.jpg differ diff --git a/src/yunzai-web-fe/service/.eslintrc.json b/src/yunzai-web-fe/service/.eslintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..afba5df65a2174ed998f4adcb59fe3e92f88aabe --- /dev/null +++ b/src/yunzai-web-fe/service/.eslintrc.json @@ -0,0 +1,5 @@ +{ + "root": true, + "ignorePatterns": ["build"], + "extends": ["@antfu"] +} diff --git a/src/yunzai-web-fe/service/.gitignore b/src/yunzai-web-fe/service/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..c1125f113c3604e8441a9915917c3e5679cbc6ed --- /dev/null +++ b/src/yunzai-web-fe/service/.gitignore @@ -0,0 +1,31 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/settings.json +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +build diff --git a/src/yunzai-web-fe/service/.npmrc b/src/yunzai-web-fe/service/.npmrc new file mode 100644 index 0000000000000000000000000000000000000000..6c59086d862516d2fffa5da2035e5003100fb5c7 --- /dev/null +++ b/src/yunzai-web-fe/service/.npmrc @@ -0,0 +1 @@ +enable-pre-post-scripts=true diff --git a/src/yunzai-web-fe/service/.vscode/extensions.json b/src/yunzai-web-fe/service/.vscode/extensions.json new file mode 100644 index 0000000000000000000000000000000000000000..940260d85687fb0e7ef60401e703c86f1e8f2943 --- /dev/null +++ b/src/yunzai-web-fe/service/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["dbaeumer.vscode-eslint"] +} diff --git a/src/yunzai-web-fe/service/.vscode/settings.json b/src/yunzai-web-fe/service/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..b84cbc50025a59a5eb04739b75eba3e0a6b3e7f6 --- /dev/null +++ b/src/yunzai-web-fe/service/.vscode/settings.json @@ -0,0 +1,22 @@ +{ + "prettier.enable": false, + "editor.formatOnSave": false, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "eslint.validate": [ + "javascript", + "typescript", + "json", + "jsonc", + "json5", + "yaml" + ], + "cSpell.words": [ + "antfu", + "chatgpt", + "esno", + "GPTAPI", + "OPENAI" + ] +} diff --git a/src/yunzai-web-fe/service/package.json b/src/yunzai-web-fe/service/package.json new file mode 100644 index 0000000000000000000000000000000000000000..fa99f9c777eab360d41e47e582130d51e5be13f5 --- /dev/null +++ b/src/yunzai-web-fe/service/package.json @@ -0,0 +1,44 @@ +{ + "name": "chatgpt-web-service", + "version": "1.0.0", + "private": false, + "description": "ChatGPT Web Service", + "author": "ChenZhaoYu ", + "keywords": [ + "chatgpt-web", + "chatgpt", + "chatbot", + "express" + ], + "engines": { + "node": "^16 || ^18" + }, + "scripts": { + "start": "esno ./src/index.ts", + "dev": "esno watch ./src/index.ts", + "prod": "esno ./build/index.js", + "build": "pnpm clean && tsup", + "clean": "rimraf build", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "common:cleanup": "rimraf node_modules && rimraf pnpm-lock.yaml" + }, + "dependencies": { + "chatgpt": "^4.7.2", + "dotenv": "^16.0.3", + "esno": "^0.16.3", + "express": "^4.18.2", + "isomorphic-fetch": "^3.0.0", + "node-fetch": "^3.3.0", + "socks-proxy-agent": "^7.0.0" + }, + "devDependencies": { + "@antfu/eslint-config": "^0.35.2", + "@types/express": "^4.17.17", + "@types/node": "^18.14.0", + "eslint": "^8.34.0", + "rimraf": "^4.1.2", + "tsup": "^6.6.3", + "typescript": "^4.9.5" + } +} diff --git a/src/yunzai-web-fe/service/pnpm-lock.yaml b/src/yunzai-web-fe/service/pnpm-lock.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fffe85e4fb9bb649e316f21c6ecdabc6e1388c08 --- /dev/null +++ b/src/yunzai-web-fe/service/pnpm-lock.yaml @@ -0,0 +1,3626 @@ +lockfileVersion: 5.4 + +specifiers: + '@antfu/eslint-config': ^0.35.2 + '@types/express': ^4.17.17 + '@types/node': ^18.14.0 + chatgpt: ^4.7.2 + dotenv: ^16.0.3 + eslint: ^8.34.0 + esno: ^0.16.3 + express: ^4.18.2 + isomorphic-fetch: ^3.0.0 + node-fetch: ^3.3.0 + rimraf: ^4.1.2 + socks-proxy-agent: ^7.0.0 + tsup: ^6.6.3 + typescript: ^4.9.5 + +dependencies: + chatgpt: 4.7.2 + dotenv: 16.0.3 + esno: 0.16.3 + express: 4.18.2 + isomorphic-fetch: 3.0.0 + node-fetch: 3.3.0 + socks-proxy-agent: 7.0.0 + +devDependencies: + '@antfu/eslint-config': 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm + '@types/express': 4.17.17 + '@types/node': 18.14.0 + eslint: 8.34.0 + rimraf: 4.1.2 + tsup: 6.6.3_typescript@4.9.5 + typescript: 4.9.5 + +packages: + + /@antfu/eslint-config-basic/0.35.2_khyrr7my4aaa3ssgqabkfgcc24: + resolution: {integrity: sha512-2k7Ovkd8U/q0sgfjuT9KzAUV0q187yGxP7JzD2D4YifuJwL5Bh3JC49KpCv9PXMTeRUMJX2y/kOtGYPetocOug==} + peerDependencies: + eslint: '>=7.4.0' + dependencies: + eslint: 8.34.0 + eslint-plugin-antfu: 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm + eslint-plugin-eslint-comments: 3.2.0_eslint@8.34.0 + eslint-plugin-html: 7.1.0 + eslint-plugin-import: 2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4 + eslint-plugin-jsonc: 2.6.0_eslint@8.34.0 + eslint-plugin-markdown: 3.0.0_eslint@8.34.0 + eslint-plugin-n: 15.6.1_eslint@8.34.0 + eslint-plugin-no-only-tests: 3.1.0 + eslint-plugin-promise: 6.1.1_eslint@8.34.0 + eslint-plugin-unicorn: 45.0.2_eslint@8.34.0 + eslint-plugin-unused-imports: 2.0.0_vqeavzxdzk2atb75l6fx3anzpi + eslint-plugin-yml: 1.5.0_eslint@8.34.0 + jsonc-eslint-parser: 2.1.0 + yaml-eslint-parser: 1.1.0 + transitivePeerDependencies: + - '@typescript-eslint/eslint-plugin' + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + - typescript + dev: true + + /@antfu/eslint-config-ts/0.35.2_7kw3g6rralp5ps6mg3uyzz6azm: + resolution: {integrity: sha512-GiJtTCQ83L/vMkJlWWg2l0buH/LIOXl5szrsqtr8/Hl6ssjAMXnug8sDZMCqCIZtztzQCewBPx8ufp/MpzA2cQ==} + peerDependencies: + eslint: '>=7.4.0' + typescript: '>=3.9' + dependencies: + '@antfu/eslint-config-basic': 0.35.2_khyrr7my4aaa3ssgqabkfgcc24 + '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza + '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + eslint: 8.34.0 + eslint-plugin-jest: 27.2.1_7hfwvekd5cgjoxqyvesymwuacm + typescript: 4.9.5 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + dev: true + + /@antfu/eslint-config-vue/0.35.2_khyrr7my4aaa3ssgqabkfgcc24: + resolution: {integrity: sha512-98k9D+n0bgr/9OqedAEOsflIWbXz4D92pejXqkUAtnRnB2Nq5dWrrFMJ59oJwTDKnEslpwANlgIXM11qdiTF0Q==} + peerDependencies: + eslint: '>=7.4.0' + dependencies: + '@antfu/eslint-config-basic': 0.35.2_khyrr7my4aaa3ssgqabkfgcc24 + '@antfu/eslint-config-ts': 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm + eslint: 8.34.0 + eslint-plugin-vue: 9.9.0_eslint@8.34.0 + local-pkg: 0.4.3 + transitivePeerDependencies: + - '@typescript-eslint/eslint-plugin' + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + - typescript + dev: true + + /@antfu/eslint-config/0.35.2_7kw3g6rralp5ps6mg3uyzz6azm: + resolution: {integrity: sha512-bbm7Yh7VgNI9ZaYs/L1oSTQwPMIdvlRtqxPfaBLpYdEvnsOuT4yX84TO0YaZ4RFjE4jqxQCSE/eioxydmWnl4w==} + peerDependencies: + eslint: '>=7.4.0' + dependencies: + '@antfu/eslint-config-vue': 0.35.2_khyrr7my4aaa3ssgqabkfgcc24 + '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza + '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + eslint: 8.34.0 + eslint-plugin-eslint-comments: 3.2.0_eslint@8.34.0 + eslint-plugin-html: 7.1.0 + eslint-plugin-import: 2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4 + eslint-plugin-jsonc: 2.6.0_eslint@8.34.0 + eslint-plugin-n: 15.6.1_eslint@8.34.0 + eslint-plugin-promise: 6.1.1_eslint@8.34.0 + eslint-plugin-unicorn: 45.0.2_eslint@8.34.0 + eslint-plugin-vue: 9.9.0_eslint@8.34.0 + eslint-plugin-yml: 1.5.0_eslint@8.34.0 + jsonc-eslint-parser: 2.1.0 + yaml-eslint-parser: 1.1.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + - typescript + dev: true + + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@esbuild-kit/cjs-loader/2.4.2: + resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} + dependencies: + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.4.0 + dev: false + + /@esbuild-kit/core-utils/3.1.0: + resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} + dependencies: + esbuild: 0.17.8 + source-map-support: 0.5.21 + dev: false + + /@esbuild-kit/esm-loader/2.5.5: + resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} + dependencies: + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.4.0 + dev: false + + /@esbuild/android-arm/0.17.8: + resolution: {integrity: sha512-0/rb91GYKhrtbeglJXOhAv9RuYimgI8h623TplY2X+vA4EXnk3Zj1fXZreJ0J3OJJu1bwmb0W7g+2cT/d8/l/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm64/0.17.8: + resolution: {integrity: sha512-oa/N5j6v1svZQs7EIRPqR8f+Bf8g6HBDjD/xHC02radE/NjKHK7oQmtmLxPs1iVwYyvE+Kolo6lbpfEQ9xnhxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-x64/0.17.8: + resolution: {integrity: sha512-bTliMLqD7pTOoPg4zZkXqCDuzIUguEWLpeqkNfC41ODBHwoUgZ2w5JBeYimv4oP6TDVocoYmEhZrCLQTrH89bg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/darwin-arm64/0.17.8: + resolution: {integrity: sha512-ghAbV3ia2zybEefXRRm7+lx8J/rnupZT0gp9CaGy/3iolEXkJ6LYRq4IpQVI9zR97ID80KJVoUlo3LSeA/sMAg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-x64/0.17.8: + resolution: {integrity: sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/freebsd-arm64/0.17.8: + resolution: {integrity: sha512-a/SATTaOhPIPFWvHZDoZYgxaZRVHn0/LX1fHLGfZ6C13JqFUZ3K6SMD6/HCtwOQ8HnsNaEeokdiDSFLuizqv5A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-x64/0.17.8: + resolution: {integrity: sha512-xpFJb08dfXr5+rZc4E+ooZmayBW6R3q59daCpKZ/cDU96/kvDM+vkYzNeTJCGd8rtO6fHWMq5Rcv/1cY6p6/0Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/linux-arm/0.17.8: + resolution: {integrity: sha512-6Ij8gfuGszcEwZpi5jQIJCVIACLS8Tz2chnEBfYjlmMzVsfqBP1iGmHQPp7JSnZg5xxK9tjCc+pJ2WtAmPRFVA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm64/0.17.8: + resolution: {integrity: sha512-v3iwDQuDljLTxpsqQDl3fl/yihjPAyOguxuloON9kFHYwopeJEf1BkDXODzYyXEI19gisEsQlG1bM65YqKSIww==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ia32/0.17.8: + resolution: {integrity: sha512-8svILYKhE5XetuFk/B6raFYIyIqydQi+GngEXJgdPdI7OMKUbSd7uzR02wSY4kb53xBrClLkhH4Xs8P61Q2BaA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-loong64/0.17.8: + resolution: {integrity: sha512-B6FyMeRJeV0NpyEOYlm5qtQfxbdlgmiGdD+QsipzKfFky0K5HW5Td6dyK3L3ypu1eY4kOmo7wW0o94SBqlqBSA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-mips64el/0.17.8: + resolution: {integrity: sha512-CCb67RKahNobjm/eeEqeD/oJfJlrWyw29fgiyB6vcgyq97YAf3gCOuP6qMShYSPXgnlZe/i4a8WFHBw6N8bYAA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ppc64/0.17.8: + resolution: {integrity: sha512-bytLJOi55y55+mGSdgwZ5qBm0K9WOCh0rx+vavVPx+gqLLhxtSFU0XbeYy/dsAAD6xECGEv4IQeFILaSS2auXw==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-riscv64/0.17.8: + resolution: {integrity: sha512-2YpRyQJmKVBEHSBLa8kBAtbhucaclb6ex4wchfY0Tj3Kg39kpjeJ9vhRU7x4mUpq8ISLXRXH1L0dBYjAeqzZAw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-s390x/0.17.8: + resolution: {integrity: sha512-QgbNY/V3IFXvNf11SS6exkpVcX0LJcob+0RWCgV9OiDAmVElnxciHIisoSix9uzYzScPmS6dJFbZULdSAEkQVw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-x64/0.17.8: + resolution: {integrity: sha512-mM/9S0SbAFDBc4OPoyP6SEOo5324LpUxdpeIUUSrSTOfhHU9hEfqRngmKgqILqwx/0DVJBzeNW7HmLEWp9vcOA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/netbsd-x64/0.17.8: + resolution: {integrity: sha512-eKUYcWaWTaYr9zbj8GertdVtlt1DTS1gNBWov+iQfWuWyuu59YN6gSEJvFzC5ESJ4kMcKR0uqWThKUn5o8We6Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + + /@esbuild/openbsd-x64/0.17.8: + resolution: {integrity: sha512-Vc9J4dXOboDyMXKD0eCeW0SIeEzr8K9oTHJU+Ci1mZc5njPfhKAqkRt3B/fUNU7dP+mRyralPu8QUkiaQn7iIg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + + /@esbuild/sunos-x64/0.17.8: + resolution: {integrity: sha512-0xvOTNuPXI7ft1LYUgiaXtpCEjp90RuBBYovdd2lqAFxje4sEucurg30M1WIm03+3jxByd3mfo+VUmPtRSVuOw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + + /@esbuild/win32-arm64/0.17.8: + resolution: {integrity: sha512-G0JQwUI5WdEFEnYNKzklxtBheCPkuDdu1YrtRrjuQv30WsYbkkoixKxLLv8qhJmNI+ATEWquZe/N0d0rpr55Mg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-ia32/0.17.8: + resolution: {integrity: sha512-Fqy63515xl20OHGFykjJsMnoIWS+38fqfg88ClvPXyDbLtgXal2DTlhb1TfTX34qWi3u4I7Cq563QcHpqgLx8w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-x64/0.17.8: + resolution: {integrity: sha512-1iuezdyDNngPnz8rLRDO2C/ZZ/emJLb72OsZeqQ6gL6Avko/XCXZw+NuxBSNhBAP13Hie418V7VMt9et1FMvpg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@eslint-community/eslint-utils/4.1.2_eslint@8.34.0: + resolution: {integrity: sha512-7qELuQWWjVDdVsFQ5+beUl+KPczrEDA7S3zM4QUd/bJl7oXgsmpXaEVqrRTnOBqenOV4rWf2kVZk2Ot085zPWA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.34.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@eslint/eslintrc/1.4.1: + resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.4.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/config-array/0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer/1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@types/body-parser/1.19.2: + resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + dependencies: + '@types/connect': 3.4.35 + '@types/node': 18.14.0 + dev: true + + /@types/connect/3.4.35: + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + dependencies: + '@types/node': 18.14.0 + dev: true + + /@types/express-serve-static-core/4.17.33: + resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} + dependencies: + '@types/node': 18.14.0 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 + dev: true + + /@types/express/4.17.17: + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + dependencies: + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.33 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.0 + dev: true + + /@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/json5/0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/mdast/3.0.10: + resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} + dependencies: + '@types/unist': 2.0.6 + dev: true + + /@types/mime/3.0.1: + resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + dev: true + + /@types/node/18.14.0: + resolution: {integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==} + dev: true + + /@types/normalize-package-data/2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + + /@types/qs/6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + dev: true + + /@types/range-parser/1.2.4: + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + dev: true + + /@types/semver/7.3.13: + resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + dev: true + + /@types/serve-static/1.15.0: + resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} + dependencies: + '@types/mime': 3.0.1 + '@types/node': 18.14.0 + dev: true + + /@types/unist/2.0.6: + resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + dev: true + + /@typescript-eslint/eslint-plugin/5.52.0_6cfvjsbua5ptj65675bqcn6oza: + resolution: {integrity: sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/scope-manager': 5.52.0 + '@typescript-eslint/type-utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + debug: 4.3.4 + eslint: 8.34.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm: + resolution: {integrity: sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.52.0 + '@typescript-eslint/types': 5.52.0 + '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5 + debug: 4.3.4 + eslint: 8.34.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager/5.52.0: + resolution: {integrity: sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.52.0 + '@typescript-eslint/visitor-keys': 5.52.0 + dev: true + + /@typescript-eslint/type-utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm: + resolution: {integrity: sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5 + '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + debug: 4.3.4 + eslint: 8.34.0 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types/5.52.0: + resolution: {integrity: sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree/5.52.0_typescript@4.9.5: + resolution: {integrity: sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.52.0 + '@typescript-eslint/visitor-keys': 5.52.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm: + resolution: {integrity: sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.52.0 + '@typescript-eslint/types': 5.52.0 + '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5 + eslint: 8.34.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.34.0 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys/5.52.0: + resolution: {integrity: sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.52.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /accepts/1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /acorn-jsx/5.3.2_acorn@8.8.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.2 + dev: true + + /acorn/8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /ajv-formats/2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: false + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv/8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /any-promise/1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-flatten/1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: false + + /array-includes/3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + get-intrinsic: 1.2.0 + is-string: 1.0.7 + dev: true + + /array-keyed-map/2.1.3: + resolution: {integrity: sha512-JIUwuFakO+jHjxyp4YgSiKXSZeC0U+R1jR94bXWBcVlFRBycqXlb+kH9JHxBGcxnVuSqx5bnn0Qz9xtSeKOjiA==} + dev: false + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.flat/1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flatmap/1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + es-shim-unscopables: 1.0.0 + dev: true + + /atomically/2.0.1: + resolution: {integrity: sha512-sxBhVZUFBFhqSAsYMM3X2oaUi2NVDJ8U026FsIusM8gYXls9AYs/eXzgGrufs1Qjpkxi9zunds+75QUFz+m7UQ==} + dependencies: + stubborn-fs: 1.2.4 + when-exit: 2.1.0 + dev: false + + /available-typed-arrays/1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /body-parser/1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + 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 + transitivePeerDependencies: + - supports-color + dev: false + + /boolbase/1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: false + + /builtin-modules/3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /builtins/5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.3.8 + dev: true + + /bundle-require/4.0.1_esbuild@0.17.8: + resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + dependencies: + esbuild: 0.17.8 + load-tsconfig: 0.2.3 + dev: true + + /bytes/3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + + /cac/6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.0 + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /character-entities-legacy/1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + dev: true + + /character-entities/1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + dev: true + + /character-reference-invalid/1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + dev: true + + /chatgpt/4.7.2: + resolution: {integrity: sha512-c5CNqvB98IMEz/Byopwu5FlXGS3w/3iNiZITdDlcZLue4VSjEfzMRWrOrdGidzcE+ud2My6nO8/sSnY7W04WJA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + cac: 6.7.14 + conf: 11.0.1 + eventsource-parser: 0.0.5 + gpt3-tokenizer: 1.1.5 + keyv: 4.5.2 + p-timeout: 6.1.1 + quick-lru: 6.1.1 + read-pkg-up: 9.1.0 + uuid: 9.0.0 + dev: false + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /ci-info/3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: true + + /clean-regexp/1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /commander/4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /conf/11.0.1: + resolution: {integrity: sha512-WlLiQboEjKx0bYx2IIRGedBgNjLAxtwPaCSnsjWPST5xR0DB4q8lcsO/bEH9ZRYNcj63Y9vj/JG/5Fg6uWzI0Q==} + engines: {node: '>=14.16'} + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1 + atomically: 2.0.1 + debounce-fn: 5.1.2 + dot-prop: 7.2.0 + env-paths: 3.0.0 + json-schema-typed: 8.0.1 + semver: 7.3.8 + dev: false + + /content-disposition/0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type/1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: false + + /cookie-signature/1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: false + + /cookie/0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: false + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /cssesc/3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /data-uri-to-buffer/4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: false + + /debounce-fn/5.1.2: + resolution: {integrity: sha512-Sr4SdOZ4vw6eQDvPYNxHogvrxmCIld/VenC5JbNrFwMiwd7lY/Z18ZFfo+EWNG4DD9nFlAujWAo/wGuOPHmy5A==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /define-properties/1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /depd/2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /destroy/1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine/2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-serializer/2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.4.0 + dev: true + + /domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler/5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils/3.0.1: + resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + + /dot-prop/7.2.0: + resolution: {integrity: sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + type-fest: 2.19.0 + dev: false + + /dotenv/16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: false + + /ee-first/1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + + /encodeurl/1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + + /entities/4.4.0: + resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} + engines: {node: '>=0.12'} + dev: true + + /env-paths/3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /es-abstract/1.21.1: + resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.0 + 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.1 + 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.10 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + safe-regex-test: 1.0.0 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.9 + dev: true + + /es-set-tostringtag/2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + + /es-shim-unscopables/1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild/0.17.8: + resolution: {integrity: sha512-g24ybC3fWhZddZK6R3uD2iF/RIPnRpwJAqLov6ouX3hMbY4+tKolP0VMF3zuIYCaXun+yHwS5IPQ91N2BT191g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.8 + '@esbuild/android-arm64': 0.17.8 + '@esbuild/android-x64': 0.17.8 + '@esbuild/darwin-arm64': 0.17.8 + '@esbuild/darwin-x64': 0.17.8 + '@esbuild/freebsd-arm64': 0.17.8 + '@esbuild/freebsd-x64': 0.17.8 + '@esbuild/linux-arm': 0.17.8 + '@esbuild/linux-arm64': 0.17.8 + '@esbuild/linux-ia32': 0.17.8 + '@esbuild/linux-loong64': 0.17.8 + '@esbuild/linux-mips64el': 0.17.8 + '@esbuild/linux-ppc64': 0.17.8 + '@esbuild/linux-riscv64': 0.17.8 + '@esbuild/linux-s390x': 0.17.8 + '@esbuild/linux-x64': 0.17.8 + '@esbuild/netbsd-x64': 0.17.8 + '@esbuild/openbsd-x64': 0.17.8 + '@esbuild/sunos-x64': 0.17.8 + '@esbuild/win32-arm64': 0.17.8 + '@esbuild/win32-ia32': 0.17.8 + '@esbuild/win32-x64': 0.17.8 + + /escape-html/1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-import-resolver-node/0.3.7: + resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + dependencies: + debug: 3.2.7 + is-core-module: 2.11.0 + resolve: 1.22.1 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils/2.7.4_npjqex3ey3rgd34fjcuucz7la4: + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + debug: 3.2.7 + eslint: 8.34.0 + eslint-import-resolver-node: 0.3.7 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-antfu/0.35.2_7kw3g6rralp5ps6mg3uyzz6azm: + resolution: {integrity: sha512-Q6FOcOakafU49PDRlq7jkrWmlTJ4u3AW7aGX+FqeQNaMgjXq0RzPGvS0Vyp7q/XDRLLoe0BjbGkamTeZXg8waw==} + dependencies: + '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + transitivePeerDependencies: + - eslint + - supports-color + - typescript + dev: true + + /eslint-plugin-es/4.1.0_eslint@8.34.0: + resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + eslint: 8.34.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + dev: true + + /eslint-plugin-eslint-comments/3.2.0_eslint@8.34.0: + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + escape-string-regexp: 1.0.5 + eslint: 8.34.0 + ignore: 5.2.4 + dev: true + + /eslint-plugin-html/7.1.0: + resolution: {integrity: sha512-fNLRraV/e6j8e3XYOC9xgND4j+U7b1Rq+OygMlLcMg+wI/IpVbF+ubQa3R78EjKB9njT6TQOlcK5rFKBVVtdfg==} + dependencies: + htmlparser2: 8.0.1 + dev: true + + /eslint-plugin-import/2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4: + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.34.0 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.7.4_npjqex3ey3rgd34fjcuucz7la4 + has: 1.0.3 + is-core-module: 2.11.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.1 + semver: 6.3.0 + tsconfig-paths: 3.14.1 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jest/27.2.1_7hfwvekd5cgjoxqyvesymwuacm: + resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza + '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + eslint: 8.34.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-jsonc/2.6.0_eslint@8.34.0: + resolution: {integrity: sha512-4bA9YTx58QaWalua1Q1b82zt7eZMB7i+ed8q8cKkbKP75ofOA2SXbtFyCSok7RY6jIXeCqQnKjN9If8zCgv6PA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + eslint: 8.34.0 + eslint-utils: 3.0.0_eslint@8.34.0 + jsonc-eslint-parser: 2.1.0 + natural-compare: 1.4.0 + dev: true + + /eslint-plugin-markdown/3.0.0_eslint@8.34.0: + resolution: {integrity: sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.34.0 + mdast-util-from-markdown: 0.8.5 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-n/15.6.1_eslint@8.34.0: + resolution: {integrity: sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==} + engines: {node: '>=12.22.0'} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + builtins: 5.0.1 + eslint: 8.34.0 + eslint-plugin-es: 4.1.0_eslint@8.34.0 + eslint-utils: 3.0.0_eslint@8.34.0 + ignore: 5.2.4 + is-core-module: 2.11.0 + minimatch: 3.1.2 + resolve: 1.22.1 + semver: 7.3.8 + dev: true + + /eslint-plugin-no-only-tests/3.1.0: + resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} + engines: {node: '>=5.0.0'} + dev: true + + /eslint-plugin-promise/6.1.1_eslint@8.34.0: + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.34.0 + dev: true + + /eslint-plugin-unicorn/45.0.2_eslint@8.34.0: + resolution: {integrity: sha512-Y0WUDXRyGDMcKLiwgL3zSMpHrXI00xmdyixEGIg90gHnj0PcHY4moNv3Ppje/kDivdAy5vUeUr7z211ImPv2gw==} + engines: {node: '>=14.18'} + peerDependencies: + eslint: '>=8.28.0' + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + '@eslint-community/eslint-utils': 4.1.2_eslint@8.34.0 + ci-info: 3.8.0 + clean-regexp: 1.0.0 + eslint: 8.34.0 + esquery: 1.4.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.0.2 + lodash: 4.17.21 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.24 + regjsparser: 0.9.1 + safe-regex: 2.1.1 + semver: 7.3.8 + strip-indent: 3.0.0 + dev: true + + /eslint-plugin-unused-imports/2.0.0_vqeavzxdzk2atb75l6fx3anzpi: + resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 + eslint: ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza + eslint: 8.34.0 + eslint-rule-composer: 0.3.0 + dev: true + + /eslint-plugin-vue/9.9.0_eslint@8.34.0: + resolution: {integrity: sha512-YbubS7eK0J7DCf0U2LxvVP7LMfs6rC6UltihIgval3azO3gyDwEGVgsCMe1TmDiEkl6GdMKfRpaME6QxIYtzDQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.34.0 + eslint-utils: 3.0.0_eslint@8.34.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.0.11 + semver: 7.3.8 + vue-eslint-parser: 9.1.0_eslint@8.34.0 + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-yml/1.5.0_eslint@8.34.0: + resolution: {integrity: sha512-iygN054g+ZrnYmtOXMnT+sx9iDNXt89/m0+506cQHeG0+5jJN8hY5iOPQLd3yfd50AfK/mSasajBWruf1SoHpQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: 4.3.4 + eslint: 8.34.0 + lodash: 4.17.21 + natural-compare: 1.4.0 + yaml-eslint-parser: 1.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-rule-composer/0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + dev: true + + /eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope/7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils/2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-utils/3.0.0_eslint@8.34.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.34.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys/1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys/3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint/8.34.0: + resolution: {integrity: sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.4.1 + '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0_eslint@8.34.0 + eslint-visitor-keys: 3.3.0 + espree: 9.4.1 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.3.0 + 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.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /esno/0.16.3: + resolution: {integrity: sha512-6slSBEV1lMKcX13DBifvnDFpNno5WXhw4j/ff7RI0y51BZiDqEe5dNhhjhIQ3iCOQuzsm2MbVzmwqbN78BBhPg==} + hasBin: true + dependencies: + tsx: 3.12.3 + dev: false + + /espree/9.4.1: + resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.2 + acorn-jsx: 5.3.2_acorn@8.8.2 + eslint-visitor-keys: 3.3.0 + dev: true + + /esquery/1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag/1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: false + + /eventsource-parser/0.0.5: + resolution: {integrity: sha512-BAq82bC3ZW9fPYYZlofXBOAfbpmDzXIOsj+GOehQwgTUYsQZ6HtHs6zuRtge7Ph8OhS6lNH1kJF8q9dj17RcmA==} + engines: {node: '>=12'} + dev: false + + /execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /express/4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + 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 + transitivePeerDependencies: + - supports-color + dev: false + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq/1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fetch-blob/3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: false + + /file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler/1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + 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 + transitivePeerDependencies: + - supports-color + dev: false + + /find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-up/6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + dev: false + + /flat-cache/3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flatted/3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /for-each/0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /formdata-polyfill/4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: false + + /forwarded/0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: false + + /fresh/0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /function.prototype.name/1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names/1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /get-intrinsic/1.2.0: + resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + dev: true + + /get-tsconfig/4.4.0: + resolution: {integrity: sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ==} + dev: false + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals/13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis/1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + dev: true + + /globby/11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /gopd/1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.0 + dev: true + + /gpt3-tokenizer/1.1.5: + resolution: {integrity: sha512-O9iCL8MqGR0Oe9wTh0YftzIbysypNQmS5a5JG3cB3M4LMYjlAVvNnf8LUzVY9MrI7tj+YLY356uHtO2lLX2HpA==} + engines: {node: '>=12'} + dependencies: + array-keyed-map: 2.1.3 + dev: false + + /grapheme-splitter/1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /has-bigints/1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors/1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.0 + dev: true + + /has-proto/1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /hosted-git-info/2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info/4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: false + + /htmlparser2/8.0.1: + resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.0.1 + entities: 4.4.0 + dev: true + + /http-errors/2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ignore/5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string/4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /internal-slot/1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /ip/2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + dev: false + + /ipaddr.js/1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: false + + /is-alphabetical/1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + dev: true + + /is-alphanumerical/1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + dev: true + + /is-array-buffer/3.0.1: + resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-typed-array: 1.1.10 + dev: true + + /is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-builtin-module/3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + + /is-callable/1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + + /is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-decimal/1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-hexadecimal/1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + dev: true + + /is-negative-zero/2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object/1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside/3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-shared-array-buffer/1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array/1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + engines: {node: '>= 0.4'} + 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 + dev: true + + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isomorphic-fetch/3.0.0: + resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} + dependencies: + node-fetch: 2.6.9 + whatwg-fetch: 3.6.2 + transitivePeerDependencies: + - encoding + dev: false + + /joycon/3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: true + + /js-sdsl/4.3.0: + resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} + dev: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc/0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc/3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /json-buffer/3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: false + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse/1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /json-schema-typed/8.0.1: + resolution: {integrity: sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==} + dev: false + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5/1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /jsonc-eslint-parser/2.1.0: + resolution: {integrity: sha512-qCRJWlbP2v6HbmKW7R3lFbeiVWHo+oMJ0j+MizwvauqnCV/EvtAeEeuCgoc/ErtsuoKgYB8U4Ih8AxJbXoE6/g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.2 + eslint-visitor-keys: 3.3.0 + espree: 9.4.1 + semver: 7.3.8 + dev: true + + /keyv/4.5.2: + resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} + dependencies: + json-buffer: 3.0.1 + dev: false + + /levn/0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lilconfig/2.0.6: + resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /load-tsconfig/0.2.3: + resolution: {integrity: sha512-iyT2MXws+dc2Wi6o3grCFtGXpeMvHmJqS27sMPGtV2eUu4PeFnG+33I8BlFK1t1NWMjOpcx9bridn5yxLDX2gQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /local-pkg/0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /locate-path/7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: false + + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.sortby/4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /mdast-util-from-markdown/0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-to-string: 2.0.0 + micromark: 2.11.4 + parse-entities: 2.0.0 + unist-util-stringify-position: 2.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-to-string/2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + dev: true + + /media-typer/0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /merge-descriptors/1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: false + + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /methods/1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + + /micromark/2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + dependencies: + debug: 4.3.4 + parse-entities: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn/4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist/1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /mz/2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /natural-compare-lite/1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare/1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /negotiator/0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /node-domexception/1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + + /node-fetch/2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-fetch/3.3.0: + resolution: {integrity: sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + + /normalize-package-data/2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.1 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data/3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.11.0 + semver: 7.3.8 + validate-npm-package-license: 3.0.4 + dev: false + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /nth-check/2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-inspect/1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign/4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.values/1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + dev: true + + /on-finished/2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /optionator/0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + + /p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit/4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: false + + /p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-locate/6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: false + + /p-timeout/6.1.1: + resolution: {integrity: sha512-yqz2Wi4fiFRpMmK0L2pGAU49naSUaP23fFIQL2Y6YT+qDGPoFwpvgQM/wzc6F8JoenUkIlAFa4Ql7NguXBxI7w==} + engines: {node: '>=14.16'} + dev: false + + /p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-entities/2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + dev: true + + /parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.18.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /parseurl/1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-exists/5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-to-regexp/0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: false + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pirates/4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + dev: true + + /pluralize/8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + + /postcss-load-config/3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.0.6 + yaml: 1.10.2 + dev: true + + /postcss-selector-parser/6.0.11: + resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /proxy-addr/2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: false + + /punycode/2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + /qs/6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru/6.1.1: + resolution: {integrity: sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==} + engines: {node: '>=12'} + dev: false + + /range-parser/1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: false + + /raw-body/2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /read-pkg-up/7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg-up/9.1.0: + resolution: {integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + find-up: 6.3.0 + read-pkg: 7.1.0 + type-fest: 2.19.0 + dev: false + + /read-pkg/5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read-pkg/7.1.0: + resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==} + engines: {node: '>=12.20'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 3.0.3 + parse-json: 5.2.0 + type-fest: 2.19.0 + dev: false + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /regexp-tree/0.1.24: + resolution: {integrity: sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==} + hasBin: true + dev: true + + /regexp.prototype.flags/1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: true + + /regexpp/3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /regjsparser/0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /require-from-string/2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf/4.1.2: + resolution: {integrity: sha512-BlIbgFryTbw3Dz6hyoWFhKk+unCcHMSkZGrTFVAx2WmttdBSonsdtRlwiuTbDqTKr+UlXIUqJVS4QT5tUzGENQ==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /rollup/3.15.0: + resolution: {integrity: sha512-F9hrCAhnp5/zx/7HYmftvsNBkMfLfk/dXUh73hPSM2E3CRgap65orDNJbLetoiUFwSAk6iHPLvBrZ5iHYvzqsg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safe-regex-test/1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-regex: 1.1.4 + dev: true + + /safe-regex/2.1.1: + resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + dependencies: + regexp-tree: 0.1.24 + dev: true + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver/7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /send/0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + 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 + transitivePeerDependencies: + - supports-color + dev: false + + /serve-static/1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: false + + /setprototypeof/1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + object-inspect: 1.12.3 + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /smart-buffer/4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: false + + /socks-proxy-agent/7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: false + + /socks/2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 2.0.0 + smart-buffer: 4.2.0 + dev: false + + /source-map-support/0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: false + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map/0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 + dev: true + + /spdx-correct/3.1.1: + resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.12 + + /spdx-exceptions/2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + + /spdx-expression-parse/3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.12 + + /spdx-license-ids/3.0.12: + resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} + + /statuses/2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /string.prototype.trimend/1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + dev: true + + /string.prototype.trimstart/1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /stubborn-fs/1.2.4: + resolution: {integrity: sha512-KRa4nIRJ8q6uApQbPwYZVhOof8979fw4xbajBWa5kPJFa4nyY3aFaMWVyIVCDnkNCCG/3HLipUZ4QaNlYsmX1w==} + dev: false + + /sucrase/3.29.0: + resolution: {integrity: sha512-bZPAuGA5SdFHuzqIhTAqt9fvNEo9rESqXIG3oiKdF8K4UmkQxC4KlNL3lVyAErXp+mPvUqZ5l13qx6TrDIGf3A==} + engines: {node: '>=8'} + hasBin: true + dependencies: + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.5 + ts-interface-checker: 0.1.13 + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /text-table/0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /thenify-all/1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify/3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toidentifier/1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + + /tr46/0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /tr46/1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.0 + dev: true + + /tree-kill/1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /ts-interface-checker/0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + + /tsconfig-paths/3.14.1: + resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tsup/6.6.3_typescript@4.9.5: + resolution: {integrity: sha512-OLx/jFllYlVeZQ7sCHBuRVEQBBa1tFbouoc/gbYakyipjVQdWy/iQOvmExUA/ewap9iQ7tbJf9pW0PgcEFfJcQ==} + engines: {node: '>=14.18'} + hasBin: true + peerDependencies: + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: ^4.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + dependencies: + bundle-require: 4.0.1_esbuild@0.17.8 + cac: 6.7.14 + chokidar: 3.5.3 + debug: 4.3.4 + esbuild: 0.17.8 + execa: 5.1.1 + globby: 11.1.0 + joycon: 3.1.1 + postcss-load-config: 3.1.4 + resolve-from: 5.0.0 + rollup: 3.15.0 + source-map: 0.8.0-beta.0 + sucrase: 3.29.0 + tree-kill: 1.2.2 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /tsutils/3.21.0_typescript@4.9.5: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.9.5 + dev: true + + /tsx/3.12.3: + resolution: {integrity: sha512-Wc5BFH1xccYTXaQob+lEcimkcb/Pq+0en2s+ruiX0VEIC80nV7/0s7XRahx8NnsoCnpCVUPz8wrqVSPi760LkA==} + hasBin: true + dependencies: + '@esbuild-kit/cjs-loader': 2.4.2 + '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/esm-loader': 2.5.5 + optionalDependencies: + fsevents: 2.3.2 + dev: false + + /type-check/0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest/0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest/0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest/0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-fest/2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false + + /type-is/1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + + /typed-array-length/1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.10 + dev: true + + /typescript/4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /unbox-primitive/1.0.2: + resolution: {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 + dev: true + + /unist-util-stringify-position/2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + dependencies: + '@types/unist': 2.0.6 + dev: true + + /unpipe/1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /utils-merge/1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: false + + /uuid/9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + dev: false + + /validate-npm-package-license/3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.1.1 + spdx-expression-parse: 3.0.1 + + /vary/1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /vue-eslint-parser/9.1.0_eslint@8.34.0: + resolution: {integrity: sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: 4.3.4 + eslint: 8.34.0 + eslint-scope: 7.1.1 + eslint-visitor-keys: 3.3.0 + espree: 9.4.1 + esquery: 1.4.0 + lodash: 4.17.21 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + dev: true + + /web-streams-polyfill/3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} + dev: false + + /webidl-conversions/3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /webidl-conversions/4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + + /whatwg-fetch/3.6.2: + resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==} + dev: false + + /whatwg-url/5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /whatwg-url/7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + + /when-exit/2.1.0: + resolution: {integrity: sha512-H85ulNwUBU1e6PGxkWUDgxnbohSXD++ah6Xw1VHAN7CtypcbZaC4aYjQ+C2PMVaDkURDuOinNAT+Lnz3utWXxQ==} + dev: false + + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-typed-array/1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + engines: {node: '>= 0.4'} + 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 + is-typed-array: 1.1.10 + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /xml-name-validator/4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml-eslint-parser/1.1.0: + resolution: {integrity: sha512-b464Q1fYiX1oYx2kE8k4mEp6S9Prk+tfDsY/IPxQ0FCjEuj3AKko5Skf3/yQJeYTTDyjDE+aWIJemnv29HvEWQ==} + engines: {node: ^14.17.0 || >=16.0.0} + dependencies: + eslint-visitor-keys: 3.3.0 + lodash: 4.17.21 + yaml: 2.2.1 + dev: true + + /yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yaml/2.2.1: + resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} + engines: {node: '>= 14'} + dev: true + + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /yocto-queue/1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: false diff --git a/src/yunzai-web-fe/service/src/chatgpt.ts b/src/yunzai-web-fe/service/src/chatgpt.ts new file mode 100644 index 0000000000000000000000000000000000000000..aa8091322db0439f806c850292ad03569e622d8d --- /dev/null +++ b/src/yunzai-web-fe/service/src/chatgpt.ts @@ -0,0 +1,125 @@ +import * as dotenv from 'dotenv' +import 'isomorphic-fetch' +import type { ChatMessage, SendMessageOptions } from 'chatgpt' +import { ChatGPTAPI, ChatGPTUnofficialProxyAPI } from 'chatgpt' +import { SocksProxyAgent } from 'socks-proxy-agent' +import fetch from 'node-fetch' +import { sendResponse } from './utils' +import type { ApiModel, ChatContext, ChatGPTAPIOptions, ChatGPTUnofficialProxyAPIOptions, ModelConfig } from './types' + +dotenv.config() + +const timeoutMs: number = !isNaN(+process.env.TIMEOUT_MS) ? +process.env.TIMEOUT_MS : 30 * 1000 + +let apiModel: ApiModel + +if (!process.env.OPENAI_API_KEY && !process.env.OPENAI_ACCESS_TOKEN) + throw new Error('Missing OPENAI_API_KEY or OPENAI_ACCESS_TOKEN environment variable') + +let api: ChatGPTAPI | ChatGPTUnofficialProxyAPI + +// To use ESM in CommonJS, you can use a dynamic import +(async () => { + // More Info: https://github.com/transitive-bullshit/chatgpt-api + + if (process.env.OPENAI_API_KEY) { + const options: ChatGPTAPIOptions = { + apiKey: process.env.OPENAI_API_KEY, + debug: false, + } + + api = new ChatGPTAPI({ ...options }) + apiModel = 'ChatGPTAPI' + } + else { + const options: ChatGPTUnofficialProxyAPIOptions = { + accessToken: process.env.OPENAI_ACCESS_TOKEN, + debug: false, + } + + if (process.env.SOCKS_PROXY_HOST && process.env.SOCKS_PROXY_PORT) { + const agent = new SocksProxyAgent({ + hostname: process.env.SOCKS_PROXY_HOST, + port: process.env.SOCKS_PROXY_PORT, + }) + options.fetch = (url, options) => { + return fetch(url, { agent, ...options }) + } + } + + if (process.env.API_REVERSE_PROXY) + options.apiReverseProxyUrl = process.env.API_REVERSE_PROXY + + api = new ChatGPTUnofficialProxyAPI({ + accessToken: process.env.OPENAI_ACCESS_TOKEN, + ...options, + }) + apiModel = 'ChatGPTUnofficialProxyAPI' + } +})() + +async function chatReply( + message: string, + lastContext?: { conversationId?: string; parentMessageId?: string }, +) { + if (!message) + return sendResponse({ type: 'Fail', message: 'Message is empty' }) + + try { + let options: SendMessageOptions = { timeoutMs } + + if (lastContext) + options = { ...lastContext } + + const response = await api.sendMessage(message, { ...options }) + + return sendResponse({ type: 'Success', data: response }) + } + catch (error: any) { + return sendResponse({ type: 'Fail', message: error.message }) + } +} + +async function chatReplyProcess( + message: string, + lastContext?: { conversationId?: string; parentMessageId?: string }, + process?: (chat: ChatMessage) => void, +) { + if (!message) + return sendResponse({ type: 'Fail', message: 'Message is empty' }) + + try { + let options: SendMessageOptions = { timeoutMs } + + if (lastContext) + options = { ...lastContext } + + const response = await api.sendMessage(message, { + ...options, + onProgress: (partialResponse) => { + process?.(partialResponse) + }, + }) + + return sendResponse({ type: 'Success', data: response }) + } + catch (error: any) { + return sendResponse({ type: 'Fail', message: error.message }) + } +} + +async function chatConfig() { + return sendResponse({ + type: 'Success', + data: { + apiModel, + reverseProxy: process.env.API_REVERSE_PROXY, + timeoutMs, + socksProxy: (process.env.SOCKS_PROXY_HOST && process.env.SOCKS_PROXY_PORT) ? (`${process.env.SOCKS_PROXY_HOST}:${process.env.SOCKS_PROXY_PORT}`) : '-', + } as ModelConfig, + }) +} + +export type { ChatContext, ChatMessage } + +export { chatReply, chatReplyProcess, chatConfig } diff --git a/src/yunzai-web-fe/service/src/index.ts b/src/yunzai-web-fe/service/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..20d2c4fe78eebd08d1c2616051d56bc0d9be932a --- /dev/null +++ b/src/yunzai-web-fe/service/src/index.ts @@ -0,0 +1,61 @@ +import express from 'express' +import type { ChatContext, ChatMessage } from './chatgpt' +import { chatConfig, chatReply, chatReplyProcess } from './chatgpt' + +const app = express() +const router = express.Router() + +app.use(express.static('public')) +app.use(express.json()) + +app.all('*', (_, res, next) => { + res.header('Access-Control-Allow-Origin', '*') + res.header('Access-Control-Allow-Headers', 'Content-Type') + res.header('Access-Control-Allow-Methods', '*') + next() +}) + +router.post('/chat', async (req, res) => { + try { + const { prompt, options = {} } = req.body as { prompt: string; options?: ChatContext } + const response = await chatReply(prompt, options) + res.send(response) + } + catch (error) { + res.send(error) + } +}) + +router.post('/chat-process', async (req, res) => { + res.setHeader('Content-type', 'application/octet-stream') + + try { + const { prompt, options = {} } = req.body as { prompt: string; options?: ChatContext } + let firstChunk = true + await chatReplyProcess(prompt, options, (chat: ChatMessage) => { + res.write(firstChunk ? JSON.stringify(chat) : `\n${JSON.stringify(chat)}`) + firstChunk = false + }) + } + catch (error) { + res.write(JSON.stringify(error)) + } + finally { + res.end() + } +}) + +router.post('/config', async (req, res) => { + try { + const response = await chatConfig() + res.send(response) + } + catch (error) { + res.send(error) + } +}) + +app.use('', router) +app.use('/api', router) + +app.listen(3002, () => globalThis.console.log('Server is running on port 3002')) diff --git a/src/yunzai-web-fe/service/src/types.ts b/src/yunzai-web-fe/service/src/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..9e4ef41d789c6ff5813d48d0806f783f2791dd2a --- /dev/null +++ b/src/yunzai-web-fe/service/src/types.ts @@ -0,0 +1,30 @@ +import type { FetchFn, openai } from 'chatgpt' + +export interface ChatContext { + conversationId?: string + parentMessageId?: string +} + +export interface ChatGPTAPIOptions { + apiKey: string + debug?: boolean + completionParams?: Partial +} + +export interface ChatGPTUnofficialProxyAPIOptions { + accessToken: string + apiReverseProxyUrl?: string + model?: string + debug?: boolean + headers?: Record + fetch?: FetchFn +} + +export interface ModelConfig { + apiModel?: ApiModel + reverseProxy?: string + timeoutMs?: number + socksProxy?: string +} + +export type ApiModel = 'ChatGPTAPI' | 'ChatGPTUnofficialProxyAPI' | undefined diff --git a/src/yunzai-web-fe/service/src/utils/index.ts b/src/yunzai-web-fe/service/src/utils/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..1d832530551e1f370b223172bfacdb1318f2d8fa --- /dev/null +++ b/src/yunzai-web-fe/service/src/utils/index.ts @@ -0,0 +1,22 @@ +interface SendResponseOptions { + type: 'Success' | 'Fail' + message?: string + data?: any +} + +export function sendResponse(options: SendResponseOptions) { + if (options.type === 'Success') { + return Promise.resolve({ + message: options.message ?? null, + data: options.data ?? null, + status: options.type, + }) + } + + // eslint-disable-next-line prefer-promise-reject-errors + return Promise.reject({ + message: options.message ?? 'Failed', + data: options.data ?? null, + status: options.type, + }) +} diff --git a/src/yunzai-web-fe/service/tsconfig.json b/src/yunzai-web-fe/service/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..74771922ef761cc43ae45bd3a6ceba0d155b7532 --- /dev/null +++ b/src/yunzai-web-fe/service/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "es2020", + "lib": [ + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "baseUrl": ".", + "outDir": "build", + "noEmit": true + }, + "exclude": [ + "node_modules", + "build" + ], + "include": [ + "**/*.ts" + ] +} diff --git a/src/yunzai-web-fe/service/tsup.config.ts b/src/yunzai-web-fe/service/tsup.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..4f24c6a19f7c0324b29384bff60a24fac04bc2ef --- /dev/null +++ b/src/yunzai-web-fe/service/tsup.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'tsup' + +export default defineConfig({ + entry: ['src/index.ts'], + outDir: 'build', + target: 'es2020', + format: ['cjs'], + splitting: false, + sourcemap: true, + minify: false, + shims: true, + dts: false, +}) diff --git a/src/yunzai-web-fe/src/App.vue b/src/yunzai-web-fe/src/App.vue new file mode 100644 index 0000000000000000000000000000000000000000..88520c0884dd51ce1b5f2c1786939ae66f913ad6 --- /dev/null +++ b/src/yunzai-web-fe/src/App.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/yunzai-web-fe/src/api/index.ts b/src/yunzai-web-fe/src/api/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6480ecfbc2161957d58d5cd9f33effc29f558db9 --- /dev/null +++ b/src/yunzai-web-fe/src/api/index.ts @@ -0,0 +1,35 @@ +import type { AxiosProgressEvent, GenericAbortSignal } from 'axios' +import { post } from '@/utils/request' + +export function fetchChatAPI( + prompt: string, + options?: { conversationId?: string; parentMessageId?: string }, + signal?: GenericAbortSignal, +) { + return post({ + url: '/api/chat', + data: { prompt, options }, + signal, + }) +} + +export function fetchChatConfig() { + return post({ + url: '/api/config', + }) +} + +export function fetchChatAPIProcess( + params: { + prompt: string + options?: { conversationId?: string; parentMessageId?: string } + signal?: GenericAbortSignal + onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void }, +) { + return post({ + url: '/api/chat-process', + data: { prompt: params.prompt, options: params.options }, + signal: params.signal, + onDownloadProgress: params.onDownloadProgress, + }) +} diff --git a/src/yunzai-web-fe/src/assets/avatar.jpg b/src/yunzai-web-fe/src/assets/avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7a1ab2ea37a14aed866097253c3f2ca9b7d984de Binary files /dev/null and b/src/yunzai-web-fe/src/assets/avatar.jpg differ diff --git a/src/yunzai-web-fe/src/assets/paimon.jpg b/src/yunzai-web-fe/src/assets/paimon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7f09604e7684d43a035d77859555525e6f6b41ce Binary files /dev/null and b/src/yunzai-web-fe/src/assets/paimon.jpg differ diff --git a/src/yunzai-web-fe/src/components/business/index.ts b/src/yunzai-web-fe/src/components/business/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f0a766d36b82929ae5c79132d614e028bbba36c1 --- /dev/null +++ b/src/yunzai-web-fe/src/components/business/index.ts @@ -0,0 +1 @@ +export { } diff --git a/src/yunzai-web-fe/src/components/common/HoverButton/Button.vue b/src/yunzai-web-fe/src/components/common/HoverButton/Button.vue new file mode 100644 index 0000000000000000000000000000000000000000..a5228b032bb14ea832406832fbb65b11c80e8a9f --- /dev/null +++ b/src/yunzai-web-fe/src/components/common/HoverButton/Button.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/yunzai-web-fe/src/components/common/HoverButton/index.vue b/src/yunzai-web-fe/src/components/common/HoverButton/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..432445a41077a141406dd3f287c7a65249ec5b61 --- /dev/null +++ b/src/yunzai-web-fe/src/components/common/HoverButton/index.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/yunzai-web-fe/src/components/common/NaiveProvider/index.vue b/src/yunzai-web-fe/src/components/common/NaiveProvider/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..b30fc729d16daa5141eb5dfd6b1d15142f4798e3 --- /dev/null +++ b/src/yunzai-web-fe/src/components/common/NaiveProvider/index.vue @@ -0,0 +1,43 @@ + + + diff --git a/src/yunzai-web-fe/src/components/common/Setting/index.vue b/src/yunzai-web-fe/src/components/common/Setting/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..393b9c01a9eb680d312e0ed068f09248d7eced25 --- /dev/null +++ b/src/yunzai-web-fe/src/components/common/Setting/index.vue @@ -0,0 +1,80 @@ + + + diff --git a/src/yunzai-web-fe/src/components/common/SvgIcon/index.vue b/src/yunzai-web-fe/src/components/common/SvgIcon/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..8563552a3d4f50a8e49fdbbbbdb2a425ebc31b70 --- /dev/null +++ b/src/yunzai-web-fe/src/components/common/SvgIcon/index.vue @@ -0,0 +1,21 @@ + + + diff --git a/src/yunzai-web-fe/src/components/common/UserAvatar/index.vue b/src/yunzai-web-fe/src/components/common/UserAvatar/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..a0fcc392bce3f3628b0e586fed3ecabbd28eef20 --- /dev/null +++ b/src/yunzai-web-fe/src/components/common/UserAvatar/index.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/yunzai-web-fe/src/components/common/index.ts b/src/yunzai-web-fe/src/components/common/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..16b6d1083a5d9c7c6987ead5d49665f425f2c604 --- /dev/null +++ b/src/yunzai-web-fe/src/components/common/index.ts @@ -0,0 +1,7 @@ +import HoverButton from './HoverButton/index.vue' +import NaiveProvider from './NaiveProvider/index.vue' +import SvgIcon from './SvgIcon/index.vue' +import UserAvatar from './UserAvatar/index.vue' +import Setting from './Setting/index.vue' + +export { HoverButton, NaiveProvider, SvgIcon, UserAvatar, Setting } diff --git a/src/yunzai-web-fe/src/components/custom/GithubSite.vue b/src/yunzai-web-fe/src/components/custom/GithubSite.vue new file mode 100644 index 0000000000000000000000000000000000000000..5f0419daf8ec22924a5900ba8cc0292a8fc92267 --- /dev/null +++ b/src/yunzai-web-fe/src/components/custom/GithubSite.vue @@ -0,0 +1,8 @@ + diff --git a/src/yunzai-web-fe/src/components/custom/index.ts b/src/yunzai-web-fe/src/components/custom/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6e036989b29e6d8c503f68d1ef4cb655ef762926 --- /dev/null +++ b/src/yunzai-web-fe/src/components/custom/index.ts @@ -0,0 +1,3 @@ +import GithubSite from './GithubSite.vue' + +export { GithubSite } diff --git a/src/yunzai-web-fe/src/directives/highlight.ts b/src/yunzai-web-fe/src/directives/highlight.ts new file mode 100644 index 0000000000000000000000000000000000000000..b77669d8cf304fe8021f171a4207730e7936056c --- /dev/null +++ b/src/yunzai-web-fe/src/directives/highlight.ts @@ -0,0 +1,23 @@ +import type { App, Directive } from 'vue' +import hljs from 'highlight.js' +import { includeCode } from '@/utils/format' + +hljs.configure({ ignoreUnescapedHTML: true }) + +function highlightCode(el: HTMLElement) { + if (includeCode(el.textContent)) + hljs.highlightBlock(el) +} + +export default function setupHighlightDirective(app: App) { + const highLightDirective: Directive = { + mounted(el: HTMLElement) { + highlightCode(el) + }, + updated(el: HTMLElement) { + highlightCode(el) + }, + } + + app.directive('highlight', highLightDirective) +} diff --git a/src/yunzai-web-fe/src/directives/index.ts b/src/yunzai-web-fe/src/directives/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..cdcaeef7e000701618278e3fcb07aa453d70a9ab --- /dev/null +++ b/src/yunzai-web-fe/src/directives/index.ts @@ -0,0 +1,6 @@ +import type { App } from 'vue' +import setupHighlightDirective from './highlight' + +export function setupDirectives(app: App) { + setupHighlightDirective(app) +} diff --git a/src/yunzai-web-fe/src/hooks/useBasicLayout.ts b/src/yunzai-web-fe/src/hooks/useBasicLayout.ts new file mode 100644 index 0000000000000000000000000000000000000000..28a7140a8eab2e5ddacd2e65f6115a5da98d24ba --- /dev/null +++ b/src/yunzai-web-fe/src/hooks/useBasicLayout.ts @@ -0,0 +1,8 @@ +import { breakpointsTailwind, useBreakpoints } from '@vueuse/core' + +export function useBasicLayout() { + const breakpoints = useBreakpoints(breakpointsTailwind) + const isMobile = breakpoints.smaller('sm') + + return { isMobile } +} diff --git a/src/yunzai-web-fe/src/hooks/useIconRender.ts b/src/yunzai-web-fe/src/hooks/useIconRender.ts new file mode 100644 index 0000000000000000000000000000000000000000..73b9114f8761c1220fafd8f4d08f93cf6bd0ecfe --- /dev/null +++ b/src/yunzai-web-fe/src/hooks/useIconRender.ts @@ -0,0 +1,36 @@ +import { h } from 'vue' +import { SvgIcon } from '@/components/common' + +export const useIconRender = () => { + interface IconConfig { + icon?: string + color?: string + fontSize?: number + } + + interface IconStyle { + color?: string + fontSize?: string + } + + const iconRender = (config: IconConfig) => { + const { color, fontSize, icon } = config + + const style: IconStyle = {} + + if (color) + style.color = color + + if (fontSize) + style.fontSize = `${fontSize}px` + + if (!icon) + window.console.warn('iconRender: icon is required') + + return () => h(SvgIcon, { icon, style }) + } + + return { + iconRender, + } +} diff --git a/src/yunzai-web-fe/src/hooks/useTheme.ts b/src/yunzai-web-fe/src/hooks/useTheme.ts new file mode 100644 index 0000000000000000000000000000000000000000..dbda3893b2669427836ff8825548e8788f14c1d3 --- /dev/null +++ b/src/yunzai-web-fe/src/hooks/useTheme.ts @@ -0,0 +1,43 @@ +import type { GlobalThemeOverrides } from 'naive-ui' +import { computed, watch } from 'vue' +import { darkTheme, useOsTheme } from 'naive-ui' +import { useAppStore } from '@/store' + +export function useTheme() { + const appStore = useAppStore() + + const OsTheme = useOsTheme() + + const isDark = computed(() => { + if (appStore.theme === 'auto') + return OsTheme.value === 'dark' + else + return appStore.theme === 'dark' + }) + + const theme = computed(() => { + return isDark.value ? darkTheme : undefined + }) + + const themeOverrides = computed(() => { + if (isDark.value) { + return { + common: {}, + } + } + return {} + }) + + watch( + () => isDark.value, + (dark) => { + if (dark) + document.documentElement.classList.add('dark') + else + document.documentElement.classList.remove('dark') + }, + { immediate: true }, + ) + + return { theme, themeOverrides } +} diff --git a/src/yunzai-web-fe/src/main.ts b/src/yunzai-web-fe/src/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..115198dc1bbaf50f81025b7a99a65d50d8f728aa --- /dev/null +++ b/src/yunzai-web-fe/src/main.ts @@ -0,0 +1,21 @@ +import { createApp } from 'vue' +import App from './App.vue' +import { setupDirectives } from './directives' +import { setupAssets } from '@/plugins' +import { setupStore } from '@/store' +import { setupRouter } from '@/router' + +async function bootstrap() { + const app = createApp(App) + setupAssets() + + setupStore(app) + + setupDirectives(app) + + await setupRouter(app) + + app.mount('#app') +} + +bootstrap() diff --git a/src/yunzai-web-fe/src/plugins/assets.ts b/src/yunzai-web-fe/src/plugins/assets.ts new file mode 100644 index 0000000000000000000000000000000000000000..27054cb88c87b9336060b4a4cf9be663a8cb730b --- /dev/null +++ b/src/yunzai-web-fe/src/plugins/assets.ts @@ -0,0 +1,17 @@ +import '@/styles/lib/tailwind.css' +import '@/styles/lib/highlight.less' +import '@/styles/lib/github-markdown.less' +import '@/styles/global.less' + +/** Tailwind's Preflight Style Override */ +function naiveStyleOverride() { + const meta = document.createElement('meta') + meta.name = 'naive-ui-style' + document.head.appendChild(meta) +} + +function setupAssets() { + naiveStyleOverride() +} + +export default setupAssets diff --git a/src/yunzai-web-fe/src/plugins/index.ts b/src/yunzai-web-fe/src/plugins/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..ae1ac228004bb261e51a41ea8675d021f53ee779 --- /dev/null +++ b/src/yunzai-web-fe/src/plugins/index.ts @@ -0,0 +1,3 @@ +import setupAssets from './assets' + +export { setupAssets } diff --git a/src/yunzai-web-fe/src/router/index.ts b/src/yunzai-web-fe/src/router/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..587ad2b290f73a098321a179151c10b68915b4de --- /dev/null +++ b/src/yunzai-web-fe/src/router/index.ts @@ -0,0 +1,31 @@ +import type { App } from 'vue' +import type { RouteRecordRaw } from 'vue-router' +import { createRouter, createWebHashHistory } from 'vue-router' +import { ChatLayout } from '@/views/chat/layout' + +const routes: RouteRecordRaw[] = [ + { + path: '/', + name: 'Root', + component: ChatLayout, + redirect: '/chat', + children: [ + { + path: '/chat/:uuid?', + name: 'Chat', + component: () => import('@/views/chat/index.vue'), + }, + ], + }, +] + +export const router = createRouter({ + history: createWebHashHistory(), + routes, + scrollBehavior: () => ({ left: 0, top: 0 }), +}) + +export async function setupRouter(app: App) { + app.use(router) + await router.isReady() +} diff --git a/src/yunzai-web-fe/src/store/index.ts b/src/yunzai-web-fe/src/store/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..5044bb1fda9cccd18345e7464b49dc28eb4df49f --- /dev/null +++ b/src/yunzai-web-fe/src/store/index.ts @@ -0,0 +1,9 @@ +import type { App } from 'vue' +import { createPinia } from 'pinia' + +export function setupStore(app: App) { + const store = createPinia() + app.use(store) +} + +export * from './modules' diff --git a/src/yunzai-web-fe/src/store/modules/app/helper.ts b/src/yunzai-web-fe/src/store/modules/app/helper.ts new file mode 100644 index 0000000000000000000000000000000000000000..f8f172cfb01f0913408a46d6bfcdc7a417a80958 --- /dev/null +++ b/src/yunzai-web-fe/src/store/modules/app/helper.ts @@ -0,0 +1,23 @@ +import { ss } from '@/utils/storage' + +const LOCAL_NAME = 'appSetting' + +export type Theme = 'light' | 'dark' | 'auto' + +export interface AppState { + siderCollapsed: boolean + theme: Theme +} + +export function defaultSetting(): AppState { + return { siderCollapsed: false, theme: 'light' } +} + +export function getLocalSetting(): AppState { + const localSetting: AppState | undefined = ss.get(LOCAL_NAME) + return { ...defaultSetting(), ...localSetting } +} + +export function setLocalSetting(setting: AppState): void { + ss.set(LOCAL_NAME, setting) +} diff --git a/src/yunzai-web-fe/src/store/modules/app/index.ts b/src/yunzai-web-fe/src/store/modules/app/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..4c300f584ec1bc632bb3c1403775dfcb0e6ce179 --- /dev/null +++ b/src/yunzai-web-fe/src/store/modules/app/index.ts @@ -0,0 +1,22 @@ +import { defineStore } from 'pinia' +import type { AppState, Theme } from './helper' +import { getLocalSetting, setLocalSetting } from './helper' + +export const useAppStore = defineStore('app-store', { + state: (): AppState => getLocalSetting(), + actions: { + setSiderCollapsed(collapsed: boolean) { + this.siderCollapsed = collapsed + this.recordState() + }, + + setTheme(theme: Theme) { + this.theme = theme + this.recordState() + }, + + recordState() { + setLocalSetting(this.$state) + }, + }, +}) diff --git a/src/yunzai-web-fe/src/store/modules/chat/helper.ts b/src/yunzai-web-fe/src/store/modules/chat/helper.ts new file mode 100644 index 0000000000000000000000000000000000000000..553e2e227f41fe37027e2b64fe2e2840020a2e9f --- /dev/null +++ b/src/yunzai-web-fe/src/store/modules/chat/helper.ts @@ -0,0 +1,17 @@ +import { ss } from '@/utils/storage' + +const LOCAL_NAME = 'chatStorage' + +export function defaultState(): Chat.ChatState { + const uuid = Date.now() + return { active: uuid, history: [{ uuid, title: 'New Chat', isEdit: false }], chat: [{ uuid, data: [] }] } +} + +export function getLocalState(): Chat.ChatState { + const localState = ss.get(LOCAL_NAME) + return localState ?? defaultState() +} + +export function setLocalState(state: Chat.ChatState) { + ss.set(LOCAL_NAME, state) +} diff --git a/src/yunzai-web-fe/src/store/modules/chat/index.ts b/src/yunzai-web-fe/src/store/modules/chat/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..540954de15bfbbc78c8a5886c2c8aab92656bee6 --- /dev/null +++ b/src/yunzai-web-fe/src/store/modules/chat/index.ts @@ -0,0 +1,189 @@ +import { defineStore } from 'pinia' +import { getLocalState, setLocalState } from './helper' +import { router } from '@/router' + +export const useChatStore = defineStore('chat-store', { + state: (): Chat.ChatState => getLocalState(), + + getters: { + getChatHistoryByCurrentActive(state: Chat.ChatState) { + const index = state.history.findIndex(item => item.uuid === state.active) + if (index !== -1) + return state.history[index] + return null + }, + + getChatByUuid(state: Chat.ChatState) { + return (uuid?: number) => { + if (uuid) + return state.chat.find(item => item.uuid === uuid)?.data ?? [] + return state.chat.find(item => item.uuid === state.active)?.data ?? [] + } + }, + }, + + actions: { + addHistory(history: Chat.History, chatData: Chat.Chat[] = []) { + this.history.unshift(history) + this.chat.unshift({ uuid: history.uuid, data: chatData }) + this.active = history.uuid + this.reloadRoute(history.uuid) + }, + + updateHistory(uuid: number, edit: Partial) { + const index = this.history.findIndex(item => item.uuid === uuid) + if (index !== -1) { + this.history[index] = { ...this.history[index], ...edit } + this.recordState() + } + }, + + async deleteHistory(index: number) { + this.history.splice(index, 1) + this.chat.splice(index, 1) + + if (this.history.length === 0) { + this.active = null + this.reloadRoute() + return + } + + if (index > 0 && index <= this.history.length) { + const uuid = this.history[index - 1].uuid + this.active = uuid + this.reloadRoute(uuid) + return + } + + if (index === 0) { + if (this.history.length > 0) { + const uuid = this.history[0].uuid + this.active = uuid + this.reloadRoute(uuid) + } + } + + if (index > this.history.length) { + const uuid = this.history[this.history.length - 1].uuid + this.active = uuid + this.reloadRoute(uuid) + } + }, + + async setActive(uuid: number) { + this.active = uuid + return await this.reloadRoute(uuid) + }, + + getChatByUuidAndIndex(uuid: number, index: number) { + if (!uuid || uuid === 0) { + if (this.chat.length) + return this.chat[0].data[index] + return null + } + const chatIndex = this.chat.findIndex(item => item.uuid === uuid) + if (chatIndex !== -1) + return this.chat[chatIndex].data[index] + return null + }, + + addChatByUuid(uuid: number, chat: Chat.Chat) { + if (!uuid || uuid === 0) { + if (this.history.length === 0) { + const uuid = Date.now() + this.history.push({ uuid, title: chat.text, isEdit: false }) + this.chat.push({ uuid, data: [chat] }) + this.active = uuid + this.recordState() + } + else { + this.chat[0].data.push(chat) + if (this.history[0].title === 'New Chat') + this.history[0].title = chat.text + this.recordState() + } + } + + const index = this.chat.findIndex(item => item.uuid === uuid) + if (index !== -1) { + this.chat[index].data.push(chat) + if (this.history[index].title === 'New Chat') + this.history[index].title = chat.text + this.recordState() + } + }, + + updateChatByUuid(uuid: number, index: number, chat: Chat.Chat) { + if (!uuid || uuid === 0) { + if (this.chat.length) { + this.chat[0].data[index] = chat + this.recordState() + } + return + } + + const chatIndex = this.chat.findIndex(item => item.uuid === uuid) + if (chatIndex !== -1) { + this.chat[chatIndex].data[index] = chat + this.recordState() + } + }, + + updateChatSomeByUuid(uuid: number, index: number, chat: Partial) { + if (!uuid || uuid === 0) { + if (this.chat.length) { + this.chat[0].data[index] = { ...this.chat[0].data[index], ...chat } + this.recordState() + } + return + } + + const chatIndex = this.chat.findIndex(item => item.uuid === uuid) + if (chatIndex !== -1) { + this.chat[chatIndex].data[index] = { ...this.chat[chatIndex].data[index], ...chat } + this.recordState() + } + }, + + deleteChatByUuid(uuid: number, index: number) { + if (!uuid || uuid === 0) { + if (this.chat.length) { + this.chat[0].data.splice(index, 1) + this.recordState() + } + return + } + + const chatIndex = this.chat.findIndex(item => item.uuid === uuid) + if (chatIndex !== -1) { + this.chat[chatIndex].data.splice(index, 1) + this.recordState() + } + }, + + clearChatByUuid(uuid: number) { + if (!uuid || uuid === 0) { + if (this.chat.length) { + this.chat[0].data = [] + this.recordState() + } + return + } + + const index = this.chat.findIndex(item => item.uuid === uuid) + if (index !== -1) { + this.chat[index].data = [] + this.recordState() + } + }, + + async reloadRoute(uuid?: number) { + this.recordState() + await router.push({ name: 'Chat', params: { uuid } }) + }, + + recordState() { + setLocalState(this.$state) + }, + }, +}) diff --git a/src/yunzai-web-fe/src/store/modules/index.ts b/src/yunzai-web-fe/src/store/modules/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..1659032ec6498f54e593466f9f5f8529080606f6 --- /dev/null +++ b/src/yunzai-web-fe/src/store/modules/index.ts @@ -0,0 +1,2 @@ +export * from './app' +export * from './chat' diff --git a/src/yunzai-web-fe/src/styles/global.less b/src/yunzai-web-fe/src/styles/global.less new file mode 100644 index 0000000000000000000000000000000000000000..cff90b80c4cb2617189f15cd52728b9999d3abdb --- /dev/null +++ b/src/yunzai-web-fe/src/styles/global.less @@ -0,0 +1,5 @@ +html, +body, +#app { + height: 100%; +} diff --git a/src/yunzai-web-fe/src/styles/lib/github-markdown.less b/src/yunzai-web-fe/src/styles/lib/github-markdown.less new file mode 100644 index 0000000000000000000000000000000000000000..c9285778a2e27731b2a4770232b63f04cf887a5a --- /dev/null +++ b/src/yunzai-web-fe/src/styles/lib/github-markdown.less @@ -0,0 +1,1102 @@ +html.dark { + .markdown-body { + color-scheme: dark; + --color-prettylights-syntax-comment: #8b949e; + --color-prettylights-syntax-constant: #79c0ff; + --color-prettylights-syntax-entity: #d2a8ff; + --color-prettylights-syntax-storage-modifier-import: #c9d1d9; + --color-prettylights-syntax-entity-tag: #7ee787; + --color-prettylights-syntax-keyword: #ff7b72; + --color-prettylights-syntax-string: #a5d6ff; + --color-prettylights-syntax-variable: #ffa657; + --color-prettylights-syntax-brackethighlighter-unmatched: #f85149; + --color-prettylights-syntax-invalid-illegal-text: #f0f6fc; + --color-prettylights-syntax-invalid-illegal-bg: #8e1519; + --color-prettylights-syntax-carriage-return-text: #f0f6fc; + --color-prettylights-syntax-carriage-return-bg: #b62324; + --color-prettylights-syntax-string-regexp: #7ee787; + --color-prettylights-syntax-markup-list: #f2cc60; + --color-prettylights-syntax-markup-heading: #1f6feb; + --color-prettylights-syntax-markup-italic: #c9d1d9; + --color-prettylights-syntax-markup-bold: #c9d1d9; + --color-prettylights-syntax-markup-deleted-text: #ffdcd7; + --color-prettylights-syntax-markup-deleted-bg: #67060c; + --color-prettylights-syntax-markup-inserted-text: #aff5b4; + --color-prettylights-syntax-markup-inserted-bg: #033a16; + --color-prettylights-syntax-markup-changed-text: #ffdfb6; + --color-prettylights-syntax-markup-changed-bg: #5a1e02; + --color-prettylights-syntax-markup-ignored-text: #c9d1d9; + --color-prettylights-syntax-markup-ignored-bg: #1158c7; + --color-prettylights-syntax-meta-diff-range: #d2a8ff; + --color-prettylights-syntax-brackethighlighter-angle: #8b949e; + --color-prettylights-syntax-sublimelinter-gutter-mark: #484f58; + --color-prettylights-syntax-constant-other-reference-link: #a5d6ff; + --color-fg-default: #c9d1d9; + --color-fg-muted: #8b949e; + --color-fg-subtle: #6e7681; + --color-canvas-default: #0d1117; + --color-canvas-subtle: #161b22; + --color-border-default: #30363d; + --color-border-muted: #21262d; + --color-neutral-muted: rgba(110,118,129,0.4); + --color-accent-fg: #58a6ff; + --color-accent-emphasis: #1f6feb; + --color-attention-subtle: rgba(187,128,9,0.15); + --color-danger-fg: #f85149; + } +} + +html { + .markdown-body { + color-scheme: light; + --color-prettylights-syntax-comment: #6e7781; + --color-prettylights-syntax-constant: #0550ae; + --color-prettylights-syntax-entity: #8250df; + --color-prettylights-syntax-storage-modifier-import: #24292f; + --color-prettylights-syntax-entity-tag: #116329; + --color-prettylights-syntax-keyword: #cf222e; + --color-prettylights-syntax-string: #0a3069; + --color-prettylights-syntax-variable: #953800; + --color-prettylights-syntax-brackethighlighter-unmatched: #82071e; + --color-prettylights-syntax-invalid-illegal-text: #f6f8fa; + --color-prettylights-syntax-invalid-illegal-bg: #82071e; + --color-prettylights-syntax-carriage-return-text: #f6f8fa; + --color-prettylights-syntax-carriage-return-bg: #cf222e; + --color-prettylights-syntax-string-regexp: #116329; + --color-prettylights-syntax-markup-list: #3b2300; + --color-prettylights-syntax-markup-heading: #0550ae; + --color-prettylights-syntax-markup-italic: #24292f; + --color-prettylights-syntax-markup-bold: #24292f; + --color-prettylights-syntax-markup-deleted-text: #82071e; + --color-prettylights-syntax-markup-deleted-bg: #ffebe9; + --color-prettylights-syntax-markup-inserted-text: #116329; + --color-prettylights-syntax-markup-inserted-bg: #dafbe1; + --color-prettylights-syntax-markup-changed-text: #953800; + --color-prettylights-syntax-markup-changed-bg: #ffd8b5; + --color-prettylights-syntax-markup-ignored-text: #eaeef2; + --color-prettylights-syntax-markup-ignored-bg: #0550ae; + --color-prettylights-syntax-meta-diff-range: #8250df; + --color-prettylights-syntax-brackethighlighter-angle: #57606a; + --color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f; + --color-prettylights-syntax-constant-other-reference-link: #0a3069; + --color-fg-default: #24292f; + --color-fg-muted: #57606a; + --color-fg-subtle: #6e7781; + --color-canvas-default: #ffffff; + --color-canvas-subtle: #f6f8fa; + --color-border-default: #d0d7de; + --color-border-muted: hsla(210,18%,87%,1); + --color-neutral-muted: rgba(175,184,193,0.2); + --color-accent-fg: #0969da; + --color-accent-emphasis: #0969da; + --color-attention-subtle: #fff8c5; + --color-danger-fg: #cf222e; + } +} + +.markdown-body { + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + margin: 0; + color: var(--color-fg-default); + background-color: var(--color-canvas-default); + font-family: -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"; + font-size: 16px; + line-height: 1.5; + word-wrap: break-word; +} + +.markdown-body .octicon { + display: inline-block; + fill: currentColor; + vertical-align: text-bottom; +} + +.markdown-body h1:hover .anchor .octicon-link:before, +.markdown-body h2:hover .anchor .octicon-link:before, +.markdown-body h3:hover .anchor .octicon-link:before, +.markdown-body h4:hover .anchor .octicon-link:before, +.markdown-body h5:hover .anchor .octicon-link:before, +.markdown-body h6:hover .anchor .octicon-link:before { + width: 16px; + height: 16px; + content: ' '; + display: inline-block; + background-color: currentColor; + -webkit-mask-image: url("data:image/svg+xml,"); + mask-image: url("data:image/svg+xml,"); +} + +.markdown-body details, +.markdown-body figcaption, +.markdown-body figure { + display: block; +} + +.markdown-body summary { + display: list-item; +} + +.markdown-body [hidden] { + display: none !important; +} + +.markdown-body a { + background-color: transparent; + color: var(--color-accent-fg); + text-decoration: none; +} + +.markdown-body abbr[title] { + border-bottom: none; + text-decoration: underline dotted; +} + +.markdown-body b, +.markdown-body strong { + font-weight: var(--base-text-weight-semibold, 600); +} + +.markdown-body dfn { + font-style: italic; +} + +.markdown-body h1 { + margin: .67em 0; + font-weight: var(--base-text-weight-semibold, 600); + padding-bottom: .3em; + font-size: 2em; + border-bottom: 1px solid var(--color-border-muted); +} + +.markdown-body mark { + background-color: var(--color-attention-subtle); + color: var(--color-fg-default); +} + +.markdown-body small { + font-size: 90%; +} + +.markdown-body sub, +.markdown-body sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +.markdown-body sub { + bottom: -0.25em; +} + +.markdown-body sup { + top: -0.5em; +} + +.markdown-body img { + border-style: none; + max-width: 100%; + box-sizing: content-box; + background-color: var(--color-canvas-default); +} + +.markdown-body code, +.markdown-body kbd, +.markdown-body pre, +.markdown-body samp { + font-family: monospace; + font-size: 1em; +} + +.markdown-body figure { + margin: 1em 40px; +} + +.markdown-body hr { + box-sizing: content-box; + overflow: hidden; + background: transparent; + border-bottom: 1px solid var(--color-border-muted); + height: .25em; + padding: 0; + margin: 24px 0; + background-color: var(--color-border-default); + border: 0; +} + +.markdown-body input { + font: inherit; + margin: 0; + overflow: visible; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +.markdown-body [type=button], +.markdown-body [type=reset], +.markdown-body [type=submit] { + -webkit-appearance: button; +} + +.markdown-body [type=checkbox], +.markdown-body [type=radio] { + box-sizing: border-box; + padding: 0; +} + +.markdown-body [type=number]::-webkit-inner-spin-button, +.markdown-body [type=number]::-webkit-outer-spin-button { + height: auto; +} + +.markdown-body [type=search]::-webkit-search-cancel-button, +.markdown-body [type=search]::-webkit-search-decoration { + -webkit-appearance: none; +} + +.markdown-body ::-webkit-input-placeholder { + color: inherit; + opacity: .54; +} + +.markdown-body ::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +.markdown-body a:hover { + text-decoration: underline; +} + +.markdown-body ::placeholder { + color: var(--color-fg-subtle); + opacity: 1; +} + +.markdown-body hr::before { + display: table; + content: ""; +} + +.markdown-body hr::after { + display: table; + clear: both; + content: ""; +} + +.markdown-body table { + border-spacing: 0; + border-collapse: collapse; + display: block; + width: max-content; + max-width: 100%; + overflow: auto; +} + +.markdown-body td, +.markdown-body th { + padding: 0; +} + +.markdown-body details summary { + cursor: pointer; +} + +.markdown-body details:not([open])>*:not(summary) { + display: none !important; +} + +.markdown-body a:focus, +.markdown-body [role=button]:focus, +.markdown-body input[type=radio]:focus, +.markdown-body input[type=checkbox]:focus { + outline: 2px solid var(--color-accent-fg); + outline-offset: -2px; + box-shadow: none; +} + +.markdown-body a:focus:not(:focus-visible), +.markdown-body [role=button]:focus:not(:focus-visible), +.markdown-body input[type=radio]:focus:not(:focus-visible), +.markdown-body input[type=checkbox]:focus:not(:focus-visible) { + outline: solid 1px transparent; +} + +.markdown-body a:focus-visible, +.markdown-body [role=button]:focus-visible, +.markdown-body input[type=radio]:focus-visible, +.markdown-body input[type=checkbox]:focus-visible { + outline: 2px solid var(--color-accent-fg); + outline-offset: -2px; + box-shadow: none; +} + +.markdown-body a:not([class]):focus, +.markdown-body a:not([class]):focus-visible, +.markdown-body input[type=radio]:focus, +.markdown-body input[type=radio]:focus-visible, +.markdown-body input[type=checkbox]:focus, +.markdown-body input[type=checkbox]:focus-visible { + outline-offset: 0; +} + +.markdown-body kbd { + display: inline-block; + padding: 3px 5px; + font: 11px ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; + line-height: 10px; + color: var(--color-fg-default); + vertical-align: middle; + background-color: var(--color-canvas-subtle); + border: solid 1px var(--color-neutral-muted); + border-bottom-color: var(--color-neutral-muted); + border-radius: 6px; + box-shadow: inset 0 -1px 0 var(--color-neutral-muted); +} + +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin-top: 24px; + margin-bottom: 16px; + font-weight: var(--base-text-weight-semibold, 600); + line-height: 1.25; +} + +.markdown-body h2 { + font-weight: var(--base-text-weight-semibold, 600); + padding-bottom: .3em; + font-size: 1.5em; + border-bottom: 1px solid var(--color-border-muted); +} + +.markdown-body h3 { + font-weight: var(--base-text-weight-semibold, 600); + font-size: 1.25em; +} + +.markdown-body h4 { + font-weight: var(--base-text-weight-semibold, 600); + font-size: 1em; +} + +.markdown-body h5 { + font-weight: var(--base-text-weight-semibold, 600); + font-size: .875em; +} + +.markdown-body h6 { + font-weight: var(--base-text-weight-semibold, 600); + font-size: .85em; + color: var(--color-fg-muted); +} + +.markdown-body p { + margin-top: 0; + margin-bottom: 10px; +} + +.markdown-body blockquote { + margin: 0; + padding: 0 1em; + color: var(--color-fg-muted); + border-left: .25em solid var(--color-border-default); +} + +.markdown-body ul, +.markdown-body ol { + margin-top: 0; + margin-bottom: 0; + padding-left: 2em; +} + +.markdown-body ol ol, +.markdown-body ul ol { + list-style-type: lower-roman; +} + +.markdown-body ul ul ol, +.markdown-body ul ol ol, +.markdown-body ol ul ol, +.markdown-body ol ol ol { + list-style-type: lower-alpha; +} + +.markdown-body dd { + margin-left: 0; +} + +.markdown-body tt, +.markdown-body code, +.markdown-body samp { + font-family: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; + font-size: 12px; +} + +.markdown-body pre { + margin-top: 0; + margin-bottom: 0; + font-family: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; + font-size: 12px; + word-wrap: normal; +} + +.markdown-body .octicon { + display: inline-block; + overflow: visible !important; + vertical-align: text-bottom; + fill: currentColor; +} + +.markdown-body input::-webkit-outer-spin-button, +.markdown-body input::-webkit-inner-spin-button { + margin: 0; + -webkit-appearance: none; + appearance: none; +} + +.markdown-body::before { + display: table; + content: ""; +} + +.markdown-body::after { + display: table; + clear: both; + content: ""; +} + +.markdown-body>*:first-child { + margin-top: 0 !important; +} + +.markdown-body>*:last-child { + margin-bottom: 0 !important; +} + +.markdown-body a:not([href]) { + color: inherit; + text-decoration: none; +} + +.markdown-body .absent { + color: var(--color-danger-fg); +} + +.markdown-body .anchor { + float: left; + padding-right: 4px; + margin-left: -20px; + line-height: 1; +} + +.markdown-body .anchor:focus { + outline: none; +} + +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre, +.markdown-body details { + margin-top: 0; + margin-bottom: 16px; +} + +.markdown-body blockquote>:first-child { + margin-top: 0; +} + +.markdown-body blockquote>:last-child { + margin-bottom: 0; +} + +.markdown-body h1 .octicon-link, +.markdown-body h2 .octicon-link, +.markdown-body h3 .octicon-link, +.markdown-body h4 .octicon-link, +.markdown-body h5 .octicon-link, +.markdown-body h6 .octicon-link { + color: var(--color-fg-default); + vertical-align: middle; + visibility: hidden; +} + +.markdown-body h1:hover .anchor, +.markdown-body h2:hover .anchor, +.markdown-body h3:hover .anchor, +.markdown-body h4:hover .anchor, +.markdown-body h5:hover .anchor, +.markdown-body h6:hover .anchor { + text-decoration: none; +} + +.markdown-body h1:hover .anchor .octicon-link, +.markdown-body h2:hover .anchor .octicon-link, +.markdown-body h3:hover .anchor .octicon-link, +.markdown-body h4:hover .anchor .octicon-link, +.markdown-body h5:hover .anchor .octicon-link, +.markdown-body h6:hover .anchor .octicon-link { + visibility: visible; +} + +.markdown-body h1 tt, +.markdown-body h1 code, +.markdown-body h2 tt, +.markdown-body h2 code, +.markdown-body h3 tt, +.markdown-body h3 code, +.markdown-body h4 tt, +.markdown-body h4 code, +.markdown-body h5 tt, +.markdown-body h5 code, +.markdown-body h6 tt, +.markdown-body h6 code { + padding: 0 .2em; + font-size: inherit; +} + +.markdown-body summary h1, +.markdown-body summary h2, +.markdown-body summary h3, +.markdown-body summary h4, +.markdown-body summary h5, +.markdown-body summary h6 { + display: inline-block; +} + +.markdown-body summary h1 .anchor, +.markdown-body summary h2 .anchor, +.markdown-body summary h3 .anchor, +.markdown-body summary h4 .anchor, +.markdown-body summary h5 .anchor, +.markdown-body summary h6 .anchor { + margin-left: -40px; +} + +.markdown-body summary h1, +.markdown-body summary h2 { + padding-bottom: 0; + border-bottom: 0; +} + +.markdown-body ul.no-list, +.markdown-body ol.no-list { + padding: 0; + list-style-type: none; +} + +.markdown-body ol[type=a] { + list-style-type: lower-alpha; +} + +.markdown-body ol[type=A] { + list-style-type: upper-alpha; +} + +.markdown-body ol[type=i] { + list-style-type: lower-roman; +} + +.markdown-body ol[type=I] { + list-style-type: upper-roman; +} + +.markdown-body ol[type="1"] { + list-style-type: decimal; +} + +.markdown-body div>ol:not([type]) { + list-style-type: decimal; +} + +.markdown-body ul ul, +.markdown-body ul ol, +.markdown-body ol ol, +.markdown-body ol ul { + margin-top: 0; + margin-bottom: 0; +} + +.markdown-body li>p { + margin-top: 16px; +} + +.markdown-body li+li { + margin-top: .25em; +} + +.markdown-body dl { + padding: 0; +} + +.markdown-body dl dt { + padding: 0; + margin-top: 16px; + font-size: 1em; + font-style: italic; + font-weight: var(--base-text-weight-semibold, 600); +} + +.markdown-body dl dd { + padding: 0 16px; + margin-bottom: 16px; +} + +.markdown-body table th { + font-weight: var(--base-text-weight-semibold, 600); +} + +.markdown-body table th, +.markdown-body table td { + padding: 6px 13px; + border: 1px solid var(--color-border-default); +} + +.markdown-body table tr { + background-color: var(--color-canvas-default); + border-top: 1px solid var(--color-border-muted); +} + +.markdown-body table tr:nth-child(2n) { + background-color: var(--color-canvas-subtle); +} + +.markdown-body table img { + background-color: transparent; +} + +.markdown-body img[align=right] { + padding-left: 20px; +} + +.markdown-body img[align=left] { + padding-right: 20px; +} + +.markdown-body .emoji { + max-width: none; + vertical-align: text-top; + background-color: transparent; +} + +.markdown-body span.frame { + display: block; + overflow: hidden; +} + +.markdown-body span.frame>span { + display: block; + float: left; + width: auto; + padding: 7px; + margin: 13px 0 0; + overflow: hidden; + border: 1px solid var(--color-border-default); +} + +.markdown-body span.frame span img { + display: block; + float: left; +} + +.markdown-body span.frame span span { + display: block; + padding: 5px 0 0; + clear: both; + color: var(--color-fg-default); +} + +.markdown-body span.align-center { + display: block; + overflow: hidden; + clear: both; +} + +.markdown-body span.align-center>span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align: center; +} + +.markdown-body span.align-center span img { + margin: 0 auto; + text-align: center; +} + +.markdown-body span.align-right { + display: block; + overflow: hidden; + clear: both; +} + +.markdown-body span.align-right>span { + display: block; + margin: 13px 0 0; + overflow: hidden; + text-align: right; +} + +.markdown-body span.align-right span img { + margin: 0; + text-align: right; +} + +.markdown-body span.float-left { + display: block; + float: left; + margin-right: 13px; + overflow: hidden; +} + +.markdown-body span.float-left span { + margin: 13px 0 0; +} + +.markdown-body span.float-right { + display: block; + float: right; + margin-left: 13px; + overflow: hidden; +} + +.markdown-body span.float-right>span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align: right; +} + +.markdown-body code, +.markdown-body tt { + padding: .2em .4em; + margin: 0; + font-size: 85%; + white-space: break-spaces; + background-color: var(--color-neutral-muted); + border-radius: 6px; +} + +.markdown-body code br, +.markdown-body tt br { + display: none; +} + +.markdown-body del code { + text-decoration: inherit; +} + +.markdown-body samp { + font-size: 85%; +} + +.markdown-body pre code { + font-size: 100%; +} + +.markdown-body pre>code { + padding: 0; + margin: 0; + word-break: normal; + white-space: pre; + background: transparent; + border: 0; +} + +.markdown-body .highlight { + margin-bottom: 16px; +} + +.markdown-body .highlight pre { + margin-bottom: 0; + word-break: normal; +} + +.markdown-body .highlight pre, +.markdown-body pre { + padding: 16px; + overflow: auto; + font-size: 85%; + line-height: 1.45; + background-color: var(--color-canvas-subtle); + border-radius: 6px; +} + +.markdown-body pre code, +.markdown-body pre tt { + display: inline; + max-width: auto; + padding: 0; + margin: 0; + overflow: visible; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; +} + +.markdown-body .csv-data td, +.markdown-body .csv-data th { + padding: 5px; + overflow: hidden; + font-size: 12px; + line-height: 1; + text-align: left; + white-space: nowrap; +} + +.markdown-body .csv-data .blob-num { + padding: 10px 8px 9px; + text-align: right; + background: var(--color-canvas-default); + border: 0; +} + +.markdown-body .csv-data tr { + border-top: 0; +} + +.markdown-body .csv-data th { + font-weight: var(--base-text-weight-semibold, 600); + background: var(--color-canvas-subtle); + border-top: 0; +} + +.markdown-body [data-footnote-ref]::before { + content: "["; +} + +.markdown-body [data-footnote-ref]::after { + content: "]"; +} + +.markdown-body .footnotes { + font-size: 12px; + color: var(--color-fg-muted); + border-top: 1px solid var(--color-border-default); +} + +.markdown-body .footnotes ol { + padding-left: 16px; +} + +.markdown-body .footnotes ol ul { + display: inline-block; + padding-left: 16px; + margin-top: 16px; +} + +.markdown-body .footnotes li { + position: relative; +} + +.markdown-body .footnotes li:target::before { + position: absolute; + top: -8px; + right: -8px; + bottom: -8px; + left: -24px; + pointer-events: none; + content: ""; + border: 2px solid var(--color-accent-emphasis); + border-radius: 6px; +} + +.markdown-body .footnotes li:target { + color: var(--color-fg-default); +} + +.markdown-body .footnotes .data-footnote-backref g-emoji { + font-family: monospace; +} + +.markdown-body .pl-c { + color: var(--color-prettylights-syntax-comment); +} + +.markdown-body .pl-c1, +.markdown-body .pl-s .pl-v { + color: var(--color-prettylights-syntax-constant); +} + +.markdown-body .pl-e, +.markdown-body .pl-en { + color: var(--color-prettylights-syntax-entity); +} + +.markdown-body .pl-smi, +.markdown-body .pl-s .pl-s1 { + color: var(--color-prettylights-syntax-storage-modifier-import); +} + +.markdown-body .pl-ent { + color: var(--color-prettylights-syntax-entity-tag); +} + +.markdown-body .pl-k { + color: var(--color-prettylights-syntax-keyword); +} + +.markdown-body .pl-s, +.markdown-body .pl-pds, +.markdown-body .pl-s .pl-pse .pl-s1, +.markdown-body .pl-sr, +.markdown-body .pl-sr .pl-cce, +.markdown-body .pl-sr .pl-sre, +.markdown-body .pl-sr .pl-sra { + color: var(--color-prettylights-syntax-string); +} + +.markdown-body .pl-v, +.markdown-body .pl-smw { + color: var(--color-prettylights-syntax-variable); +} + +.markdown-body .pl-bu { + color: var(--color-prettylights-syntax-brackethighlighter-unmatched); +} + +.markdown-body .pl-ii { + color: var(--color-prettylights-syntax-invalid-illegal-text); + background-color: var(--color-prettylights-syntax-invalid-illegal-bg); +} + +.markdown-body .pl-c2 { + color: var(--color-prettylights-syntax-carriage-return-text); + background-color: var(--color-prettylights-syntax-carriage-return-bg); +} + +.markdown-body .pl-sr .pl-cce { + font-weight: bold; + color: var(--color-prettylights-syntax-string-regexp); +} + +.markdown-body .pl-ml { + color: var(--color-prettylights-syntax-markup-list); +} + +.markdown-body .pl-mh, +.markdown-body .pl-mh .pl-en, +.markdown-body .pl-ms { + font-weight: bold; + color: var(--color-prettylights-syntax-markup-heading); +} + +.markdown-body .pl-mi { + font-style: italic; + color: var(--color-prettylights-syntax-markup-italic); +} + +.markdown-body .pl-mb { + font-weight: bold; + color: var(--color-prettylights-syntax-markup-bold); +} + +.markdown-body .pl-md { + color: var(--color-prettylights-syntax-markup-deleted-text); + background-color: var(--color-prettylights-syntax-markup-deleted-bg); +} + +.markdown-body .pl-mi1 { + color: var(--color-prettylights-syntax-markup-inserted-text); + background-color: var(--color-prettylights-syntax-markup-inserted-bg); +} + +.markdown-body .pl-mc { + color: var(--color-prettylights-syntax-markup-changed-text); + background-color: var(--color-prettylights-syntax-markup-changed-bg); +} + +.markdown-body .pl-mi2 { + color: var(--color-prettylights-syntax-markup-ignored-text); + background-color: var(--color-prettylights-syntax-markup-ignored-bg); +} + +.markdown-body .pl-mdr { + font-weight: bold; + color: var(--color-prettylights-syntax-meta-diff-range); +} + +.markdown-body .pl-ba { + color: var(--color-prettylights-syntax-brackethighlighter-angle); +} + +.markdown-body .pl-sg { + color: var(--color-prettylights-syntax-sublimelinter-gutter-mark); +} + +.markdown-body .pl-corl { + text-decoration: underline; + color: var(--color-prettylights-syntax-constant-other-reference-link); +} + +.markdown-body g-emoji { + display: inline-block; + min-width: 1ch; + font-family: "Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; + font-size: 1em; + font-style: normal !important; + font-weight: var(--base-text-weight-normal, 400); + line-height: 1; + vertical-align: -0.075em; +} + +.markdown-body g-emoji img { + width: 1em; + height: 1em; +} + +.markdown-body .task-list-item { + list-style-type: none; +} + +.markdown-body .task-list-item label { + font-weight: var(--base-text-weight-normal, 400); +} + +.markdown-body .task-list-item.enabled label { + cursor: pointer; +} + +.markdown-body .task-list-item+.task-list-item { + margin-top: 4px; +} + +.markdown-body .task-list-item .handle { + display: none; +} + +.markdown-body .task-list-item-checkbox { + margin: 0 .2em .25em -1.4em; + vertical-align: middle; +} + +.markdown-body .contains-task-list:dir(rtl) .task-list-item-checkbox { + margin: 0 -1.6em .25em .2em; +} + +.markdown-body .contains-task-list { + position: relative; +} + +.markdown-body .contains-task-list:hover .task-list-item-convert-container, +.markdown-body .contains-task-list:focus-within .task-list-item-convert-container { + display: block; + width: auto; + height: 24px; + overflow: visible; + clip: auto; +} + +.markdown-body ::-webkit-calendar-picker-indicator { + filter: invert(50%); +} diff --git a/src/yunzai-web-fe/src/styles/lib/highlight.less b/src/yunzai-web-fe/src/styles/lib/highlight.less new file mode 100644 index 0000000000000000000000000000000000000000..e3a72c3958770c8234afbd4deb7926cb1a14b133 --- /dev/null +++ b/src/yunzai-web-fe/src/styles/lib/highlight.less @@ -0,0 +1,203 @@ +html.dark { + pre code.hljs { + display: block; + overflow-x: auto; + padding: 1em + } + + code.hljs { + padding: 3px 5px + } + + .hljs { + color: #abb2bf; + background: #282c34 + } + + .hljs-keyword, + .hljs-operator, + .hljs-pattern-match { + color: #f92672 + } + + .hljs-function, + .hljs-pattern-match .hljs-constructor { + color: #61aeee + } + + .hljs-function .hljs-params { + color: #a6e22e + } + + .hljs-function .hljs-params .hljs-typing { + color: #fd971f + } + + .hljs-module-access .hljs-module { + color: #7e57c2 + } + + .hljs-constructor { + color: #e2b93d + } + + .hljs-constructor .hljs-string { + color: #9ccc65 + } + + .hljs-comment, + .hljs-quote { + color: #b18eb1; + font-style: italic + } + + .hljs-doctag, + .hljs-formula { + color: #c678dd + } + + .hljs-deletion, + .hljs-name, + .hljs-section, + .hljs-selector-tag, + .hljs-subst { + color: #e06c75 + } + + .hljs-literal { + color: #56b6c2 + } + + .hljs-addition, + .hljs-attribute, + .hljs-meta .hljs-string, + .hljs-regexp, + .hljs-string { + color: #98c379 + } + + .hljs-built_in, + .hljs-class .hljs-title, + .hljs-title.class_ { + color: #e6c07b + } + + .hljs-attr, + .hljs-number, + .hljs-selector-attr, + .hljs-selector-class, + .hljs-selector-pseudo, + .hljs-template-variable, + .hljs-type, + .hljs-variable { + color: #d19a66 + } + + .hljs-bullet, + .hljs-link, + .hljs-meta, + .hljs-selector-id, + .hljs-symbol, + .hljs-title { + color: #61aeee + } + + .hljs-emphasis { + font-style: italic + } + + .hljs-strong { + font-weight: 700 + } + + .hljs-link { + text-decoration: underline + } +} + +html { + pre code.hljs { + display: block; + overflow-x: auto; + padding: 1em + } + + code.hljs { + padding: 3px 5px + } + + .hljs { + color: #383a42; + background: #fafafa + } + + .hljs-comment, + .hljs-quote { + color: #a0a1a7; + font-style: italic + } + + .hljs-doctag, + .hljs-formula, + .hljs-keyword { + color: #a626a4 + } + + .hljs-deletion, + .hljs-name, + .hljs-section, + .hljs-selector-tag, + .hljs-subst { + color: #e45649 + } + + .hljs-literal { + color: #0184bb + } + + .hljs-addition, + .hljs-attribute, + .hljs-meta .hljs-string, + .hljs-regexp, + .hljs-string { + color: #50a14f + } + + .hljs-attr, + .hljs-number, + .hljs-selector-attr, + .hljs-selector-class, + .hljs-selector-pseudo, + .hljs-template-variable, + .hljs-type, + .hljs-variable { + color: #986801 + } + + .hljs-bullet, + .hljs-link, + .hljs-meta, + .hljs-selector-id, + .hljs-symbol, + .hljs-title { + color: #4078f2 + } + + .hljs-built_in, + .hljs-class .hljs-title, + .hljs-title.class_ { + color: #c18401 + } + + .hljs-emphasis { + font-style: italic + } + + .hljs-strong { + font-weight: 700 + } + + .hljs-link { + text-decoration: underline + } +} diff --git a/src/yunzai-web-fe/src/styles/lib/tailwind.css b/src/yunzai-web-fe/src/styles/lib/tailwind.css new file mode 100644 index 0000000000000000000000000000000000000000..b5c61c956711f981a41e95f7fcf0038436cfbb22 --- /dev/null +++ b/src/yunzai-web-fe/src/styles/lib/tailwind.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/src/yunzai-web-fe/src/typings/chat.d.ts b/src/yunzai-web-fe/src/typings/chat.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..c0b80c9632654fcd2b53db474d4dd2ed1f71a9c9 --- /dev/null +++ b/src/yunzai-web-fe/src/typings/chat.d.ts @@ -0,0 +1,45 @@ +declare namespace Chat { + + interface Chat { + dateTime: string + text: string + inversion?: boolean + error?: boolean + loading?: boolean + conversationOptions?: ConversationRequest | null + requestOptions: { prompt: string; options?: ConversationRequest | null } + } + + interface History { + title: string + isEdit: boolean + uuid: number + } + + interface ChatState { + active: number | null + history: History[] + chat: { uuid: number; data: Chat[] }[] + } + + interface ConversationRequest { + conversationId?: string + parentMessageId?: string + } + + interface ConversationResponse { + conversationId: string + detail: { + choices: { finish_reason: string; index: number; logprobs: any; text: string }[] + created: number + id: string + model: string + object: string + usage: { completion_tokens: number; prompt_tokens: number; total_tokens: number } + } + id: string + parentMessageId: string + role: string + text: string + } +} diff --git a/src/yunzai-web-fe/src/typings/env.d.ts b/src/yunzai-web-fe/src/typings/env.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..54408d72c9ee49f4be12c0ee99de1877d9891cca --- /dev/null +++ b/src/yunzai-web-fe/src/typings/env.d.ts @@ -0,0 +1,7 @@ +/// + +interface ImportMetaEnv { + readonly VITE_GLOB_API_URL: string; + readonly VITE_GLOB_API_TIMEOUT: string; + readonly VITE_APP_API_BASE_URL: string; +} diff --git a/src/yunzai-web-fe/src/typings/global.d.ts b/src/yunzai-web-fe/src/typings/global.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..bf8ef323c8195ea5d3897c611831f2a9d2434583 --- /dev/null +++ b/src/yunzai-web-fe/src/typings/global.d.ts @@ -0,0 +1,6 @@ +interface Window { + $loadingBar?: import('naive-ui').LoadingBarProviderInst; + $dialog?: import('naive-ui').DialogProviderInst; + $message?: import('naive-ui').MessageProviderInst; + $notification?: import('naive-ui').NotificationProviderInst; +} diff --git a/src/yunzai-web-fe/src/utils/crypto/index.ts b/src/yunzai-web-fe/src/utils/crypto/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6c57c8d352fc4c6d5077976fef4053c1214a4b1a --- /dev/null +++ b/src/yunzai-web-fe/src/utils/crypto/index.ts @@ -0,0 +1,18 @@ +import CryptoJS from 'crypto-js' + +const CryptoSecret = '__CRYPTO_SECRET__' + +export function enCrypto(data: any) { + const str = JSON.stringify(data) + return CryptoJS.AES.encrypt(str, CryptoSecret).toString() +} + +export function deCrypto(data: string) { + const bytes = CryptoJS.AES.decrypt(data, CryptoSecret) + const str = bytes.toString(CryptoJS.enc.Utf8) + + if (str) + return JSON.parse(str) + + return null +} diff --git a/src/yunzai-web-fe/src/utils/format/index.ts b/src/yunzai-web-fe/src/utils/format/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..8539b5c71d94265892154ebf3f6e0b7dc3574719 --- /dev/null +++ b/src/yunzai-web-fe/src/utils/format/index.ts @@ -0,0 +1,27 @@ +// 转义 HTML 字符 +export function encodeHTML(source: string) { + return source + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, ''') +} + +// 判断是否为代码块 +export function includeCode(text: string | null | undefined) { + const regexp = /^(?:\s{4}|\t).+/gm + return !!(text?.includes(' = ') || text?.match(regexp)) +} + +// 复制文本 +export function copyText(text: string) { + const input = document.createElement('input') + input.setAttribute('readonly', 'readonly') + input.setAttribute('value', text) + document.body.appendChild(input) + input.select() + if (document.execCommand('copy')) + document.execCommand('copy') + document.body.removeChild(input) +} diff --git a/src/yunzai-web-fe/src/utils/is/index.ts b/src/yunzai-web-fe/src/utils/is/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..27a8230a12e94ad05df1fe5e466446587f6d26d0 --- /dev/null +++ b/src/yunzai-web-fe/src/utils/is/index.ts @@ -0,0 +1,55 @@ +export function isNumber(value: T | unknown): value is number { + return Object.prototype.toString.call(value) === '[object Number]' +} + +export function isString(value: T | unknown): value is string { + return Object.prototype.toString.call(value) === '[object String]' +} + +export function isBoolean(value: T | unknown): value is boolean { + return Object.prototype.toString.call(value) === '[object Boolean]' +} + +export function isNull(value: T | unknown): value is null { + return Object.prototype.toString.call(value) === '[object Null]' +} + +export function isUndefined(value: T | unknown): value is undefined { + return Object.prototype.toString.call(value) === '[object Undefined]' +} + +export function isObject(value: T | unknown): value is object { + return Object.prototype.toString.call(value) === '[object Object]' +} + +export function isArray(value: T | unknown): value is T { + return Object.prototype.toString.call(value) === '[object Array]' +} + +export function isFunction any | void | never>(value: T | unknown): value is T { + return Object.prototype.toString.call(value) === '[object Function]' +} + +export function isDate(value: T | unknown): value is T { + return Object.prototype.toString.call(value) === '[object Date]' +} + +export function isRegExp(value: T | unknown): value is T { + return Object.prototype.toString.call(value) === '[object RegExp]' +} + +export function isPromise>(value: T | unknown): value is T { + return Object.prototype.toString.call(value) === '[object Promise]' +} + +export function isSet>(value: T | unknown): value is T { + return Object.prototype.toString.call(value) === '[object Set]' +} + +export function isMap>(value: T | unknown): value is T { + return Object.prototype.toString.call(value) === '[object Map]' +} + +export function isFile(value: T | unknown): value is T { + return Object.prototype.toString.call(value) === '[object File]' +} diff --git a/src/yunzai-web-fe/src/utils/request/axios.ts b/src/yunzai-web-fe/src/utils/request/axios.ts new file mode 100644 index 0000000000000000000000000000000000000000..06f993c2af9e3c28020fceb678cf2e3dee97fad6 --- /dev/null +++ b/src/yunzai-web-fe/src/utils/request/axios.ts @@ -0,0 +1,29 @@ +import axios, { type AxiosResponse } from 'axios' + +const service = axios.create({ + baseURL: import.meta.env.VITE_GLOB_API_URL, + timeout: !isNaN(+import.meta.env.VITE_GLOB_API_TIMEOUT) ? Number(import.meta.env.VITE_GLOB_API_TIMEOUT) : 60 * 1000, +}) + +service.interceptors.request.use( + (config) => { + return config + }, + (error) => { + return Promise.reject(error.response) + }, +) + +service.interceptors.response.use( + (response: AxiosResponse): AxiosResponse => { + if (response.status === 200) + return response + + throw new Error(response.status.toString()) + }, + (error) => { + return Promise.reject(error) + }, +) + +export default service diff --git a/src/yunzai-web-fe/src/utils/request/index.ts b/src/yunzai-web-fe/src/utils/request/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..4fc36e74bb10d38b9bc54d05465a230411af5bfa --- /dev/null +++ b/src/yunzai-web-fe/src/utils/request/index.ts @@ -0,0 +1,76 @@ +import type { AxiosProgressEvent, AxiosResponse, GenericAbortSignal } from 'axios' +import request from './axios' + +export interface HttpOption { + url: string + data?: any + method?: string + headers?: any + onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void + signal?: GenericAbortSignal + beforeRequest?: () => void + afterRequest?: () => void +} + +export interface Response { + data: T + message: string | null + status: string +} + +function http( + { url, data, method, headers, onDownloadProgress, signal, beforeRequest, afterRequest }: HttpOption, +) { + const successHandler = (res: AxiosResponse>) => { + if (res.data.status === 'Success' || typeof res.data === 'string') + return res.data + + return Promise.reject(res.data) + } + + const failHandler = (error: Response) => { + afterRequest?.() + throw new Error(error?.message || 'Error') + } + + beforeRequest?.() + + method = method || 'GET' + + const params = Object.assign(typeof data === 'function' ? data() : data ?? {}, {}) + + return method === 'GET' + ? request.get(url, { params, signal, onDownloadProgress }).then(successHandler, failHandler) + : request.post(url, params, { headers, signal, onDownloadProgress }).then(successHandler, failHandler) +} + +export function get( + { url, data, method = 'GET', onDownloadProgress, signal, beforeRequest, afterRequest }: HttpOption, +): Promise> { + return http({ + url, + method, + data, + onDownloadProgress, + signal, + beforeRequest, + afterRequest, + }) +} + +export function post( + { url, data, method = 'POST', headers, onDownloadProgress, signal, beforeRequest, afterRequest }: HttpOption, +): Promise> { + return http({ + url, + method, + data, + headers, + onDownloadProgress, + signal, + beforeRequest, + afterRequest, + }) +} + +export default post diff --git a/src/yunzai-web-fe/src/utils/storage/index.ts b/src/yunzai-web-fe/src/utils/storage/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..87c2c0ade988e634b2f78cb5088e22d5281905ec --- /dev/null +++ b/src/yunzai-web-fe/src/utils/storage/index.ts @@ -0,0 +1 @@ +export * from './local' diff --git a/src/yunzai-web-fe/src/utils/storage/local.ts b/src/yunzai-web-fe/src/utils/storage/local.ts new file mode 100644 index 0000000000000000000000000000000000000000..215d22c2b3b00b4ab6892b4a81a1ce3ba96f5d91 --- /dev/null +++ b/src/yunzai-web-fe/src/utils/storage/local.ts @@ -0,0 +1,70 @@ +import { deCrypto, enCrypto } from '../crypto' + +interface StorageData { + data: T + expire: number | null +} + +export function createLocalStorage(options?: { expire?: number | null; crypto?: boolean }) { + const DEFAULT_CACHE_TIME = 60 * 60 * 24 * 7 + + const { expire, crypto } = Object.assign( + { + expire: DEFAULT_CACHE_TIME, + crypto: true, + }, + options, + ) + + function set(key: string, data: T) { + const storageData: StorageData = { + data, + expire: expire !== null ? new Date().getTime() + expire * 1000 : null, + } + + const json = crypto ? enCrypto(storageData) : JSON.stringify(storageData) + window.localStorage.setItem(key, json) + } + + function get(key: string) { + const json = window.localStorage.getItem(key) + if (json) { + let storageData: StorageData | null = null + + try { + storageData = crypto ? deCrypto(json) : JSON.parse(json) + } + catch { + // Prevent failure + } + + if (storageData) { + const { data, expire } = storageData + if (expire === null || expire >= Date.now()) + return data + } + + remove(key) + return null + } + } + + function remove(key: string) { + window.localStorage.removeItem(key) + } + + function clear() { + window.localStorage.clear() + } + + return { + set, + get, + remove, + clear, + } +} + +export const ls = createLocalStorage() + +export const ss = createLocalStorage({ expire: null, crypto: false }) diff --git a/src/yunzai-web-fe/src/views/chat/components/Message/Avatar.vue b/src/yunzai-web-fe/src/views/chat/components/Message/Avatar.vue new file mode 100644 index 0000000000000000000000000000000000000000..b978869632bf2afb06cf4b4c8db3cf1fe9f59c64 --- /dev/null +++ b/src/yunzai-web-fe/src/views/chat/components/Message/Avatar.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/yunzai-web-fe/src/views/chat/components/Message/Text.vue b/src/yunzai-web-fe/src/views/chat/components/Message/Text.vue new file mode 100644 index 0000000000000000000000000000000000000000..247a5ceb405c8974798240a3a28d8a23c3218088 --- /dev/null +++ b/src/yunzai-web-fe/src/views/chat/components/Message/Text.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/yunzai-web-fe/src/views/chat/components/Message/index.vue b/src/yunzai-web-fe/src/views/chat/components/Message/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..36b0a740b27a13fe534d8ad9a719940ef1c4bdef --- /dev/null +++ b/src/yunzai-web-fe/src/views/chat/components/Message/index.vue @@ -0,0 +1,102 @@ + + + diff --git a/src/yunzai-web-fe/src/views/chat/components/Message/style.less b/src/yunzai-web-fe/src/views/chat/components/Message/style.less new file mode 100644 index 0000000000000000000000000000000000000000..a7850bea3de837b321a28374259757ef5cc4b4a0 --- /dev/null +++ b/src/yunzai-web-fe/src/views/chat/components/Message/style.less @@ -0,0 +1,38 @@ +.markdown-body { + background-color: transparent; + font-size: 14px; + + p { + white-space: pre-wrap; + } + + ol { + list-style-type: decimal; + } + + ul { + list-style-type: disc; + } + + pre code, + pre tt { + line-height: 1.65; + } + + .highlight pre, + pre { + background-color: #fff; + } + + code.hljs{ + padding: 0; + } +} + +html.dark { + + .highlight pre, + pre { + background-color: #282c34; + } +} diff --git a/src/yunzai-web-fe/src/views/chat/components/index.ts b/src/yunzai-web-fe/src/views/chat/components/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..e5b21df458f481af30b8c0b3b61be1a394e19f89 --- /dev/null +++ b/src/yunzai-web-fe/src/views/chat/components/index.ts @@ -0,0 +1,3 @@ +import Message from './Message/index.vue' + +export { Message } diff --git a/src/yunzai-web-fe/src/views/chat/hooks/useChat.ts b/src/yunzai-web-fe/src/views/chat/hooks/useChat.ts new file mode 100644 index 0000000000000000000000000000000000000000..1eb9fcb205370addd5c9b321086ad046dad5f0f2 --- /dev/null +++ b/src/yunzai-web-fe/src/views/chat/hooks/useChat.ts @@ -0,0 +1,28 @@ +import { useChatStore } from '@/store' + +export function useChat() { + const chatStore = useChatStore() + + const getChatByUuidAndIndex = (uuid: number, index: number) => { + return chatStore.getChatByUuidAndIndex(uuid, index) + } + + const addChat = (uuid: number, chat: Chat.Chat) => { + chatStore.addChatByUuid(uuid, chat) + } + + const updateChat = (uuid: number, index: number, chat: Chat.Chat) => { + chatStore.updateChatByUuid(uuid, index, chat) + } + + const updateChatSome = (uuid: number, index: number, chat: Partial) => { + chatStore.updateChatSomeByUuid(uuid, index, chat) + } + + return { + addChat, + updateChat, + updateChatSome, + getChatByUuidAndIndex, + } +} diff --git a/src/yunzai-web-fe/src/views/chat/hooks/useScroll.ts b/src/yunzai-web-fe/src/views/chat/hooks/useScroll.ts new file mode 100644 index 0000000000000000000000000000000000000000..009698883e1c9befa973aecf350e9018f72b578e --- /dev/null +++ b/src/yunzai-web-fe/src/views/chat/hooks/useScroll.ts @@ -0,0 +1,32 @@ +import type { Ref } from 'vue' +import { nextTick, ref } from 'vue' + +type ScrollElement = HTMLDivElement | null + +interface ScrollReturn { + scrollRef: Ref + scrollToBottom: () => Promise + scrollToTop: () => Promise +} + +export function useScroll(): ScrollReturn { + const scrollRef = ref(null) + + const scrollToBottom = async () => { + await nextTick() + if (scrollRef.value) + scrollRef.value.scrollTop = scrollRef.value.scrollHeight + } + + const scrollToTop = async () => { + await nextTick() + if (scrollRef.value) + scrollRef.value.scrollTop = 0 + } + + return { + scrollRef, + scrollToBottom, + scrollToTop, + } +} diff --git a/src/yunzai-web-fe/src/views/chat/index.vue b/src/yunzai-web-fe/src/views/chat/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..1253fad98d5996978db829304403d1db9733c83d --- /dev/null +++ b/src/yunzai-web-fe/src/views/chat/index.vue @@ -0,0 +1,414 @@ + + + diff --git a/src/yunzai-web-fe/src/views/chat/layout/Layout.vue b/src/yunzai-web-fe/src/views/chat/layout/Layout.vue new file mode 100644 index 0000000000000000000000000000000000000000..3da4654e274af7e5b0d9629efe49eec428fd570c --- /dev/null +++ b/src/yunzai-web-fe/src/views/chat/layout/Layout.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/yunzai-web-fe/src/views/chat/layout/header/index.vue b/src/yunzai-web-fe/src/views/chat/layout/header/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..731f5a785343daeebb91e39fba2a0d5e069b4acc --- /dev/null +++ b/src/yunzai-web-fe/src/views/chat/layout/header/index.vue @@ -0,0 +1,55 @@ + + + diff --git a/src/yunzai-web-fe/src/views/chat/layout/index.ts b/src/yunzai-web-fe/src/views/chat/layout/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6f94c82c0347f303665e24f4cd410d63518db2a2 --- /dev/null +++ b/src/yunzai-web-fe/src/views/chat/layout/index.ts @@ -0,0 +1,3 @@ +import ChatLayout from './Layout.vue' + +export { ChatLayout } diff --git a/src/yunzai-web-fe/src/views/chat/layout/sider/Footer.vue b/src/yunzai-web-fe/src/views/chat/layout/sider/Footer.vue new file mode 100644 index 0000000000000000000000000000000000000000..6fb489d9d7bea10b6cac08d72d574ba01d0653fc --- /dev/null +++ b/src/yunzai-web-fe/src/views/chat/layout/sider/Footer.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/yunzai-web-fe/src/views/chat/layout/sider/List.vue b/src/yunzai-web-fe/src/views/chat/layout/sider/List.vue new file mode 100644 index 0000000000000000000000000000000000000000..16da3f77fa8ad1f34864366bde5bd6961d70954d --- /dev/null +++ b/src/yunzai-web-fe/src/views/chat/layout/sider/List.vue @@ -0,0 +1,99 @@ + + + diff --git a/src/yunzai-web-fe/src/views/chat/layout/sider/index.vue b/src/yunzai-web-fe/src/views/chat/layout/sider/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..b8f47c07b19de8a56ba245580ae55d3eed07e536 --- /dev/null +++ b/src/yunzai-web-fe/src/views/chat/layout/sider/index.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/yunzai-web-fe/start.sh b/src/yunzai-web-fe/start.sh new file mode 100644 index 0000000000000000000000000000000000000000..8440c6ce4d3d4353d6499eb62bce0394ddb8b7d0 --- /dev/null +++ b/src/yunzai-web-fe/start.sh @@ -0,0 +1,11 @@ + +cd ./service +nohup pnpm start > service.log & +echo "Start service complete!" + + +cd .. +echo "" > front.log +nohup pnpm dev > front.log & +echo "Start front complete!" +tail -f front.log diff --git a/src/yunzai-web-fe/tailwind.config.js b/src/yunzai-web-fe/tailwind.config.js new file mode 100644 index 0000000000000000000000000000000000000000..66c6c725daee5e2295eea9574283c5ae0af3cbea --- /dev/null +++ b/src/yunzai-web-fe/tailwind.config.js @@ -0,0 +1,22 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: 'class', + content: [ + './index.html', + './src/**/*.{vue,js,ts,jsx,tsx}', + ], + theme: { + extend: { + animation: { + blink: 'blink 1.2s infinite steps(1, start)', + }, + keyframes: { + blink: { + '0%, 100%': { 'background-color': 'currentColor' }, + '50%': { 'background-color': 'transparent' }, + }, + }, + }, + }, + plugins: [], +} diff --git a/src/yunzai-web-fe/tsconfig.json b/src/yunzai-web-fe/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..2d80f4e16d10716425cd113275dda1aaef0efbd3 --- /dev/null +++ b/src/yunzai-web-fe/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "module": "ESNext", + "target": "ESNext", + "lib": ["DOM", "ESNext"], + "strict": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "jsx": "preserve", + "moduleResolution": "node", + "resolveJsonModule": true, + "noUnusedLocals": true, + "strictNullChecks": true, + "forceConsistentCasingInFileNames": true, + "paths": { + "@/*": ["./src/*"] + }, + "types": ["vite/client", "node", "naive-ui/volar", "web-bluetooth"] + }, + "exclude": ["node_modules", "dist", "service"] +} diff --git a/src/yunzai-web-fe/vite.config.ts b/src/yunzai-web-fe/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..e056d0557a6297940aafacadf77e123897bce203 --- /dev/null +++ b/src/yunzai-web-fe/vite.config.ts @@ -0,0 +1,35 @@ +import path from 'path' +import { defineConfig, loadEnv } from 'vite' +import vue from '@vitejs/plugin-vue' + +export default defineConfig((env) => { + const viteEnv = loadEnv(env.mode, process.cwd()) as unknown as ImportMetaEnv + + return { + resolve: { + alias: { + '@': path.resolve(process.cwd(), 'src'), + }, + }, + plugins: [vue()], + server: { + host: '0.0.0.0', + port: 1002, + open: false, + proxy: { + '/api': { + target: viteEnv.VITE_APP_API_BASE_URL, + changeOrigin: true, // 允许跨域 + rewrite: path => path.replace('/api/', '/'), + }, + }, + }, + build: { + reportCompressedSize: false, + sourcemap: false, + commonjsOptions: { + ignoreTryCatch: false, + }, + }, + } +})