diff --git a/.gitignore b/.gitignore index 525719c..2309865 100644 --- a/.gitignore +++ b/.gitignore @@ -1,188 +1,28 @@ -# Created by .ignore support plugin (hsz.mobi) -### Python template -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# Custom -model_small/ - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - -# 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/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*,cover -.hypothesis/ - -# Translations -*.mo -*.pot - -# Django stuff: +# Logs +logs *.log -local_settings.py +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* -# Flask stuff: -instance/ -.webassets-cache +node_modules +dist +dist-ssr +*.local -# Scrapy stuff: -.scrapy +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# IPython Notebook -.ipynb_checkpoints - -# pyenv -.python-version - -# celery beat schedule file -celerybeat-schedule - -# dotenv -.env - -# virtualenv -venv/ -ENV/ - -# Spyder project settings -.spyderproject - -# Rope project settings -.ropeproject -### VirtualEnv template -# Virtualenv -# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ -[Bb]in -[Ii]nclude -[Ll]ib -[Ll]ib64 -[Ll]ocal -[Ss]cripts -pyvenv.cfg -.venv -pip-selfcheck.json - -### JetBrains template -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf - -# AWS User-specific -.idea/**/aws.xml - -# Generated files -.idea/**/contentModel.xml - -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml -.idea/**/dbnavigator.xml - -# Gradle -.idea/**/gradle.xml -.idea/**/libraries - -# Gradle and Maven with auto-import -# When using Gradle or Maven with auto-import, you should exclude module files, -# since they will be recreated, and may cause churn. Uncomment if using -# auto-import. -# .idea/artifacts -# .idea/compiler.xml -# .idea/jarRepositories.xml -# .idea/modules.xml -# .idea/*.iml -# .idea/modules -# *.iml -# *.ipr - -# CMake -cmake-build-*/ - -# Mongo Explorer plugin -.idea/**/mongoSettings.xml - -# File-based project format -*.iws - -# IntelliJ -out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# SonarLint plugin -.idea/sonarlint/ - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -# Editor-based Rest Client -.idea/httpRequests - -# Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser - -# idea folder, uncomment if you don't need it -# .idea \ No newline at end of file +# Etc +.routify +build \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 7f9be7c..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/jarvis.iml b/.idea/jarvis.iml deleted file mode 100644 index b55f7bb..0000000 --- a/.idea/jarvis.iml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index b1d0f0b..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index fbd2bfc..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..61343e9 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "svelte.svelte-vscode", + "tauri-apps.tauri-vscode", + "rust-lang.rust-analyzer" + ] +} diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index e72bfdd..0000000 --- a/LICENSE.txt +++ /dev/null @@ -1,674 +0,0 @@ - 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 -. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index b655b5b..0000000 --- a/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Kesha v3.0 very early (aka Jarvis update) -Simple Voice Assistant made as an experiment using [Silero](https://github.com/snakers4/silero-models) & [Vosk](https://pypi.org/project/vosk/). -
Later on [Picovoice Porcupine Wake Word Detection](https://picovoice.ai/platform/porcupine/) & [ChatGPT](https://chat.openai.com/) was added. - -![image](https://i.pinimg.com/originals/63/e9/b7/63e9b72b983793f64bffc07fd14a0e62.jpg) - -`The code has NOT been polished and is provided "as is". There are a lot of code that are redundant and there are tons of improvements that can be made.` - -# Installation -First, install the requirements, the `requirements.txt` file is just an output of `pip freeze` from my test venv 'k.
-Second, check `config.py` and set required values (api key, device index).
-Next, run the `main.py` script and Voilà, as simple as that.

- -And don't forget to put models of Vosk to main folder.
-You can get the latest from the [official website.](https://alphacephei.com/vosk/models) -
The one I was using is `small`. -
p.s. If you don't understand how to install or where to put the Vosk model, I've made a [screenshot](https://i.imgur.com/N3bu2lC.png) for you. - -# Python version -I was using Python `3.8.3`, but it should work on any newer version. - -# ToDo -- Адекватная архитектура кода, собрать всё и переписать from the ground up. -- Задержка воспроизведения звука на основе реальной длительности .wav файла (прогружать при запуске?) -- Speech to intent? -- Отключать self listening protection во время воспроизведения с наушников. -- Указание из списка или по имени будет реализовано позже. - -# Author -(2022) Abraham Tugalov \ No newline at end of file diff --git a/commands.yaml b/commands.yaml deleted file mode 100644 index dc191dc..0000000 --- a/commands.yaml +++ /dev/null @@ -1,157 +0,0 @@ -gaming_mode_off: -- рабочий режим -- вернись в рабочий режим -- переключись на компьютер -- обратно на компьютер -- отключи игровой режим -- выйди из игрового режима -- вернись на компьютер -- выход с игрового режима -- рабочее пространство -- вернись в игровой режим -- выключи игровой режим -gaming_mode_on: -- включи игровой режим -- перейди в игровой режим -- я хочу поиграть -- переключись на телевизор -music: -- давай музыку -- музыка -- яндекс музыка -- включи музыку -- открой музыку -- послушаем музыку -- хочу музыку -- врубай музло -- включи что-то послушать -- давай что-то послушаем -music_next: -- следующий трек -- следующая мелодия -- следующая песня -- переключи трек -- переключи музыку -- переключи мелодию -- переключи песню -- следующая музыка -music_off: -- выключи музыку -- отруби музыку -- убери музыку -- отключи музыку -- закрой музыку -- останови музыку -- хватит музыки -music_prev: -- предыдущая музыка -- предыдущий трек -- предыдущая мелодия -- предыдущая песня -- верни трек -- верни мелодию -- верни песню -- верни прошлый трек -- верни прошлую мелодию -- верни прошлую песню -- верни прошлую музыку -- верни то что играло -- давай предыдущий трек -- переключи музыку обратно -- переключи на прошлый трек -- переключи на прошлую мелодию -- переключи на прошлую песню -music_save: -- сохрани трек -- мне нравится трек -- сохрани песню -- мне нравится песня -- добавь трек в избранное -- добавь песню в избранное -- запомни мелодию -- запомни трек -- запомни песню -- добавь мелодию в избранное -- сохрани то что сейчас играет -- добавь то что сейчас играет в избранное -- лайкни трек -- лайкни мелодию -- лайкни песню -'off': -- выключись -- вырубись -- завершить работу -- закройся -- отключись -- заверши свою работу -- на сегодня хватит -- выгрузи себя из памяти -- ты мне надоел -- пора спать -open_browser: -- открой браузер -- запусти браузер -- открой гугл хром -- гугл хром -open_google: -- открой гугл -- гугл -- запусти гугл -open_youtube: -- открой ютуб -- ютуб -- запусти ютуб -sound_off: -- выключи звук -- беззвучный режим -- режим без звука -- отключи звук -sound_on: -- включи звук -- режим со звуком -- верни звук -stupid: -- ты дурак -- ты дебил -- ты глупый -- ты тупой -switch_to_dynamics: -- переключи на динамики -- включи динамики -- перейди на динамики -- давай звук в динамики -- давай звук на динамики -- переключи звук в динамики -- переключи звук на динамики -- переключи на колонки -- включи колонки -- перейди на колонки -- давай звук в колонки -- давай звук на колонки -- переключи звук в колонки -- переключи звук на колонки -switch_to_headphones: -- переключи на наушники -- включи наушники -- перейди на наушники -- давай звук в наушники -- давай звук на наушники -- переключи звук в наушники -- переключи звук на наушники -- переключи на кракены -- включи кракены -- перейди на кракены -- давай звук в кракены -- давай звук на кракены -- переключи звук в кракены -- переключи звук на кракены -thanks: -- спасибо -- молодец -- респект -- ты супер -- отличная работа -- ты крут -- ты большой молодец -- ты реально крут -- ты афигенный \ No newline at end of file diff --git a/config.py b/config.py deleted file mode 100644 index cac005f..0000000 --- a/config.py +++ /dev/null @@ -1,24 +0,0 @@ -from dotenv import load_dotenv -import os - -# Find .env file with os variables -load_dotenv("dev.env") - -# Конфигурация -VA_NAME = 'Jarvis' -VA_VER = "3.0" -VA_ALIAS = ('джарвис',) -VA_TBR = ('скажи', 'покажи', 'ответь', 'произнеси', 'расскажи', 'сколько', 'слушай') - -# ID микрофона (можете просто менять ID пока при запуске не отобразится нужный) -# -1 это стандартное записывающее устройство -MICROPHONE_INDEX = -1 - -# Путь к браузеру Google Chrome -CHROME_PATH = 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s' - -# Токен Picovoice -PICOVOICE_TOKEN = os.getenv('PICOVOICE_TOKEN') - -# Токен OpenAI -OPENAI_TOKEN = os.getenv('OPENAI_TOKEN') diff --git a/custom-commands/Next music.ahk b/custom-commands/Next music.ahk deleted file mode 100644 index e0c9a12..0000000 --- a/custom-commands/Next music.ahk +++ /dev/null @@ -1,19 +0,0 @@ -#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. -; #Warn ; Enable warnings to assist with detecting common errors. -SendMode Input ; Recommended for new scripts due to its superior speed and reliability. -SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. - -Process, Exist, Y.Music.exe -If ErrorLevel = 0 -{ -; APP IS NOT RUNNING -} -Else -{ -; APP IS RUNNING -;MsgBox, Already running -Run C:\Users\Abraham\Documents\WinStoreApps\YandexMusic -sleep 100 -Send, {Ctrl down}f{Ctrl up} -} -Return \ No newline at end of file diff --git a/custom-commands/Next music.exe b/custom-commands/Next music.exe deleted file mode 100644 index ceed05b..0000000 Binary files a/custom-commands/Next music.exe and /dev/null differ diff --git a/custom-commands/Prev music.ahk b/custom-commands/Prev music.ahk deleted file mode 100644 index f86c2c6..0000000 --- a/custom-commands/Prev music.ahk +++ /dev/null @@ -1,19 +0,0 @@ -#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. -; #Warn ; Enable warnings to assist with detecting common errors. -SendMode Input ; Recommended for new scripts due to its superior speed and reliability. -SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. - -Process, Exist, Y.Music.exe -If ErrorLevel = 0 -{ -; APP IS NOT RUNNING -} -Else -{ -; APP IS RUNNING -;MsgBox, Already running -Run C:\Users\Abraham\Documents\WinStoreApps\YandexMusic -sleep 100 -Send, {Ctrl down}b{Ctrl up} -} -Return \ No newline at end of file diff --git a/custom-commands/Prev music.exe b/custom-commands/Prev music.exe deleted file mode 100644 index 420d246..0000000 Binary files a/custom-commands/Prev music.exe and /dev/null differ diff --git a/custom-commands/Run music.ahk b/custom-commands/Run music.ahk deleted file mode 100644 index 5b231a8..0000000 --- a/custom-commands/Run music.ahk +++ /dev/null @@ -1,41 +0,0 @@ -#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. -; #Warn ; Enable warnings to assist with detecting common errors. -SendMode Input ; Recommended for new scripts due to its superior speed and reliability. -SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. - -Process, Exist, Y.Music.exe -If ErrorLevel = 0 -{ -; APP IS NOT RUNNING -; Run https://music.yandex.ru/home -Run C:\Users\Abraham\Documents\WinStoreApps\YandexMusic -; Autoplay -sleep 3000 -Send, {Ctrl down}p{Ctrl up} -sleep 10 - -; Open full -Loop, 4 -{ -Send, {Tab} -sleep 10 -} - -Send, {Enter} -sleep 1500 - -Loop, 7 -{ -Send, {Down} -sleep 50 -} - -sleep 1000 -Send, {Enter} -} -Else -{ -; APP IS RUNNING -;MsgBox, Already running -} -Return \ No newline at end of file diff --git a/custom-commands/Run music.exe b/custom-commands/Run music.exe deleted file mode 100644 index e021034..0000000 Binary files a/custom-commands/Run music.exe and /dev/null differ diff --git a/custom-commands/Save music.ahk b/custom-commands/Save music.ahk deleted file mode 100644 index 3cb0e6d..0000000 --- a/custom-commands/Save music.ahk +++ /dev/null @@ -1,19 +0,0 @@ -#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. -; #Warn ; Enable warnings to assist with detecting common errors. -SendMode Input ; Recommended for new scripts due to its superior speed and reliability. -SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. - -Process, Exist, Y.Music.exe -If ErrorLevel = 0 -{ -; APP IS NOT RUNNING -} -Else -{ -; APP IS RUNNING -;MsgBox, Already running -Run C:\Users\Abraham\Documents\WinStoreApps\YandexMusic -sleep 100 -Send, {Ctrl down}l{Ctrl up} -} -Return \ No newline at end of file diff --git a/custom-commands/Save music.exe b/custom-commands/Save music.exe deleted file mode 100644 index 31e0147..0000000 Binary files a/custom-commands/Save music.exe and /dev/null differ diff --git a/custom-commands/Stop music.ahk b/custom-commands/Stop music.ahk deleted file mode 100644 index ff950ea..0000000 --- a/custom-commands/Stop music.ahk +++ /dev/null @@ -1,6 +0,0 @@ -#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. -; #Warn ; Enable warnings to assist with detecting common errors. -SendMode Input ; Recommended for new scripts due to its superior speed and reliability. -SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. - -Process, Close, Y.Music.exe \ No newline at end of file diff --git a/custom-commands/Stop music.exe b/custom-commands/Stop music.exe deleted file mode 100644 index e8a5d2e..0000000 Binary files a/custom-commands/Stop music.exe and /dev/null differ diff --git a/custom-commands/Switch back to workspace.ahk b/custom-commands/Switch back to workspace.ahk deleted file mode 100644 index c9ca23e..0000000 --- a/custom-commands/Switch back to workspace.ahk +++ /dev/null @@ -1,16 +0,0 @@ -#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. -; #Warn ; Enable warnings to assist with detecting common errors. -SendMode Input ; Recommended for new scripts due to its superior speed and reliability. -SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. - -; Step 1. Close steam. -WinKill, AHK_exe Steam.exe -Process, Close, Steam.exe - -; Step 2. Switch monitor profile. -RunWait C:\MonitorProfileSwitcher\MonitorSwitcher.exe -load:"C:\Users\Abraham\AppData\Roaming\MonitorSwitcher\Profiles\Workspace.xml" - -Sleep, 7000 - -; Step 3. Switch audio device to Luna Edifier. -Run, nircmd setdefaultsounddevice "Luna Edifier" 1 \ No newline at end of file diff --git a/custom-commands/Switch back to workspace.exe b/custom-commands/Switch back to workspace.exe deleted file mode 100644 index f1164ee..0000000 Binary files a/custom-commands/Switch back to workspace.exe and /dev/null differ diff --git a/custom-commands/Switch to gaming mode.ahk b/custom-commands/Switch to gaming mode.ahk deleted file mode 100644 index e8f1967..0000000 --- a/custom-commands/Switch to gaming mode.ahk +++ /dev/null @@ -1,19 +0,0 @@ -#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. -; #Warn ; Enable warnings to assist with detecting common errors. -SendMode Input ; Recommended for new scripts due to its superior speed and reliability. -SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. - -; Step 1. Close steam. -WinKill, AHK_exe Steam.exe -Process, Close, Steam.exe - -; Step 2. Switch monitor profile. -RunWait C:\MonitorProfileSwitcher\MonitorSwitcher.exe -load:"C:\Users\Abraham\AppData\Roaming\MonitorSwitcher\Profiles\Gaming.xml" - -Sleep, 7000 - -; Step 3. Switch audio device to LG TV. -Run, nircmd setdefaultsounddevice "LG TV" 1 - -; Step 4. Run Steam big picture. -Run, steam://open/bigpicture \ No newline at end of file diff --git a/custom-commands/Switch to gaming mode.exe b/custom-commands/Switch to gaming mode.exe deleted file mode 100644 index 9f5a84d..0000000 Binary files a/custom-commands/Switch to gaming mode.exe and /dev/null differ diff --git a/custom-commands/Switch to headphones.ahk b/custom-commands/Switch to headphones.ahk deleted file mode 100644 index d05b68b..0000000 --- a/custom-commands/Switch to headphones.ahk +++ /dev/null @@ -1,6 +0,0 @@ -#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. -; #Warn ; Enable warnings to assist with detecting common errors. -SendMode Input ; Recommended for new scripts due to its superior speed and reliability. -SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. - -Run, nircmd setdefaultsounddevice "Razer Kraken" 1 \ No newline at end of file diff --git a/custom-commands/Switch to headphones.exe b/custom-commands/Switch to headphones.exe deleted file mode 100644 index c506d8d..0000000 Binary files a/custom-commands/Switch to headphones.exe and /dev/null differ diff --git a/custom-commands/nircmd.exe b/custom-commands/nircmd.exe deleted file mode 100644 index e606a83..0000000 Binary files a/custom-commands/nircmd.exe and /dev/null differ diff --git a/dev.env b/dev.env deleted file mode 100644 index 4f357f2..0000000 --- a/dev.env +++ /dev/null @@ -1,2 +0,0 @@ -PICOVOICE_TOKEN=<тут ключ-picovoice> -OPENAI_TOKEN=<тут ключ-openai> \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..6e53357 --- /dev/null +++ b/index.html @@ -0,0 +1,14 @@ + + + + + + + Tauri + Svelte + TS + + + +
+ + + diff --git a/main.py b/main.py deleted file mode 100644 index 7204464..0000000 --- a/main.py +++ /dev/null @@ -1,316 +0,0 @@ -import datetime -import json -import os -import queue -import random -import struct -import subprocess -import sys -import time -from ctypes import POINTER, cast - -import openai -from openai import error -import pvporcupine -import simpleaudio as sa -import vosk -import yaml -from comtypes import CLSCTX_ALL -from fuzzywuzzy import fuzz -from pvrecorder import PvRecorder -from pycaw.pycaw import ( - AudioUtilities, - IAudioEndpointVolume -) -from rich import print - -import config -import tts - -# some consts -CDIR = os.getcwd() -VA_CMD_LIST = yaml.safe_load( - open('commands.yaml', 'rt', encoding='utf8'), -) - -# ChatGPT vars -system_message = {"role": "system", "content": "Ты голосовой ассистент из железного человека."} -message_log = [system_message] - -# init openai -openai.api_key = config.OPENAI_TOKEN - -# PORCUPINE -porcupine = pvporcupine.create( - access_key=config.PICOVOICE_TOKEN, - keywords=['jarvis'], - sensitivities=[1] -) -# print(pvporcupine.KEYWORDS) - -# VOSK -model = vosk.Model("model_small") -samplerate = 16000 -device = config.MICROPHONE_INDEX -kaldi_rec = vosk.KaldiRecognizer(model, samplerate) -q = queue.Queue() - - -def gpt_answer(): - global message_log - - model_engine = "gpt-3.5-turbo" - max_tokens = 256 # default 1024 - try: - response = openai.ChatCompletion.create( - model=model_engine, - messages=message_log, - max_tokens=max_tokens, - temperature=0.7, - top_p=1, - stop=None - ) - except (error.TryAgain, error.ServiceUnavailableError): - return "ChatGPT перегружен!" - except openai.OpenAIError as ex: - # если ошибка - это макс длина контекста, то возвращаем ответ с очищенным контекстом - if ex.code == "context_length_exceeded": - message_log = [system_message, message_log[-1]] - return gpt_answer() - else: - return "OpenAI токен не рабочий." - - # Find the first response from the chatbot that has text in it (some responses may not have text) - for choice in response.choices: - if "text" in choice: - return choice.text - - # If no response with text is found, return the first response's content (which may be empty) - return response.choices[0].message.content - - -# play(f'{CDIR}\\sound\\ok{random.choice([1, 2, 3, 4])}.wav') -def play(phrase, wait_done=True): - global recorder - filename = f"{CDIR}\\sound\\" - - if phrase == "greet": # for py 3.8 - filename += f"greet{random.choice([1, 2, 3])}.wav" - elif phrase == "ok": - filename += f"ok{random.choice([1, 2, 3])}.wav" - elif phrase == "not_found": - filename += "not_found.wav" - elif phrase == "thanks": - filename += "thanks.wav" - elif phrase == "run": - filename += "run.wav" - elif phrase == "stupid": - filename += "stupid.wav" - elif phrase == "ready": - filename += "ready.wav" - elif phrase == "off": - filename += "off.wav" - - if wait_done: - recorder.stop() - - wave_obj = sa.WaveObject.from_wave_file(filename) - play_obj = wave_obj.play() - - if wait_done: - play_obj.wait_done() - # time.sleep((len(wave_obj.audio_data) / wave_obj.sample_rate) + 0.5) - # print("END") - # time.sleep(0.5) - recorder.start() - - -def q_callback(indata, frames, time, status): - if status: - print(status, file=sys.stderr) - q.put(bytes(indata)) - - -def va_respond(voice: str): - global recorder, message_log, first_request - print(f"Распознано: {voice}") - - cmd = recognize_cmd(filter_cmd(voice)) - - print(cmd) - - if len(cmd['cmd'].strip()) <= 0: - return False - elif cmd['percent'] < 70 or cmd['cmd'] not in VA_CMD_LIST.keys(): - # play("not_found") - # tts.va_speak("Что?") - if fuzz.ratio(voice.join(voice.split()[:1]).strip(), "скажи") > 75: - - message_log.append({"role": "user", "content": voice}) - response = gpt_answer() - message_log.append({"role": "assistant", "content": response}) - - recorder.stop() - tts.va_speak(response) - time.sleep(0.5) - recorder.start() - return False - else: - play("not_found") - time.sleep(1) - - return False - else: - execute_cmd(cmd['cmd'], voice) - return True - - -def filter_cmd(raw_voice: str): - cmd = raw_voice - - for x in config.VA_ALIAS: - cmd = cmd.replace(x, "").strip() - - for x in config.VA_TBR: - cmd = cmd.replace(x, "").strip() - - return cmd - - -def recognize_cmd(cmd: str): - rc = {'cmd': '', 'percent': 0} - for c, v in VA_CMD_LIST.items(): - - for x in v: - vrt = fuzz.ratio(cmd, x) - if vrt > rc['percent']: - rc['cmd'] = c - rc['percent'] = vrt - - return rc - - -def execute_cmd(cmd: str, voice: str): - if cmd == 'open_browser': - subprocess.Popen([f'{CDIR}\\custom-commands\\Run browser.exe']) - play("ok") - - elif cmd == 'open_youtube': - subprocess.Popen([f'{CDIR}\\custom-commands\\Run youtube.exe']) - play("ok") - - elif cmd == 'open_google': - subprocess.Popen([f'{CDIR}\\custom-commands\\Run google.exe']) - play("ok") - - elif cmd == 'music': - subprocess.Popen([f'{CDIR}\\custom-commands\\Run music.exe']) - play("ok") - - elif cmd == 'music_off': - subprocess.Popen([f'{CDIR}\\custom-commands\\Stop music.exe']) - time.sleep(0.2) - play("ok") - - elif cmd == 'music_save': - subprocess.Popen([f'{CDIR}\\custom-commands\\Save music.exe']) - time.sleep(0.2) - play("ok") - - elif cmd == 'music_next': - subprocess.Popen([f'{CDIR}\\custom-commands\\Next music.exe']) - time.sleep(0.2) - play("ok") - - elif cmd == 'music_prev': - subprocess.Popen([f'{CDIR}\\custom-commands\\Prev music.exe']) - time.sleep(0.2) - play("ok") - - elif cmd == 'sound_off': - play("ok", True) - - devices = AudioUtilities.GetSpeakers() - interface = devices.Activate(IAudioEndpointVolume._iid_, CLSCTX_ALL, None) - volume = cast(interface, POINTER(IAudioEndpointVolume)) - volume.SetMute(1, None) - - elif cmd == 'sound_on': - devices = AudioUtilities.GetSpeakers() - interface = devices.Activate(IAudioEndpointVolume._iid_, CLSCTX_ALL, None) - volume = cast(interface, POINTER(IAudioEndpointVolume)) - volume.SetMute(0, None) - - play("ok") - - elif cmd == 'thanks': - play("thanks") - - elif cmd == 'stupid': - play("stupid") - - elif cmd == 'gaming_mode_on': - play("ok") - subprocess.check_call([f'{CDIR}\\custom-commands\\Switch to gaming mode.exe']) - play("ready") - - elif cmd == 'gaming_mode_off': - play("ok") - subprocess.check_call([f'{CDIR}\\custom-commands\\Switch back to workspace.exe']) - play("ready") - - elif cmd == 'switch_to_headphones': - play("ok") - subprocess.check_call([f'{CDIR}\\custom-commands\\Switch to headphones.exe']) - time.sleep(0.5) - play("ready") - - elif cmd == 'switch_to_dynamics': - play("ok") - subprocess.check_call([f'{CDIR}\\custom-commands\\Switch to dynamics.exe']) - time.sleep(0.5) - play("ready") - - elif cmd == 'off': - play("off", True) - - porcupine.delete() - exit(0) - - -# `-1` is the default input audio device. -recorder = PvRecorder(device_index=config.MICROPHONE_INDEX, frame_length=porcupine.frame_length) -recorder.start() -print('Using device: %s' % recorder.selected_device) - -print(f"Jarvis (v3.0) начал свою работу ...") -play("run") -time.sleep(0.5) - -ltc = time.time() - 1000 - -while True: - try: - pcm = recorder.read() - keyword_index = porcupine.process(pcm) - - if keyword_index >= 0: - recorder.stop() - play("greet", True) - print("Yes, sir.") - recorder.start() # prevent self recording - ltc = time.time() - - while time.time() - ltc <= 10: - pcm = recorder.read() - sp = struct.pack("h" * len(pcm), *pcm) - - if kaldi_rec.AcceptWaveform(sp): - if va_respond(json.loads(kaldi_rec.Result())["text"]): - ltc = time.time() - - break - - except Exception as err: - print(f"Unexpected {err=}, {type(err)=}") - raise diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..983ca0a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2825 @@ +{ + "name": "jarvis-app", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "jarvis-app", + "version": "0.0.0", + "dependencies": { + "@svelteuidev/composables": "^0.11.1", + "@svelteuidev/core": "^0.11.1", + "@svelteuidev/motion": "^0.11.1", + "@tauri-apps/api": "^1.2.0", + "howler": "^2.2.3", + "radix-icons-svelte": "^1.2.1", + "worker-timers": "^7.0.64" + }, + "devDependencies": { + "@roxi/routify": "^2.18.11", + "@sveltejs/vite-plugin-svelte": "^2.0.0", + "@tauri-apps/cli": "^1.2.2", + "@tsconfig/svelte": "^3.0.0", + "@types/node": "^18.7.10", + "sass": "^1.62.0", + "svelte": "^3.54.0", + "svelte-check": "^3.0.0", + "svelte-preprocess": "^5.0.0", + "tslib": "^2.4.1", + "typescript": "^4.9.5", + "vite": "^4.2.1", + "vite-tsconfig-paths": "^4.2.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.17.tgz", + "integrity": "sha512-E6VAZwN7diCa3labs0GYvhEPL2M94WLF8A+czO8hfjREXxba8Ng7nM5VxV+9ihNXIY1iQO1XxUU4P7hbqbICxg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.17.tgz", + "integrity": "sha512-jaJ5IlmaDLFPNttv0ofcwy/cfeY4bh/n705Tgh+eLObbGtQBK3EPAu+CzL95JVE4nFAliyrnEu0d32Q5foavqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.17.tgz", + "integrity": "sha512-446zpfJ3nioMC7ASvJB1pszHVskkw4u/9Eu8s5yvvsSDTzYh4p4ZIRj0DznSl3FBF0Z/mZfrKXTtt0QCoFmoHA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.17.tgz", + "integrity": "sha512-m/gwyiBwH3jqfUabtq3GH31otL/0sE0l34XKpSIqR7NjQ/XHQ3lpmQHLHbG8AHTGCw8Ao059GvV08MS0bhFIJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.17.tgz", + "integrity": "sha512-4utIrsX9IykrqYaXR8ob9Ha2hAY2qLc6ohJ8c0CN1DR8yWeMrTgYFjgdeQ9LIoTOfLetXjuCu5TRPHT9yKYJVg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.17.tgz", + "integrity": "sha512-4PxjQII/9ppOrpEwzQ1b0pXCsFLqy77i0GaHodrmzH9zq2/NEhHMAMJkJ635Ns4fyJPFOlHMz4AsklIyRqFZWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.17.tgz", + "integrity": "sha512-lQRS+4sW5S3P1sv0z2Ym807qMDfkmdhUYX30GRBURtLTrJOPDpoU0kI6pVz1hz3U0+YQ0tXGS9YWveQjUewAJw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.17.tgz", + "integrity": "sha512-biDs7bjGdOdcmIk6xU426VgdRUpGg39Yz6sT9Xp23aq+IEHDb/u5cbmu/pAANpDB4rZpY/2USPhCA+w9t3roQg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.17.tgz", + "integrity": "sha512-2+pwLx0whKY1/Vqt8lyzStyda1v0qjJ5INWIe+d8+1onqQxHLLi3yr5bAa4gvbzhZqBztifYEu8hh1La5+7sUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.17.tgz", + "integrity": "sha512-IBTTv8X60dYo6P2t23sSUYym8fGfMAiuv7PzJ+0LcdAndZRzvke+wTVxJeCq4WgjppkOpndL04gMZIFvwoU34Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.17.tgz", + "integrity": "sha512-WVMBtcDpATjaGfWfp6u9dANIqmU9r37SY8wgAivuKmgKHE+bWSuv0qXEFt/p3qXQYxJIGXQQv6hHcm7iWhWjiw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.17.tgz", + "integrity": "sha512-2kYCGh8589ZYnY031FgMLy0kmE4VoGdvfJkxLdxP4HJvWNXpyLhjOvxVsYjYZ6awqY4bgLR9tpdYyStgZZhi2A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.17.tgz", + "integrity": "sha512-KIdG5jdAEeAKogfyMTcszRxy3OPbZhq0PPsW4iKKcdlbk3YE4miKznxV2YOSmiK/hfOZ+lqHri3v8eecT2ATwQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.17.tgz", + "integrity": "sha512-Cj6uWLBR5LWhcD/2Lkfg2NrkVsNb2sFM5aVEfumKB2vYetkA/9Uyc1jVoxLZ0a38sUhFk4JOVKH0aVdPbjZQeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.17.tgz", + "integrity": "sha512-lK+SffWIr0XsFf7E0srBjhpkdFVJf3HEgXCwzkm69kNbRar8MhezFpkIwpk0qo2IOQL4JE4mJPJI8AbRPLbuOQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.17.tgz", + "integrity": "sha512-XcSGTQcWFQS2jx3lZtQi7cQmDYLrpLRyz1Ns1DzZCtn898cWfm5Icx/DEWNcTU+T+tyPV89RQtDnI7qL2PObPg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.17.tgz", + "integrity": "sha512-RNLCDmLP5kCWAJR+ItLM3cHxzXRTe4N00TQyQiimq+lyqVqZWGPAvcyfUBM0isE79eEZhIuGN09rAz8EL5KdLA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.17.tgz", + "integrity": "sha512-PAXswI5+cQq3Pann7FNdcpSUrhrql3wKjj3gVkmuz6OHhqqYxKvi6GgRBoaHjaG22HV/ZZEgF9TlS+9ftHVigA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.17.tgz", + "integrity": "sha512-V63egsWKnx/4V0FMYkr9NXWrKTB5qFftKGKuZKFIrAkO/7EWLFnbBZNM1CvJ6Sis+XBdPws2YQSHF1Gqf1oj/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.17.tgz", + "integrity": "sha512-YtUXLdVnd6YBSYlZODjWzH+KzbaubV0YVd6UxSfoFfa5PtNJNaW+1i+Hcmjpg2nEe0YXUCNF5bkKy1NnBv1y7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.17.tgz", + "integrity": "sha512-yczSLRbDdReCO74Yfc5tKG0izzm+lPMYyO1fFTcn0QNwnKmc3K+HdxZWLGKg4pZVte7XVgcFku7TIZNbWEJdeQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.17.tgz", + "integrity": "sha512-FNZw7H3aqhF9OyRQbDDnzUApDXfC1N6fgBhkqEO2jvYCJ+DxMTfZVqg3AX0R1khg1wHTBRD5SdcibSJ+XF6bFg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@floating-ui/core": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz", + "integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==" + }, + "node_modules/@floating-ui/dom": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.2.tgz", + "integrity": "sha512-z1DnEa7F3d8Fm/eXSbii8UEGpcjZGkQaYYUI0WpEVgD3vBfebDW8j/3ysusxonuMexoigA+A3b/fYH7sEqiwyg==", + "dependencies": { + "@floating-ui/core": "^0.7.2" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@roxi/routify": { + "version": "2.18.11", + "resolved": "https://registry.npmjs.org/@roxi/routify/-/routify-2.18.11.tgz", + "integrity": "sha512-7G1pPSYaEXZ+NoDbIvZRblI/tFDNrbPKs0K4+KApOn1Rb3YGzAu5o2DU1v2BTG4F+0Ro0CS8FmSfvoDiYMimUQ==", + "dev": true, + "dependencies": { + "@roxi/ssr": "^0.2.1", + "@types/node": "^12.20.52", + "chalk": "^4.1.2", + "cheap-watch": "^1.0.4", + "commander": "^7.2.0", + "configent": "^2.2.0", + "esm": "^3.2.25", + "fs-extra": "^9.1.0", + "log-symbols": "^3.0.0", + "picomatch": "^2.3.1", + "rollup-pluginutils": "^2.8.2" + }, + "bin": { + "routify": "plugins/cli.js" + } + }, + "node_modules/@roxi/routify/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "node_modules/@roxi/ssr": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@roxi/ssr/-/ssr-0.2.1.tgz", + "integrity": "sha512-C86xWJOmtCGZr/U4MURqePM0oDKFkTlLeEyT07R+7jSKvREKZ2manJAeAebYudJLYEGITEPGqObhRan32bUUbg==", + "dev": true, + "dependencies": { + "bufferutil": "^4.0.1", + "jsdom": "^16.0.1", + "node-fetch": "^2.6.0", + "utf-8-validate": "^5.0.2" + } + }, + "node_modules/@stitches/core": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@stitches/core/-/core-1.2.8.tgz", + "integrity": "sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==" + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.0.4.tgz", + "integrity": "sha512-pjqhW00KwK2uzDGEr+yJBwut+D+4XfJO/+bHHdHzPRXn9+1Jeq5JcFHyrUiYaXgHtyhX0RsllCTm4ssAx4ZY7Q==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.0", + "svelte-hmr": "^0.15.1", + "vitefu": "^0.2.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.54.0", + "vite": "^4.0.0" + } + }, + "node_modules/@svelteuidev/composables": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@svelteuidev/composables/-/composables-0.11.1.tgz", + "integrity": "sha512-TTRGTDlrJD22KT/X8L2he5hu3rDorzzB591sgzDjtCi35vKF6Z/ijuc/ngNCFHA+2WxcDGBGPs7YewEgv2yEKg==" + }, + "node_modules/@svelteuidev/core": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@svelteuidev/core/-/core-0.11.1.tgz", + "integrity": "sha512-Dy16B6OaoSgMPyWL+WvrJwFB529N6Gmr4S4qdUWmE3LrJwhm9rNtwoEQn167dhOlmTQhfgJDot+DuIRRwtGXrw==", + "dependencies": { + "@floating-ui/dom": "0.5.2", + "@stitches/core": "1.2.8" + }, + "peerDependencies": { + "@svelteuidev/composables": "0.11.1", + "svelte": ">=3.55.0" + } + }, + "node_modules/@svelteuidev/motion": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@svelteuidev/motion/-/motion-0.11.1.tgz", + "integrity": "sha512-XyN/s43w9Y8JPmogy2iDbdzVsaawQYgM9amBbywGaKeSkcbeJ1Wwdh6LpeLJ2/oXYJ0iymQNSM+VxK5ICA9lyg==", + "peerDependencies": { + "svelte": ">=3.55.0" + } + }, + "node_modules/@tauri-apps/api": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.2.0.tgz", + "integrity": "sha512-lsI54KI6HGf7VImuf/T9pnoejfgkNoXveP14pVV7XarrQ46rOejIVJLFqHI9sRReJMGdh2YuCoI3cc/yCWCsrw==", + "engines": { + "node": ">= 14.6.0", + "npm": ">= 6.6.0", + "yarn": ">= 1.19.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.2.3.tgz", + "integrity": "sha512-erxtXuPhMEGJPBtnhPILD4AjuT81GZsraqpFvXAmEJZ2p8P6t7MVBifCL8LznRknznM3jn90D3M8RNBP3wcXTw==", + "dev": true, + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "1.2.3", + "@tauri-apps/cli-darwin-x64": "1.2.3", + "@tauri-apps/cli-linux-arm-gnueabihf": "1.2.3", + "@tauri-apps/cli-linux-arm64-gnu": "1.2.3", + "@tauri-apps/cli-linux-arm64-musl": "1.2.3", + "@tauri-apps/cli-linux-x64-gnu": "1.2.3", + "@tauri-apps/cli-linux-x64-musl": "1.2.3", + "@tauri-apps/cli-win32-ia32-msvc": "1.2.3", + "@tauri-apps/cli-win32-x64-msvc": "1.2.3" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.2.3.tgz", + "integrity": "sha512-phJN3fN8FtZZwqXg08bcxfq1+X1JSDglLvRxOxB7VWPq+O5SuB8uLyssjJsu+PIhyZZnIhTGdjhzLSFhSXfLsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.2.3.tgz", + "integrity": "sha512-jFZ/y6z8z6v4yliIbXKBXA7BJgtZVMsITmEXSuD6s5+eCOpDhQxbRkr6CA+FFfr+/r96rWSDSgDenDQuSvPAKw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.2.3.tgz", + "integrity": "sha512-C7h5vqAwXzY0kRGSU00Fj8PudiDWFCiQqqUNI1N+fhCILrzWZB9TPBwdx33ZfXKt/U4+emdIoo/N34v3TiAOmQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.2.3.tgz", + "integrity": "sha512-buf1c8sdkuUzVDkGPQpyUdAIIdn5r0UgXU6+H5fGPq/Xzt5K69JzXaeo6fHsZEZghbV0hOK+taKV4J0m30UUMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.2.3.tgz", + "integrity": "sha512-x88wPS9W5xAyk392vc4uNHcKBBvCp0wf4H9JFMF9OBwB7vfd59LbQCFcPSu8f0BI7bPrOsyHqspWHuFL8ojQEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.2.3.tgz", + "integrity": "sha512-ZMz1jxEVe0B4/7NJnlPHmwmSIuwiD6ViXKs8F+OWWz2Y4jn5TGxWKFg7DLx5OwQTRvEIZxxT7lXHi5CuTNAxKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.2.3.tgz", + "integrity": "sha512-B/az59EjJhdbZDzawEVox0LQu2ZHCZlk8rJf85AMIktIUoAZPFbwyiUv7/zjzA/sY6Nb58OSJgaPL2/IBy7E0A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.2.3.tgz", + "integrity": "sha512-ypdO1OdC5ugNJAKO2m3sb1nsd+0TSvMS9Tr5qN/ZSMvtSduaNwrcZ3D7G/iOIanrqu/Nl8t3LYlgPZGBKlw7Ng==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.2.3.tgz", + "integrity": "sha512-CsbHQ+XhnV/2csOBBDVfH16cdK00gNyNYUW68isedmqcn8j+s0e9cQ1xXIqi+Hue3awp8g3ImYN5KPepf3UExw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tsconfig/svelte": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", + "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "dev": true + }, + "node_modules/@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/bufferutil": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cheap-watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cheap-watch/-/cheap-watch-1.0.4.tgz", + "integrity": "sha512-QR/9FrtRL5fjfUJBhAKCdi0lSRQ3rVRRum3GF9wDKp2TJbEIMGhUEr2yU8lORzm9Isdjx7/k9S0DFDx+z5VGtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/configent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/configent/-/configent-2.2.0.tgz", + "integrity": "sha512-yIN6zfOWk2nycNJ2JFNiWEai0oiqAhISIht8+pbEBP8bdcpwoQ74AhCZPbUv9aRVJwo7wh1MbCBDUV44UJa7Kw==", + "dev": true, + "dependencies": { + "dotenv": "^8.2.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.17.tgz", + "integrity": "sha512-/jUywtAymR8jR4qsa2RujlAF7Krpt5VWi72Q2yuLD4e/hvtNcFQ0I1j8m/bxq238pf3/0KO5yuXNpuLx8BE1KA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.17", + "@esbuild/android-arm64": "0.17.17", + "@esbuild/android-x64": "0.17.17", + "@esbuild/darwin-arm64": "0.17.17", + "@esbuild/darwin-x64": "0.17.17", + "@esbuild/freebsd-arm64": "0.17.17", + "@esbuild/freebsd-x64": "0.17.17", + "@esbuild/linux-arm": "0.17.17", + "@esbuild/linux-arm64": "0.17.17", + "@esbuild/linux-ia32": "0.17.17", + "@esbuild/linux-loong64": "0.17.17", + "@esbuild/linux-mips64el": "0.17.17", + "@esbuild/linux-ppc64": "0.17.17", + "@esbuild/linux-riscv64": "0.17.17", + "@esbuild/linux-s390x": "0.17.17", + "@esbuild/linux-x64": "0.17.17", + "@esbuild/netbsd-x64": "0.17.17", + "@esbuild/openbsd-x64": "0.17.17", + "@esbuild/sunos-x64": "0.17.17", + "@esbuild/win32-arm64": "0.17.17", + "@esbuild/win32-ia32": "0.17.17", + "@esbuild/win32-x64": "0.17.17" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-unique-numbers": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-8.0.0.tgz", + "integrity": "sha512-okNyVf1JPLcyqziVls/CHOXS+tmoF0m4HGWz3kCuBEeEXCc5H1dGwEHC2bUV+TC+cI7oiNQ+gAHfYpcXyh8Djg==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=16.1.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/howler": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.3.tgz", + "integrity": "sha512-QM0FFkw0LRX1PR8pNzJVAY25JhIWvbKMBFM4gqk+QdV+kPXOhleWGCB6AiAF/goGjIHK2e/nIElplvjQwhr0jg==" + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "dev": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.4.tgz", + "integrity": "sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/radix-icons-svelte": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/radix-icons-svelte/-/radix-icons-svelte-1.2.1.tgz", + "integrity": "sha512-svmiMd0ocpdTm9cvAz0klcZpnh639lVctj6psQiawd4pYalVzOG4cX+JizAgRckyTAsRVdzObP7D2EBrSfdghA==" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rollup": { + "version": "3.20.7", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.7.tgz", + "integrity": "sha512-P7E2zezKSLhWnTz46XxjSmInrbOCiul1yf+kJccMxT56vxjHwCbDfoLbiqFgu+WQoo9ij2PkraYaBstgB2prBA==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/sass": { + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.0.tgz", + "integrity": "sha512-Q4USplo4pLYgCi+XlipZCWUQz5pkg/ruSSgJ0WRDSb/+3z9tXUOkQ7QPYn4XrhZKYAK4HlpaQecRwKLJX6+DBg==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sorcery": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", + "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.14", + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0" + }, + "bin": { + "sorcery": "bin/sorcery" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svelte": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.58.0.tgz", + "integrity": "sha512-brIBNNB76mXFmU/Kerm4wFnkskBbluBDCjx/8TcpYRb298Yh2dztS2kQ6bhtjMcvUhd5ynClfwpz5h2gnzdQ1A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/svelte-check": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.2.0.tgz", + "integrity": "sha512-6ZnscN8dHEN5Eq5LgIzjj07W9nc9myyBH+diXsUAuiY/3rt0l65/LCIQYlIuoFEjp2F1NhXqZiJwV9omPj9tMw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^5.0.3", + "typescript": "^5.0.3" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "peerDependencies": { + "svelte": "^3.55.0" + } + }, + "node_modules/svelte-check/node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/svelte-hmr": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz", + "integrity": "sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==", + "dev": true, + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": ">=3.19.0" + } + }, + "node_modules/svelte-preprocess": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.3.tgz", + "integrity": "sha512-GrHF1rusdJVbOZOwgPWtpqmaexkydznKzy5qIC2FabgpFyKN57bjMUUUqPRfbBXK5igiEWn1uO/DXsa2vJ5VHA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.6", + "detect-indent": "^6.1.0", + "magic-string": "^0.27.0", + "sorcery": "^0.11.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 14.10.0" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "svelte": "^3.23.0", + "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/svelte-preprocess/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tsconfck": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", + "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/vite": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.1.tgz", + "integrity": "sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==", + "dev": true, + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.21", + "rollup": "^3.20.2" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "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 + } + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", + "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", + "dev": true, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/worker-timers": { + "version": "7.0.64", + "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-7.0.64.tgz", + "integrity": "sha512-F7YRueu9Rq0TfFcgg7vJ3Yzh1PngQifkQP82x4gvU3B/moK2OHk6Crv3vQATPMu2Ux1qGaSCSTg3Z9PbG3sKjA==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "tslib": "^2.5.0", + "worker-timers-broker": "^6.0.84", + "worker-timers-worker": "^7.0.49" + } + }, + "node_modules/worker-timers-broker": { + "version": "6.0.84", + "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-6.0.84.tgz", + "integrity": "sha512-ZJY9zGJ8dBSHzfc27cEeRz65o7xc+IVCelz/fzuMBm6Hflzb0Cy9MfqI5WpmkNwZjuwCMt/4SGnFqe5URRK/yg==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "fast-unique-numbers": "^8.0.0", + "tslib": "^2.5.0", + "worker-timers-worker": "^7.0.49" + } + }, + "node_modules/worker-timers-worker": { + "version": "7.0.49", + "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-7.0.49.tgz", + "integrity": "sha512-pKx9/HYUu83z2CbbL7/HcYxgT+5Qtrty5VZcOU4FmVEqp9Y8eHuy3F3KHrxwOd/1kR02/ftSBWPGZUkls659vQ==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "tslib": "^2.5.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..630c460 --- /dev/null +++ b/package.json @@ -0,0 +1,39 @@ +{ + "name": "jarvis-app", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "routify -c dev:vite", + "dev:routify": "routify", + "dev:vite": "vite", + "build": "svelte-check && routify -b && vite build", + "preview": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.json", + "tauri": "tauri" + }, + "dependencies": { + "@svelteuidev/composables": "^0.11.1", + "@svelteuidev/core": "^0.11.1", + "@svelteuidev/motion": "^0.11.1", + "@tauri-apps/api": "^1.2.0", + "howler": "^2.2.3", + "radix-icons-svelte": "^1.2.1", + "worker-timers": "^7.0.64" + }, + "devDependencies": { + "@roxi/routify": "^2.18.11", + "@sveltejs/vite-plugin-svelte": "^2.0.0", + "@tauri-apps/cli": "^1.2.2", + "@tsconfig/svelte": "^3.0.0", + "@types/node": "^18.7.10", + "sass": "^1.62.0", + "svelte": "^3.54.0", + "svelte-check": "^3.0.0", + "svelte-preprocess": "^5.0.0", + "tslib": "^2.4.1", + "typescript": "^4.9.5", + "vite": "^4.2.1", + "vite-tsconfig-paths": "^4.2.0" + } +} diff --git a/public/media/app-logo.png b/public/media/app-logo.png new file mode 100644 index 0000000..f98152d Binary files /dev/null and b/public/media/app-logo.png differ diff --git a/public/media/images/bg/bg1.gif b/public/media/images/bg/bg1.gif new file mode 100644 index 0000000..a782614 Binary files /dev/null and b/public/media/images/bg/bg1.gif differ diff --git a/public/media/images/bg/bg10.gif b/public/media/images/bg/bg10.gif new file mode 100644 index 0000000..d8bf16b Binary files /dev/null and b/public/media/images/bg/bg10.gif differ diff --git a/public/media/images/bg/bg11.gif b/public/media/images/bg/bg11.gif new file mode 100644 index 0000000..004e171 Binary files /dev/null and b/public/media/images/bg/bg11.gif differ diff --git a/public/media/images/bg/bg12.gif b/public/media/images/bg/bg12.gif new file mode 100644 index 0000000..8ff81c7 Binary files /dev/null and b/public/media/images/bg/bg12.gif differ diff --git a/public/media/images/bg/bg13.gif b/public/media/images/bg/bg13.gif new file mode 100644 index 0000000..d119c31 Binary files /dev/null and b/public/media/images/bg/bg13.gif differ diff --git a/public/media/images/bg/bg18.gif b/public/media/images/bg/bg18.gif new file mode 100644 index 0000000..db268ac Binary files /dev/null and b/public/media/images/bg/bg18.gif differ diff --git a/public/media/images/bg/bg19.gif b/public/media/images/bg/bg19.gif new file mode 100644 index 0000000..3fb10af Binary files /dev/null and b/public/media/images/bg/bg19.gif differ diff --git a/public/media/images/bg/bg2.gif b/public/media/images/bg/bg2.gif new file mode 100644 index 0000000..d330d15 Binary files /dev/null and b/public/media/images/bg/bg2.gif differ diff --git a/public/media/images/bg/bg20.gif b/public/media/images/bg/bg20.gif new file mode 100644 index 0000000..4e726ad Binary files /dev/null and b/public/media/images/bg/bg20.gif differ diff --git a/public/media/images/bg/bg21.gif b/public/media/images/bg/bg21.gif new file mode 100644 index 0000000..8a870ab Binary files /dev/null and b/public/media/images/bg/bg21.gif differ diff --git a/public/media/images/bg/bg22.gif b/public/media/images/bg/bg22.gif new file mode 100644 index 0000000..a867f1c Binary files /dev/null and b/public/media/images/bg/bg22.gif differ diff --git a/public/media/images/bg/bg24.gif b/public/media/images/bg/bg24.gif new file mode 100644 index 0000000..2bc40b1 Binary files /dev/null and b/public/media/images/bg/bg24.gif differ diff --git a/public/media/images/bg/bg25.gif b/public/media/images/bg/bg25.gif new file mode 100644 index 0000000..b482f00 Binary files /dev/null and b/public/media/images/bg/bg25.gif differ diff --git a/public/media/images/bg/bg26.gif b/public/media/images/bg/bg26.gif new file mode 100644 index 0000000..4ed97ff Binary files /dev/null and b/public/media/images/bg/bg26.gif differ diff --git a/public/media/images/bg/bg3.gif b/public/media/images/bg/bg3.gif new file mode 100644 index 0000000..1d43a70 Binary files /dev/null and b/public/media/images/bg/bg3.gif differ diff --git a/public/media/images/bg/bg4.gif b/public/media/images/bg/bg4.gif new file mode 100644 index 0000000..9fd0da0 Binary files /dev/null and b/public/media/images/bg/bg4.gif differ diff --git a/public/media/images/bg/bg5.gif b/public/media/images/bg/bg5.gif new file mode 100644 index 0000000..70d2338 Binary files /dev/null and b/public/media/images/bg/bg5.gif differ diff --git a/public/media/images/bg/bg6.gif b/public/media/images/bg/bg6.gif new file mode 100644 index 0000000..67170fc Binary files /dev/null and b/public/media/images/bg/bg6.gif differ diff --git a/public/media/images/bg/bg7.gif b/public/media/images/bg/bg7.gif new file mode 100644 index 0000000..9f6ad78 Binary files /dev/null and b/public/media/images/bg/bg7.gif differ diff --git a/public/media/images/bg/bg8.gif b/public/media/images/bg/bg8.gif new file mode 100644 index 0000000..1b0ee93 Binary files /dev/null and b/public/media/images/bg/bg8.gif differ diff --git a/public/media/images/bg/bg9.gif b/public/media/images/bg/bg9.gif new file mode 100644 index 0000000..76e7c92 Binary files /dev/null and b/public/media/images/bg/bg9.gif differ diff --git a/public/media/images/cote1.gif b/public/media/images/cote1.gif new file mode 100644 index 0000000..22c8d78 Binary files /dev/null and b/public/media/images/cote1.gif differ diff --git a/public/media/images/decor.png b/public/media/images/decor.png new file mode 100644 index 0000000..a292813 Binary files /dev/null and b/public/media/images/decor.png differ diff --git a/public/media/images/man-1.png b/public/media/images/man-1.png new file mode 100644 index 0000000..57a206f Binary files /dev/null and b/public/media/images/man-1.png differ diff --git a/public/media/images/nero.png b/public/media/images/nero.png new file mode 100644 index 0000000..d6ef125 Binary files /dev/null and b/public/media/images/nero.png differ diff --git a/public/media/images/preloaders/loader-hd.gif b/public/media/images/preloaders/loader-hd.gif new file mode 100644 index 0000000..70a8a5d Binary files /dev/null and b/public/media/images/preloaders/loader-hd.gif differ diff --git a/public/media/images/preloaders/loader.gif b/public/media/images/preloaders/loader.gif new file mode 100644 index 0000000..267b1c3 Binary files /dev/null and b/public/media/images/preloaders/loader.gif differ diff --git a/public/media/images/preloaders/spinner.gif b/public/media/images/preloaders/spinner.gif new file mode 100644 index 0000000..73af712 Binary files /dev/null and b/public/media/images/preloaders/spinner.gif differ diff --git a/public/media/images/tenor.gif b/public/media/images/tenor.gif new file mode 100644 index 0000000..d8d3bdb Binary files /dev/null and b/public/media/images/tenor.gif differ diff --git a/public/media/images/vk.png b/public/media/images/vk.png new file mode 100644 index 0000000..5a589ee Binary files /dev/null and b/public/media/images/vk.png differ diff --git a/public/media/images/youtube.png b/public/media/images/youtube.png new file mode 100644 index 0000000..96bff12 Binary files /dev/null and b/public/media/images/youtube.png differ diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 348ea58..0000000 Binary files a/requirements.txt and /dev/null differ diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore new file mode 100644 index 0000000..2de70eb --- /dev/null +++ b/src-tauri/.gitignore @@ -0,0 +1,4 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ +app.db \ No newline at end of file diff --git a/src-tauri/.taurignore b/src-tauri/.taurignore new file mode 100644 index 0000000..3997bea --- /dev/null +++ b/src-tauri/.taurignore @@ -0,0 +1 @@ +*.db \ No newline at end of file diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock new file mode 100644 index 0000000..55986bc --- /dev/null +++ b/src-tauri/Cargo.lock @@ -0,0 +1,4024 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + +[[package]] +name = "aho-corasick" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "alsa" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8512c9117059663fb5606788fbca3619e2a91dac0e3fe516242eab1fa6be5e44" +dependencies = [ + "alsa-sys", + "bitflags", + "libc", + "nix", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "anyhow" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "atk" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +dependencies = [ + "atk-sys", + "bitflags", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.0.5", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + +[[package]] +name = "bindgen" +version = "0.64.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4243e6031260db77ede97ad86c27e501d646a27ab57b59a574f725d98ab1fb4" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 1.0.109", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "3.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bstr" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" + +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "bytesize" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38fcc2979eff34a4b84e1cf9a1e3da42a7d44b3b690a40cdcb23e3d556cfb2e5" + +[[package]] +name = "cairo-rs" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +dependencies = [ + "bitflags", + "cairo-sys-rs", + "glib", + "libc", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.0.5", +] + +[[package]] +name = "cargo_toml" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497049e9477329f8f6a559972ee42e117487d01d1e8c2cc9f836ea6fa23a9e1a" +dependencies = [ + "serde", + "toml 0.5.11", +] + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +dependencies = [ + "jobserver", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfb" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f89d248799e3f15f91b70917f65381062a01bb8e222700ea0e5a7ff9785f9c" +dependencies = [ + "byteorder", + "uuid 0.8.2", +] + +[[package]] +name = "cfg-expr" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-expr" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8790cf1286da485c72cf5fc7aeba308438800036ec67d89425924c4807268c9" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clang-sys" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "claxon" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bfbf56724aa9eca8afa4fcfadeb479e722935bb2a0900c2d37e0cc477af0688" + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" +dependencies = [ + "bitflags", + "block", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys 0.8.4", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +dependencies = [ + "bitflags", + "core-foundation", + "foreign-types", + "libc", +] + +[[package]] +name = "coreaudio-rs" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb17e2d1795b1996419648915df94bc7103c28f7b48062d7acf4652fc371b2ff" +dependencies = [ + "bitflags", + "core-foundation-sys 0.6.2", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f034b2258e6c4ade2f73bf87b21047567fb913ee9550837c2316d139b0262b24" +dependencies = [ + "bindgen", +] + +[[package]] +name = "cpal" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c" +dependencies = [ + "alsa", + "core-foundation-sys 0.8.4", + "coreaudio-rs", + "dasp_sample", + "jni 0.19.0", + "js-sys", + "libc", + "mach2", + "ndk 0.7.0", + "ndk-context", + "oboe", + "once_cell", + "parking_lot", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.46.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa 0.4.8", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ctor" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dtoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" + +[[package]] +name = "dtoa-short" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fdeflate" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3cf3a800ff6e860c863ca6d4b16fd999db8b752819c1606884047b73e468535" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "filetime" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.2.16", + "windows-sys 0.48.0", +] + +[[package]] +name = "flate2" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +dependencies = [ + "crc32fast", + "miniz_oxide 0.6.2", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-core", + "futures-macro", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +dependencies = [ + "bitflags", + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +dependencies = [ + "bitflags", + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.0.5", +] + +[[package]] +name = "gdk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps 6.0.5", +] + +[[package]] +name = "gdkx11-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps 6.0.5", + "x11", +] + +[[package]] +name = "generator" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3e123d9ae7c02966b4d892e550bdc32164f05853cd40ab570650ad600596a8a" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows 0.48.0", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "gio" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "futures-io", + "gio-sys", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.0.5", + "winapi", +] + +[[package]] +name = "glib" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.15.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" +dependencies = [ + "anyhow", + "heck 0.4.1", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "glib-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +dependencies = [ + "libc", + "system-deps 6.0.5", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "globset" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" +dependencies = [ + "aho-corasick 0.7.20", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "gobject-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.0.5", +] + +[[package]] +name = "gtk" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +dependencies = [ + "atk", + "bitflags", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "once_cell", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps 6.0.5", +] + +[[package]] +name = "gtk3-macros" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" +dependencies = [ + "anyhow", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "hound" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d13cdbd5dbb29f9c88095bbdc2590c9cba0d0a1269b983fef6b2cdd7e9f4db1" + +[[package]] +name = "html5ever" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.6", +] + +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + +[[package]] +name = "ico" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031530fe562d8c8d71c0635013d6d155bbfe8ba0aa4b4d2d24ce8af6b71047bd" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "ignore" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" +dependencies = [ + "crossbeam-utils", + "globset", + "lazy_static", + "log", + "memchr", + "regex", + "same-file", + "thread_local", + "walkdir", + "winapi-util", +] + +[[package]] +name = "image" +version = "0.24.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-rational", + "num-traits", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "infer" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20b2b533137b9cad970793453d4f921c2e91312a6d88b1085c07bc15fc51bb3b" +dependencies = [ + "cfb", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "jarvis-app" +version = "0.0.1" +dependencies = [ + "hound", + "lazy_static", + "peak_alloc", + "pickledb", + "pv_porcupine", + "pv_recorder", + "rand 0.8.5", + "rodio", + "seqdiff", + "serde", + "serde_json", + "serde_yaml", + "systemstat", + "tauri", + "tauri-build", + "vosk", +] + +[[package]] +name = "javascriptcore-rs" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" +dependencies = [ + "bitflags", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3fa5a61630976fc4c353c70297f2e93f1930e3ccee574d59d618ccbd5154ce" +dependencies = [ + "serde", + "serde_json", + "treediff", +] + +[[package]] +name = "kuchiki" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" +dependencies = [ + "cssparser", + "html5ever", + "matches", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "lewton" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" +dependencies = [ + "byteorder", + "ogg", + "tinyvec", +] + +[[package]] +name = "libc" +version = "0.2.142" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "line-wrap" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +dependencies = [ + "safemem", +] + +[[package]] +name = "linux-raw-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b085a4f2cde5781fc4b1717f2e86c62f5cda49de7ba99a7c2eae02b61c9064c" + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "mach2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" +dependencies = [ + "libc", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "markup5ever" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" +dependencies = [ + "log", + "phf 0.8.0", + "phf_codegen", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +dependencies = [ + "adler", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "ndk" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +dependencies = [ + "bitflags", + "jni-sys", + "ndk-sys 0.3.0", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +dependencies = [ + "bitflags", + "jni-sys", + "ndk-sys 0.4.1+23.1.7779620", + "num_enum", + "raw-window-handle", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "ndk-sys" +version = "0.4.1+23.1.7779620" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi 0.2.6", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "oboe" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8868cc237ee02e2d9618539a23a8d228b9bb3fc2e7a5b11eed3831de77c395d0" +dependencies = [ + "jni 0.20.0", + "ndk 0.7.0", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", +] + +[[package]] +name = "oboe-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f44155e7fb718d3cfddcf70690b2b51ac4412f347cd9e4fbe511abe9cd7b5f2" +dependencies = [ + "cc", +] + +[[package]] +name = "ogg" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" +dependencies = [ + "byteorder", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "open" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" +dependencies = [ + "pathdiff", + "windows-sys 0.42.0", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pango" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +dependencies = [ + "bitflags", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.0.5", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "paste" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" + +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + +[[package]] +name = "peak_alloc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d3978b0aa7d46c34452384c28264ac859c652b67635f6acfd598e1b6608de5" + +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pickledb" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c53a5ade47760e8cc4986bdc5e72daeffaaaee64cbc374f9cfe0a00c1cd87b1f" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" + +[[package]] +name = "plist" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd9647b268a3d3e14ff09c23201133a62589c658db02bb7388c7246aafe0590" +dependencies = [ + "base64 0.21.0", + "indexmap", + "line-wrap", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaeebc51f9e7d2c150d3f3bfeb667f2aa985db5ef1e3d212847bdedb488beeaa" +dependencies = [ + "bitflags", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.7.1", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pv_porcupine" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae03954126b8952a4cb30630db971502953feb06786003dc86afc6329082fd78" +dependencies = [ + "libc", + "libloading", +] + +[[package]] +name = "pv_recorder" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae96949bb558aada42e66de6fe37d57e365db61e6c3f7bda0413de22daab6c1a" +dependencies = [ + "libc", + "libloading", +] + +[[package]] +name = "quick-xml" +version = "0.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.9", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom 0.2.9", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac6cf59af1067a3fb53fbe5c88c053764e930f932be1d71d3ffe032cbe147f59" +dependencies = [ + "aho-corasick 1.0.1", + "memchr", + "regex-syntax 0.7.0", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6868896879ba532248f33598de5181522d8b3d9d724dfd230911e1a7d4822f5" + +[[package]] +name = "rfd" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" +dependencies = [ + "block", + "dispatch", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "lazy_static", + "log", + "objc", + "objc-foundation", + "objc_id", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.37.0", +] + +[[package]] +name = "rodio" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdf1d4dea18dff2e9eb6dca123724f8b60ef44ad74a9ad283cdfe025df7e73fa" +dependencies = [ + "claxon", + "cpal", + "hound", + "lewton", + "symphonia", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.37.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79bef90eb6d984c72722595b5b1348ab39275a5e5123faca6863bf07d75a4e0" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" + +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + +[[package]] +name = "semver" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +dependencies = [ + "serde", +] + +[[package]] +name = "seqdiff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e058ed56aee6d266fa5aa7809f99899b07d350c30aecd4f3d859b4f0d9dbbbdf" + +[[package]] +name = "serde" +version = "1.0.160" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.160" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "serde_json" +version = "1.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +dependencies = [ + "itoa 1.0.6", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "serde_spanned" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_with" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" +dependencies = [ + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "serde_yaml" +version = "0.9.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9d684e3ec7de3bf5466b32bd75303ac16f0736426e5a4e0d6e489559ce1249c" +dependencies = [ + "indexmap", + "itoa 1.0.6", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" + +[[package]] +name = "simd-adler32" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f" + +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "soup2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +dependencies = [ + "bitflags", + "gio", + "glib", + "libc", + "once_cell", + "soup2-sys", +] + +[[package]] +name = "soup2-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +dependencies = [ + "bitflags", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "state" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +dependencies = [ + "loom", +] + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "symphonia" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3671dd6f64f4f9d5c87179525054cfc1f60de23ba1f193bd6ceab812737403f1" +dependencies = [ + "lazy_static", + "symphonia-bundle-mp3", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-bundle-mp3" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55a0846e7a2c9a8081ff799fc83a975170417ad2a143f644a77ec2e3e82a2b73" +dependencies = [ + "bitflags", + "lazy_static", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-core" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b9567e2d8a5f866b2f94f5d366d811e0c6826babcff6d37de9e1a6690d38869" +dependencies = [ + "arrayvec", + "bitflags", + "bytemuck", + "lazy_static", + "log", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acd35c263223ef6161000be79b124a75de3e065eea563bf3ef169b3e94c7bb2e" +dependencies = [ + "encoding_rs", + "lazy_static", + "log", + "symphonia-core", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "system-deps" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" +dependencies = [ + "cfg-expr 0.9.1", + "heck 0.3.3", + "pkg-config", + "toml 0.5.11", + "version-compare 0.0.11", +] + +[[package]] +name = "system-deps" +version = "6.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0fe581ad25d11420b873cf9aedaca0419c2b411487b134d4d21065f3d092055" +dependencies = [ + "cfg-expr 0.15.1", + "heck 0.4.1", + "pkg-config", + "toml 0.7.3", + "version-compare 0.1.1", +] + +[[package]] +name = "systemstat" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a24aec24a9312c83999a28e3ef9db7e2afd5c64bf47725b758cdc1cafd5b0bd2" +dependencies = [ + "bytesize", + "lazy_static", + "libc", + "nom", + "time", + "winapi", +] + +[[package]] +name = "tao" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac8e6399427c8494f9849b58694754d7cc741293348a6836b6c8d2c5aa82d8e6" +dependencies = [ + "bitflags", + "cairo-rs", + "cc", + "cocoa", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "gdk", + "gdk-pixbuf", + "gdk-sys", + "gdkx11-sys", + "gio", + "glib", + "glib-sys", + "gtk", + "image", + "instant", + "jni 0.20.0", + "lazy_static", + "libc", + "log", + "ndk 0.6.0", + "ndk-context", + "ndk-sys 0.3.0", + "objc", + "once_cell", + "parking_lot", + "paste", + "png", + "raw-window-handle", + "scopeguard", + "serde", + "unicode-segmentation", + "uuid 1.3.1", + "windows 0.39.0", + "windows-implement", + "x11-dl", +] + +[[package]] +name = "tar" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "target-lexicon" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae9980cab1db3fceee2f6c6f643d5d8de2997c58ee8d25fb0cc8a9e9e7348e5" + +[[package]] +name = "tauri" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe7e0f1d535e7cbbbab43c82be4fc992b84f9156c16c160955617e0260ebc449" +dependencies = [ + "anyhow", + "cocoa", + "dirs-next", + "embed_plist", + "encoding_rs", + "flate2", + "futures-util", + "glib", + "glob", + "gtk", + "heck 0.4.1", + "http", + "ignore", + "objc", + "once_cell", + "open", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "regex", + "rfd", + "semver", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "state", + "tar", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "tempfile", + "thiserror", + "tokio", + "url", + "uuid 1.3.1", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-build" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8807c85d656b2b93927c19fe5a5f1f1f348f96c2de8b90763b3c2d561511f9b4" +dependencies = [ + "anyhow", + "cargo_toml", + "heck 0.4.1", + "json-patch", + "semver", + "serde_json", + "tauri-utils", + "winres", +] + +[[package]] +name = "tauri-codegen" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14388d484b6b1b5dc0f6a7d6cc6433b3b230bec85eaa576adcdf3f9fafa49251" +dependencies = [ + "base64 0.13.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "regex", + "semver", + "serde", + "serde_json", + "sha2", + "tauri-utils", + "thiserror", + "time", + "uuid 1.3.1", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "069319e5ecbe653a799b94b0690d9f9bf5d00f7b1d3989aa331c524d4e354075" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c507d954d08ac8705d235bc70ec6975b9054fb95ff7823af72dbb04186596f3b" +dependencies = [ + "gtk", + "http", + "http-range", + "rand 0.8.5", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "uuid 1.3.1", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-runtime-wry" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36b1c5764a41a13176a4599b5b7bd0881bea7d94dfe45e1e755f789b98317e30" +dependencies = [ + "cocoa", + "gtk", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "tauri-runtime", + "tauri-utils", + "uuid 1.3.1", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5abbc109a6eb45127956ffcc26ef0e875d160150ac16cfa45d26a6b2871686f1" +dependencies = [ + "brotli", + "ctor", + "glob", + "heck 0.4.1", + "html5ever", + "infer", + "json-patch", + "kuchiki", + "memchr", + "phf 0.10.1", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "serde_with", + "thiserror", + "url", + "walkdir", + "windows 0.39.0", +] + +[[package]] +name = "tempfile" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.45.0", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +dependencies = [ + "itoa 1.0.6", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + +[[package]] +name = "time-macros" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +dependencies = [ + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +dependencies = [ + "autocfg", + "bytes", + "num_cpus", + "pin-project-lite", + "windows-sys 0.45.0", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tracing-core" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "treediff" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761e8d5ad7ce14bb82b7e61ccc0ca961005a275a060b9644a2431aa11553c2ff" +dependencies = [ + "serde_json", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "unsafe-libyaml" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1865806a559042e51ab5414598446a5871b561d21b6764f2eabb0dd481d880a6" + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" + +[[package]] +name = "uuid" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b55a3fef2a1e3b3a00ce878640918820d3c51081576ac657d23af9fc7928fdb" +dependencies = [ + "getrandom 0.2.9", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + +[[package]] +name = "version-compare" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "vosk" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e24b8dd868df76aea46929b460640896b170d64eefffcd773084fdd4fcd67ec" +dependencies = [ + "serde", + "serde_json", + "vosk-sys", +] + +[[package]] +name = "vosk-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4119af93ca109482d71c6c01511a88c93131fcfdcf4ab4f5f1d8e4e4f5099d29" + +[[package]] +name = "walkdir" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + +[[package]] +name = "web-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +dependencies = [ + "bitflags", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup2", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +dependencies = [ + "atk-sys", + "bitflags", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pango-sys", + "pkg-config", + "soup2-sys", + "system-deps 6.0.5", +] + +[[package]] +name = "webview2-com" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "webview2-com-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "webview2-com-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +dependencies = [ + "regex", + "serde", + "serde_json", + "thiserror", + "windows 0.39.0", + "windows-bindgen", + "windows-metadata", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" +dependencies = [ + "windows_aarch64_msvc 0.37.0", + "windows_i686_gnu 0.37.0", + "windows_i686_msvc 0.37.0", + "windows_x86_64_gnu 0.37.0", + "windows_x86_64_msvc 0.37.0", +] + +[[package]] +name = "windows" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +dependencies = [ + "windows-implement", + "windows_aarch64_msvc 0.39.0", + "windows_i686_gnu 0.39.0", + "windows_i686_msvc 0.39.0", + "windows_x86_64_gnu 0.39.0", + "windows_x86_64_msvc 0.39.0", +] + +[[package]] +name = "windows" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-bindgen" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" +dependencies = [ + "windows-metadata", + "windows-tokens", +] + +[[package]] +name = "windows-implement" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" +dependencies = [ + "syn 1.0.109", + "windows-tokens", +] + +[[package]] +name = "windows-metadata" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows-tokens" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" + +[[package]] +name = "windows_i686_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" + +[[package]] +name = "windows_i686_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winnow" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +dependencies = [ + "memchr", +] + +[[package]] +name = "winres" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" +dependencies = [ + "toml 0.5.11", +] + +[[package]] +name = "wry" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c1ad8e2424f554cc5bdebe8aa374ef5b433feff817aebabca0389961fc7ef98" +dependencies = [ + "base64 0.13.1", + "block", + "cocoa", + "core-graphics", + "crossbeam-channel", + "dunce", + "gdk", + "gio", + "glib", + "gtk", + "html5ever", + "http", + "kuchiki", + "libc", + "log", + "objc", + "objc_id", + "once_cell", + "serde", + "serde_json", + "sha2", + "soup2", + "tao", + "thiserror", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "xattr" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +dependencies = [ + "libc", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 0000000..c92de71 --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "jarvis-app" +version = "0.0.1" +description = "Jarvis Voice Assistant" +authors = ["Abraham Tugalov"] +license = "GPL-3.0-only" +repository = "https://github.com/Priler/jarvis" +edition = "2021" + +[lib] +name = "const_concat" +path = "src/lib.rs" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] +tauri-build = { version = "1.2", features = [] } + +[dependencies] +tauri = { version = "1.2", features = ["dialog-message", "path-all", "shell-open"] } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +lazy_static = "1.4.0" +pickledb = "0.5.1" +peak_alloc = "0.2.0" +systemstat = "0.2.3" +hound = "3.5.0" +pv_recorder = "1.1.1" +pv_porcupine = "2.2.0" +rodio = "0.17.1" +serde_yaml = "0.9.21" +seqdiff = "0.3.0" +vosk = "0.2.0" +rand = "0.8.5" + +[features] +# this feature is used for production builds or when `devPath` points to the filesystem +# DO NOT REMOVE!! +custom-protocol = ["tauri/custom-protocol"] diff --git a/src-tauri/Makefile.toml b/src-tauri/Makefile.toml new file mode 100644 index 0000000..51b17af --- /dev/null +++ b/src-tauri/Makefile.toml @@ -0,0 +1,45 @@ +[tasks.format] +install_crate = "rustfmt" +command = "cargo" +args = ["fmt", "--", "--emit=files"] + +[tasks.clean] +command = "cargo" +args = ["clean"] + +[tasks.build_debug] +command = "cargo" +args = ["build"] + +[tasks.run] +command = "cargo" +args = ["run"] + +[tasks.build_release] +command = "cargo" +args = ["build", "--release"] +dependencies = ["clean"] + +[tasks.test] +command = "cargo" +args = ["test"] +# dependencies = ["clean"] + +[tasks.vosk] +script_runner = "python" +script_extension = "py" +script = { file = "vosk_build.py" } + +[tasks.debug] +dependencies = [ + "format", + "build_debug", + "vosk" +] + +[tasks.release] +dependencies = [ + "format", + "build_release", + "vosk" +] \ No newline at end of file diff --git a/src-tauri/app.db.temp.1682532589 b/src-tauri/app.db.temp.1682532589 new file mode 100644 index 0000000..330cf05 --- /dev/null +++ b/src-tauri/app.db.temp.1682532589 @@ -0,0 +1 @@ +[{"assistant_voice":"\"jarvis-remake\"","selected_microphone":"\"0\"","api_key__picovoice":"\"Hl7tfFyDT+S6fLhcT2nngK2qXsbhAwMsrVVp0Y9G0A2IfLlsPTm9eg==\"","api_key__openai":"\"\""},{}] \ No newline at end of file diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 0000000..0457690 --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,9 @@ +fn main() { + // link to Vosk lib + println!("cargo:rustc-link-search=vosk/"); + + // println!("cargo:rustc-link-lib=dylib=D:/Rust/vosk/libvosk.dll"); + + // Tauri build + tauri_build::build() +} diff --git a/custom-commands/Run browser.ahk b/src-tauri/commands/browser/ahk/Run browser.ahk similarity index 100% rename from custom-commands/Run browser.ahk rename to src-tauri/commands/browser/ahk/Run browser.ahk diff --git a/custom-commands/Run browser.exe b/src-tauri/commands/browser/ahk/Run browser.exe similarity index 100% rename from custom-commands/Run browser.exe rename to src-tauri/commands/browser/ahk/Run browser.exe diff --git a/custom-commands/Run google.ahk b/src-tauri/commands/browser/ahk/Run google.ahk similarity index 100% rename from custom-commands/Run google.ahk rename to src-tauri/commands/browser/ahk/Run google.ahk diff --git a/custom-commands/Run google.exe b/src-tauri/commands/browser/ahk/Run google.exe similarity index 100% rename from custom-commands/Run google.exe rename to src-tauri/commands/browser/ahk/Run google.exe diff --git a/custom-commands/Run youtube.ahk b/src-tauri/commands/browser/ahk/Run youtube.ahk similarity index 100% rename from custom-commands/Run youtube.ahk rename to src-tauri/commands/browser/ahk/Run youtube.ahk diff --git a/custom-commands/Run youtube.exe b/src-tauri/commands/browser/ahk/Run youtube.exe similarity index 100% rename from custom-commands/Run youtube.exe rename to src-tauri/commands/browser/ahk/Run youtube.exe diff --git a/src-tauri/commands/browser/command.yaml b/src-tauri/commands/browser/command.yaml new file mode 100644 index 0000000..a7a02a8 --- /dev/null +++ b/src-tauri/commands/browser/command.yaml @@ -0,0 +1,46 @@ +list: +- command: + action: ahk + exe_path: ahk/Run browser.exe + exe_args: + voice: + sounds: + - ok1 + - ok2 + - ok3 + phrases: + - открой браузер + - запусти браузер + - открой гугл хром + - гугл хром + +- command: + action: ahk + exe_path: ahk/Run google.exe + exe_args: + voice: + sounds: + - ok1 + - ok2 + - ok3 + - ok4 + phrases: + - открой гугл + - гугл + - запусти гугл + - перейди в гугл + +- command: + action: ahk + exe_path: ahk/Run youtube.exe + exe_args: + voice: + sounds: + - ok1 + - ok2 + - ok3 + - ok4 + phrases: + - открой ютуб + - ютуб + - запусти ютуб \ No newline at end of file diff --git a/src-tauri/commands/humor/command.yaml b/src-tauri/commands/humor/command.yaml new file mode 100644 index 0000000..dce8ed0 --- /dev/null +++ b/src-tauri/commands/humor/command.yaml @@ -0,0 +1,53 @@ +list: +- command: + action: voice + exe_path: + exe_args: + voice: + sounds: + - joke1 + - joke2 + - joke3 + - joke4 + - joke5 + phrases: + - расскажи анекдот + - рассмеши + - пошути + - шутка + - расскажи шутку + - развесели меня + - что нибудь смешное + - подними мне настроение + - мне скучно + - хочу шутку + - хочу анекдот + - пошути + - расскажи что нибудь смешное + - расскажи смешное что нибудь + - хочу посмеяться + +- command: + action: voice + exe_path: + exe_args: + voice: + sounds: + - thanks + phrases: + - спасибо + - молодец + - респект + - ты супер + - отличная работа + - ты крут + - ты большой молодец + - ты реально крут + - ты афигенный + - классная шутка + - очень смешно + - ты меня рассмешил + - веселая шутка + - смешной анекдот + - это было весело + - интересная шутка \ No newline at end of file diff --git a/src-tauri/commands/stupid/command.yaml b/src-tauri/commands/stupid/command.yaml new file mode 100644 index 0000000..09ba093 --- /dev/null +++ b/src-tauri/commands/stupid/command.yaml @@ -0,0 +1,13 @@ +list: +- command: + action: voice + exe_path: + exe_args: + voice: + sounds: + - stupid + phrases: + - ты дурак + - ты дебил + - ты глупый + - ты тупой \ No newline at end of file diff --git a/src-tauri/commands/terminate/command.yaml b/src-tauri/commands/terminate/command.yaml new file mode 100644 index 0000000..0afbdb5 --- /dev/null +++ b/src-tauri/commands/terminate/command.yaml @@ -0,0 +1,19 @@ +list: +- command: + action: terminate + exe_path: + exe_args: + voice: + sounds: + - off + phrases: + - выключись + - вырубись + - завершить работу + - закройся + - отключись + - заверши свою работу + - на сегодня хватит + - выгрузи себя из памяти + - ты мне надоел + - пора спать \ No newline at end of file diff --git a/src-tauri/commands/thanks/command.yaml b/src-tauri/commands/thanks/command.yaml new file mode 100644 index 0000000..1aee89b --- /dev/null +++ b/src-tauri/commands/thanks/command.yaml @@ -0,0 +1,20 @@ +list: +- command: + action: voice + exe_path: + exe_args: + voice: + sounds: + - thanks + phrases: + - спасибо + - молодец + - респект + - ты супер + - отличная работа + - ты крут + - ты большой молодец + - ты реально крут + - ты афигенный + - ты отец + - вечно ты молодец \ No newline at end of file diff --git a/custom-commands/Switch to dynamics.ahk b/src-tauri/commands/volume/ahk/Mute volume.ahk similarity index 86% rename from custom-commands/Switch to dynamics.ahk rename to src-tauri/commands/volume/ahk/Mute volume.ahk index f4b5430..473b758 100644 --- a/custom-commands/Switch to dynamics.ahk +++ b/src-tauri/commands/volume/ahk/Mute volume.ahk @@ -3,4 +3,4 @@ SendMode Input ; Recommended for new scripts due to its superior speed and reliability. SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. -Run, nircmd setdefaultsounddevice "Luna Edifier" 1 \ No newline at end of file +Send {Volume_Mute} ; Mute/unmute the master volume. \ No newline at end of file diff --git a/custom-commands/Switch to dynamics.exe b/src-tauri/commands/volume/ahk/Mute volume.exe similarity index 99% rename from custom-commands/Switch to dynamics.exe rename to src-tauri/commands/volume/ahk/Mute volume.exe index e47c8a4..3065430 100644 Binary files a/custom-commands/Switch to dynamics.exe and b/src-tauri/commands/volume/ahk/Mute volume.exe differ diff --git a/src-tauri/commands/volume/command.yaml b/src-tauri/commands/volume/command.yaml new file mode 100644 index 0000000..22a7e6f --- /dev/null +++ b/src-tauri/commands/volume/command.yaml @@ -0,0 +1,31 @@ +list: +- command: + action: ahk + exe_path: ahk/Mute volume.exe + exe_args: + voice: + sounds: + - ok1 + - ok2 + - ok3 + - ok4 + phrases: + - выключи звук + - беззвучный режим + - режим без звука + - отключи звук + +- command: + action: ahk + exe_path: ahk/Mute volume.exe + exe_args: + voice: + sounds: + - ok1 + - ok2 + - ok3 + - ok4 + phrases: + - включи звук + - режим со звуком + - верни звук \ No newline at end of file diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png new file mode 100644 index 0000000..6be5e50 Binary files /dev/null and b/src-tauri/icons/128x128.png differ diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000..e81bece Binary files /dev/null and b/src-tauri/icons/128x128@2x.png differ diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png new file mode 100644 index 0000000..a437dd5 Binary files /dev/null and b/src-tauri/icons/32x32.png differ diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000..0ca4f27 Binary files /dev/null and b/src-tauri/icons/Square107x107Logo.png differ diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000..b81f820 Binary files /dev/null and b/src-tauri/icons/Square142x142Logo.png differ diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000..624c7bf Binary files /dev/null and b/src-tauri/icons/Square150x150Logo.png differ diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000..c021d2b Binary files /dev/null and b/src-tauri/icons/Square284x284Logo.png differ diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000..6219700 Binary files /dev/null and b/src-tauri/icons/Square30x30Logo.png differ diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000..f9bc048 Binary files /dev/null and b/src-tauri/icons/Square310x310Logo.png differ diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000..d5fbfb2 Binary files /dev/null and b/src-tauri/icons/Square44x44Logo.png differ diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000..63440d7 Binary files /dev/null and b/src-tauri/icons/Square71x71Logo.png differ diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000..f3f705a Binary files /dev/null and b/src-tauri/icons/Square89x89Logo.png differ diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000..4556388 Binary files /dev/null and b/src-tauri/icons/StoreLogo.png differ diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns new file mode 100644 index 0000000..12a5bce Binary files /dev/null and b/src-tauri/icons/icon.icns differ diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico new file mode 100644 index 0000000..b3636e4 Binary files /dev/null and b/src-tauri/icons/icon.ico differ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png new file mode 100644 index 0000000..e1cd261 Binary files /dev/null and b/src-tauri/icons/icon.png differ diff --git a/src-tauri/libgcc_s_seh-1.dll b/src-tauri/libgcc_s_seh-1.dll new file mode 100644 index 0000000..6e75249 Binary files /dev/null and b/src-tauri/libgcc_s_seh-1.dll differ diff --git a/src-tauri/libstdc++-6.dll b/src-tauri/libstdc++-6.dll new file mode 100644 index 0000000..7783d88 Binary files /dev/null and b/src-tauri/libstdc++-6.dll differ diff --git a/src-tauri/libvosk.dll b/src-tauri/libvosk.dll new file mode 100644 index 0000000..4f3c6ed Binary files /dev/null and b/src-tauri/libvosk.dll differ diff --git a/src-tauri/libwinpthread-1.dll b/src-tauri/libwinpthread-1.dll new file mode 100644 index 0000000..0b416a5 Binary files /dev/null and b/src-tauri/libwinpthread-1.dll differ diff --git a/sound/ready.wav b/src-tauri/sound/jarvis-og/game_mode.wav similarity index 100% rename from sound/ready.wav rename to src-tauri/sound/jarvis-og/game_mode.wav diff --git a/sound/greet1.wav b/src-tauri/sound/jarvis-og/greet1.wav similarity index 100% rename from sound/greet1.wav rename to src-tauri/sound/jarvis-og/greet1.wav diff --git a/sound/greet2.wav b/src-tauri/sound/jarvis-og/greet2.wav similarity index 100% rename from sound/greet2.wav rename to src-tauri/sound/jarvis-og/greet2.wav diff --git a/sound/greet3.wav b/src-tauri/sound/jarvis-og/greet3.wav similarity index 100% rename from sound/greet3.wav rename to src-tauri/sound/jarvis-og/greet3.wav diff --git a/sound/not_found.wav b/src-tauri/sound/jarvis-og/not_found.wav similarity index 100% rename from sound/not_found.wav rename to src-tauri/sound/jarvis-og/not_found.wav diff --git a/sound/off.wav b/src-tauri/sound/jarvis-og/off.wav similarity index 100% rename from sound/off.wav rename to src-tauri/sound/jarvis-og/off.wav diff --git a/sound/ok1.wav b/src-tauri/sound/jarvis-og/ok1.wav similarity index 100% rename from sound/ok1.wav rename to src-tauri/sound/jarvis-og/ok1.wav diff --git a/sound/ok2.wav b/src-tauri/sound/jarvis-og/ok2.wav similarity index 100% rename from sound/ok2.wav rename to src-tauri/sound/jarvis-og/ok2.wav diff --git a/sound/ok3.wav b/src-tauri/sound/jarvis-og/ok3.wav similarity index 100% rename from sound/ok3.wav rename to src-tauri/sound/jarvis-og/ok3.wav diff --git a/src-tauri/sound/jarvis-og/ok4.wav b/src-tauri/sound/jarvis-og/ok4.wav new file mode 100644 index 0000000..d42baf5 Binary files /dev/null and b/src-tauri/sound/jarvis-og/ok4.wav differ diff --git a/sound/run.wav b/src-tauri/sound/jarvis-og/run.wav similarity index 100% rename from sound/run.wav rename to src-tauri/sound/jarvis-og/run.wav diff --git a/sound/stupid.wav b/src-tauri/sound/jarvis-og/stupid.wav similarity index 100% rename from sound/stupid.wav rename to src-tauri/sound/jarvis-og/stupid.wav diff --git a/sound/thanks.wav b/src-tauri/sound/jarvis-og/thanks.wav similarity index 100% rename from sound/thanks.wav rename to src-tauri/sound/jarvis-og/thanks.wav diff --git a/src-tauri/sound/jarvis-remake/game_mode.wav b/src-tauri/sound/jarvis-remake/game_mode.wav new file mode 100644 index 0000000..360f574 Binary files /dev/null and b/src-tauri/sound/jarvis-remake/game_mode.wav differ diff --git a/src-tauri/sound/jarvis-remake/greet1.wav b/src-tauri/sound/jarvis-remake/greet1.wav new file mode 100644 index 0000000..7558f50 Binary files /dev/null and b/src-tauri/sound/jarvis-remake/greet1.wav differ diff --git a/src-tauri/sound/jarvis-remake/greet2.wav b/src-tauri/sound/jarvis-remake/greet2.wav new file mode 100644 index 0000000..ec46a86 Binary files /dev/null and b/src-tauri/sound/jarvis-remake/greet2.wav differ diff --git a/src-tauri/sound/jarvis-remake/greet3.wav b/src-tauri/sound/jarvis-remake/greet3.wav new file mode 100644 index 0000000..7558f50 Binary files /dev/null and b/src-tauri/sound/jarvis-remake/greet3.wav differ diff --git a/src-tauri/sound/jarvis-remake/joke1.wav b/src-tauri/sound/jarvis-remake/joke1.wav new file mode 100644 index 0000000..e76f8b5 Binary files /dev/null and b/src-tauri/sound/jarvis-remake/joke1.wav differ diff --git a/src-tauri/sound/jarvis-remake/joke2.wav b/src-tauri/sound/jarvis-remake/joke2.wav new file mode 100644 index 0000000..fe07efd Binary files /dev/null and b/src-tauri/sound/jarvis-remake/joke2.wav differ diff --git a/src-tauri/sound/jarvis-remake/joke3.wav b/src-tauri/sound/jarvis-remake/joke3.wav new file mode 100644 index 0000000..b6058e0 Binary files /dev/null and b/src-tauri/sound/jarvis-remake/joke3.wav differ diff --git a/src-tauri/sound/jarvis-remake/joke4.wav b/src-tauri/sound/jarvis-remake/joke4.wav new file mode 100644 index 0000000..26fa5f0 Binary files /dev/null and b/src-tauri/sound/jarvis-remake/joke4.wav differ diff --git a/src-tauri/sound/jarvis-remake/joke5.wav b/src-tauri/sound/jarvis-remake/joke5.wav new file mode 100644 index 0000000..23c434e Binary files /dev/null and b/src-tauri/sound/jarvis-remake/joke5.wav differ diff --git a/src-tauri/sound/jarvis-remake/not_found.wav b/src-tauri/sound/jarvis-remake/not_found.wav new file mode 100644 index 0000000..48dce5b Binary files /dev/null and b/src-tauri/sound/jarvis-remake/not_found.wav differ diff --git a/src-tauri/sound/jarvis-remake/ok1.wav b/src-tauri/sound/jarvis-remake/ok1.wav new file mode 100644 index 0000000..33962c9 Binary files /dev/null and b/src-tauri/sound/jarvis-remake/ok1.wav differ diff --git a/src-tauri/sound/jarvis-remake/ok2.wav b/src-tauri/sound/jarvis-remake/ok2.wav new file mode 100644 index 0000000..0e52464 Binary files /dev/null and b/src-tauri/sound/jarvis-remake/ok2.wav differ diff --git a/src-tauri/sound/jarvis-remake/ok3.wav b/src-tauri/sound/jarvis-remake/ok3.wav new file mode 100644 index 0000000..2e3ed3b Binary files /dev/null and b/src-tauri/sound/jarvis-remake/ok3.wav differ diff --git a/src-tauri/sound/jarvis-remake/ok4.wav b/src-tauri/sound/jarvis-remake/ok4.wav new file mode 100644 index 0000000..eb3308f Binary files /dev/null and b/src-tauri/sound/jarvis-remake/ok4.wav differ diff --git a/src-tauri/sound/jarvis-remake/ready.wav b/src-tauri/sound/jarvis-remake/ready.wav new file mode 100644 index 0000000..dc85ced Binary files /dev/null and b/src-tauri/sound/jarvis-remake/ready.wav differ diff --git a/src-tauri/sound/jarvis-remake/run.wav b/src-tauri/sound/jarvis-remake/run.wav new file mode 100644 index 0000000..8d2cca7 Binary files /dev/null and b/src-tauri/sound/jarvis-remake/run.wav differ diff --git a/src-tauri/sound/jarvis-remake/stupid.wav b/src-tauri/sound/jarvis-remake/stupid.wav new file mode 100644 index 0000000..7611cc7 Binary files /dev/null and b/src-tauri/sound/jarvis-remake/stupid.wav differ diff --git a/src-tauri/sound/jarvis-remake/thanks.wav b/src-tauri/sound/jarvis-remake/thanks.wav new file mode 100644 index 0000000..6198470 Binary files /dev/null and b/src-tauri/sound/jarvis-remake/thanks.wav differ diff --git a/src-tauri/src/assistant_commands.rs b/src-tauri/src/assistant_commands.rs new file mode 100644 index 0000000..d0c0719 --- /dev/null +++ b/src-tauri/src/assistant_commands.rs @@ -0,0 +1,189 @@ +use rand::seq::SliceRandom; +use seqdiff::ratio; +use serde_yaml; +use std::path::Path; +use std::{fs, fs::File}; + +use core::time::Duration; +use std::path::PathBuf; +use std::process::Child; +use std::process::Command; +use tauri::Manager; + +mod structs; +pub use structs::*; + +use crate::config; +use crate::events; + +pub fn parse_commands() -> Result, String> { + // collect commands + let mut commands: Vec = vec![]; + + // read commands directories first + if let Ok(cpaths) = fs::read_dir(config::COMMANDS_PATH) { + for cpath in cpaths { + // validate this command, check if required files exists + let _cpath = cpath.unwrap().path(); + let cc_file = Path::new(&_cpath).join("command.yaml"); + + if cc_file.exists() { + // try parse config files + let cc_reader = std::fs::File::open(&cc_file).unwrap(); + let cc_yaml: CommandsList; + + // try parse command.yaml + if let Ok(parse_result) = serde_yaml::from_reader::(cc_reader) { + cc_yaml = parse_result; + } else { + println!("Can't parse {}, skipping ...", &cc_file.display()); + continue; + // return Err(format!("Can't parse {}", &cc_file.display())); + } + + // everything seems to be Ok + commands.push(AssistantCommand { + path: _cpath, + commands: cc_yaml, + }); + } + } + + if commands.len() > 0 { + Ok(commands) + } else { + Err("No commands were found".into()) + } + } else { + return Err("Error reading commands directory".into()); + } +} + +pub fn fetch_command<'a>( + phrase: &str, + commands: &'a Vec, +) -> Option<(&'a PathBuf, &'a Config)> { + // result scmd + let mut result_scmd: Option<(&PathBuf, &Config)> = None; + let mut current_max_ratio = config::CMD_RATIO_THRESHOLD; + + // convert fetch phrase to sequence + let fetch_phrase_chars = phrase.chars().collect::>(); + + // list all the commands + for cmd in commands { + // list all subcommands + for scmd in &cmd.commands.list { + // list all phrases in command + for cmd_phrase in &scmd.phrases { + // convert cmd phrase to sequence + let cmd_phrase_chars = cmd_phrase.chars().collect::>(); + + // compare fetch phrase with cmd phrase + let ratio = ratio(&fetch_phrase_chars, &cmd_phrase_chars); + + // return, if it fits the given threshold + if ratio >= current_max_ratio { + result_scmd = Some((&cmd.path, &scmd)); + current_max_ratio = ratio; + // println!("Ratio is: {}", ratio); + // return Some((&cmd.path, &scmd)) + } + } + } + } + + if let Some((cmd_path, scmd)) = result_scmd { + println!("Ratio is: {}", current_max_ratio); + Some((&cmd_path, &scmd)) + } else { + None + } +} + +pub fn execute_exe(exe: &str, args: &Vec) -> std::io::Result { + Command::new(exe).args(args).spawn() +} + +pub fn execute_command( + cmd_path: &PathBuf, + cmd_config: &Config, + app_handle: &tauri::AppHandle, +) -> Result<(), String> { + match cmd_config.command.action.as_str() { + "voice" => { + // VOICE command type + let random_cmd_sound = cmd_config + .voice + .sounds + .choose(&mut rand::thread_rng()) + .unwrap(); + events::play(random_cmd_sound, app_handle); + + Ok(()) + } + "ahk" => { + // AutoHotkey command type + let exe_path_absolute = Path::new(&cmd_config.command.exe_path); + let exe_path_local = Path::new(&cmd_path).join(&cmd_config.command.exe_path); + + if let Ok(_) = execute_exe( + if exe_path_absolute.exists() { + exe_path_absolute.to_str().unwrap() + } else { + exe_path_local.to_str().unwrap() + }, + &cmd_config.command.exe_args, + ) { + let random_cmd_sound = cmd_config + .voice + .sounds + .choose(&mut rand::thread_rng()) + .unwrap(); + events::play(random_cmd_sound, app_handle); + + Ok(()) + } else { + Err("AHK process spawn error (does exe path is valid?)".into()) + } + } + "cli" => { + // CLI command type + let exe_path_absolute = Path::new(&cmd_config.command.exe_path); + let exe_path_local = Path::new(&cmd_path).join(&cmd_config.command.exe_path); + + if let Ok(_) = execute_exe( + if exe_path_absolute.exists() { + exe_path_absolute.to_str().unwrap() + } else { + exe_path_local.to_str().unwrap() + }, + &cmd_config.command.exe_args, + ) { + let random_cmd_sound = cmd_config + .voice + .sounds + .choose(&mut rand::thread_rng()) + .unwrap(); + events::play(random_cmd_sound, app_handle); + + Ok(()) + } else { + Err("Shell process spawn error (does cli command is valid?)".into()) + } + } + "terminate" => { + // TERMINATE command type + let random_cmd_sound = cmd_config + .voice + .sounds + .choose(&mut rand::thread_rng()) + .unwrap(); + events::play(random_cmd_sound, app_handle); + + std::thread::sleep(Duration::from_secs(2)); + std::process::exit(0); + } + _ => Err("Command type unknown".into()), + } +} diff --git a/src-tauri/src/assistant_commands/structs.rs b/src-tauri/src/assistant_commands/structs.rs new file mode 100644 index 0000000..6a0005c --- /dev/null +++ b/src-tauri/src/assistant_commands/structs.rs @@ -0,0 +1,32 @@ +use serde::Deserialize; +use std::path::PathBuf; + +#[derive(Debug)] +pub struct AssistantCommand { + pub path: PathBuf, + pub commands: CommandsList, +} + +#[derive(Deserialize, Debug)] +pub struct CommandsList { + pub list: Vec, +} + +#[derive(Deserialize, Debug)] +pub struct Config { + pub command: ConfigCommandSection, + pub voice: ConfigVoiceSection, + pub phrases: Vec, +} + +#[derive(Deserialize, Debug)] +pub struct ConfigCommandSection { + pub action: String, + pub exe_path: String, + pub exe_args: Vec, +} + +#[derive(Deserialize, Debug)] +pub struct ConfigVoiceSection { + pub sounds: Vec, +} diff --git a/src-tauri/src/config.rs b/src-tauri/src/config.rs new file mode 100644 index 0000000..bd0b18b --- /dev/null +++ b/src-tauri/src/config.rs @@ -0,0 +1,42 @@ +use const_concat::const_concat; +use std::env::current_dir; + +// pub const IS_DEV: bool = cfg!(debug_assertions);// cfg!(debug_assertions); +// pub const PUBLIC_PATH: &str = if IS_DEV { +// "D:/Rust/jarvis-app/public" +// } else { +// "./public" +// }; + +pub const COMMANDS_PATH: &str = "commands/"; + +pub const DB_FILE_NAME: &str = "app.db"; +pub const APP_VERSION: Option<&str> = option_env!("CARGO_PKG_VERSION"); +pub const AUTHOR_NAME: Option<&str> = option_env!("CARGO_PKG_AUTHORS"); +pub const REPOSITORY_LINK: Option<&str> = option_env!("CARGO_PKG_REPOSITORY"); + +// pub const VOSK_MODEL_PATH: &str = const_concat!(PUBLIC_PATH, "/vosk/model_small"); +pub const VOSK_MODEL_PATH: &str = "vosk/model_small"; + +pub const CMD_RATIO_THRESHOLD: f64 = 60f64; +pub const CMS_WAIT_DELAY: std::time::Duration = std::time::Duration::from_secs(10); + +pub const ASSISTANT_GREET_PHRASES: [&str; 3] = ["greet1", "greet2", "greet3"]; +pub const ASSISTANT_PHRASES_TBR: [&str; 16] = [ + "сэр", + "слушаю сэр", + "всегда к услугам", + "произнеси", + "ответь", + "покажи", + "скажи", + "давай", + "да сэр", + "к вашим услугам сэр", + "всегда к вашим услугам сэр", + "запрос выполнен сэр", + "выполнен сэр", + "есть", + "загружаю сэр", + "очень тонкое замечание сэр", +]; diff --git a/src-tauri/src/events.rs b/src-tauri/src/events.rs new file mode 100644 index 0000000..a6ba3d4 --- /dev/null +++ b/src-tauri/src/events.rs @@ -0,0 +1,40 @@ +use tauri::Manager; + +// the payload type must implement `Serialize` and `Clone`. +#[derive(Clone, serde::Serialize)] +pub struct Payload { + pub data: String, +} + +pub enum EventTypes { + AudioPlay, + AssistantWaiting, + AssistantGreet, + CommandStart, + CommandInProcess, + CommandEnd, +} + +impl EventTypes { + pub fn get(&self) -> &str { + match self { + Self::AudioPlay => "audio-play", + Self::AssistantWaiting => "assistant-waiting", + Self::AssistantGreet => "assistant-greet", + Self::CommandStart => "command-start", + Self::CommandInProcess => "command-in-process", + Self::CommandEnd => "command-end", + } + } +} + +pub fn play(phrase: &str, app_handle: &tauri::AppHandle) { + app_handle + .emit_all( + EventTypes::AudioPlay.get(), + Payload { + data: phrase.into(), + }, + ) + .unwrap(); +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 0000000..efe62f6 --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,71 @@ +// Taken from https://github.com/Vurich/const-concat/issues/13 + +#![no_std] + +use core::mem::ManuallyDrop; + +const unsafe fn transmute_prefix(from: From) -> To { + union Transmute { + from: ManuallyDrop, + to: ManuallyDrop, + } + + ManuallyDrop::into_inner( + Transmute { + from: ManuallyDrop::new(from), + } + .to, + ) +} + +/// # Safety +/// +/// `Len1 + Len2 >= Len3` +#[doc(hidden)] +#[allow(non_upper_case_globals)] +pub const unsafe fn concat( + arr1: [u8; Len1], + arr2: [u8; Len2], +) -> [u8; Len3] { + #[repr(C)] + struct Concat(A, B); + transmute_prefix(Concat(arr1, arr2)) +} + +#[macro_export] +macro_rules! const_concat { + () => (""); + ($a:expr) => ($a); + + ($a:expr, $b:expr $(,)?) => {{ + const A: &str = $a; + const B: &str = $b; + const BYTES: [u8; { A.len() + B.len() }] = unsafe { + $crate::concat::< + { A.len() }, + { B.len() }, + { A.len() + B.len() } + >( + *A.as_ptr().cast(), + *B.as_ptr().cast(), + ) + }; + unsafe { ::core::str::from_utf8_unchecked(&BYTES) } + }}; + + ($a:expr, $b:expr, $($rest:expr),+ $(,)?) => {{ + const TAIL: &str = $crate::const_concat!($b, $($rest),+); + $crate::const_concat!($a, TAIL) + }} +} + +#[test] +fn tests() { + const SALUTATION: &str = "Hello"; + const TARGET: &str = "world"; + const GREETING: &str = const_concat!(SALUTATION, ", ", TARGET, "!"); + const GREETING_TRAILING_COMMA: &str = const_concat!(SALUTATION, ", ", TARGET, "!",); + + assert_eq!(GREETING, "Hello, world!"); + assert_eq!(GREETING_TRAILING_COMMA, "Hello, world!"); +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 0000000..bdc52cb --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,90 @@ +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +// #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +#[macro_use] +extern crate lazy_static; // better switch to once_cell ? +use pickledb::{PickleDb, PickleDbDumpPolicy, SerializationMethod}; +use std::sync::Mutex; + +// expose the config +mod config; +use config::*; + +// include tauri commands +mod tauri_commands; + +// include assistant commands +mod assistant_commands; +use assistant_commands::AssistantCommand; + +// include vosk +mod vosk; + +// include events +mod events; + +// app dir +lazy_static! { + static ref APP_CONFIG_DIR: Mutex = Mutex::new(String::new()); +} + +// init PickleDb connection +lazy_static! { + static ref DB: Mutex = Mutex::new( + PickleDb::load( + format!("{}/{}", APP_CONFIG_DIR.lock().unwrap(), DB_FILE_NAME), + PickleDbDumpPolicy::AutoDump, + SerializationMethod::Json + ) + .unwrap_or_else(|_x: _| { + println!("Creating new db file at {} ...", format!("{}/{}", APP_CONFIG_DIR.lock().unwrap(), DB_FILE_NAME)); + PickleDb::new( + format!("{}/{}", APP_CONFIG_DIR.lock().unwrap(), DB_FILE_NAME), + PickleDbDumpPolicy::AutoDump, + SerializationMethod::Json, + ) + }) + ); +} + +// init commands +lazy_static! { + static ref COMMANDS: Vec = assistant_commands::parse_commands().unwrap(); +} + +fn main() { + vosk::init_vosk(); + + tauri::Builder::default() + .setup(|app| { + std::fs::create_dir_all(app.path_resolver().app_config_dir().unwrap())?; + APP_CONFIG_DIR.lock().unwrap().push_str(app.path_resolver().app_config_dir().unwrap().to_str().unwrap()); + + Ok(()) + }) + .invoke_handler(tauri::generate_handler![ + // db commands + tauri_commands::db_read, + tauri_commands::db_write, + // recorder commands + tauri_commands::pv_get_audio_devices, + tauri_commands::pv_get_audio_device_name, + // listener commands + tauri_commands::start_listening, + tauri_commands::stop_listening, + tauri_commands::is_listening, + // sys commands + tauri_commands::get_current_ram_usage, + tauri_commands::get_peak_ram_usage, + tauri_commands::get_cpu_temp, + tauri_commands::get_cpu_usage, + // sound commands + tauri_commands::play_sound, + // etc commands + tauri_commands::get_app_version, + tauri_commands::get_author_name, + tauri_commands::get_repository_link + ]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/src-tauri/src/tauri_commands.rs b/src-tauri/src/tauri_commands.rs new file mode 100644 index 0000000..398b0bb --- /dev/null +++ b/src-tauri/src/tauri_commands.rs @@ -0,0 +1,23 @@ +// import DB related commands +mod db; +pub use db::*; + +// import RECORDER commands +mod recorder; +pub use recorder::*; + +// import PORCUPINE commands +mod listener; +pub use listener::*; + +// import SYS commands +mod sys; +pub use sys::*; + +// import VOICE commands +mod voice; +pub use voice::*; + +// import ETC commands +mod etc; +pub use etc::*; diff --git a/src-tauri/src/tauri_commands/db.rs b/src-tauri/src/tauri_commands/db.rs new file mode 100644 index 0000000..d612ba8 --- /dev/null +++ b/src-tauri/src/tauri_commands/db.rs @@ -0,0 +1,19 @@ +use crate::DB; + +#[tauri::command] +pub fn db_read(key: &str) -> String { + if let Some(value) = DB.lock().unwrap().get(key) { + value + } else { + String::from("") + } +} + +#[tauri::command] +pub fn db_write(key: &str, val: &str) -> bool { + if let Ok(_) = DB.lock().unwrap().set(key, &val) { + true + } else { + false + } +} diff --git a/src-tauri/src/tauri_commands/etc.rs b/src-tauri/src/tauri_commands/etc.rs new file mode 100644 index 0000000..73bffc5 --- /dev/null +++ b/src-tauri/src/tauri_commands/etc.rs @@ -0,0 +1,32 @@ +use crate::config::APP_VERSION; +use crate::config::AUTHOR_NAME; +use crate::config::REPOSITORY_LINK; + +// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command + +#[tauri::command] +pub fn get_app_version() -> String { + if let Some(ver) = APP_VERSION { + ver.to_string() + } else { + String::from("error") + } +} + +#[tauri::command] +pub fn get_author_name() -> String { + if let Some(ver) = AUTHOR_NAME { + ver.to_string() + } else { + String::from("error") + } +} + +#[tauri::command] +pub fn get_repository_link() -> String { + if let Some(ver) = REPOSITORY_LINK { + ver.to_string() + } else { + String::from("error") + } +} diff --git a/src-tauri/src/tauri_commands/listener.rs b/src-tauri/src/tauri_commands/listener.rs new file mode 100644 index 0000000..04c3098 --- /dev/null +++ b/src-tauri/src/tauri_commands/listener.rs @@ -0,0 +1,193 @@ +use porcupine::{BuiltinKeywords, Porcupine, PorcupineBuilder}; +use pv_recorder::RecorderBuilder; +use std::sync::atomic::{AtomicBool, Ordering}; + +use crate::events::Payload; +use tauri::Manager; + +use rand::seq::SliceRandom; +use std::time::SystemTime; + +use crate::assistant_commands; +use crate::events; + +use crate::config; +use crate::vosk; + +use crate::COMMANDS; +use crate::DB; + +// track listening state +static LISTENING: AtomicBool = AtomicBool::new(false); + +// stop listening with Atomic flag (to make it work between different threads) +static STOP_LISTENING: AtomicBool = AtomicBool::new(false); + +#[tauri::command] +pub fn is_listening() -> bool { + LISTENING.load(Ordering::SeqCst) +} + +#[tauri::command] +pub fn stop_listening() { + if is_listening() { + STOP_LISTENING.store(true, Ordering::SeqCst); + } + + // wait until listening stops + while is_listening() {} +} + +#[tauri::command(async)] +pub fn start_listening(app_handle: tauri::AppHandle) -> Result { + // only one listener thread is allowed + if is_listening() { + return Err("Already listening.".into()); + } + + // vars + let porcupine: Porcupine; + let picovoice_api_key: String; + let selected_microphone: i32; + + let mut start = SystemTime::now(); + + // Retrieve API key from DB + if let Some(pkey) = DB.lock().unwrap().get::("api_key__picovoice") { + picovoice_api_key = pkey; + } else { + return Err("Picovoice API key is not set!".into()); + } + + // Create instance of Porcupine with the given API key + if let Ok(pinstance) = + PorcupineBuilder::new_with_keywords(picovoice_api_key, &[BuiltinKeywords::Jarvis]) + .sensitivities(&[1.0f32]) // max sensitivity possible + .init() + { + // porcupine successfully initialized with the valid API key + porcupine = pinstance; + } else { + // something went wrong + return Err( + "Porcupine error: either API key is not valid or there is no internet connection" + .into(), + ); + } + + // Retrieve microphone index + if let Some(smic) = DB.lock().unwrap().get::("selected_microphone") { + selected_microphone = smic.parse().unwrap_or(-1); + } else { + selected_microphone = -1; // use default, if not selected + } + + // Create recorder instance + let recorder = RecorderBuilder::new() + .device_index(selected_microphone) + .frame_length(porcupine.frame_length() as i32) + .init() + .expect("Failed to initialize pvrecorder"); + + // Start recording + println!("Listening (microphone idx = {selected_microphone}) ..."); + recorder.start().expect("Failed to start audio recording"); + LISTENING.store(true, Ordering::SeqCst); + + // Greet user + events::play("run", &app_handle); + + // Listen until stop flag will be true + let mut frame_buffer = vec![0; porcupine.frame_length() as usize]; + while !STOP_LISTENING.load(Ordering::SeqCst) { + recorder + .read(&mut frame_buffer) + .expect("Failed to read audio frame"); + + if let Ok(keyword_index) = porcupine.process(&frame_buffer) { + if keyword_index >= 0 { + println!("Yes, sir! {}", keyword_index); + events::play( + config::ASSISTANT_GREET_PHRASES + .choose(&mut rand::thread_rng()) + .unwrap(), + &app_handle, + ); + start = SystemTime::now(); + + app_handle + .emit_all(events::EventTypes::AssistantGreet.get(), ()) + .unwrap(); + + loop { + recorder + .read(&mut frame_buffer) + .expect("Failed to read audio frame"); + + // vosk part (partials included) + if let Some(mut test) = vosk::recognize(&frame_buffer) { + if !test.is_empty() { + println!("Recognized: {}", test); + + // some filtration + test = test.to_lowercase(); + for tbr in config::ASSISTANT_PHRASES_TBR { + test = test.replace(tbr, ""); + } + + // infer command + if let Some((cmd_path, cmd_config)) = + assistant_commands::fetch_command(&test, &COMMANDS) + { + println!("Recognized (filtered): {}", test); + println!("Command found: {:?}", cmd_path); + println!("Executing ..."); + + let cmd_result = assistant_commands::execute_command( + &cmd_path, + &cmd_config, + &app_handle, + ); + + match cmd_result { + Ok(_) => { + println!("Command executed successfully!"); + start = SystemTime::now(); // listen for more commands + continue; + } + Err(error_message) => { + println!("Error executing command: {}", error_message); + } + } + + app_handle + .emit_all(events::EventTypes::AssistantWaiting.get(), ()) + .unwrap(); + break; // return to picovoice after command execution (no matter successfull or not) + } + } + } + + match start.elapsed() { + Ok(elapsed) if elapsed > config::CMS_WAIT_DELAY => { + // return to picovoice after N seconds + app_handle + .emit_all(events::EventTypes::AssistantWaiting.get(), ()) + .unwrap(); + break; + } + _ => (), + } + } + } + } + } + + // Stop listening + println!("Stop listening ..."); + recorder.stop().expect("Failed to stop audio recording"); + LISTENING.store(false, Ordering::SeqCst); + STOP_LISTENING.store(false, Ordering::SeqCst); + + Ok(true) +} diff --git a/src-tauri/src/tauri_commands/recorder.rs b/src-tauri/src/tauri_commands/recorder.rs new file mode 100644 index 0000000..8ef6097 --- /dev/null +++ b/src-tauri/src/tauri_commands/recorder.rs @@ -0,0 +1,33 @@ +use pv_recorder::RecorderBuilder; + +#[tauri::command] +pub fn pv_get_audio_devices() -> Vec { + let audio_devices = RecorderBuilder::default().get_audio_devices(); + match audio_devices { + Ok(audio_devices) => audio_devices, + Err(err) => panic!("Failed to get audio devices: {}", err), + } +} + +#[tauri::command] +pub fn pv_get_audio_device_name(idx: i32) -> String { + let audio_devices = RecorderBuilder::default().get_audio_devices(); + let mut first_device: String = String::new(); + match audio_devices { + Ok(audio_devices) => { + for (_idx, device) in audio_devices.iter().enumerate() { + if idx as usize == _idx { + return device.to_string(); + } + + if _idx == 0 { + first_device = device.to_string() + } + } + } + Err(err) => panic!("Failed to get audio devices: {}", err), + }; + + // return first device as default, if none were matched + first_device +} diff --git a/src-tauri/src/tauri_commands/sys.rs b/src-tauri/src/tauri_commands/sys.rs new file mode 100644 index 0000000..cadb473 --- /dev/null +++ b/src-tauri/src/tauri_commands/sys.rs @@ -0,0 +1,48 @@ +use peak_alloc::PeakAlloc; + +#[global_allocator] +static PEAK_ALLOC: PeakAlloc = PeakAlloc; + +extern crate systemstat; +use std::thread; +use std::time::Duration; +use systemstat::{saturating_sub_bytes, Platform, System}; + +lazy_static! { + static ref SYS: System = System::new(); +} + +#[tauri::command] +pub fn get_current_ram_usage() -> String { + let result = String::from(format!("{}", PEAK_ALLOC.current_usage_as_mb())); + + result +} + +#[tauri::command] +pub fn get_peak_ram_usage() -> String { + let result = String::from(format!("{}", PEAK_ALLOC.peak_usage_as_gb())); + + result +} + +#[tauri::command] +pub fn get_cpu_temp() -> String { + if let Ok(cpu_temp) = SYS.cpu_temp() { + String::from(format!("{}", cpu_temp)) + } else { + String::from("error") + } +} + +// https://github.com/valpackett/systemstat/blob/trunk/examples/info.rs +#[tauri::command(async)] +pub async fn get_cpu_usage() -> String { + if let Ok(cpu) = SYS.cpu_load_aggregate() { + thread::sleep(Duration::from_secs(1)); + let cpu = cpu.done().unwrap(); + String::from(format!("{}", cpu.user * 100.0)) + } else { + String::from("error") + } +} diff --git a/src-tauri/src/tauri_commands/voice.rs b/src-tauri/src/tauri_commands/voice.rs new file mode 100644 index 0000000..a6490b5 --- /dev/null +++ b/src-tauri/src/tauri_commands/voice.rs @@ -0,0 +1,29 @@ +use std::fs::File; +use std::io::BufReader; +use rodio::{Decoder, OutputStream, Sink}; + +#[tauri::command(async)] +pub fn play_sound(filename: &str, sleep: bool) { + // Get a output stream handle to the default physical sound device + let (_stream, stream_handle) = OutputStream::try_default().unwrap(); + let sink = Sink::try_new(&stream_handle).unwrap(); + + // Load a sound from a file, using a path relative to Cargo.toml + // let filepath = format!("{PUBLIC_PATH}/sound/{filename}.wav"); + let filepath = filename; + let file = BufReader::new(File::open(&filepath).unwrap()); + + // Decode that sound file into a source + let source = Decoder::new(file).unwrap(); + + // Play the sound directly on the device + println!("Playing {} ...", filepath); + // stream_handle.play_raw(source.convert_samples()); + sink.append(source); + + if sleep { + // The sound plays in a separate thread. This call will block the current thread until the sink + // has finished playing all its queued sounds. + sink.sleep_until_end(); + } +} \ No newline at end of file diff --git a/src-tauri/src/vosk.rs b/src-tauri/src/vosk.rs new file mode 100644 index 0000000..91edef0 --- /dev/null +++ b/src-tauri/src/vosk.rs @@ -0,0 +1,58 @@ +use std::sync::Mutex; +use vosk::{CompleteResult, DecodingState, Model, Recognizer}; + +use crate::config::VOSK_MODEL_PATH; + +lazy_static! { + static ref MODEL: Model = Model::new(VOSK_MODEL_PATH).unwrap(); +} + +lazy_static! { + static ref RECOGNIZER: Mutex = + Mutex::new(Recognizer::new(&MODEL, 16000.0).unwrap()); +} + +pub fn init_vosk() { + RECOGNIZER.lock().unwrap().set_max_alternatives(10); + RECOGNIZER.lock().unwrap().set_words(true); + RECOGNIZER.lock().unwrap().set_partial_words(true); +} + +pub fn recognize(data: &[i16]) -> Option { + let state = RECOGNIZER.lock().unwrap().accept_waveform(data); + + match state { + DecodingState::Running => { + None + // Some(RECOGNIZER.lock().unwrap().partial_result().partial.into()) + } + DecodingState::Finalized => { + // Result will always be multiple because we called set_max_alternatives + Some( + RECOGNIZER + .lock() + .unwrap() + .result() + .multiple() + .unwrap() + .alternatives + .first() + .unwrap() + .text + .into(), + ) + } + DecodingState::Failed => None, + } +} + +pub fn stereo_to_mono(input_data: &[i16]) -> Vec { + let mut result = Vec::with_capacity(input_data.len() / 2); + result.extend( + input_data + .chunks_exact(2) + .map(|chunk| chunk[0] / 2 + chunk[1] / 2), + ); + + result +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 0000000..538ae59 --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,65 @@ +{ + "build": { + "beforeDevCommand": "npm run dev", + "beforeBuildCommand": "npm run build", + "devPath": "http://localhost:1420", + "distDir": "../dist", + "withGlobalTauri": false + }, + "package": { + "productName": "jarvis-app", + "version": "0.0.0" + }, + "tauri": { + "allowlist": { + "all": false, + "shell": { + "all": false, + "open": true + }, + "dialog": { "message": true }, + "fs": { + "scope": ["$RESOURCE/*"] + }, + "path": { + "all": true + } + }, + "bundle": { + "active": true, + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "identifier": "com.priler.jarvis", + "targets": "all", + "resources": [ + "commands", + "sound", + "vosk/model_small", + "libvosk.dll", + "libstdc++-6.dll", + "libwinpthread-1.dll", + "libgcc_s_seh-1.dll" + ] + }, + "security": { + "csp": null + }, + "updater": { + "active": false + }, + "windows": [ + { + "fullscreen": false, + "resizable": false, + "title": "Jarvis Voice Assistant", + "width": 550, + "height": 820 + } + ] + } +} diff --git a/src-tauri/vosk/libgcc_s_seh-1.dll b/src-tauri/vosk/libgcc_s_seh-1.dll new file mode 100644 index 0000000..6e75249 Binary files /dev/null and b/src-tauri/vosk/libgcc_s_seh-1.dll differ diff --git a/src-tauri/vosk/libstdc++-6.dll b/src-tauri/vosk/libstdc++-6.dll new file mode 100644 index 0000000..7783d88 Binary files /dev/null and b/src-tauri/vosk/libstdc++-6.dll differ diff --git a/src-tauri/vosk/libvosk.dll b/src-tauri/vosk/libvosk.dll new file mode 100644 index 0000000..4f3c6ed Binary files /dev/null and b/src-tauri/vosk/libvosk.dll differ diff --git a/src-tauri/vosk/libvosk.lib b/src-tauri/vosk/libvosk.lib new file mode 100644 index 0000000..dfba69b Binary files /dev/null and b/src-tauri/vosk/libvosk.lib differ diff --git a/src-tauri/vosk/libwinpthread-1.dll b/src-tauri/vosk/libwinpthread-1.dll new file mode 100644 index 0000000..0b416a5 Binary files /dev/null and b/src-tauri/vosk/libwinpthread-1.dll differ diff --git a/model_small/README b/src-tauri/vosk/model_small/README similarity index 100% rename from model_small/README rename to src-tauri/vosk/model_small/README diff --git a/model_small/am/final.mdl b/src-tauri/vosk/model_small/am/final.mdl similarity index 100% rename from model_small/am/final.mdl rename to src-tauri/vosk/model_small/am/final.mdl diff --git a/model_small/conf/mfcc.conf b/src-tauri/vosk/model_small/conf/mfcc.conf similarity index 100% rename from model_small/conf/mfcc.conf rename to src-tauri/vosk/model_small/conf/mfcc.conf diff --git a/model_small/conf/model.conf b/src-tauri/vosk/model_small/conf/model.conf similarity index 100% rename from model_small/conf/model.conf rename to src-tauri/vosk/model_small/conf/model.conf diff --git a/model_small/graph/Gr.fst b/src-tauri/vosk/model_small/graph/Gr.fst similarity index 100% rename from model_small/graph/Gr.fst rename to src-tauri/vosk/model_small/graph/Gr.fst diff --git a/model_small/graph/HCLr.fst b/src-tauri/vosk/model_small/graph/HCLr.fst similarity index 100% rename from model_small/graph/HCLr.fst rename to src-tauri/vosk/model_small/graph/HCLr.fst diff --git a/model_small/graph/disambig_tid.int b/src-tauri/vosk/model_small/graph/disambig_tid.int similarity index 100% rename from model_small/graph/disambig_tid.int rename to src-tauri/vosk/model_small/graph/disambig_tid.int diff --git a/model_small/graph/phones/word_boundary.int b/src-tauri/vosk/model_small/graph/phones/word_boundary.int similarity index 100% rename from model_small/graph/phones/word_boundary.int rename to src-tauri/vosk/model_small/graph/phones/word_boundary.int diff --git a/model_small/ivector/final.dubm b/src-tauri/vosk/model_small/ivector/final.dubm similarity index 100% rename from model_small/ivector/final.dubm rename to src-tauri/vosk/model_small/ivector/final.dubm diff --git a/model_small/ivector/final.ie b/src-tauri/vosk/model_small/ivector/final.ie similarity index 100% rename from model_small/ivector/final.ie rename to src-tauri/vosk/model_small/ivector/final.ie diff --git a/model_small/ivector/final.mat b/src-tauri/vosk/model_small/ivector/final.mat similarity index 100% rename from model_small/ivector/final.mat rename to src-tauri/vosk/model_small/ivector/final.mat diff --git a/model_small/ivector/global_cmvn.stats b/src-tauri/vosk/model_small/ivector/global_cmvn.stats similarity index 100% rename from model_small/ivector/global_cmvn.stats rename to src-tauri/vosk/model_small/ivector/global_cmvn.stats diff --git a/model_small/ivector/online_cmvn.conf b/src-tauri/vosk/model_small/ivector/online_cmvn.conf similarity index 100% rename from model_small/ivector/online_cmvn.conf rename to src-tauri/vosk/model_small/ivector/online_cmvn.conf diff --git a/model_small/ivector/splice.conf b/src-tauri/vosk/model_small/ivector/splice.conf similarity index 100% rename from model_small/ivector/splice.conf rename to src-tauri/vosk/model_small/ivector/splice.conf diff --git a/src-tauri/vosk/vosk_api.h b/src-tauri/vosk/vosk_api.h new file mode 100644 index 0000000..9816019 --- /dev/null +++ b/src-tauri/vosk/vosk_api.h @@ -0,0 +1,361 @@ +// Copyright 2020-2021 Alpha Cephei Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* This header contains the C API for Vosk speech recognition system */ + +#ifndef VOSK_API_H +#define VOSK_API_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** Model stores all the data required for recognition + * it contains static data and can be shared across processing + * threads. */ +typedef struct VoskModel VoskModel; + + +/** Speaker model is the same as model but contains the data + * for speaker identification. */ +typedef struct VoskSpkModel VoskSpkModel; + + +/** Recognizer object is the main object which processes data. + * Each recognizer usually runs in own thread and takes audio as input. + * Once audio is processed recognizer returns JSON object as a string + * which represent decoded information - words, confidences, times, n-best lists, + * speaker information and so on */ +typedef struct VoskRecognizer VoskRecognizer; + + +/** + * Batch model object + */ +typedef struct VoskBatchModel VoskBatchModel; + +/** + * Batch recognizer object + */ +typedef struct VoskBatchRecognizer VoskBatchRecognizer; + + +/** Loads model data from the file and returns the model object + * + * @param model_path: the path of the model on the filesystem + * @returns model object or NULL if problem occured */ +VoskModel *vosk_model_new(const char *model_path); + + +/** Releases the model memory + * + * The model object is reference-counted so if some recognizer + * depends on this model, model might still stay alive. When + * last recognizer is released, model will be released too. */ +void vosk_model_free(VoskModel *model); + + +/** Check if a word can be recognized by the model + * @param word: the word + * @returns the word symbol if @param word exists inside the model + * or -1 otherwise. + * Reminding that word symbol 0 is for */ +int vosk_model_find_word(VoskModel *model, const char *word); + + +/** Loads speaker model data from the file and returns the model object + * + * @param model_path: the path of the model on the filesystem + * @returns model object or NULL if problem occured */ +VoskSpkModel *vosk_spk_model_new(const char *model_path); + + +/** Releases the model memory + * + * The model object is reference-counted so if some recognizer + * depends on this model, model might still stay alive. When + * last recognizer is released, model will be released too. */ +void vosk_spk_model_free(VoskSpkModel *model); + +/** Creates the recognizer object + * + * The recognizers process the speech and return text using shared model data + * @param model VoskModel containing static data for recognizer. Model can be + * shared across recognizers, even running in different threads. + * @param sample_rate The sample rate of the audio you going to feed into the recognizer. + * Make sure this rate matches the audio content, it is a common + * issue causing accuracy problems. + * @returns recognizer object or NULL if problem occured */ +VoskRecognizer *vosk_recognizer_new(VoskModel *model, float sample_rate); + + +/** Creates the recognizer object with speaker recognition + * + * With the speaker recognition mode the recognizer not just recognize + * text but also return speaker vectors one can use for speaker identification + * + * @param model VoskModel containing static data for recognizer. Model can be + * shared across recognizers, even running in different threads. + * @param sample_rate The sample rate of the audio you going to feed into the recognizer. + * Make sure this rate matches the audio content, it is a common + * issue causing accuracy problems. + * @param spk_model speaker model for speaker identification + * @returns recognizer object or NULL if problem occured */ +VoskRecognizer *vosk_recognizer_new_spk(VoskModel *model, float sample_rate, VoskSpkModel *spk_model); + + +/** Creates the recognizer object with the phrase list + * + * Sometimes when you want to improve recognition accuracy and when you don't need + * to recognize large vocabulary you can specify a list of phrases to recognize. This + * will improve recognizer speed and accuracy but might return [unk] if user said + * something different. + * + * Only recognizers with lookahead models support this type of quick configuration. + * Precompiled HCLG graph models are not supported. + * + * @param model VoskModel containing static data for recognizer. Model can be + * shared across recognizers, even running in different threads. + * @param sample_rate The sample rate of the audio you going to feed into the recognizer. + * Make sure this rate matches the audio content, it is a common + * issue causing accuracy problems. + * @param grammar The string with the list of phrases to recognize as JSON array of strings, + * for example "["one two three four five", "[unk]"]". + * + * @returns recognizer object or NULL if problem occured */ +VoskRecognizer *vosk_recognizer_new_grm(VoskModel *model, float sample_rate, const char *grammar); + + +/** Adds speaker model to already initialized recognizer + * + * Can add speaker recognition model to already created recognizer. Helps to initialize + * speaker recognition for grammar-based recognizer. + * + * @param spk_model Speaker recognition model */ +void vosk_recognizer_set_spk_model(VoskRecognizer *recognizer, VoskSpkModel *spk_model); + + +/** Reconfigures recognizer to use grammar + * + * @param recognizer Already running VoskRecognizer + * @param grammar Set of phrases in JSON array of strings or "[]" to use default model graph. + * See also vosk_recognizer_new_grm + */ +void vosk_recognizer_set_grm(VoskRecognizer *recognizer, char const *grammar); + + +/** Configures recognizer to output n-best results + * + *
+ *   {
+ *      "alternatives": [
+ *          { "text": "one two three four five", "confidence": 0.97 },
+ *          { "text": "one two three for five", "confidence": 0.03 },
+ *      ]
+ *   }
+ * 
+ * + * @param max_alternatives - maximum alternatives to return from recognition results + */ +void vosk_recognizer_set_max_alternatives(VoskRecognizer *recognizer, int max_alternatives); + + +/** Enables words with times in the output + * + *
+ *   "result" : [{
+ *       "conf" : 1.000000,
+ *       "end" : 1.110000,
+ *       "start" : 0.870000,
+ *       "word" : "what"
+ *     }, {
+ *       "conf" : 1.000000,
+ *       "end" : 1.530000,
+ *       "start" : 1.110000,
+ *       "word" : "zero"
+ *     }, {
+ *       "conf" : 1.000000,
+ *       "end" : 1.950000,
+ *       "start" : 1.530000,
+ *       "word" : "zero"
+ *     }, {
+ *       "conf" : 1.000000,
+ *       "end" : 2.340000,
+ *       "start" : 1.950000,
+ *       "word" : "zero"
+ *     }, {
+ *       "conf" : 1.000000,
+ *       "end" : 2.610000,
+ *       "start" : 2.340000,
+ *       "word" : "one"
+ *     }],
+ * 
+ * + * @param words - boolean value + */ +void vosk_recognizer_set_words(VoskRecognizer *recognizer, int words); + +/** Like above return words and confidences in partial results + * + * @param partial_words - boolean value + */ +void vosk_recognizer_set_partial_words(VoskRecognizer *recognizer, int partial_words); + +/** Set NLSML output + * @param nlsml - boolean value + */ +void vosk_recognizer_set_nlsml(VoskRecognizer *recognizer, int nlsml); + + +/** Accept voice data + * + * accept and process new chunk of voice data + * + * @param data - audio data in PCM 16-bit mono format + * @param length - length of the audio data + * @returns 1 if silence is occured and you can retrieve a new utterance with result method + * 0 if decoding continues + * -1 if exception occured */ +int vosk_recognizer_accept_waveform(VoskRecognizer *recognizer, const char *data, int length); + + +/** Same as above but the version with the short data for language bindings where you have + * audio as array of shorts */ +int vosk_recognizer_accept_waveform_s(VoskRecognizer *recognizer, const short *data, int length); + + +/** Same as above but the version with the float data for language bindings where you have + * audio as array of floats */ +int vosk_recognizer_accept_waveform_f(VoskRecognizer *recognizer, const float *data, int length); + + +/** Returns speech recognition result + * + * @returns the result in JSON format which contains decoded line, decoded + * words, times in seconds and confidences. You can parse this result + * with any json parser + * + *
+ *  {
+ *    "text" : "what zero zero zero one"
+ *  }
+ * 
+ * + * If alternatives enabled it returns result with alternatives, see also vosk_recognizer_set_max_alternatives(). + * + * If word times enabled returns word time, see also vosk_recognizer_set_word_times(). + */ +const char *vosk_recognizer_result(VoskRecognizer *recognizer); + + +/** Returns partial speech recognition + * + * @returns partial speech recognition text which is not yet finalized. + * result may change as recognizer process more data. + * + *
+ * {
+ *    "partial" : "cyril one eight zero"
+ * }
+ * 
+ */ +const char *vosk_recognizer_partial_result(VoskRecognizer *recognizer); + + +/** Returns speech recognition result. Same as result, but doesn't wait for silence + * You usually call it in the end of the stream to get final bits of audio. It + * flushes the feature pipeline, so all remaining audio chunks got processed. + * + * @returns speech result in JSON format. + */ +const char *vosk_recognizer_final_result(VoskRecognizer *recognizer); + + +/** Resets the recognizer + * + * Resets current results so the recognition can continue from scratch */ +void vosk_recognizer_reset(VoskRecognizer *recognizer); + + +/** Releases recognizer object + * + * Underlying model is also unreferenced and if needed released */ +void vosk_recognizer_free(VoskRecognizer *recognizer); + +/** Set log level for Kaldi messages + * + * @param log_level the level + * 0 - default value to print info and error messages but no debug + * less than 0 - don't print info messages + * greather than 0 - more verbose mode + */ +void vosk_set_log_level(int log_level); + +/** + * Init, automatically select a CUDA device and allow multithreading. + * Must be called once from the main thread. + * Has no effect if HAVE_CUDA flag is not set. + */ +void vosk_gpu_init(); + +/** + * Init CUDA device in a multi-threaded environment. + * Must be called for each thread. + * Has no effect if HAVE_CUDA flag is not set. + */ +void vosk_gpu_thread_init(); + +/** Creates the batch recognizer object + * + * @returns model object or NULL if problem occured */ +VoskBatchModel *vosk_batch_model_new(const char *model_path); + +/** Releases batch model object */ +void vosk_batch_model_free(VoskBatchModel *model); + +/** Wait for the processing */ +void vosk_batch_model_wait(VoskBatchModel *model); + +/** Creates batch recognizer object + * @returns recognizer object or NULL if problem occured */ +VoskBatchRecognizer *vosk_batch_recognizer_new(VoskBatchModel *model, float sample_rate); + +/** Releases batch recognizer object */ +void vosk_batch_recognizer_free(VoskBatchRecognizer *recognizer); + +/** Accept batch voice data */ +void vosk_batch_recognizer_accept_waveform(VoskBatchRecognizer *recognizer, const char *data, int length); + +/** Set NLSML output + * @param nlsml - boolean value + */ +void vosk_batch_recognizer_set_nlsml(VoskBatchRecognizer *recognizer, int nlsml); + +/** Closes the stream */ +void vosk_batch_recognizer_finish_stream(VoskBatchRecognizer *recognizer); + +/** Return results */ +const char *vosk_batch_recognizer_front_result(VoskBatchRecognizer *recognizer); + +/** Release and free first retrieved result */ +void vosk_batch_recognizer_pop(VoskBatchRecognizer *recognizer); + +/** Get amount of pending chunks for more intelligent waiting */ +int vosk_batch_recognizer_get_pending_chunks(VoskBatchRecognizer *recognizer); + +#ifdef __cplusplus +} +#endif + +#endif /* VOSK_API_H */ diff --git a/src-tauri/vosk_build.py b/src-tauri/vosk_build.py new file mode 100644 index 0000000..5a87fb2 --- /dev/null +++ b/src-tauri/vosk_build.py @@ -0,0 +1,36 @@ +# Simple python script used to +# copy Vosk libraries to the "target" directory +# after Rust build + +# Note that Rust build should be run via "cargo make " command +# in order to automate all the compile process + +import os +from pathlib import Path +import shutil + +# some config vars +VOSK_LIBRARIES_PATH = "D:/Rust/vosk" +TARGET_DIRS = ( + os.getcwd() + "/target/debug", + os.getcwd() + "/target/release" +) + +for tdir in TARGET_DIRS: + if not Path(tdir).is_dir(): + continue + + vosk_lib_testfile = Path(tdir + "/libvosk.dll") + + if vosk_lib_testfile.is_file(): + # skip + print("[Vosk] library files already exist in " + tdir) + else: + # copy lib files + src_files = os.listdir(VOSK_LIBRARIES_PATH) + for file_name in src_files: + full_file_name = os.path.join(VOSK_LIBRARIES_PATH, file_name) + if os.path.isfile(full_file_name): + shutil.copy(full_file_name, tdir) + + print("[Vosk] library files was copied to " + tdir) \ No newline at end of file diff --git a/src/App.svelte b/src/App.svelte new file mode 100644 index 0000000..cf6a112 --- /dev/null +++ b/src/App.svelte @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file diff --git a/src/Events.svelte b/src/Events.svelte new file mode 100644 index 0000000..f0a8b87 --- /dev/null +++ b/src/Events.svelte @@ -0,0 +1,44 @@ + \ No newline at end of file diff --git a/src/components/Footer.svelte b/src/components/Footer.svelte new file mode 100644 index 0000000..a4923b0 --- /dev/null +++ b/src/components/Footer.svelte @@ -0,0 +1,44 @@ + + + + + \ No newline at end of file diff --git a/src/components/Header.svelte b/src/components/Header.svelte new file mode 100644 index 0000000..a9be6e7 --- /dev/null +++ b/src/components/Header.svelte @@ -0,0 +1,28 @@ + + \ No newline at end of file diff --git a/src/components/Nav.svelte b/src/components/Nav.svelte new file mode 100644 index 0000000..c8f8ccb --- /dev/null +++ b/src/components/Nav.svelte @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/src/components/elements/ArcReactor.svelte b/src/components/elements/ArcReactor.svelte new file mode 100644 index 0000000..26796ca --- /dev/null +++ b/src/components/elements/ArcReactor.svelte @@ -0,0 +1,644 @@ + +
+
+
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/src/components/elements/HDivider.svelte b/src/components/elements/HDivider.svelte new file mode 100644 index 0000000..5c8cea9 --- /dev/null +++ b/src/components/elements/HDivider.svelte @@ -0,0 +1,18 @@ + + +
+ + \ No newline at end of file diff --git a/src/components/elements/SearchBar.svelte b/src/components/elements/SearchBar.svelte new file mode 100644 index 0000000..3e48b10 --- /dev/null +++ b/src/components/elements/SearchBar.svelte @@ -0,0 +1,11 @@ + + + \ No newline at end of file diff --git a/src/components/elements/Stats.svelte b/src/components/elements/Stats.svelte new file mode 100644 index 0000000..78f4894 --- /dev/null +++ b/src/components/elements/Stats.svelte @@ -0,0 +1,366 @@ + + +
+
+
+
+ Микрофон + {microphone_label} +
+
+
+
+
+ Нейросети + {nn_label} +
+
+
+
+
+ Ресурсы + RAM {resources_ram_usage}mb +
+
+
+ + diff --git a/src/css/main.scss b/src/css/main.scss new file mode 100644 index 0000000..50f5246 --- /dev/null +++ b/src/css/main.scss @@ -0,0 +1,2738 @@ +$prim-font: "Roboto", sans-serif; +$sec-font: "Roboto Condensed", sans-serif; + +html, body { + overflow-x: hidden; +} + +::-webkit-scrollbar { + width: 15px; +} + +::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); +} + +::-webkit-scrollbar-thumb { + background: -webkit-gradient(linear,left top,left bottom,from(#999),to(#27292F)); + background: linear-gradient(to bottom,#999,#27292F); +} + +::selection { + background: #FF8901!important; /* WebKit/Blink Browsers */ + color: white!important; + text-shadow: 1px 1px 1px rgba(0, 0, 0, .5)!important; +} +::-moz-selection { + background: #FF8901!important; /* WebKit/Blink Browsers */ + color: white!important; + text-shadow: 1px 1px 1px rgba(0, 0, 0, .5)!important; +} + +/* + * HEADER + */ + +#header { + height: 80px; + background-color: #0c1013; + box-shadow: 0 0 19px 2px rgba(0, 0, 0, 0.91); + position: relative; + z-index: 100; + text-align: justify; + + display: flex; + justify-content: space-between; + + .logo { + margin-top: 12px; + + & > a > img { + width: 57px; + display: inline-block; + transition: .5s opacity ease-in; + + &:hover { + opacity: .8; + } + } + + & > div { + display: inline-block; + margin-left: 13px; + margin-top: 8px; + vertical-align: top; + } + + h1 { + color: #ffffff; + font-family: $sec-font; + font-size: 20px; + font-weight: bold; + text-transform: uppercase; + letter-spacing: 0.1px; + margin: 0; + + & > a { + color: white; + text-shadow: 1px 1px 1px rgba(0, 0, 0, .5); + text-decoration: none; + + &:hover { + color: #FF0000; + } + } + } + + h2 { + color: #888; + font-family: $sec-font; + font-size: 14px; + font-weight: bold; + letter-spacing: 0.1px; + margin-top: 2px; + letter-spacing: -0.01px; + } + } + + .top-menu { + vertical-align: top; + margin-top: 18px; + margin-left: 50px; + + & > ul { + margin: 0; + padding: 0; + list-style: none; + + & > li { + display: inline-block; + position: relative; + + &:not(:first-child) { + margin-left: 20px; + } + + & > a { + display: inline-block; + text-decoration: none; + color: #c6c6c6; + font-family: $sec-font; + font-size: 16px; + text-transform: uppercase; + font-weight: bold; + transition: .2s color; + padding: 10px 0; + + & > svg { + height: 20px; + width: 20px; + vertical-align: middle; + margin-bottom: 4px; + margin-right: 3px; + margin-left: 3px; + } + + &:hover, &.active { + color: #8AC832; + + &:after { + -webkit-transform: scaleX(1); + -ms-transform: scaleX(1); + transform: scaleX(1); + -webkit-transform-origin: left; + -ms-transform-origin: left; + transform-origin: left; + } + } + + &:after { + content: ""; + display: block; + height: 3px; + border-radius: 10px; + -webkit-transform: scaleX(0); + -ms-transform: scaleX(0); + transform: scaleX(0); + transition: .4s -webkit-transform; + transition: .4s transform; + -webkit-transform-origin: 100% 0; + -ms-transform-origin: 100% 0; + transform-origin: 100% 0; + background: #8AC832; + opacity: 0.90; + position: absolute; + bottom: 5px; + left: 0; + width: 100%; + z-index: 333; + } + + } + } + } + } +} + +.search { + display: block; + margin: 20px 0; + text-align: center; + + & > form { + position: relative; + + & > input { + width: 380px; + height: 38px; + box-shadow: inset 0 0 5px 1px rgba(0, 0, 0, 0.6); + border: 1px solid rgba(6, 6, 6, 0.99); + background-color: #0f1012; + outline: none; + + color: #D1D1D1; + font-family: $sec-font; + font-size: 17px; + font-weight: 600; + line-height: 70.58px; + padding-left: 20px; + padding-right: 45px; + padding-right: 45px; + + &::placeholder { + color: #676767; + font-weight: 400; + } + + &:focus + button + small { + opacity: .3; + } + } + + & > button { + position: absolute; + padding: 0; + margin: 0; + background: none; + border: none; + right: 35px; + top: 4px; + width: 30px; + height: 30px; + opacity: 1; + transition: .3s opacity; + + &::before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 110%; + height: 110%; + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAbCAYAAABvCO8sAAAC4ElEQVRIiaXWX4hXRRTA8c/etkwy+gNBEVRCmxFl1ouZGlEWFUQZPfVQRLAjKvSylEFBf16EiChJOxhLQY8RtA+lRZtpRv8ohUJQNMiHooKyojZNtoeZy95+/fZ3r+uBy5xz5pzznYGZc2dodHRUB1lVviUYwXkYwk84iK8wGRHb2goNtQDXYxRXdVkV9mFrRDx/osCl2IxrG75PsAv75Z1NyzsdwQosb8R+jXURsbML8AG82rDH8TI+77eyiAAppSVYg9SYXhsRW5rxVU/+Qw3Yd7ip+PrCesB7ImKNvNMDxb05pbR+NuBSvFL0L7EYH7SB+oA/Lrm7i2tTSmlVL3AYbxf9eyzDkROFNaBTWCmfYJhIKc1rAh/DuUW/HUfnCmtAp3FrMefjmRp4Kh4tE+PYO6DO6fKp7Ao9hJeKOZZSWlBhNc4ozidbaqyUr8W4/x+42aSuOYT7KtxZHF/gcEvyvDI+KF/yFW20iPgZk8W8o8KVxZjsn/IfOdbQL8OulNLTHfJ2lHFRhYuKcbB/bKs8kVLanVK6ZkBMfS8vqLCgGL/NEQjX48MB8/UVm1/hz2KceRLAfbh3wHxde2pYbmFnY+EcYVsiYm1LzKVl/KHCN8W4sUPxUxr6j7i7AwxuKOP+ykxLW4bzWxKnyziBRXirjZRSOstMx9lW4Q38XRyPt+R/hOtwF35tgzVqDhX99QpTeK441pWVzya/49OOICmlCzFWzE0RcaRuT0/hj6Jv71qwg7xbxuNKv66BR820uIuxE6edDCmltB1XFPOeiPiL/B+sZQcexgtyk96L+3X42/eAFuM1+YUHGyJiop4f7ol/Ef/Iv5TL8VlZQMiXexBoRH7hjTXcj0TEs8242V5tNxdo8wC9J5/Sfq+25bitEfut/Gp7p7dw7w5reV/e4Yay6oW4pXyD5DC2YmNEHOsXMBuwlo3lWy3v+mpcgnPku/WL3Br3yA+uNyPi+KCC/wJQGMGINsMjCwAAAABJRU5ErkJggg=="); + background-repeat: no-repeat; + background-size: 75%; + background-position: center center; + transition: all .3s; + } + + &:hover { + &::before { + cursor: pointer; + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAbCAYAAABvCO8sAAABN2lDQ1BBZG9iZSBSR0IgKDE5OTgpAAAokZWPv0rDUBSHvxtFxaFWCOLgcCdRUGzVwYxJW4ogWKtDkq1JQ5ViEm6uf/oQjm4dXNx9AidHwUHxCXwDxamDQ4QMBYvf9J3fORzOAaNi152GUYbzWKt205Gu58vZF2aYAoBOmKV2q3UAECdxxBjf7wiA10277jTG+38yH6ZKAyNguxtlIYgK0L/SqQYxBMygn2oQD4CpTto1EE9AqZf7G1AKcv8ASsr1fBBfgNlzPR+MOcAMcl8BTB1da4Bakg7UWe9Uy6plWdLuJkEkjweZjs4zuR+HiUoT1dFRF8jvA2AxH2w3HblWtay99X/+PRHX82Vun0cIQCw9F1lBeKEuf1UYO5PrYsdwGQ7vYXpUZLs3cLcBC7dFtlqF8hY8Dn8AwMZP/fNTP8gAAAAJcEhZcwAACxMAAAsTAQCanBgAAAXRaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzE0MiA3OS4xNjA5MjQsIDIwMTcvMDcvMTMtMDE6MDY6MzkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDQtMjNUMDQ6MzE6NTgrMDU6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTA0LTIzVDA0OjM0OjI3KzA1OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTA0LTIzVDA0OjM0OjI3KzA1OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowZDA5NTdiMi0zYmM3LTcxNDItODcyNS01ODA3MjA2NTFlYTIiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDoxM2UwZWYxNi03OGM0LTE2NGMtODc1Mi0xYjY5OTQ1OTczMGMiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo5YjNkZTI4Yy1iOTBmLTNjNDUtYjAwNS1kNTExOTE3ZDhkNzIiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjliM2RlMjhjLWI5MGYtM2M0NS1iMDA1LWQ1MTE5MTdkOGQ3MiIgc3RFdnQ6d2hlbj0iMjAyMy0wNC0yM1QwNDozMTo1OCswNTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowZDA5NTdiMi0zYmM3LTcxNDItODcyNS01ODA3MjA2NTFlYTIiIHN0RXZ0OndoZW49IjIwMjMtMDQtMjNUMDQ6MzQ6MjcrMDU6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4Wh528AAAC7UlEQVRIiaXWX4gXVRTA8c9v2jLJ6A8ERVAJbUakTr2YqRFl0QRRRk89FBGYqNDLUgY51PQiRERJWhhLQY8RtA+OFm2mGf2RGqEQDAvyoaigrKhNk+3h3mGnX7/9zbgeGO45555zvvfCvWdub/POpTrI6vilGMVF6OEnHMEXmCyyaldboV4LcCPWYnGXVeEQdhRZ9fypApdhG65v+D7GPhwWdjYt7HQUK7GiEfslNhRZtbcL8EG81rDH8TI+G7SyIqtAXqYp1uGRxvT6Iqu2N+OTvvyHG7DvcEv0DYT1gasiq9YJO/06urflZbpxNuAyvBr1z7EE77eBBoA/irn7o2trXqar+4Ej2Bn177Ecx04V1oBOYZVwgmEiL9N5TeATuDDqGY7PFdaATuP2aM7HMzXwTDweJ8ZxcEids4VT2RX6DV6K5lhepgsSrME50flUS41VwrUY9/8DN5vUNXu4P8Fd0XEAR1uS58XxIeGSr2yjFVn1MyajeWeCa6MxOTjlP3KioV+FfXmZFh3y9sRxUYLLonFkcGyrbM7LdH9eptcNianv5SUJFkTjtzkC4UZ8MGS+vmLzE/wZjXNPA3gI9w2Zr2tPjQgt7HwsnCNse5FV61tirozjDwm+isbNHYqf0dB/xD0dYHBTHA8nZlraclzckjgdxwkswtttpLxMzzPTcXYleBN/R8eTLfkf4gbcjV/bYI2avai/kWAKz0XHhrjy2eR3fNIRJC/TSzEWza1FVh2r29PT+CPqu7sW7CDvxPGk2K9r4HEzLe5y7MVZp0PKy3Q3ronmvUVW/UX4D9ayB4/iBaFJH8QDOvzt+0BL8LrwwoNNRVZN1PMjffEv4h/hl3I1Po0LeEW43MNAo8ILb6zhfqzIqmebcbO92m6N0OYBelc4pYNebStwRyP2W+HVVvYX7t9hLe8JO9wUV70Qt8VvmBzFDmwpsurEoIDZgLVsid8aYddLcQUuEO7WL0JrrIQH11tFVp0cVvBfVZDA+HDoxOQAAAAASUVORK5CYII="); + } + } + } + + & > small { + position: absolute; + font-family: $sec-font; + font-size: 14px; + font-weight: bold; + line-height: 1.7em; + top: 8px; + right: 75px; + background-color: #D1D1D1; + color: #080C0F; + padding: 0 7px; + padding-top: 2px; + border-radius: 4px; + opacity: 0; + transition: opacity .3s; + cursor: default; + } + } + + &.active { + small { + opacity: .3; + } + } +} + +/* + * CONTENT + */ + +#content { + margin-top: 52px; + + & > .inner { + min-height: 1000px; + background-image: url(media/images/decor.png); + background-repeat: no-repeat; + background-size: 100%; + + & > section.materials { + padding: 36px; + + & > header { + margin-top: 25px; + + & > h1 { + display: inline-block; + margin: 0; + padding: 0; + color: #d1d1d1; + font-family: $sec-font; + font-size: 23px; + font-weight: bold; + letter-spacing: 0.1px; + position: relative; + + & + sup { + font-family: $sec-font; + margin-left: 10px; + color: silver; + background: black; + padding: 3px 7px; + border-radius: 3px; + opacity: .5; + top: 0; + transition: .3s opacity; + + &:hover { + opacity: 1; + } + } + + &::before { + content: ""; + position: absolute; + left: 0; + bottom: -5px; + width: 100%; + height: 3px; + background-color: #ff8a00; + background: -webkit-gradient(linear,left top,right top,from(#ff8a00),to(#da1b60)); + background: linear-gradient(to right,#ff8a00,#da1b60); + } + + &.with-icon { + margin-bottom: 5px; + + & > img { + vertical-align: middle; + margin-right: 10px; + } + + & > span { + vertical-align: middle; + } + + &::before { + bottom: -10px; + } + } + } + } + + & > article { + display: table; + margin: 15px 0; + font-size: 0; + position: relative; + + .toolkit { + position: absolute; + left: 10px; + top: 10px; + z-index: 10; + font-size: 20px; + opacity: 0; + transition: .3s opacity; + + & > a { + text-decoration: none; + opacity: .3; + transition: .3s opacity; + + &:hover { + opacity: 1; + } + } + } + + &:hover { + & > .toolkit { + opacity: 1; + } + } + + & > .poster { + display: inline-block; + vertical-align: top; + width: 372px; + min-height: 250px; + overflow: hidden; + background-color: black; + border-radius: 3px 0 0 3px; + + background-repeat: no-repeat; + background-size: contain; + background-position: center; + + & > img { + max-width: 372px; + border-radius: 3px 0 0 3px; + vertical-align: middle; + } + } + + & > .details { + display: table-cell; + vertical-align: top; + background-color: #080c0f; + min-height: 250px; + /*width: calc(100% - 372px);*/ + width: 100%; + border-radius: 0 3px 3px 0; + font-size: 16px; + padding: 15px 22px; + position: relative; + + & > h1 { + display: inline-block; + text-shadow: 0 0 4px rgba(55, 55, 55, 0.54); + font-family: $sec-font; + font-size: 21px; + padding: 0; + margin: 0; + font-weight: normal; + font-weight: 600; + + & > a { + color: #fea431; + color: #FFC14E; + text-decoration: none; + display: inline-block; + opacity: 1; + transition: .1s opacity; + position: relative; + background: -webkit-gradient(linear,left top,right top,from(#fea431),to(#ff8a00)); + background: linear-gradient(to right,#fea431,#ff8a00); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; + text-shadow: none; + + &:hover { + background: -webkit-gradient(linear,left top,right top,from(#ff8a00),to(#da1b60)); + background: linear-gradient(to right,#ff8a00,#da1b60); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; + text-shadow: none; + } + } + } + + & > .meta { + margin-top: 10px; + + .status { + &.over5k { + color: mediumslateblue; + background-image: url(images/bg/bg10.gif); + background-position: center center; + background-size: 50%; + background-repeat: no-repeat; + } + + &.over10k { + color: limegreen; + background-image: url(images/bg/bg24.gif); + background-position: center center; + background-size: cover; + background-repeat: no-repeat; + } + + &.over100k { + color: goldenrod; + font-weight: bold; + font-size: 20px; + background-image: url(images/bg/bg11.gif); + background-position: center center; + background-size: 100%; + background-repeat: no-repeat; + text-shadow: 0 0 3px rgba(0, 0, 0, 1); + position: relative; + top: -2px; + } + } + + & > .pubdate { + display: inline-block; + vertical-align: top; + color: #888888; + font-family: $sec-font; + font-size: 16px; + font-weight: 400; + margin-right: 19px; + } + + & > .cat { + display: inline-block; + vertical-align: top; + margin-right: 5px; + color: #888888; + font-family: $sec-font; + font-size: 16px; + font-weight: 400; + margin-right: 17px; + opacity: .9; + transition: .3s opacity; + + background-position: center; + background-size: 17px; + background-repeat: no-repeat; + background-position: left center; + + & > a { + color: inherit; + text-decoration: none; + transition: .2s color; + + &:hover { + color: deepskyblue; + background-image: url(images/bg/bg8.gif); + } + } + + &.icon { + & > a > img { + vertical-align: middle; + margin-right: 3px; + } + } + } + + & > .downloads { + display: inline-block; + vertical-align: top; + margin-right: 5px; + color: #888888; + font-family: $sec-font; + font-size: 16px; + font-weight: 400; + padding-left: 20px; + opacity: .7; + transition: .3s opacity; + + background-position: center; + background-size: 17px; + background-repeat: no-repeat; + background-position: left -2px; + + & > a { + color: inherit; + text-decoration: none; + + &:hover { + color: orange; + } + } + } + } + + & > blockquote { + font-family: $prim-font; + color: #88919d; + font-size: 15px; + font-weight: normal; + line-height: 20px; + padding: 0; + margin: 0; + margin-top: 12px; + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 5; + -webkit-box-orient: vertical; + } + + & > .actions { + position: absolute; + right: 22px; + bottom: 15px; + font-size: 0; + + & > .btn { + &:first-child { + border-radius: 3px 0 0 3px; + margin-right: 1px; + opacity: .7; + + & + .btn { + border-radius: 0 3px 3px 0; + } + } + + &:not(:first-child):not(:last-child) { + border-radius: 0; + margin-right: 1px; + opacity: .7; + + &:hover { + opacity: 1; + } + } + + &:last-child { + border-radius: 0 3px 3px 0; + margin-right: 1px; + opacity: .7; + + & + .btn { + border-radius: 0 3px 3px 0; + } + + &:hover { + opacity: 1; + } + } + + &:only-child { + border-radius: 3px!important; + } + } + } + } + + &:hover { + .meta > .cat { + opacity: 1; + } + + .meta > .downloads { + opacity: 1; + } + + .actions > .btn:first-child { + opacity: 1; + } + } + } + } + } +} + +@media (max-width: 1364px) { + #content>.inner>section.materials>header>h1 { + font-size: 26px; + } + + #content>.inner>section.materials>article>.details>h1 { + font-size: 25px; + } + + #content>.inner>section.materials>article>.details>blockquote { + font-size: 17px; + line-height: 24px; + -webkit-line-clamp: 4; + } + + .btn { + font-size: 16px!important; + } + + #paginator>header>h1 { + font-size: 30px!important; + } + + #paginator>.paginator-wrapper>.paginator-box { + transform: scale(1.5); + margin-top: 15px; + } + + #paginator>.paginator-wrapper>small:first-child { + display: none; + } + + #paginator>.paginator-wrapper>small:last-child { + display: none; + } +} + +@media (max-width: 991px) { + #wrapper { + overflow-y: hidden; + } + #content>.inner>section.materials>article>.details>h1 { + font-size: 30px; + margin-top: 15px; + margin-bottom: 10px; + } + + #content>.inner>section.materials>article>.details>blockquote { + -webkit-line-clamp: initial; + font-size: 18px; + line-height: 25px; + } + + #content>.inner>section.materials>article>.poster { + display: block; + width: 100%; + min-height: auto; + max-height: 650px; + + & > img { + max-width: none; + width: inherit!important; + } + } + + #content>.inner>section.materials>article>.details { + display: block; + } + + #content>.inner>section.materials>article>.details>.actions { + position: static; + text-align: center; + margin-top: 20px; + margin-bottom: 10px; + display: none; + } + + #content>.inner>section.materials>article { + display: block; + } + + #content>.inner>section.materials>article>.details>.meta>.cat { + display: none; + } + + #content>.inner>section.materials { + padding: 0px; + } +} + +#paginator { + text-align: center; + + & > header { + margin-bottom: 20px; + + & > h1 { + display: inline-block; + margin: 0; + padding: 0; + color: #d1d1d1; + font-family: $sec-font; + font-size: 23px; + font-weight: bold; + letter-spacing: 0.1px; + position: relative; + + &::before { + content: ""; + position: absolute; + left: 0; + bottom: -5px; + width: 100%; + height: 3px; + background-color: #86BF45; + background: -webkit-gradient(linear,left top,right top,from(#ff8a00),to(#da1b60)); + background: linear-gradient(to right,#ff8a00,#da1b60); + } + } + } + + & > .paginator-wrapper { + margin-bottom: 150px; + position: relative; + + & > small { + display: inline-block; + opacity: 0.75; + color: #d3d3d3; + font-family: $sec-font; + font-size: 15px; + font-weight: 700; + vertical-align: middle; + + &:first-child { + margin-right: 15px; + color: #88DB47; + } + + &:last-child { + margin-left: 15px; + } + } + + & > .paginator-box { + display: inline-block; + background: black; + width: 500px; + height: 50px; + border-radius: 2px; + border: 1px solid #070808; + background-color: #171A20; + vertical-align: middle; + overflow: hidden; + position: relative; + + /* box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.5); */ + + & > .pb-start, & > .pb-end { + height: 100%; + + & > nav { + & > ul { + padding: 0; + margin: 0; + list-style: none; + + & > li { + display: inline-block; + line-height: 43px; + + & > a { + position: relative; + display: inline-block; + width: 35px; + height: 35px; + line-height: 33px; + border-radius: 1px; + border: 1px solid #070808; + border-radius: 3px; + background-color: #171A20; + background-image: linear-gradient(to top, #1a1c24 0%, #20232a 100%); + box-shadow: 0 0 2px 0px rgba(0, 0, 0, 0.7); + text-shadow: 0px 0px 5px #000000, 0px 0px 5px #000000, 0px 0px 3px #000000, 0px 0px 3px #000000, 0px 0px 3px #000000; + color: #D5DAE3; + font-family: $sec-font; + font-size: 15px; + font-weight: 700; + text-decoration: none; + text-align: center; + + &.current { + color: #8AC547; + cursor: not-allowed; + opacity: .5; + } + + &.last { + width: auto; + padding: 0 15px; + } + + &:not(.current):hover { + background-image: linear-gradient(to top, #20222A 0%, #2B2E35 100%); + } + + &::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + border-radius: 2px; + border-left: 1px solid rgba(150, 150, 150, .1); + border-top: 1px solid rgba(150, 150, 150, .1); + border-right: 1px solid rgba(100, 100, 100, .1); + border-bottom: 1px solid rgba(100, 100, 100, .1); + } + + &.chosen { + color: #8AC547; + cursor: not-allowed; + opacity: .5; + } + } + } + } + } + } + + & > .pb-start { + background-color: #171a20; + box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.5); + text-align: left; + padding-left: 10px; + position: absolute; + z-index: 10; + padding-right: 10px; + left: 0; + + &::before { + content: ""; + position: absolute; + right: -10px; + top: -70%; + height: 200%; + width: 50px; + background-image: linear-gradient(to bottom, #13151A 30%, #16191E 70%, #13151A 100%); + border-right: 2px solid #456789; + transform: rotate(25deg); + } + + &.pb-single { + position: static; + text-align: center; + + &::before { + display: none; + } + } + } + + & > .pb-end { + background-color: #0E131A; + text-align: right; + padding-right: 10px; + } + } + } +} + +/* + * SIDEBAR + */ + +#sidebar, #sidebar-mobile { + + &.col-s { + &::after { + content: " "; + box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.54); + background-color: #1f2326; + position: fixed; + + top: 0; + width: 328px; + height: 100vh; + } + } + + & > .inner { + z-index: 9; + + & > section { + position: relative; + z-index: 2; + padding: 18px; + + &:last-child { + margin-bottom: 50px; + } + + & > header { + margin-top: 25px; + + & > h1 { + display: inline-block; + margin: 0; + padding: 0; + color: #d1d1d1; + font-family: $sec-font; + font-size: 20px; + font-weight: bold; + letter-spacing: 0.1px; + position: relative; + + &::before { + content: ""; + position: absolute; + left: 0; + bottom: -5px; + width: 100%; + height: 3px; + background-color: #ff8a00; + background: -webkit-gradient(linear,left top,right top,from(#ff8a00),to(#da1b60)); + background: linear-gradient(to right,#ff8a00,#da1b60); + } + } + } + + &.hollow { + padding: 0; + + & > header { + padding: 18px; + } + } + + &.default { + & > header { + margin-bottom: 18px; + } + } + + } + + & > .side-menu { + padding: 0; + + & > header { + padding: 18px; + } + + & > nav { + background-color: rgba(0, 0, 0, .05); + + & > ul { + margin: 0; + padding: 0; + list-style: none; + + & > li { + & > a { + color: white; + text-decoration: none; + display: block; + height: 50px; + line-height: 50px; + text-align: left; + padding: 0 18px; + text-transform: uppercase; + font-family: $sec-font; + font-size: 16px; + font-weight: 400; + position: relative; + + &:hover { + background-color: rgba(11,12,14,0.75); + } + + &.with-icon { + padding-left: 54px; + + &:hover { + cursor: pointer; + } + + & > .icon-fg { + display: block; + width: 20px; + height: 20px; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + position: absolute; + left: 18px; + top: 12.5px; + z-index: 10; + + & > .icon-bg { + display: block; + width: 32px; + height: 32px; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + position: absolute; + left: -6px; + top: -6px; + opacity: 0.3; + z-index: 5; + filter: blur(3px); + transition: .5s all; + } + } + + &:hover { + + & > .icon-fg { + & > .icon-bg { + filter: blur(1px); + } + } + } + } + } + + &.active > a { + background-color: rgba(11,12,14,0.75); + } + + span.emoji-ic { + display: inline-block; + width: 20px; + text-align: center; + margin-right: 5px; + } + + &.with-dropdown { + + & > a { + &::after { + content: ""; + position: absolute; + width: 13px; + height: 13px; + background-color: #434648; + opacity: .3; + border-radius: 50%; + right: 18px; + top: 18px; + } + } + + & > ul.dropdown { + margin: 0; + padding: 0; + list-style: none; + box-shadow: inset 0 1px 10px rgba(0, 0, 0, .3); + display: none; + + & > li { + & > a { + color: rgba(255, 255, 255, .9); + text-decoration: none; + display: block; + height: 50px; + line-height: 50px; + text-align: left; + padding: 0 18px; + text-transform: uppercase; + font-family: $sec-font; + font-size: 15px; + font-weight: 400; + position: relative; + + &:hover { + background-color: rgba(11,12,14,0.5); + color: #FEA431; + } + + & > small { + position: absolute; + right: 18px; + opacity: .5; + + &.warning { + opacity: .7; + color: #EFCE49; + } + } + + &.with-icon { + padding-left: 54px; + + & > .icon-fg { + display: block; + width: 18px; + height: 18px; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + position: absolute; + left: 19px; + top: 12.5px; + z-index: 10; + + + & > .icon-bg { + display: block; + width: 25px; + height: 25px; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + position: absolute; + left: -4px; + top: -4px; + opacity: 0.3; + z-index: 5; + filter: blur(3px); + transition: .5s all; + + } + } + + &:hover { + + & > .icon-fg { + & > .icon-bg { + filter: blur(1px); + } + } + } + } + } + + &.active { + & > a { + background-color: rgba(11,12,14,0.5); + color: #FEA431; + } + } + } + } + + &.dropdown-opened { + & > a { + background-color: rgba(11,12,14,0.75); + } + + & > ul.dropdown { + /*display: block;*/ + } + } + } + } + } + } + } + + } +} + +#sidebar-mobile { + section.special { + margin-top: 30px; + + & > .special-top-tip { + position: relative; + width: 285px; + height: 100px; + margin: 0 auto; + border-radius: 5px; + text-shadow: 0 0 4px rgba(55, 55, 55, 0.54); + color: #b6b6b6; + font-family: $prim-font; + font-size: 14px; + font-weight: 400; + line-height: 18px; + padding: 15px 15px; + text-align: center; + z-index: 10; + + background-color: #ff8a00; + background: -webkit-gradient(linear,left top,right top,from(#ff8a00),to(#da1b60)); + background: -o-linear-gradient(left,#ff8a00,#da1b60); + background: linear-gradient(to right,#ff8a00,#da1b60); + color: white!important; + + & > a { + color: gold!important; + text-transform: uppercase; + font-weight: bold; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 1); + text-decoration: none; + } + + &::before { + content: ""; + width: 0; + height: 0; + border-left: 15px solid transparent; + border-right: 15px solid transparent; + border-top: 15px solid #ED5430; + + position: absolute; + left: 0; + right: 0; + bottom: -15px; + margin: auto; + } + } + + & > .special-bottom-tip { + position: relative; + width: 200px; + height: 55px; + margin: 0 auto; + border-radius: 5px; + background-color: #0b0d10; + text-shadow: 0 0 4px rgba(55, 55, 55, 0.54); + color: #b6b6b6; + font-family: $prim-font; + font-size: 14px; + font-weight: 400; + line-height: 18px; + padding: 8px 15px; + text-align: center; + z-index: 10; + margin-top: 20px; + + & > a { + color: #fc7234; + text-decoration: none; + } + } + + & > .special-copyright { + position: relative; + margin: 0 auto; + text-shadow: 0 0 3px rgba(0, 0, 0, 1); + color: #b6b6b6; + font-family: $prim-font; + font-size: 14px; + font-weight: 400; + line-height: 18px; + padding: 8px 15px; + text-align: center; + z-index: 10; + margin-top: 20px; + + & > span { + color: #6c00ff; + font-weight: bold; + } + } + + @mixin rings($duration, $delay) { + opacity: 0; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + position: absolute; + top: -21%; + left: -21%; + right: 0; + bottom: 0; + content: ''; + height: 125%; + width: 125%; + border: 11px solid rgba(0, 169, 221, .7); + border-radius: 100%; + animation-name: ripple; + animation-duration: $duration; + animation-delay: $delay; + animation-iteration-count: infinite; + animation-timing-function: cubic-bezier(.65,0,.34,1); + z-index: -1; + } + + @keyframes ripple { + from { + opacity: 1; + transform: scale3d(0.75,0.75,1); + } + + to { + opacity: 0; + transform: scale3d(1.5,1.5,1); + } + } + + & > .special-ripple { + & > .request-loader { + position: relative; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + height: 123px; + width: 123px; + background: #00B4DB; + border-radius: 100%; + box-shadow: 0 0 20px 0 rgba(0,0,0,0.25); + margin: 0 auto; + margin-top: 35px; + text-align: center; + opacity: .9; + transition: .3s all; + + &:hover { + opacity: 1; + background: #00BEEA; + } + + img { + width: 60px; + margin-right: 5px; + } + + &::after { + @include rings(3s, 0s); + } + + &::before { + @include rings(3s, 0.5s); + } + } + } + } + + .search { + margin-top: 20px; + + & > form { + position: relative; + + & > input { + width: 100%; + height: auto; + box-shadow: inset 0 0 5px 1px rgba(0, 0, 0, 0.6); + border: 1px solid rgba(6, 6, 6, 0.99); + background-color: #0f1012; + outline: none; + + color: #D1D1D1!important; + font-family: $sec-font; + font-size: 16px; + font-weight: 600; + padding: 15px 20px; + + &::placeholder { + color: #676767; + font-weight: 400; + } + + &:focus + button + small { + opacity: .3; + } + } + + & > button { + position: absolute; + padding: 0; + margin: 0; + background: none; + border: none; + right: 15px; + top: 10px; + width: 30px; + height: 30px; + opacity: 1; + transition: .3s opacity; + + &::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-image: url(icons/search.svg); + background-repeat: no-repeat; + background-size: 75%; + background-position: center center; + opacity: .3; + transition: all .3s; + } + + &:hover { + &::before { + cursor: pointer; + background-image: url(icons/magnifier-tool.svg); + opacity: .9; + } + } + } + + & > small { + position: absolute; + font-family: $sec-font; + font-size: 14px; + font-weight: bold; + top: 10px; + right: 50px; + background-color: #D1D1D1; + color: #080C0F; + padding: 1px 4px; + border-radius: 4px; + opacity: 0; + transition: opacity .3s; + } + } + } +} + +@media (max-width: 1499px) { + #sidebar.col-s::after { + width: 303px; + } + + #vk_groups { + max-width: 100%; + overflow: hidden; + border-radius: 3px; + } + + #sidebar>.inner>.side-menu>nav>ul>li.with-dropdown>ul.dropdown>li>a>small { + font-size: 11px; + } + + #sidebar>.inner>.statistics span.num { + font-size: 18px!important; + } + + #sidebar>.inner>.statistics > div { + width: 75px!important; + } +} + +/* + * FOOTER + */ + +footer#footer { + & > .footer-content { + height: 320px; + background-color: #0B0D10; + padding: 45px 0; + + & > .container { + position: relative; + } + + .logo { + display: inline-block; + margin-top: 7px; + + & > a > img { + width: 57px; + display: inline-block; + transition: .5s opacity ease-in; + + &:hover { + opacity: .8; + } + } + + & > div { + display: inline-block; + margin-left: 13px; + margin-top: 15px; + vertical-align: top; + } + + h1 { + color: #ffffff; + font-family: $sec-font; + font-size: 20px; + font-weight: bold; + text-transform: uppercase; + letter-spacing: 0.1px; + margin: 0; + + & > a { + color: white; + text-shadow: 1px 1px 1px rgba(0, 0, 0, .5); + text-decoration: none; + + &:hover { + color: #da1b60; + } + } + } + + h2 { + color: #888; + font-family: $sec-font; + font-size: 14px; + font-weight: bold; + text-transform: uppercase; + letter-spacing: 0.1px; + margin-top: 2px; + letter-spacing: -0.01px; + } + } + + p.cowners-text { + width: 330px; + font-family: $prim-font; + color: #c1c6cf; + color: #929393; + line-height: 19px; + font-size: 14px; + text-align: left; + } + + section.special { + position: absolute; + height: 380px; + width: 291px; + right: 18px; + top: -80px; + padding: 0; + z-index: 10; + + & > .special-top-tip { + position: relative; + width: 285px; + height: 100px; + margin: 0 auto; + border-radius: 5px; + background-color: #0b0d10; + text-shadow: 0 0 4px rgba(55, 55, 55, 0.54); + color: #b6b6b6; + font-family: $prim-font; + font-size: 14px; + font-weight: 400; + line-height: 18px; + padding: 15px 15px; + text-align: center; + z-index: 10; + + & > a { + color: #fc7234; + text-decoration: none; + } + + &::before { + content: ""; + width: 0; + height: 0; + border-left: 15px solid transparent; + border-right: 15px solid transparent; + border-top: 15px solid #0b0d10; + + position: absolute; + left: 0; + right: 0; + bottom: -15px; + margin: auto; + } + } + + & > .special-bottom-tip { + position: relative; + width: 200px; + height: 55px; + margin: 0 auto; + border-radius: 5px; + background-color: #0b0d10; + text-shadow: 0 0 4px rgba(55, 55, 55, 0.54); + color: #b6b6b6; + font-family: $prim-font; + font-size: 14px; + font-weight: 400; + line-height: 18px; + padding: 8px 15px; + text-align: center; + z-index: 10; + margin-top: 20px; + + & > a { + color: #fc7234; + text-decoration: none; + } + } + + & > .special-copyright { + position: relative; + margin: 0 auto; + text-shadow: 0 0 3px rgba(0, 0, 0, 1); + color: #b6b6b6; + font-family: $prim-font; + font-size: 14px; + font-weight: 400; + line-height: 18px; + padding: 8px 15px; + text-align: center; + z-index: 10; + margin-top: 20px; + + & > span { + color: #6c00ff; + font-weight: bold; + } + } + + @mixin rings($duration, $delay) { + opacity: 0; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + position: absolute; + top: -21%; + left: -21%; + right: 0; + bottom: 0; + content: ''; + height: 125%; + width: 125%; + border: 11px solid rgba(0, 169, 221, .7); + border-radius: 100%; + animation-name: ripple; + animation-duration: $duration; + animation-delay: $delay; + animation-iteration-count: infinite; + animation-timing-function: cubic-bezier(.65,0,.34,1); + z-index: -1; + } + + @keyframes ripple { + from { + opacity: 1; + transform: scale3d(0.75,0.75,1); + } + + to { + opacity: 0; + transform: scale3d(1.5,1.5,1); + } + } + + & > .special-ripple { + & > .request-loader { + position: relative; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + height: 123px; + width: 123px; + background: #00B4DB; + border-radius: 100%; + box-shadow: 0 0 20px 0 rgba(0,0,0,0.25); + margin: 0 auto; + margin-top: 35px; + text-align: center; + opacity: .9; + transition: .3s all; + + &:hover { + opacity: 1; + background: #00BEEA; + } + + img { + width: 60px; + margin-right: 5px; + } + + &::after { + @include rings(3s, 0s); + } + + &::before { + @include rings(3s, 0.5s); + } + } + } + } + } + + & > div.footer-copyright { + height: 80px; + line-height: 50px; + font-family: $prim-font; + color: #929393; + font-size: 14px; + background-color: #040506; + + span { + color: #eee; + } + + small { + color: #8AC547; + } + } +} + +@media (max-width: 1499px) { + footer#footer>.footer-content section.special { + right: 5px; + } +} + +@media (max-width: 1364px) { + #footer .container { + padding: 0 10px; + } + + footer#footer>.footer-content section.special>.special-top-tip { + background-color: #ff8a00; + background: -webkit-gradient(linear,left top,right top,from(#ff8a00),to(#da1b60)); + background: -o-linear-gradient(left,#ff8a00,#da1b60); + background: linear-gradient(to right,#ff8a00,#da1b60); + color: white!important; + + & > a { + color: gold!important; + text-transform: uppercase; + font-weight: bold; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 1); + } + + &::before { + border-top: 15px solid #ED5430!important; + } + } + + footer#footer>.footer-content p.cowners-text { + font-size: 16px; + line-height: 22px; + width: 450px; + } + + footer#footer>.footer-content section.special>.special-bottom-tip { + background-color: rgba(0, 0, 0, .7); + } +} + +@media (max-width: 991px) { + footer#footer>.footer-content section.special { + display: none; + } + + footer#footer>.footer-content p.cowners-text { + font-size: 20px; + line-height: 24px; + } + + footer#footer>.footer-content { + height: auto; + } + + .footer-copyright { + text-align: center; + font-size: 16px!important; + } +} + +@media (max-width: 750px) { + .footer-copyright .container { + padding: 0!important; + } + + #paginator { + margin-top: 50px; + } + + #paginator>.paginator-wrapper>.paginator-box { + transform: none!important; + height: auto; + width: auto; + background: transparent; + border: none; + } + + #paginator>.paginator-wrapper>.paginator-box>.pb-start { + position: static; + text-align: center; + box-shadow: none; + background: transparent; + border: none; + } + + #paginator>.paginator-wrapper>.paginator-box>.pb-start::before { + display: none; + } + + #paginator>.paginator-wrapper>.paginator-box>.pb-end { + display: none; + } + + #paginator>.paginator-wrapper>.paginator-box>.pb-start>nav>ul>li { + & > a { + font-size: 25px; + width: auto; + height: auto; + padding: 10px 20px; + margin: 5px; + } + } + + footer#footer>.footer-content p.cowners-text { + width: auto; + } + + .row { + margin-left: 0; + margin-right: 0; + } +} + +/* + * ORPHUS. + */ +#orphus-popup { + background: #1F2326; + padding: 30px; + border-radius: 10px; + box-shadow: 0 0 150px rgba(0, 0, 0, 1); + position: fixed; + left: 0;top: 0;right: 0;bottom: 0; + margin: auto; + width: 750px; + height: 500px; + font-family: $prim-font; + font-size: 18px; + + & > a { + display: block; + text-align: center; + margin-bottom: 10px; + } + + & > h2 { + font-size: 20px; + color: #F24941; + + & + div { + line-height: 1.3em; + font-size: 16px; + color: #88919D; + margin-bottom: 15px; + + u { + font-weight: bold; + color: #F24941!important; + } + + & + div { + line-height: 1.5em; + font-size: 17px; + color: #ddd; + + & + form { + & > input { + font-size: 18px; + padding: 10px; + border-radius: 5px; + border: none; + background: #0F1012; + -webkit-box-shadow: inset 0 0 5px 1px rgba(0,0,0,.6); + box-shadow: inset 0 0 5px 1px rgba(0,0,0,.6); + border: 1px solid rgba(6,6,6,.99); + background-color: #0f1012; + outline: none; + color: #D1D1D1; + font-family: $prim-font; + + & + div { + margin-top: 7px; + + input { + background: #7DB042; + border: none; + padding: 10px 5px; + border-radius: 3px; + color: #eee; + text-transform: uppercase; + font-size: 14px; + font-family: $prim-font; + opacity: .9; + transition: .3s all; + + &:last-child { + background: #0F1012; + color: silver; + opacity: .7; + } + + &:hover { + cursor: pointer; + opacity: 1; + } + } + } + } + } + } + } + } + +} + +/* + * ADAPTIVE + */ +#slideout-open { + position: fixed; + left: 0; + bottom: 0; + z-index: 10; + width: 110px; + height: 100px; + text-align: center; + cursor: pointer; + transition: left .3s; + transition-timing-function: ease-in-out; + visibility: hidden; + + & > .request-loader img:last-child {display: none;} + + &.opened { + & > .request-loader img:first-child {display: none;} + & > .request-loader img:last-child {display: block;} + } + + @mixin rings($duration, $delay) { + opacity: 0; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + position: absolute; + top: -9px; + left: -9px; + right: 0; + bottom: 0; + content: ''; + height: 70px; + width: 70px; + border: 11px solid rgba(125,133,144, .7); + border-radius: 100%; + animation-name: ripple; + animation-duration: $duration; + animation-delay: $delay; + animation-iteration-count: infinite; + animation-timing-function: cubic-bezier(.65,0,.34,1); + z-index: -1; + } + + @keyframes ripple { + from { + opacity: 1; + transform: scale3d(0.75,0.75,1); + } + + to { + opacity: 0; + transform: scale3d(1.5,1.5,1); + } + } + + &.special-ripple { + & > .request-loader { + position: relative; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + height: 75px; + width: 75px; + border-radius: 100%; + box-shadow: 0 0 20px 0 rgba(0,0,0,0.25); + margin: 0 auto; + margin-top: 15px; + text-align: center; + opacity: .9; + text-align: center; + line-height: 75px; + background-color: #ff8a00; + background: -webkit-gradient(linear,left top,right top,from(#ff8a00),to(#da1b60)); + background: linear-gradient(to right,#ff8a00,#da1b60); + + &:hover { + opacity: 1; + } + + img { + width: 62px; + } + + &::after { + @include rings(3s, 0s); + } + + &::before { + @include rings(3s, 0.5s); + } + } + } +} + +@media (max-width: 1364px) { + #sidebar { + display: none; + } + + #slideout-open { + visibility: visible!important; + } +} + +/* + * SLIDEOUT + */ +.slideout-menu { + position: fixed; + top: 0; + bottom: 0; + width: 370px; + min-height: 100vh; + overflow-y: scroll; + overflow-x: hidden; + -webkit-overflow-scrolling: touch; + z-index: 0; + display: none; + background: #1F2326; + + & > #sidebar-mobile { + & > .inner { + & > .statistics { + padding-top: 10px; + } + } + } +} + +.slideout-menu-left { + left: 0; +} + +.slideout-menu-right { + right: 0; +} + +.slideout-panel { + position: relative; + z-index: 1; + background-color: #14171A; /* A background-color is required */ + min-height: 100vh; +} + +.slideout-open, +.slideout-open body, +.slideout-open .slideout-panel { + overflow: hidden; +} + +.slideout-open .slideout-menu { + display: block; +} + +/* + * BUTTONS & STUFF + */ + +.btn { + display: inline-block; + background-color: #181e23; + color: #d1d1d1; + font-family: $sec-font; + text-decoration: none; + font-weight: bold; + letter-spacing: 0.2px; + font-size: 14px; + padding: 8px 15px; + border-radius: 3px; + margin: 0; + text-shadow: 0 0 3px rgba(0, 0, 0, .5); + transition: .3s all; + + & > .label { + font-family: $sec-font; + text-align: center; + background: #31383F; + color: white; + font-size: 12px; + font-weight: bold; + text-shadow: none; + border-radius: 2px; + padding: 2px 5px; + margin-left: 5px; + opacity: .5; + transition: .7s all; + } + + &.btn-darkblue:hover { + background-color: rgb(39,111,169); + color: white; + + & > .label { + opacity: .9; + } + } + + &.btn-orange:hover { + background-color: orange; + color: white; + + & > .label { + opacity: .9; + } + } + + &.btn-green:hover { + background-color: #41b14f; + background-image: -webkit-gradient(linear,left top,left bottom,from(#9ec14c),to(#41b14f)); + background-image: linear-gradient(#9ec14c,#41b14f); + color: #fff; + + & > .label { + opacity: 0.9; + } + } + + // &.btn-blue:hover { + // background-color: #2096D2; + // background-image: -webkit-gradient(linear,left top,left bottom,from(#79C1E4),to(#2096D2)); + // background-image: linear-gradient(#79C1E4,#2096D2); + // color: #fff; + + // & > .label { + // opacity: 0.9; + // } + // } + + &.btn-blue:hover { + background-color: #0BBFF5; + color: white; + + & > .label { + opacity: .9; + } + } + + &.btn-dark:hover { + background-color: darkslategray; + color: white; + + & > .label { + opacity: .9; + } + } +} + +/** + * ICONS. + */ +.icon { + &.icon-books { + background-image: url(/media/icons/upload/book.svg); + } + + &.icon-downloads { + background-image: url(/media/icons/download.svg); + } +} + +/** + * OTHER. + */ +[class*=hint--]:after { + color: #DDD; + text-transform: uppercase; + font-family: $sec-font; + font-size: 15px; + font-weight: 600; + padding: 13px; +} + +.KICKASSELEMENT.KICKASShidden { + display: none!important; +} + +@-webkit-keyframes ka-bg-alert-blink { + 0%, 49% { + background: rgba(0, 0, 0, .9); + border: 3px solid rgb(117, 209, 63); + color: #ff0000; + } + 50%, 100% { + background: rgba(0, 0, 0, .3); + border: 3px solid rgb(117, 209, 63); + color: rgb(134,191,69); + } +} + +@-webkit-keyframes ka-activator-blink { + 0% { + opacity: 1; + } + 100% { + opacity: .3; + } +} + +#activate-ka { + animation: ka-activator-blink 1.2s infinite; + animation-direction: alternate; + cursor: pointer; +} + +#ka-info { + position: fixed; + left: 0; + bottom: 0; + background: rgba(8,12,15,.9); + border-radius: 10px; + padding: 15px 30px; + width: 500px; + margin: 20px; + display: none; + font-size: 0; + z-index: 998; + + & > div { + display: inline-block; + width: 50%; + font-size: 16px; + font-family: $sec-font; + vertical-align: middle; + + &:last-child { + width: 50%; + font-size: 30px; + text-align: center; + + p { + margin: 0; + } + + #ka-score { + color: rgb(0,191,8); + font-weight: bold; + } + + small { + display: inline-block; + font-size: 14px; + width: 100px; + opacity: .7; + margin-top: 10px; + } + } + } + + kbd { + color: #88DB47; + background-color: black; + padding: 5px 10px; + border-radius: 10px; + } + + &.ka-new-ship-alert::before { + content: "НОВЫЙ КОРАБЛЬ!"; + font-size: 40px; + font-weight: bold; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + text-align: center; + padding-top: 50px; + z-index: 999; + color: rgb(134,191,69); + border-radius: 10px; + animation: ka-bg-alert-blink 1s infinite; + } +} + +hr { + border: none; + border-top: 2px dotted #1D3D42; + background-color: transparent; + height: 1px; + width: 75%; +} + +/** + * Chat Bro restyle. + */ + +#chatbro { + height: 500px; + overflow: hidden; + position: relative; + + &.is-loading { + &::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: #1D2124; + background-image: url(/media/images/preloaders/loader.gif); + background-repeat: no-repeat; + background-position: center center; + z-index: 999; + transition: 1s opacity; + } + + &::after { + content: "Загрузка ..."; + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + margin: auto; + text-align: center; + width: 100px; + height: 50px; + line-height: 50px; + font-size: 16px; + z-index: 999; + transition: 1s opacity; + } + + &.is-loaded { + &::before { + opacity: 0; + } + + &::after { + opacity: 0; + } + } + + &.is-loaded-finish { + &::before { + display: none; + } + + &::after { + display: none; + } + } + } +} + +.chatbro_header { + display: none; +} + +.chatbro_body { + font-family: $prim-font!important; + border: none!important; +} + +.chatbro_body { + position: relative!important; + + &::before { + content: ""; + background: linear-gradient(to bottom, rgba(0, 0, 0, 0.4) 0%, rgba(0, 0, 0, 0.2) 25%, rgba(0, 0, 0, 0) 100%); + height: 26px; + position: absolute; + top: 0; + left: 0; + right: 0; + flex-shrink: 0; + z-index: 2; + pointer-events: none; + opacity: .3; + } + + &::after { + content: ""; + background: linear-gradient(to top, rgba(0, 0, 0, 0.4) 0%, rgba(0, 0, 0, 0.2) 25%, rgba(0, 0, 0, 0) 100%); + height: 16px; + position: absolute; + flex-shrink: 0; + bottom: 57px; + left: 0; + right: 0; + pointer-events: none; + } +} + +.chatbro_messages_block { + background: #1F2127!important; +} + +.chatbro_message_image { + width: 30px!important; + height: 30px!important; +} + +.chatbro_message_name, .chatbro_message_name > a { + font-size: 13px!important; +} + +.chatbro_message_text { + color: #c1c6cf!important; + line-height: 18px!important; + font-size: 14px!important; + margin-top: 0!important; +} + +.chatbro_message_td_message { + border-top: 1px dashed #0ef3f322!important; +} + +.chatbro_messages .chatbro_message td { + padding: 12px 2px!important; +} + +.chatbro_send_input_wrapper { + +} + +.chatbro_send_input_block { + position: relative!important; + + .chatbro_send_button { + position: absolute!important; + left: 215px!important; + top: 0!important; + background: transparent!important; + + &::before { + content: ""!important; + position: absolute!important; + left: -39px!important; + top: 9px!important; + width: 40px; + height: 42px; + background-image: url('/media/icons/enter-arrow.svg'); + background-size: 50%; + background-position: center center; + background-repeat: no-repeat; + background-color: #2C3036; + fill: #6F798A; + } + } + + .chatbro_open_smiles_button { + position: absolute!important; + left: 224px!important; + top: 0!important; + background: transparent!important; + + &::before { + content: ""!important; + position: absolute!important; + left: 0!important; + top: 5px!important; + width: 46px; + height: 46px; + background-image: url('/media/icons/smile.svg'); + background-size: 50%; + background-position: center center; + background-repeat: no-repeat; + background-color: #2C3036; + box-sizing: content-box; + border: 2px solid #0F0F12; + } + } + + .chatbro_open_upload_button { + position: absolute!important; + left: 273px!important; + top: 0!important; + background: transparent!important; + + &::before { + content: ""!important; + position: absolute!important; + left: 0px!important; + top: 5px!important; + width: 46px; + height: 46px; + background-image: url('/media/icons/photo-camera.svg'); + background-size: 53%; + background-position: center center; + background-repeat: no-repeat; + background-color: #2C3036; + box-sizing: content-box; + border: 2px solid #0F0F12; + opacity: .6; + } + + &:hover::before { + opacity: 1!important; + cursor: pointer; + } + } + + .chatbro_send_input_wrapper { + padding: 0!important; + box-shadow: inset 0px 0px 4px #000000; + height: 50px!important; + width: 215px!important; + margin-top: 5px; + margin-left: 5px; + + & > .chatbro_send_input { + width: 80%!important; + background: transparent!important; + cursor: text; + height: 45px!important; + overflow: hidden!important; + max-height: 50px!important; + padding: 8px 13px !important; + } + } +} + +.chatbro_smiles_menu { + bottom: 60px!important; + right: 34px!important; +} + +.emojione { + width: 20px; + display: inline; + vertical-align: middle; + margin: auto 2px; +} + +.chatbro_loader_radial { + top: 18px!important; + left: -31px!important; + border-color: rgb(119, 119, 119) rgb(119, 119, 119) rgb(119, 119, 119) rgb(138,197,71)!important; +} + +.chatbro_message_admin { + color: rgb(138,197,71); + opacity: 1!important; + border-radius: 3px!important; + + &::before { + content: "АДМИН"!important; + } +} + +@media (max-width: 1499px) { + .chatbro_send_input_block .chatbro_open_smiles_button::before { + width: 36px; + left: -1px!important; + } + .chatbro_send_input_block .chatbro_open_upload_button::before { + width: 36px; + left: -11px!important; + } + .chatbro_smiles_menu { + right: 14px!important; + } +} + +.not-found { + background-color: #040304; + padding: 30px 50px; + margin-top: 5px; + font-family: $prim-font; + height: 500px; + + background-image: url(/media/images/tenor.gif); + background-repeat: no-repeat; + background-position: 90% 50%; + + h2 { + font-size: 40px; + color: white; + background: -webkit-gradient(linear,left top,right top,from(#ff8a00),to(#da1b60)); + background: -o-linear-gradient(left,#ff8a00,#da1b60); + background: linear-gradient(to right,#ff8a00,#da1b60); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; + text-shadow: none; + } + + p { + max-width: 60%; + line-height: 1.5em; + + span { + color: #F56C1A; + font-weight: bold; + } + } + + small { + color: #555; + } + + .search-f { + margin-top: 20px; + background: white; + width: 440px; + + & > form { + position: relative; + + & > input { + width: 442px; + height: 50px; + box-shadow: inset 0 0 5px 1px rgba(0, 0, 0, 0.6); + border: 1px solid rgba(6, 6, 6, 0.99); + background-color: #0f1012; + outline: none; + + color: #D1D1D1; + font-family: $sec-font; + font-size: 20px; + font-weight: 600; + line-height: 70.58px; + padding-left: 10px; + padding-right: 45px; + padding-right: 45px; + + &::placeholder { + color: #676767; + font-weight: 400; + } + + &:focus + button + small { + opacity: .3; + } + } + + & > button { + position: absolute; + padding: 0; + margin: 0; + background: none; + border: none; + right: 10px; + top: 9px; + width: 30px; + height: 30px; + opacity: 1; + transition: .3s opacity; + + &::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-image: url(/media/icons/search.svg); + background-repeat: no-repeat; + background-size: 75%; + background-position: center center; + opacity: .3; + transition: all .3s; + } + + &:hover { + &::before { + cursor: pointer; + background-image: url(/media/icons/magnifier-tool.svg); + opacity: .9; + } + } + } + + & > small { + position: absolute; + font-family: $sec-font; + font-size: 14px; + font-weight: bold; + top: 10px; + right: 50px; + background-color: #D1D1D1; + color: #080C0F; + padding: 1px 4px; + border-radius: 4px; + opacity: 0; + transition: opacity .3s; + } + } + } +} \ No newline at end of file diff --git a/src/css/styles.scss b/src/css/styles.scss new file mode 100644 index 0000000..e5bb9f4 --- /dev/null +++ b/src/css/styles.scss @@ -0,0 +1,74 @@ +/* + SOME DEFAULT CSS. +*/ +html, body { + margin: 0; + padding: 0; + min-height: 100vh; + min-width: 100vw; + + background-color: #4C5062; + color: white; + + + &.assist-page { + background: rgb(24,123,123); + background: -moz-radial-gradient(circle, rgba(24,123,123,0.4906337535014006) 0%, rgba(13,15,19,1) 64%); + background: -webkit-radial-gradient(circle, rgba(24,123,123,0.4906337535014006) 0%, rgba(13,15,19,1) 64%); + background: radial-gradient(circle, rgba(24,123,123,0.4906337535014006) 0%, rgba(13,15,19,1) 64%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#187b7b",endColorstr="#0d0f13",GradientType=1); + + &.assist-active { + background: rgb(24,81,123); + background: -moz-radial-gradient(circle, rgba(24,81,123,0.6418942577030813) 0%, rgba(13,15,19,1) 64%); + background: -webkit-radial-gradient(circle, rgba(24,81,123,0.6418942577030813) 0%, rgba(13,15,19,1) 64%); + background: radial-gradient(circle, rgba(24,81,123,0.6418942577030813) 0%, rgba(13,15,19,1) 64%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#18517b",endColorstr="#0d0f13",GradientType=1); + } + + } +} + +:root { + font-family: Inter, Avenir, Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + + color: #0f0f0f; + background-color: #f6f6f6; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + + +a { + color: #2A9CD0; + text-decoration: none; + font-weight: bold; + + &:hover { + color: #1dabed; + text-decoration: underline; + } +} + +/* + OVERRIDES. +*/ +#wrapper { + padding: 0; + margin: 0; +} + +#header, main { + padding: 0 30px; +} + +select, input { + color: #ccc!important; +} \ No newline at end of file diff --git a/src/functions.ts b/src/functions.ts new file mode 100644 index 0000000..4cec82a --- /dev/null +++ b/src/functions.ts @@ -0,0 +1,44 @@ +import { invoke } from "@tauri-apps/api/tauri" +import { is_listening, isListening } from "@/stores" +import { clearInterval, clearTimeout, setInterval, setTimeout } from 'worker-timers'; + +setInterval(() => { + (async () => { + is_listening.set(await invoke("is_listening")); + })().catch(err => { + console.error(err); + }); +}, 1000); + +export function startListening() { + (async () => { + invoke('start_listening') + .then((message) => { + is_listening.set(true); + }) + .catch((error) => { + is_listening.set(false); + console.error(error); + // alert("Ошибка: " + error); + }) + })().catch(err => { + console.error(err); + }); +} + +export function stopListening(callback) { + (async () => { + invoke('stop_listening') + .then((message) => { + is_listening.set(false); + if(callback) { + callback(); + } + }) + .catch((error) => { + console.error(error); + }) + })().catch(err => { + console.error(err); + }); +} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..be9c929 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,13 @@ +// Klondike project old CSS file +import "./css/main.scss"; + +// App current CSS file +import "./css/styles.scss"; + +// deploy app +import App from "./App.svelte"; +const app = new App({ + target: document.getElementById("app"), +}); + +export default app; \ No newline at end of file diff --git a/src/pages/_layout.svelte b/src/pages/_layout.svelte new file mode 100644 index 0000000..f307626 --- /dev/null +++ b/src/pages/_layout.svelte @@ -0,0 +1,12 @@ + + + + +
+
+ +
+ \ No newline at end of file diff --git a/src/pages/commands.svelte b/src/pages/commands.svelte new file mode 100644 index 0000000..7cf172e --- /dev/null +++ b/src/pages/commands.svelte @@ -0,0 +1,12 @@ + + + + + +